aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--lib/Sema/SemaOverload.cpp20
-rw-r--r--test/SemaObjCXX/overload.mm12
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