diff --git a/src/libs/cplusplus/CppDocument.cpp b/src/libs/cplusplus/CppDocument.cpp
index ea6c0feb3a298c40bd7c72870c242cd1082a8909..49b09c3aca88f4215abd15f2de43c9c291459751 100644
--- a/src/libs/cplusplus/CppDocument.cpp
+++ b/src/libs/cplusplus/CppDocument.cpp
@@ -314,11 +314,13 @@ bool Document::parse(ParseMode mode)
     return _translationUnit->parse(m);
 }
 
-void Document::check()
+void Document::check(CheckMode mode)
 {
     Q_ASSERT(!_globalNamespace);
 
     Semantic semantic(_control);
+    if (mode == FastCheck)
+        semantic.setSkipFunctionBodies(true);
 
     _globalNamespace = _control->newNamespace(0);
     Scope *globals = _globalNamespace->members();
diff --git a/src/libs/cplusplus/CppDocument.h b/src/libs/cplusplus/CppDocument.h
index 3773971efc60fb3fc729d09b689a8c53db64d76a..486d6d7706ce2d22d977290f558df4d03f140d35 100644
--- a/src/libs/cplusplus/CppDocument.h
+++ b/src/libs/cplusplus/CppDocument.h
@@ -105,7 +105,12 @@ public:
     bool isParsed() const;
     bool parse(ParseMode mode = ParseTranlationUnit);
 
-    void check();
+    enum CheckMode {
+        FullCheck,
+        FastCheck
+    };
+
+    void check(CheckMode mode = FullCheck);
 
     void releaseSource();
     void releaseTranslationUnit();
diff --git a/src/plugins/cpptools/cppmodelmanager.cpp b/src/plugins/cpptools/cppmodelmanager.cpp
index dc0e334d7fe1ce9f75b633877bfc5644b3233c3f..7941df52c864c2ad1c88b72f73e0bb99444779db 100644
--- a/src/plugins/cpptools/cppmodelmanager.cpp
+++ b/src/plugins/cpptools/cppmodelmanager.cpp
@@ -610,10 +610,16 @@ public:
     void operator()(Document::Ptr doc)
     {
         _doc = doc;
+
+        Document::CheckMode mode = Document::FastCheck;
+
+        if (_workingCopy.contains(doc->fileName()))
+            mode = Document::FullCheck;
+
         doc->parse();
-        doc->check();
+        doc->check(mode);
 
-        if (_workingCopy.contains(doc->fileName())) {
+        if (mode == Document::FullCheck) {
             // run the binding pass
             NamespaceBindingPtr ns = bind(doc, _snapshot);
 
diff --git a/src/shared/cplusplus/CheckDeclaration.cpp b/src/shared/cplusplus/CheckDeclaration.cpp
index ef71c798094a273f4781619c4499c70a2e3692d9..038d70b9a48a9dff38726cba7a748dc98ea2eb2f 100644
--- a/src/shared/cplusplus/CheckDeclaration.cpp
+++ b/src/shared/cplusplus/CheckDeclaration.cpp
@@ -304,26 +304,28 @@ bool CheckDeclaration::visit(FunctionDefinitionAST *ast)
     ast->symbol = fun;
     _scope->enterSymbol(fun);
 
-    if (ast->ctor_initializer) {
-        bool looksLikeCtor = false;
-        if (ty.isValid() || ! fun->identity())
-            looksLikeCtor = false;
-        else if (fun->identity()->isNameId() || fun->identity()->isTemplateNameId())
-            looksLikeCtor = true;
-
-        if (! looksLikeCtor) {
-            translationUnit()->error(ast->ctor_initializer->firstToken(),
-                                     "only constructors take base initializers");
+    if (! semantic()->skipFunctionBodies()) {
+        if (ast->ctor_initializer) {
+            bool looksLikeCtor = false;
+            if (ty.isValid() || ! fun->identity())
+                looksLikeCtor = false;
+            else if (fun->identity()->isNameId() || fun->identity()->isTemplateNameId())
+                looksLikeCtor = true;
+
+            if (! looksLikeCtor) {
+                translationUnit()->error(ast->ctor_initializer->firstToken(),
+                                         "only constructors take base initializers");
+            }
         }
-    }
 
-    const int previousVisibility = semantic()->switchVisibility(Symbol::Public);
-    const int previousMethodKey = semantic()->switchMethodKey(Function::NormalMethod);
+        const int previousVisibility = semantic()->switchVisibility(Symbol::Public);
+        const int previousMethodKey = semantic()->switchMethodKey(Function::NormalMethod);
 
-    semantic()->check(ast->function_body, fun->members());
+        semantic()->check(ast->function_body, fun->members());
 
-    semantic()->switchMethodKey(previousMethodKey);
-    semantic()->switchVisibility(previousVisibility);
+        semantic()->switchMethodKey(previousMethodKey);
+        semantic()->switchVisibility(previousVisibility);
+    }
 
     return false;
 }
diff --git a/src/shared/cplusplus/Semantic.cpp b/src/shared/cplusplus/Semantic.cpp
index ff0fa418f87d8ee82372b6b495449633aa81130a..9e7108bbc54f71a218a442446ef5615de6a24a7b 100644
--- a/src/shared/cplusplus/Semantic.cpp
+++ b/src/shared/cplusplus/Semantic.cpp
@@ -67,6 +67,7 @@ public:
     Data(Semantic *semantic, Control *control)
         : semantic(semantic),
           control(control),
+          skipFunctionBodies(false),
           visibility(Symbol::Public),
           methodKey(Function::NormalMethod),
           checkSpecifier(0),
@@ -89,6 +90,7 @@ public:
 
     Semantic *semantic;
     Control *control;
+    bool skipFunctionBodies;
     int visibility;
     int methodKey;
     CheckSpecifier *checkSpecifier;
@@ -142,6 +144,12 @@ Name *Semantic::check(NameAST *name, Scope *scope)
 Name *Semantic::check(NestedNameSpecifierAST *name, Scope *scope)
 { return d->checkName->check(name, scope); }
 
+bool Semantic::skipFunctionBodies() const
+{ return d->skipFunctionBodies; }
+
+void Semantic::setSkipFunctionBodies(bool skipFunctionBodies)
+{ d->skipFunctionBodies = skipFunctionBodies; }
+
 int Semantic::currentVisibility() const
 { return d->visibility; }
 
diff --git a/src/shared/cplusplus/Semantic.h b/src/shared/cplusplus/Semantic.h
index ef9753b092d01fa2160302f83ba60710a02dc934..9b9a4195be81c26a612948b356f95a05dab8e83b 100644
--- a/src/shared/cplusplus/Semantic.h
+++ b/src/shared/cplusplus/Semantic.h
@@ -84,6 +84,9 @@ public:
 
     Name *check(NestedNameSpecifierAST *name, Scope *scope);
 
+    bool skipFunctionBodies() const;
+    void setSkipFunctionBodies(bool skipFunctionBodies);
+
     int currentVisibility() const;
     int switchVisibility(int visibility);