[cfe-commits] r65656 - in /cfe/trunk: include/clang/Basic/DiagnosticSemaKinds.def lib/Sema/SemaDeclObjC.cpp test/SemaObjC/error-property-gc-attr.m

Fariborz Jahanian fjahanian at apple.com
Fri Feb 27 14:38:14 PST 2009


Author: fjahanian
Date: Fri Feb 27 16:38:11 2009
New Revision: 65656

URL: http://llvm.org/viewvc/llvm-project?rev=65656&view=rev
Log:
Diagnose gc attribute mismatch of property and its ivar.

Added:
    cfe/trunk/test/SemaObjC/error-property-gc-attr.m
Modified:
    cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.def
    cfe/trunk/lib/Sema/SemaDeclObjC.cpp

Modified: cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.def
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.def?rev=65656&r1=65655&r2=65656&view=diff

==============================================================================
--- cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.def (original)
+++ cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.def Fri Feb 27 16:38:11 2009
@@ -211,6 +211,10 @@
      " ivar or must explicitly name an ivar")
 DIAG(error_property_ivar_type, ERROR,
      "type of property %0 does not match type of ivar %1") 
+DIAG(error_weak_property, ERROR,
+     "existing ivar %1 for __weak property %0 must be __weak")
+DIAG(error_strong_property, ERROR,
+     "existing ivar %1 for a __strong property %0 must be garbage collectable")
 DIAG(error_dynamic_property_ivar_decl, ERROR,
      "dynamic property can not have ivar specification")
 DIAG(error_duplicate_ivar_use, ERROR,

Modified: cfe/trunk/lib/Sema/SemaDeclObjC.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaDeclObjC.cpp?rev=65656&r1=65655&r2=65656&view=diff

==============================================================================
--- cfe/trunk/lib/Sema/SemaDeclObjC.cpp (original)
+++ cfe/trunk/lib/Sema/SemaDeclObjC.cpp Fri Feb 27 16:38:11 2009
@@ -1751,6 +1751,18 @@
           << property->getDeclName() << Ivar->getDeclName();
           return 0;
         }
+        // __weak is explicit. So it works on Canonical type.
+        if (PropType.isObjCGCWeak() && !IvarType.isObjCGCWeak()) {
+          Diag(PropertyLoc, diag::error_weak_property)
+          << property->getDeclName() << Ivar->getDeclName();
+          return 0;
+        }
+        if ((Context.isObjCObjectPointerType(property->getType()) || 
+             PropType.isObjCGCStrong()) && IvarType.isObjCGCWeak()) {
+          Diag(PropertyLoc, diag::error_strong_property)
+          << property->getDeclName() << Ivar->getDeclName();
+          return 0;
+        }
       }
     }
   } else if (PropertyIvar) {

Added: cfe/trunk/test/SemaObjC/error-property-gc-attr.m
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/SemaObjC/error-property-gc-attr.m?rev=65656&view=auto

==============================================================================
--- cfe/trunk/test/SemaObjC/error-property-gc-attr.m (added)
+++ cfe/trunk/test/SemaObjC/error-property-gc-attr.m Fri Feb 27 16:38:11 2009
@@ -0,0 +1,27 @@
+// RUN: clang -fobjc-gc -fsyntax-only -verify %s
+
+ at interface INTF
+{
+  id IVAR;
+  __weak id II;
+  __weak id WID;
+  id ID;
+  __weak INTF* AWEAK;
+  __weak INTF* WI;
+}
+ at property (assign) __weak id pweak;
+ at property (assign) __weak id WID;
+ at property (assign) __strong id not;
+ at property (assign)  id ID;
+ at property (assign) INTF* AWEAK;
+ at property (assign) __weak INTF* WI;
+ at end	
+
+ at implementation INTF
+ at synthesize pweak=IVAR;  // expected-error {{existing ivar 'IVAR' for __weak property 'pweak' must be __weak}}
+ at synthesize not=II; // expected-error {{existing ivar 'II' for a __strong property 'not' must be garbage collectable}}
+ at synthesize WID;
+ at synthesize ID;
+ at synthesize AWEAK; // expected-error {{existing ivar 'AWEAK' for a __strong property 'AWEAK' must be garbage collectable}}
+ at synthesize WI;
+ at end





More information about the cfe-commits mailing list