diff options
-rw-r--r-- | lib/Sema/SemaOverload.cpp | 20 | ||||
-rw-r--r-- | test/SemaObjCXX/overload.mm | 12 |
2 files changed, 32 insertions, 0 deletions
diff --git a/lib/Sema/SemaOverload.cpp b/lib/Sema/SemaOverload.cpp index 5e3ec3f4bb..3671711964 100644 --- a/lib/Sema/SemaOverload.cpp +++ b/lib/Sema/SemaOverload.cpp @@ -846,6 +846,16 @@ bool Sema::IsPointerConversion(Expr *From, QualType FromType, QualType ToType, return true; } + // Objective C++: Allow conversions between the Objective-C "id" and + // "Class", in either direction. + if ((Context.isObjCIdType(FromPointeeType) && + Context.isObjCClassType(ToPointeeType)) || + (Context.isObjCClassType(FromPointeeType) && + Context.isObjCIdType(ToPointeeType))) { + ConvertedType = ToType; + return true; + } + return false; } @@ -864,6 +874,16 @@ bool Sema::CheckPointerConversion(Expr *From, QualType ToType) { /*DetectVirtual=*/false); QualType FromPointeeType = FromPtrType->getPointeeType(), ToPointeeType = ToPtrType->getPointeeType(); + + // Objective-C++ conversions are always okay. + // FIXME: We should have a different class of conversions for + // the Objective-C++ implicit conversions. + if (Context.isObjCIdType(FromPointeeType) || + Context.isObjCIdType(ToPointeeType) || + Context.isObjCClassType(FromPointeeType) || + Context.isObjCClassType(ToPointeeType)) + return false; + if (FromPointeeType->isRecordType() && ToPointeeType->isRecordType()) { // We must have a derived-to-base conversion. Check an diff --git a/test/SemaObjCXX/overload.mm b/test/SemaObjCXX/overload.mm index 01ca1c1ce5..16a36fc58b 100644 --- a/test/SemaObjCXX/overload.mm +++ b/test/SemaObjCXX/overload.mm @@ -1,4 +1,16 @@ // RUN: clang -fsyntax-only -verify %s +@interface Foo +@end + +@implementation Foo + +void func(id); + ++ zone { + func(self); + return self; +} + @protocol P0 @end |