]> granicus.if.org Git - clang/commitdiff
The "real" fix for <rdar://problem/6424347> clang on xcode: Assertion failed: (0...
authorSteve Naroff <snaroff@apple.com>
Wed, 10 Dec 2008 22:14:21 +0000 (22:14 +0000)
committerSteve Naroff <snaroff@apple.com>
Wed, 10 Dec 2008 22:14:21 +0000 (22:14 +0000)
Commit r60845 was premature.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@60852 91177308-0d34-0410-b5e6-96231b3b80d8

lib/AST/ASTContext.cpp
test/SemaObjC/method-conflict.m

index 233a661a4c9a0e62953a4282948422a30f3d2940..044106300cb759c86cf1ee6c5d47a93b5cb157d8 100644 (file)
@@ -2122,36 +2122,35 @@ QualType ASTContext::mergeTypes(QualType LHS, QualType RHS) {
   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 @@ QualType ASTContext::mergeTypes(QualType LHS, QualType RHS) {
     // 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();
index c46f4899123e3c70e4649c9b21790afb47adc6af..c2fb7ca4386749148de58c08d74a2968925c67fd 100644 (file)
@@ -25,7 +25,8 @@ typedef struct _NSRange {
 }
   CSSM_FIELDGROUP, *CSSM_FIELDGROUP_PTR;
 @protocol XDUMLClassifier;
-@protocol XDUMLClassInterfaceCommons <XDUMLClassifier>    @end  @protocol XDUMLImplementation;
+@protocol XDUMLClassInterfaceCommons <XDUMLClassifier>  // expected-warning {{cannot find protocol definition for 'XDUMLClassifier'}}
+@end  @protocol XDUMLImplementation;
 @protocol XDUMLElement <NSObject> - (NSArray *) ownedElements;
 @end @protocol XDUMLDataType;
 @protocol XDUMLNamedElement <XDUMLElement>     - (NSString *) name;
@@ -39,7 +40,7 @@ typedef NSUInteger XDSourceLanguage;
 @end  @class XDSCOperation;
 @interface XDSCClassFormatter : NSObject {
 }
-+ (NSUInteger) compartmentsForClassifier: (id <XDUMLClassifier>) classifier withSpecification: (XDSCDisplaySpecification *) displaySpec;
++ (NSUInteger) compartmentsForClassifier: (id <XDUMLClassifier>) classifier withSpecification: (XDSCDisplaySpecification *) displaySpec; // expected-note {{previous definition is here}}
 @end  
 @class NSString;
 @implementation XDSCClassFormatter       
@@ -47,7 +48,7 @@ typedef NSUInteger XDSourceLanguage;
 + appendVisibility: (id <XDUMLNamedElement>) element withSpecification: (XDSCDisplaySpecification *) displaySpec to: (NSMutableAttributedString *) attributedString
 {
 }
-// FIXME: should we warn? (since the protocols are different). FWIW...GCC doesn't currently.
-+ (NSUInteger) compartmentsForClassifier: (id <XDSCClassifier>) classifier withSpecification: (XDSCDisplaySpecification *) displaySpec {
+// GCC doesn't currently warn about this.
++ (NSUInteger) compartmentsForClassifier: (id <XDSCClassifier>) classifier withSpecification: (XDSCDisplaySpecification *) displaySpec { // expected-warning {{conflicting types for 'compartmentsForClassifier:withSpecification:'}}
 }
 @end 
\ No newline at end of file