]> granicus.if.org Git - clang/commitdiff
Misc. fixes to bring Objetive-C++'s handling of
authorFariborz Jahanian <fjahanian@apple.com>
Tue, 18 May 2010 23:04:17 +0000 (23:04 +0000)
committerFariborz Jahanian <fjahanian@apple.com>
Tue, 18 May 2010 23:04:17 +0000 (23:04 +0000)
gc attributes to be inline with Objective-C
(for radar 7925141).

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

lib/Sema/SemaObjCProperty.cpp
lib/Sema/SemaOverload.cpp
test/SemaObjC/error-property-gc-attr.m

index 453ea25859e6f2799c8748594a14a4032ec714d4..4c89a118bc9a132bf118b5e01cca3d020e3eaae3 100644 (file)
@@ -383,7 +383,16 @@ Sema::DeclPtrTy Sema::ActOnPropertyImplDecl(Scope *S,
 
     // Check that type of property and its ivar are type compatible.
     if (PropType != IvarType) {
-      if (CheckAssignmentConstraints(PropType, IvarType) != Compatible) {
+      bool compat = false;
+      if (isa<ObjCObjectPointerType>(PropType) 
+            && isa<ObjCObjectPointerType>(IvarType))
+        compat = 
+          Context.canAssignObjCInterfaces(
+                                  PropType->getAs<ObjCObjectPointerType>(),
+                                  IvarType->getAs<ObjCObjectPointerType>());
+      else 
+        compat = (CheckAssignmentConstraints(PropType, IvarType) == Compatible);
+      if (!compat) {
         Diag(PropertyLoc, diag::error_property_ivar_type)
           << property->getDeclName() << PropType
           << Ivar->getDeclName() << IvarType;
index 365daa60183b3c23098f3d57bff55c1f2312d158..897ee6626524aa86de43cc85e1b032a87c9dd884 100644 (file)
@@ -1042,7 +1042,8 @@ Sema::IsStandardConversion(Expr* From, QualType ToType,
     CanonTo = Context.getCanonicalType(ToType);
     if (CanonFrom.getLocalUnqualifiedType() 
                                        == CanonTo.getLocalUnqualifiedType() &&
-        CanonFrom.getLocalCVRQualifiers() != CanonTo.getLocalCVRQualifiers()) {
+        (CanonFrom.getLocalCVRQualifiers() != CanonTo.getLocalCVRQualifiers()
+         || CanonFrom.getObjCGCAttr() != CanonTo.getObjCGCAttr())) {
       FromType = ToType;
       CanonFrom = CanonTo;
     }
index a36170475bc2268df9d8c12ed87490ef7dba0fba..661638c52e06923c40f067f71a45b1819078e63e 100644 (file)
@@ -1,4 +1,5 @@
 // RUN: %clang_cc1 -triple i386-apple-darwin9 -fobjc-gc -fsyntax-only -verify %s
+// RUN: %clang_cc1 -x objective-c++ -triple i386-apple-darwin9 -fobjc-gc -fsyntax-only -verify %s
 
 @interface INTF
 {
@@ -11,7 +12,7 @@
 }
 @property (assign) __weak id pweak;
 @property (assign) __weak id WID;
-@property (assign) __strong id not;
+@property (assign) __strong id NOT;
 @property (assign)  id ID;
 @property (assign) INTF* AWEAK;
 @property (assign) __weak INTF* WI;
@@ -19,7 +20,7 @@
 
 @implementation INTF
 @synthesize pweak=IVAR;  // expected-error {{existing ivar 'IVAR' for __weak property 'pweak' must be __weak}}
-@synthesize not=II; // expected-error {{existing ivar 'II' for a __strong property 'not' must be garbage collectable}}
+@synthesize NOT=II; // expected-error {{existing ivar 'II' for a __strong property 'NOT' must be garbage collectable}}
 @synthesize WID;
 @synthesize ID;
 @synthesize AWEAK; // expected-error {{existing ivar 'AWEAK' for a __strong property 'AWEAK' must be garbage collectable}}