]> granicus.if.org Git - clang/commitdiff
Add some more implicit conversions for Objective-C++
authorDouglas Gregor <dgregor@apple.com>
Thu, 18 Dec 2008 23:43:31 +0000 (23:43 +0000)
committerDouglas Gregor <dgregor@apple.com>
Thu, 18 Dec 2008 23:43:31 +0000 (23:43 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@61229 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Sema/SemaOverload.cpp
test/SemaObjCXX/overload.mm

index 5e3ec3f4bbd2e3cdcf119d01b71bfacf6276f517..3671711964c9eabe4bf664c3352956860a49db35 100644 (file)
@@ -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
index 01ca1c1ce5370eaeb908d06f3f083d555dc2ae54..16a36fc58b303859d9ebfdb078e0c5fda2ce123d 100644 (file)
@@ -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