diff --git a/src/libs/cplusplus/LookupContext.cpp b/src/libs/cplusplus/LookupContext.cpp
index 9e81af2ac1c09ff248c4c259266a7914e55012ef..1d8811173b1f0ed44e91e4d56567365e52c8ee99 100644
--- a/src/libs/cplusplus/LookupContext.cpp
+++ b/src/libs/cplusplus/LookupContext.cpp
@@ -727,6 +727,8 @@ Symbol *LookupContext::canonicalSymbol(Symbol *symbol)
 {
     Symbol *canonical = symbol;
     Class *canonicalClass = 0;
+    ObjCClass *canonicalObjCClass = 0;
+    ObjCProtocol *canonicalObjCProto = 0;
 
     for (; symbol; symbol = symbol->next()) {
         if (symbol->identifier() == canonical->identifier()) {
@@ -734,6 +736,10 @@ Symbol *LookupContext::canonicalSymbol(Symbol *symbol)
 
             if (Class *klass = symbol->asClass())
                 canonicalClass = klass;
+            else if (ObjCClass *clazz = symbol->asObjCClass())
+                canonicalObjCClass = clazz;
+            else if (ObjCProtocol *proto = symbol->asObjCProtocol())
+                canonicalObjCProto = proto;
         }
     }
 
@@ -742,6 +748,16 @@ Symbol *LookupContext::canonicalSymbol(Symbol *symbol)
 
         if (canonical->isForwardClassDeclaration())
             return canonicalClass; // prefer class declarations when available.
+    } else if (canonicalObjCClass) {
+        Q_ASSERT(canonical != 0);
+
+        if (canonical->isObjCForwardClassDeclaration())
+            return canonicalObjCClass;
+    } else if (canonicalObjCProto) {
+        Q_ASSERT(canonical != 0);
+
+        if (canonical->isObjCForwardProtocolDeclaration())
+            return canonicalObjCProto;
     }
 
     if (canonical && canonical->scope()->isClassScope()) {