diff options
author | Fariborz Jahanian <fjahanian@apple.com> | 2009-01-19 18:16:19 +0000 |
---|---|---|
committer | Fariborz Jahanian <fjahanian@apple.com> | 2009-01-19 18:16:19 +0000 |
commit | f034e9cc4dad81d8fe6eb88a84da55b2909a9cdd (patch) | |
tree | 7b2b28e602dc44f8a49b2e6e23ce09e548329f22 | |
parent | 06a062dc784c609b75dca15fd97f468d0d846596 (diff) |
Patch to allow @dynamic synthesis of property in a category,
with @synthesize being illegal.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@62515 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r-- | lib/AST/DeclObjC.cpp | 13 | ||||
-rw-r--r-- | test/SemaObjC/property-category-2.m | 19 |
2 files changed, 30 insertions, 2 deletions
diff --git a/lib/AST/DeclObjC.cpp b/lib/AST/DeclObjC.cpp index ea7a047780..90962e69bd 100644 --- a/lib/AST/DeclObjC.cpp +++ b/lib/AST/DeclObjC.cpp @@ -364,8 +364,7 @@ ObjCContainerDecl::FindPropertyDeclaration(IdentifierInfo *PropertyId) const { return property; } - const ObjCInterfaceDecl *OID = dyn_cast<ObjCInterfaceDecl>(this); - if (OID) { + if (const ObjCInterfaceDecl *OID = dyn_cast<ObjCInterfaceDecl>(this)) { // Look through categories. for (ObjCCategoryDecl *Category = OID->getCategoryList(); Category; Category = Category->getNextClassCategory()) { @@ -384,6 +383,16 @@ ObjCContainerDecl::FindPropertyDeclaration(IdentifierInfo *PropertyId) const { if (OID->getSuperClass()) return OID->getSuperClass()->FindPropertyDeclaration(PropertyId); } + else if (const ObjCCategoryDecl *OCD = dyn_cast<ObjCCategoryDecl>(this)) { + // Look through protocols. + for (ObjCInterfaceDecl::protocol_iterator I = OCD->protocol_begin(), + E = OCD->protocol_end(); I != E; ++I) { + ObjCProtocolDecl *Protocol = *I; + ObjCPropertyDecl *property = Protocol->FindPropertyDeclaration(PropertyId); + if (property) + return property; + } + } return 0; } diff --git a/test/SemaObjC/property-category-2.m b/test/SemaObjC/property-category-2.m new file mode 100644 index 0000000000..2b86a9e65d --- /dev/null +++ b/test/SemaObjC/property-category-2.m @@ -0,0 +1,19 @@ +// RUN: clang -fsyntax-only -verify %s +// Test that a property can be synthesize in a category +// implementation with no error. + +@protocol MyProtocol +@property float myFloat; +@property float anotherFloat; +@end + +@interface MyObject { float anotherFloat; } +@end + +@interface MyObject (CAT) <MyProtocol> +@end + +@implementation MyObject (CAT) +@dynamic myFloat; // OK +@synthesize anotherFloat; // expected-error {{@synthesize not allowed in a category's implementation}} +@end |