diff options
author | Fariborz Jahanian <fjahanian@apple.com> | 2010-11-10 18:01:36 +0000 |
---|---|---|
committer | Fariborz Jahanian <fjahanian@apple.com> | 2010-11-10 18:01:36 +0000 |
commit | 2a2891410b02d146b779cdb29eeb9b6d1a9fa030 (patch) | |
tree | d22fed3998be79f0a84a42f04acb42bb835be625 | |
parent | 5de74d19ddcf84cfe9d7d973192ba93fd0c64d4f (diff) |
Check for duplicate declaration of a property in current and
other class extensions. // rdar://7629420
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@118689 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r-- | lib/Sema/SemaObjCProperty.cpp | 25 | ||||
-rw-r--r-- | test/SemaObjC/duplicate-property-class-extension.m | 13 |
2 files changed, 23 insertions, 15 deletions
diff --git a/lib/Sema/SemaObjCProperty.cpp b/lib/Sema/SemaObjCProperty.cpp index 37f9db1e5b..e1c0f4af99 100644 --- a/lib/Sema/SemaObjCProperty.cpp +++ b/lib/Sema/SemaObjCProperty.cpp @@ -93,14 +93,22 @@ Sema::HandlePropertyInClassExtension(Scope *S, ObjCCategoryDecl *CDecl, // Diagnose if this property is already in continuation class. DeclContext *DC = cast<DeclContext>(CDecl); IdentifierInfo *PropertyId = FD.D.getIdentifier(); - - if (ObjCPropertyDecl *prevDecl = - ObjCPropertyDecl::findPropertyDecl(DC, PropertyId)) { - Diag(AtLoc, diag::err_duplicate_property); - Diag(prevDecl->getLocation(), diag::note_property_declare); - return 0; - } - + ObjCInterfaceDecl *CCPrimary = CDecl->getClassInterface(); + + if (CCPrimary) + // Check for duplicate declaration of this property in current and + // other class extensions. + for (const ObjCCategoryDecl *ClsExtDecl = + CCPrimary->getFirstClassExtension(); + ClsExtDecl; ClsExtDecl = ClsExtDecl->getNextClassExtension()) { + if (ObjCPropertyDecl *prevDecl = + ObjCPropertyDecl::findPropertyDecl(ClsExtDecl, PropertyId)) { + Diag(AtLoc, diag::err_duplicate_property); + Diag(prevDecl->getLocation(), diag::note_property_declare); + return 0; + } + } + // Create a new ObjCPropertyDecl with the DeclContext being // the class extension. ObjCPropertyDecl *PDecl = @@ -115,7 +123,6 @@ Sema::HandlePropertyInClassExtension(Scope *S, ObjCCategoryDecl *CDecl, // We need to look in the @interface to see if the @property was // already declared. - ObjCInterfaceDecl *CCPrimary = CDecl->getClassInterface(); if (!CCPrimary) { Diag(CDecl->getLocation(), diag::err_continuation_class); *isOverridingProperty = true; diff --git a/test/SemaObjC/duplicate-property-class-extension.m b/test/SemaObjC/duplicate-property-class-extension.m index e8a2389bbc..bf48ed61d8 100644 --- a/test/SemaObjC/duplicate-property-class-extension.m +++ b/test/SemaObjC/duplicate-property-class-extension.m @@ -1,23 +1,24 @@ // RUN: %clang_cc1 -fsyntax-only -verify %s +// rdar://7629420 @interface Foo -@property (readonly) char foo; // expected-note {{property declared here}} +@property (readonly) char foo; @property (readwrite) char bar; // expected-note {{property declared here}} @end @interface Foo () -@property (readwrite) char foo; // OK +@property (readwrite) char foo; // expected-note 2 {{property declared here}} @property (readwrite) char NewProperty; // expected-note 2 {{property declared here}} @property (readwrite) char bar; // expected-error{{illegal redeclaration of 'readwrite' property in continuation class 'Foo' (perhaps you intended this to be a 'readwrite' redeclaration of a 'readonly' public property?)}} @end @interface Foo () -@property (readwrite) char foo; // OK again, make primary property readwrite for 2nd time! -@property (readwrite) char NewProperty; // expected-error {{redeclaration of property in continuation class 'Foo' (attribute must be 'readwrite', while its primary must be 'readonly')}} +@property (readwrite) char foo; // expected-error {{property has a previous declaration}} +@property (readwrite) char NewProperty; // expected-error {{property has a previous declaration}} @end @interface Foo () -@property (readonly) char foo; // expected-error {{redeclaration of property in continuation class 'Foo' (attribute must be 'readwrite', while its primary must be 'readonly')}} -@property (readwrite) char NewProperty; // expected-error {{redeclaration of property in continuation class 'Foo' (attribute must be 'readwrite', while its primary must be 'readonly')}} +@property (readonly) char foo; // expected-error {{property has a previous declaration}} +@property (readwrite) char NewProperty; // expected-error {{property has a previous declaration}} @end |