diff --git a/src/libs/cplusplus/CheckUndefinedSymbols.cpp b/src/libs/cplusplus/CheckUndefinedSymbols.cpp
index 19b17c4fbb3301a1169e4b76a9c27d0724b44c24..ca43b1fb3d90fb01f2aa82e790f3c3d3594c2429 100644
--- a/src/libs/cplusplus/CheckUndefinedSymbols.cpp
+++ b/src/libs/cplusplus/CheckUndefinedSymbols.cpp
@@ -84,14 +84,32 @@ QByteArray CheckUndefinedSymbols::templateParameterName(DeclarationAST *ast) con
 
 bool CheckUndefinedSymbols::isType(const QByteArray &name) const
 {
+    for (int i = _compoundStatementStack.size() - 1; i != -1; --i) {
+        Scope *members = _compoundStatementStack.at(i)->symbol->members();
+
+        for (unsigned m = 0; m < members->symbolCount(); ++m) {
+            Symbol *member = members->symbolAt(m);
+
+            if (member->isTypedef() && member->isDeclaration()) {
+                if (Identifier *id = member->identifier()) {
+                    if (name == id->chars())
+                        return true;
+                }
+            }
+        }
+    }
+
     for (int i = _templateDeclarationStack.size() - 1; i != - 1; --i) {
         TemplateDeclarationAST *templateDeclaration = _templateDeclarationStack.at(i);
+
         for (DeclarationListAST *it = templateDeclaration->template_parameters; it; it = it->next) {
             DeclarationAST *templateParameter = it->declaration;
+
             if (templateParameterName(templateParameter) == name)
                 return true;
         }
     }
+
     return _types.contains(name);
 }
 
@@ -180,10 +198,17 @@ FunctionDeclaratorAST *CheckUndefinedSymbols::currentFunctionDeclarator() const
     return _functionDeclaratorStack.last();
 }
 
+CompoundStatementAST *CheckUndefinedSymbols::compoundStatement() const
+{
+    if (_compoundStatementStack.isEmpty())
+        return 0;
+
+    return _compoundStatementStack.last();
+}
+
 bool CheckUndefinedSymbols::visit(FunctionDeclaratorAST *ast)
 {
     _functionDeclaratorStack.append(ast);
-
     return true;
 }
 
@@ -289,6 +314,17 @@ bool CheckUndefinedSymbols::visit(FunctionDefinitionAST *ast)
 void CheckUndefinedSymbols::endVisit(FunctionDefinitionAST *)
 { }
 
+bool CheckUndefinedSymbols::visit(CompoundStatementAST *ast)
+{
+    _compoundStatementStack.append(ast);
+    return true;
+}
+
+void CheckUndefinedSymbols::endVisit(CompoundStatementAST *)
+{
+    _compoundStatementStack.removeLast();
+}
+
 bool CheckUndefinedSymbols::visit(SimpleDeclarationAST *ast)
 {
     const bool check = qobjectCheck();
diff --git a/src/libs/cplusplus/CheckUndefinedSymbols.h b/src/libs/cplusplus/CheckUndefinedSymbols.h
index 247f6bc795da0579331b00c1d574f2ff30b9adb5..3108cda0e6f921dec63743db0c6453444d6e05e6 100644
--- a/src/libs/cplusplus/CheckUndefinedSymbols.h
+++ b/src/libs/cplusplus/CheckUndefinedSymbols.h
@@ -58,7 +58,9 @@ protected:
     void addType(Name *name);
     void buildTypeMap(Class *klass);
     void buildTypeMap(NamespaceBinding *binding, QSet<NamespaceBinding *> *processed);
+
     FunctionDeclaratorAST *currentFunctionDeclarator() const;
+    CompoundStatementAST *compoundStatement() const;
     bool qobjectCheck() const;
 
     QByteArray templateParameterName(NameAST *ast) const;
@@ -79,6 +81,9 @@ protected:
     virtual bool visit(FunctionDefinitionAST *ast);
     virtual void endVisit(FunctionDefinitionAST *ast);
 
+    virtual bool visit(CompoundStatementAST *ast);
+    virtual void endVisit(CompoundStatementAST *ast);
+
     virtual bool visit(SimpleDeclarationAST *ast);
     virtual bool visit(BaseSpecifierAST *base);
     virtual bool visit(UsingDirectiveAST *ast);
@@ -92,6 +97,7 @@ private:
     QList<bool> _qobjectStack;
     QList<FunctionDeclaratorAST *> _functionDeclaratorStack;
     QList<TemplateDeclarationAST *> _templateDeclarationStack;
+    QList<CompoundStatementAST *> _compoundStatementStack;
     QSet<QByteArray> _types;
     QSet<QByteArray> _namespaceNames;
 };