diff options
author | Fariborz Jahanian <fjahanian@apple.com> | 2008-04-21 21:57:36 +0000 |
---|---|---|
committer | Fariborz Jahanian <fjahanian@apple.com> | 2008-04-21 21:57:36 +0000 |
commit | 6cdf16d61de193e0596c3c2cec02e4227212986a (patch) | |
tree | 1faeced8d9ccbe623295b417a4a3a3216a69f9b4 | |
parent | c35b9e4e2efad727538c848cf30d4b0eb1031dc9 (diff) |
More semantics checks of properties. Property implementation can implicitly use
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
-rw-r--r-- | include/clang/Basic/DiagnosticKinds.def | 5 | ||||
-rw-r--r-- | lib/Sema/SemaDeclObjC.cpp | 9 | ||||
-rw-r--r-- | test/Sema/objc-property-1.m | 11 |
3 files changed, 14 insertions, 11 deletions
diff --git a/include/clang/Basic/DiagnosticKinds.def b/include/clang/Basic/DiagnosticKinds.def index 4f46eaa028..a8560e1cb3 100644 --- a/include/clang/Basic/DiagnosticKinds.def +++ b/include/clang/Basic/DiagnosticKinds.def @@ -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, diff --git a/lib/Sema/SemaDeclObjC.cpp b/lib/Sema/SemaDeclObjC.cpp index 45d8777785..234bead575 100644 --- a/lib/Sema/SemaDeclObjC.cpp +++ b/lib/Sema/SemaDeclObjC.cpp @@ -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. diff --git a/test/Sema/objc-property-1.m b/test/Sema/objc-property-1.m index d307d13022..3bc2e3386b 100644 --- a/test/Sema/objc-property-1.m +++ b/test/Sema/objc-property-1.m @@ -3,9 +3,11 @@ @interface I { int IVAR; + int name; } @property int d1; @property id prop_id; +@property int name; @end @interface I(CAT) @@ -13,10 +15,11 @@ @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'}} |