]> granicus.if.org Git - clang/commitdiff
objective-c++ must take into account qualifiers when
authorFariborz Jahanian <fjahanian@apple.com>
Mon, 15 Mar 2010 18:36:00 +0000 (18:36 +0000)
committerFariborz Jahanian <fjahanian@apple.com>
Mon, 15 Mar 2010 18:36:00 +0000 (18:36 +0000)
considering valid objc pointer converions.

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

lib/Sema/SemaOverload.cpp
test/SemaObjCXX/objc-pointer-conv.mm

index ff59fc3a7d368682f262d685f1a5ed82769124b5..a58b33f97f21a2457149cc0c984359a2fa499df3 100644 (file)
@@ -1135,6 +1135,12 @@ bool Sema::isObjCPointerConversion(QualType FromType, QualType ToType,
     // Objective C++: We're able to convert from a pointer to an
     // interface to a pointer to a different interface.
     if (Context.canAssignObjCInterfaces(ToObjCPtr, FromObjCPtr)) {
+      const ObjCInterfaceType* LHS = ToObjCPtr->getInterfaceType();
+      const ObjCInterfaceType* RHS = FromObjCPtr->getInterfaceType();
+      if (getLangOptions().CPlusPlus && LHS && RHS &&
+          !ToObjCPtr->getPointeeType().isAtLeastAsQualifiedAs(
+                                                FromObjCPtr->getPointeeType()))
+        return false;
       ConvertedType = ToType;
       return true;
     }
index c03e3aaad3db934699093e238e6a05e6a73f1f28..144bda4390d5ebaae887eaf39d6459440c2f19a8 100644 (file)
@@ -24,3 +24,15 @@ void RandomFunc(CFMDRef theDict, const void *key, const void *value);
     RandomFunc((CFMDRef)dict, key, objects[3]);
 }
 @end
+
+@interface I
+- (void) Meth : (I*) Arg;
+@end
+
+void Func (I* arg);  // expected-note {{candidate function not viable: no known conversion from 'I const *' to 'I *' for 1st argument}}
+
+void foo(const I *p, I* sel) {
+  [sel Meth : p];      // expected-error {{incompatible type sending 'I const *', expected 'I *'}}
+  Func(p);             // expected-error {{no matching function for call to 'Func'}}
+}
+