diff --git a/src/libs/cplusplus/CppDocument.cpp b/src/libs/cplusplus/CppDocument.cpp
index 64654030f2813e33f6cb0e507ed69299d35326e0..bd93b8bb318653c3d66a7d8b8aa2430906656aa4 100644
--- a/src/libs/cplusplus/CppDocument.cpp
+++ b/src/libs/cplusplus/CppDocument.cpp
@@ -329,6 +329,8 @@ void Document::check()
         for (DeclarationAST *decl = ast->declarations; decl; decl = decl->next) {
             semantic.check(decl, globals);
         }
+    } else if (ExpressionAST *ast = _translationUnit->ast()->asExpression()) {
+        semantic.check(ast, globals);
     }
 }
 
diff --git a/src/libs/cplusplus/ResolveExpression.cpp b/src/libs/cplusplus/ResolveExpression.cpp
index 7fa9751f1c4d05b46aa53b85a50d90873a610be8..9124087b6c628513aa6fdc88fe4ed6a9918df8f3 100644
--- a/src/libs/cplusplus/ResolveExpression.cpp
+++ b/src/libs/cplusplus/ResolveExpression.cpp
@@ -259,8 +259,7 @@ bool ResolveExpression::visit(BinaryExpressionAST *ast)
 
 bool ResolveExpression::visit(CastExpressionAST *ast)
 {
-    Scope dummy;
-    addResult(sem.check(ast->type_id, &dummy));
+    addResult(sem.check(ast->type_id, _context.expressionDocument()->globalSymbols()));
     return false;
 }
 
@@ -278,8 +277,7 @@ bool ResolveExpression::visit(ConditionalExpressionAST *)
 
 bool ResolveExpression::visit(CppCastExpressionAST *ast)
 {
-    Scope dummy;
-    addResult(sem.check(ast->type_id, &dummy));
+    addResult(sem.check(ast->type_id, _context.expressionDocument()->globalSymbols()));
     return false;
 }
 
@@ -450,8 +448,7 @@ bool ResolveExpression::visit(CompoundLiteralAST *ast)
 bool ResolveExpression::visit(QualifiedNameAST *ast)
 {
     ResolveClass resolveClass;
-    Scope dummy;
-    Name *name = sem.check(ast, &dummy);
+    Name *name = ast->name;
 
     QList<Symbol *> symbols = _context.resolve(name);
     foreach (Symbol *symbol, symbols) {
@@ -485,10 +482,7 @@ bool ResolveExpression::visit(ConversionFunctionIdAST *)
 
 bool ResolveExpression::visit(SimpleNameAST *ast)
 {
-    Scope dummy;
-    Name *name = sem.check(ast, &dummy);
-
-    QList<Symbol *> symbols = _context.resolve(name);
+    QList<Symbol *> symbols = _context.resolve(ast->name);
     foreach (Symbol *symbol, symbols)
         addResult(symbol->type(), symbol);
 
@@ -504,10 +498,7 @@ bool ResolveExpression::visit(DestructorNameAST *)
 
 bool ResolveExpression::visit(TemplateIdAST *ast)
 {
-    Scope dummy;
-    Name *name = sem.check(ast, &dummy);
-
-    QList<Symbol *> symbols = _context.resolve(name);
+    QList<Symbol *> symbols = _context.resolve(ast->name);
     foreach (Symbol *symbol, symbols)
         addResult(symbol->type(), symbol);
 
@@ -601,8 +592,9 @@ bool ResolveExpression::visit(MemberAccessAST *ast)
     QList<Result> baseResults = _results;
 
     // Evaluate the expression-id that follows the access operator.
-    Scope dummy;
-    Name *memberName = sem.check(ast->member_name, &dummy);
+    Name *memberName = 0;
+    if (ast->member_name)
+        memberName = ast->member_name->name;
 
     // Remember the access operator.
     const unsigned accessOp = tokenKind(ast->access_token);
diff --git a/src/libs/cplusplus/TypeOfExpression.cpp b/src/libs/cplusplus/TypeOfExpression.cpp
index 7d2d7ffdb0772d9447114aca6c64f7ab6ffe0fb2..a2a7b58f9a7c4b71cb7f24f91fed97f129db5563 100644
--- a/src/libs/cplusplus/TypeOfExpression.cpp
+++ b/src/libs/cplusplus/TypeOfExpression.cpp
@@ -63,6 +63,7 @@ QList<TypeOfExpression::Result> TypeOfExpression::operator()(const QString &expr
     if (mode == Preprocess)
         code = preprocessedExpression(expression, m_snapshot, document);
     Document::Ptr expressionDoc = documentForExpression(code);
+    expressionDoc->check();
     m_ast = extractExpressionAST(expressionDoc);
 
     m_lookupContext = LookupContext(lastVisibleSymbol, expressionDoc,