]> granicus.if.org Git - clang/commitdiff
objc: fixes a problem in block type comparison involving
authorFariborz Jahanian <fjahanian@apple.com>
Mon, 6 Feb 2012 19:06:20 +0000 (19:06 +0000)
committerFariborz Jahanian <fjahanian@apple.com>
Mon, 6 Feb 2012 19:06:20 +0000 (19:06 +0000)
enums with underlying type explicitly specified
(feature which is on by default in objective-c).
// rdar://10798770

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

lib/AST/ASTContext.cpp
test/SemaObjC/block-type-safety.m

index 51cbc3c9d7b8ba6c160a758251b6df2405e45e38..416045e2342e93f625796f0adf17217d164090d4 100644 (file)
@@ -5960,11 +5960,13 @@ QualType ASTContext::mergeTypes(QualType LHS, QualType RHS,
     // Compatibility is based on the underlying type, not the promotion
     // type.
     if (const EnumType* ETy = LHS->getAs<EnumType>()) {
-      if (ETy->getDecl()->getIntegerType() == RHSCan.getUnqualifiedType())
+      QualType TINT = ETy->getDecl()->getIntegerType();
+      if (!TINT.isNull() && hasSameType(TINT, RHSCan.getUnqualifiedType()))
         return RHS;
     }
     if (const EnumType* ETy = RHS->getAs<EnumType>()) {
-      if (ETy->getDecl()->getIntegerType() == LHSCan.getUnqualifiedType())
+      QualType TINT = ETy->getDecl()->getIntegerType();
+      if (!TINT.isNull() && hasSameType(TINT, LHSCan.getUnqualifiedType()))
         return LHS;
     }
     // allow block pointer type to match an 'id' type.
index ebc6777f7fbb1cb7d76f1a6fcf6e41bfbfd5830f..bfb848e01cb6f4959d7dd2451198303b747fc1a3 100644 (file)
@@ -138,3 +138,20 @@ int test5() {
     return 0;
 }
 
+// rdar://10798770
+typedef int NSInteger;
+
+typedef enum : NSInteger {NSOrderedAscending = -1L, NSOrderedSame, NSOrderedDescending} NSComparisonResult;
+
+typedef NSComparisonResult (^NSComparator)(id obj1, id obj2);
+
+@interface radar10798770
+- (void)sortUsingComparator:(NSComparator)c;
+@end
+
+void f() {
+   radar10798770 *f;
+   [f sortUsingComparator:^(id a, id b) {
+        return NSOrderedSame;
+   }];
+}