]> granicus.if.org Git - clang/commitdiff
More semantics checks of properties. Property implementation can implicitly use
authorFariborz Jahanian <fjahanian@apple.com>
Mon, 21 Apr 2008 21:57:36 +0000 (21:57 +0000)
committerFariborz Jahanian <fjahanian@apple.com>
Mon, 21 Apr 2008 21:57:36 +0000 (21:57 +0000)
ivar of same name.
Better diagnostics to bring home this point.

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

include/clang/Basic/DiagnosticKinds.def
lib/Sema/SemaDeclObjC.cpp
test/Sema/objc-property-1.m

index 4f46eaa02842178c682563af254e4b1b72f24a8d..a8560e1cb366b168a84c76a65f7b4f18ca035b62 100644 (file)
@@ -492,7 +492,7 @@ DIAG(error_missing_property_context, ERROR,
 DIAG(error_bad_property_context, ERROR,
      "property implementation must be in a class or category implementation")
 DIAG(error_bad_property_decl, ERROR,
-     "property implementation must have its declaration in the class '%0'")
+     "property implementation must have its declaration in interface '%0'")
 DIAG(error_bad_category_property_decl, ERROR,
      "property implementation must have its declaration in the category '%0'")
 DIAG(error_property_ivar_decl, ERROR,
@@ -502,7 +502,8 @@ DIAG(error_dynamic_property_ivar_decl, ERROR,
 DIAG(error_missing_property_interface, ERROR,
      "property implementation in a category with no category declaration")
 DIAG(error_missing_property_ivar_decl, ERROR,
-     "property synthesize requires a previously declared ivar")
+     "synthesized property '%0' must either be named the same as a compatible"
+     " ivar or must explicitly name an ivar")
 DIAG(error_synthesize_category_decl, ERROR,
      "@synthesize not allowed in a category's implementation")
 DIAG(error_property_ivar_type, ERROR,
index 45d877778568eff4999818ea3a0dbf7bcfaba49e..234bead575e232d7b0a4d3cafcffbda6677261ba 100644 (file)
@@ -998,14 +998,13 @@ Sema::DeclTy *Sema::ActOnPropertyImplDecl(SourceLocation AtLoc,
   // Check that we have a valid, previously declared ivar for @synthesize
   if (Synthesize) {
     // @synthesize
-    if (!PropertyIvar) {
-      Diag(PropertyLoc, diag::error_property_ivar_decl);
-      return 0;
-    }
+    if (!PropertyIvar)
+      PropertyIvar = PropertyId;
     // Check that this is a previously declared 'ivar' in 'IDecl' interface
     ObjCIvarDecl *Ivar = IDecl->FindIvarDeclaration(PropertyIvar);
     if (!Ivar) {
-      Diag(PropertyLoc, diag::error_missing_property_ivar_decl);
+      Diag(PropertyLoc, diag::error_missing_property_ivar_decl, 
+           PropertyId->getName());
       return 0;
     }
     // Check that type of property and its ivar match. 
index d307d13022f9c85147aa41a679eff8be0e69a89e..3bc2e3386b00fe71e2d0506c8f95bff9d834d44f 100644 (file)
@@ -3,9 +3,11 @@
 @interface I 
 {
        int IVAR;
+       int name;
 }
 @property int d1;
 @property id  prop_id;
+@property int name;
 @end
 
 @interface I(CAT)
 @end
 
 @implementation I
-@synthesize d1;                // expected-error {{property synthesize requires specification of an ivar}}
-@dynamic    bad;       // expected-error {{property implementation must have its declaration in the class 'I'}}
-@synthesize prop_id;   // expected-error {{property synthesize requires specification of an ivar}}
+@synthesize d1;                // expected-error {{synthesized property 'd1' must either be named the same as}}
+@dynamic    bad;       // expected-error {{property implementation must have its declaration in interface 'I'}}
+@synthesize prop_id;   // expected-error {{synthesized property 'prop_id' must either be named the same}}
 @synthesize prop_id = IVAR;    // expected-error {{type of property 'prop_id'  does not match type of ivar 'IVAR'}}
+@synthesize name;      // OK! property with same name as an accessible ivar of same name
 @end
 
 @implementation I(CAT)
@@ -25,7 +28,7 @@
 @end
 
 @implementation E      // expected-warning {{cannot find interface declaration for 'E'}}
-@dynamic d;            // expected-error {{property implementation must have its declaration in the class 'E'}}
+@dynamic d;            // expected-error {{property implementation must have its declaration in interface 'E'}}
 @end
 
 @implementation Q(MYCAT)  // expected-error {{cannot find interface declaration for 'Q'}}