objc: fixes a problem in block type comparison involving

enums with underlying type explicitly specified
(feature which is on by default in objective-c). 
// rdar://10798770

llvm-svn: 149888
This commit is contained in:
Fariborz Jahanian 2012-02-06 19:06:20 +00:00
parent 206dddda15
commit adfe905145
2 changed files with 21 additions and 2 deletions

View 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.

View 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;
}];
}