The "real" fix for <rdar://problem/6424347> clang on xcode: Assertion failed: (0 && "unexpected type"), function mergeTypes,

Commit r60845 was premature.



git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@60852 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/lib/AST/ASTContext.cpp b/lib/AST/ASTContext.cpp
index 233a661..0441063 100644
--- a/lib/AST/ASTContext.cpp
+++ b/lib/AST/ASTContext.cpp
@@ -2122,36 +2122,35 @@
   if (LHSClass == Type::ObjCQualifiedInterface) LHSClass = Type::ObjCInterface;
   if (RHSClass == Type::ObjCQualifiedInterface) RHSClass = Type::ObjCInterface;
 
-  // ID is compatible with all qualified id types.
-  if (LHS->isObjCQualifiedIdType()) {
-    if (const PointerType *PT = RHS->getAsPointerType()) {
-      QualType pType = PT->getPointeeType();
-      if (isObjCIdType(pType))
-        return LHS;
-      // FIXME: need to use ObjCQualifiedIdTypesAreCompatible(LHS, RHS, true).
-      // Unfortunately, this API is part of Sema (which we don't have access
-      // to. Need to refactor. The following check is insufficient, since we 
-      // need to make sure the class implements the protocol.
-      if (pType->isObjCInterfaceType())
-        return LHS;
-    }
-  }
-  if (RHS->isObjCQualifiedIdType()) {
-    if (const PointerType *PT = LHS->getAsPointerType()) {
-      QualType pType = PT->getPointeeType();
-      if (isObjCIdType(pType))
-        return RHS;
-      // FIXME: need to use ObjCQualifiedIdTypesAreCompatible(LHS, RHS, true).
-      // Unfortunately, this API is part of Sema (which we don't have access
-      // to. Need to refactor. The following check is insufficient, since we 
-      // need to make sure the class implements the protocol.
-      if (pType->isObjCInterfaceType())
-        return RHS;
-    }
-  }
   // If the canonical type classes don't match.
   if (LHSClass != RHSClass) {
-
+    // ID is compatible with all qualified id types.
+    if (LHS->isObjCQualifiedIdType()) {
+      if (const PointerType *PT = RHS->getAsPointerType()) {
+        QualType pType = PT->getPointeeType();
+        if (isObjCIdType(pType))
+          return LHS;
+        // FIXME: need to use ObjCQualifiedIdTypesAreCompatible(LHS, RHS, true).
+        // Unfortunately, this API is part of Sema (which we don't have access
+        // to. Need to refactor. The following check is insufficient, since we 
+        // need to make sure the class implements the protocol.
+        if (pType->isObjCInterfaceType())
+          return LHS;
+      }
+    }
+    if (RHS->isObjCQualifiedIdType()) {
+      if (const PointerType *PT = LHS->getAsPointerType()) {
+        QualType pType = PT->getPointeeType();
+        if (isObjCIdType(pType))
+          return RHS;
+        // FIXME: need to use ObjCQualifiedIdTypesAreCompatible(LHS, RHS, true).
+        // Unfortunately, this API is part of Sema (which we don't have access
+        // to. Need to refactor. The following check is insufficient, since we 
+        // need to make sure the class implements the protocol.
+        if (pType->isObjCInterfaceType())
+          return RHS;
+      }
+    }
     // C99 6.7.2.2p4: Each enumerated type shall be compatible with char,
     // a signed integer type, or an unsigned integer type. 
     if (const EnumType* ETy = LHS->getAsEnumType()) {
@@ -2253,6 +2252,9 @@
     // Distinct ObjC interfaces are not compatible; see canAssignObjCInterfaces
     // for checking assignment/comparison safety
     return QualType();
+  case Type::ObjCQualifiedId:
+    // Distinct qualified id's are not compatible.
+    return QualType();
   default:
     assert(0 && "unexpected type");
     return QualType();