diff --git a/src/libs/cplusplus/CppDocument.cpp b/src/libs/cplusplus/CppDocument.cpp
index 675cf6edf91a6a95ae683e2084ac0cc3be241c68..4d86c52d742c9e0d34d7570c670032fd9ce8f70f 100644
--- a/src/libs/cplusplus/CppDocument.cpp
+++ b/src/libs/cplusplus/CppDocument.cpp
@@ -390,6 +390,9 @@ void Document::check(CheckMode mode)
 {
     Q_ASSERT(!_globalNamespace);
 
+    if (! isParsed())
+        parse();
+
     Semantic semantic(_control);
     if (mode == FastCheck)
         semantic.setSkipFunctionBodies(true);
@@ -450,7 +453,6 @@ Document::Ptr Snapshot::documentFromSource(const QByteArray &preprocessedCode,
     }
 
     newDoc->setSource(preprocessedCode);
-    newDoc->parse();
     return newDoc;
 }
 
diff --git a/src/plugins/cpptools/cppsemanticsearch.cpp b/src/plugins/cpptools/cppsemanticsearch.cpp
index 808f060b58d49cfffaa8f8b116f43c9e6d73cedd..554290e478589a417edb7b7af8ac6ad2603480fb 100644
--- a/src/plugins/cpptools/cppsemanticsearch.cpp
+++ b/src/plugins/cpptools/cppsemanticsearch.cpp
@@ -288,6 +288,7 @@ static void semanticSearch_helper(QFutureInterface<Core::Utils::FileSearchResult
         }
 
         Document::Ptr newDoc = snapshot.documentFromSource(source, fileName);
+        newDoc->parse();
 
         if (SemanticSearch *search = factory->create(future, newDoc, snapshot)) {
             search->setSource(source);
diff --git a/src/plugins/cpptools/cpptoolseditorsupport.cpp b/src/plugins/cpptools/cpptoolseditorsupport.cpp
index 09ab7f15f07657c28a3850577014e9cf6c063d4f..121488202585832697c5aa39dce555ace2c0c457 100644
--- a/src/plugins/cpptools/cpptoolseditorsupport.cpp
+++ b/src/plugins/cpptools/cpptoolseditorsupport.cpp
@@ -412,6 +412,8 @@ void CppEditorSupport::checkDocumentNow()
     const QByteArray preprocessedCode = snapshot.preprocessedCode(plainText, fileName);
 
     if (Document::Ptr doc = snapshot.documentFromSource(preprocessedCode, fileName)) {
+        doc->parse();
+
         CheckDocument checkDocument(doc, snapshot);
         QList<QuickFixOperationPtr> quickFixes = checkDocument(ed->textCursor());
         if (! quickFixes.isEmpty()) {
diff --git a/src/shared/cplusplus/TranslationUnit.cpp b/src/shared/cplusplus/TranslationUnit.cpp
index 053f76f2af1275dc5444727ee16789bdcde56310..b661bf26a0474cb8ca55b448cbafcc4f75951ca9 100644
--- a/src/shared/cplusplus/TranslationUnit.cpp
+++ b/src/shared/cplusplus/TranslationUnit.cpp
@@ -255,6 +255,8 @@ bool TranslationUnit::parse(ParseMode mode)
     if (! isTokenized())
         tokenize();
 
+    f._parsed = true;
+
     Parser parser(this);
     parser.setQtMocRunEnabled(f._qtMocRunEnabled);
     parser.setObjCEnabled(f._objCEnabled);