diff --git a/src/shared/cplusplus/AST.h b/src/shared/cplusplus/AST.h
index f5e3ac42fc57463e533e6a4aa54d57792cc895b8..ecb0ddc3fb9b46a334c269bf680b270f9aeaed46 100644
--- a/src/shared/cplusplus/AST.h
+++ b/src/shared/cplusplus/AST.h
@@ -422,6 +422,9 @@ public:
     NameAST *name;
     BaseSpecifierAST *next;
 
+public: // annotations
+    BaseClass *base_class_symbol;
+
 public:
     virtual unsigned firstToken() const;
     virtual unsigned lastToken() const;
@@ -1060,6 +1063,9 @@ protected:
 
 class CPLUSPLUS_EXPORT NameAST: public ExpressionAST
 {
+public: // annotations
+    Name *name;
+
 public:
     virtual NameAST *clone(MemoryPool *pool) const = 0;
 };
diff --git a/src/shared/cplusplus/CheckName.cpp b/src/shared/cplusplus/CheckName.cpp
index 09b90f3cb804f4c777eaa4b29ee96a16e52a7d8d..dfd8158464052704ce5f9ce60ebddc07a8aa1eca 100644
--- a/src/shared/cplusplus/CheckName.cpp
+++ b/src/shared/cplusplus/CheckName.cpp
@@ -121,6 +121,8 @@ bool CheckName::visit(QualifiedNameAST *ast)
     names.push_back(semantic()->check(ast->unqualified_name, _scope));
     _name = control()->qualifiedNameId(&names[0], names.size(),
                                           ast->global_scope_token != 0);
+
+    ast->name = _name;
     return false;
 }
 
@@ -302,6 +304,7 @@ bool CheckName::visit(OperatorFunctionIdAST *ast)
     } // switch
 
     _name = control()->operatorNameId(kind);
+    ast->name = _name;
     return false;
 }
 
@@ -317,6 +320,7 @@ bool CheckName::visit(SimpleNameAST *ast)
 {
     Identifier *id = identifier(ast->identifier_token);
     _name = control()->nameId(id);
+    ast->name = _name;
     return false;
 }
 
@@ -324,6 +328,7 @@ bool CheckName::visit(DestructorNameAST *ast)
 {
     Identifier *id = identifier(ast->identifier_token);
     _name = control()->destructorNameId(id);
+    ast->name = _name;
     return false;
 }
 
@@ -342,6 +347,7 @@ bool CheckName::visit(TemplateIdAST *ast)
     else
         _name = control()->templateNameId(id, &templateArguments[0],
                                           templateArguments.size());
+    ast->name = _name;
     return false;
 }
 
diff --git a/src/shared/cplusplus/CheckSpecifier.cpp b/src/shared/cplusplus/CheckSpecifier.cpp
index cb929b868caac1c68d314fc79ed7fa951983bf31..bee510d31dcf84426efc4866b0b8cc64d3bc572a 100644
--- a/src/shared/cplusplus/CheckSpecifier.cpp
+++ b/src/shared/cplusplus/CheckSpecifier.cpp
@@ -315,6 +315,7 @@ bool CheckSpecifier::visit(ClassSpecifierAST *ast)
     for (BaseSpecifierAST *base = ast->base_clause; base; base = base->next) {
         Name *baseClassName = semantic()->check(base->name, _scope);
         BaseClass *baseClass = control()->newBaseClass(ast->firstToken(), baseClassName);
+        base->base_class_symbol = baseClass;
         if (base->token_virtual)
             baseClass->setVirtual(true);
         if (base->token_access_specifier) {