From: Steve Naroff Date: Wed, 10 Dec 2008 22:14:21 +0000 (+0000) Subject: The "real" fix for clang on xcode: Assertion failed: (0... X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=bc76dd06eb881c70c9775b74bab8b88cd747f173;p=clang The "real" fix for 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 233a661a4c..044106300c 100644 --- a/lib/AST/ASTContext.cpp +++ b/lib/AST/ASTContext.cpp @@ -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(); diff --git a/test/SemaObjC/method-conflict.m b/test/SemaObjC/method-conflict.m index c46f489912..c2fb7ca438 100644 --- a/test/SemaObjC/method-conflict.m +++ b/test/SemaObjC/method-conflict.m @@ -25,7 +25,8 @@ typedef struct _NSRange { } CSSM_FIELDGROUP, *CSSM_FIELDGROUP_PTR; @protocol XDUMLClassifier; -@protocol XDUMLClassInterfaceCommons @end @protocol XDUMLImplementation; +@protocol XDUMLClassInterfaceCommons // expected-warning {{cannot find protocol definition for 'XDUMLClassifier'}} +@end @protocol XDUMLImplementation; @protocol XDUMLElement - (NSArray *) ownedElements; @end @protocol XDUMLDataType; @protocol XDUMLNamedElement - (NSString *) name; @@ -39,7 +40,7 @@ typedef NSUInteger XDSourceLanguage; @end @class XDSCOperation; @interface XDSCClassFormatter : NSObject { } -+ (NSUInteger) compartmentsForClassifier: (id ) classifier withSpecification: (XDSCDisplaySpecification *) displaySpec; ++ (NSUInteger) compartmentsForClassifier: (id ) classifier withSpecification: (XDSCDisplaySpecification *) displaySpec; // expected-note {{previous definition is here}} @end @class NSString; @implementation XDSCClassFormatter @@ -47,7 +48,7 @@ typedef NSUInteger XDSourceLanguage; + appendVisibility: (id ) element withSpecification: (XDSCDisplaySpecification *) displaySpec to: (NSMutableAttributedString *) attributedString { } -// FIXME: should we warn? (since the protocols are different). FWIW...GCC doesn't currently. -+ (NSUInteger) compartmentsForClassifier: (id ) classifier withSpecification: (XDSCDisplaySpecification *) displaySpec { +// GCC doesn't currently warn about this. ++ (NSUInteger) compartmentsForClassifier: (id ) classifier withSpecification: (XDSCDisplaySpecification *) displaySpec { // expected-warning {{conflicting types for 'compartmentsForClassifier:withSpecification:'}} } @end \ No newline at end of file