diff options
author | Nico Weber <nicolasweber@gmx.de> | 2013-05-08 23:47:40 +0000 |
---|---|---|
committer | Nico Weber <nicolasweber@gmx.de> | 2013-05-08 23:47:40 +0000 |
commit | 4e8626f708df60abd71a205b4abbd3be04f121ee (patch) | |
tree | 2f15e95dab576af628d15a052490e9e430453646 | |
parent | 1054bbf08d171e3d39d4a8589f149f638eda07ed (diff) | |
download | bcm5719-llvm-4e8626f708df60abd71a205b4abbd3be04f121ee.tar.gz bcm5719-llvm-4e8626f708df60abd71a205b4abbd3be04f121ee.zip |
Objective-C: Correctly encode 'retain' and 'copy' for readonly properties.
clang would omit 'C' for 'copy' properties and '&' for 'retain' properties if
the property was also 'readonly'. Fix this, which makes clang match gcc4.2's
behavior.
Fixes PR15928.
llvm-svn: 181491
-rw-r--r-- | clang/lib/AST/ASTContext.cpp | 4 | ||||
-rw-r--r-- | clang/test/Rewriter/objc-modern-property-attributes.mm | 12 |
2 files changed, 16 insertions, 0 deletions
diff --git a/clang/lib/AST/ASTContext.cpp b/clang/lib/AST/ASTContext.cpp index 176aec53a25..ffcf6b5d7a9 100644 --- a/clang/lib/AST/ASTContext.cpp +++ b/clang/lib/AST/ASTContext.cpp @@ -4910,6 +4910,10 @@ void ASTContext::getObjCEncodingForPropertyDecl(const ObjCPropertyDecl *PD, if (PD->isReadOnly()) { S += ",R"; + if (PD->getPropertyAttributes() & ObjCPropertyDecl::OBJC_PR_copy) + S += ",C"; + if (PD->getPropertyAttributes() & ObjCPropertyDecl::OBJC_PR_retain) + S += ",&"; } else { switch (PD->getSetterKind()) { case ObjCPropertyDecl::Assign: break; diff --git a/clang/test/Rewriter/objc-modern-property-attributes.mm b/clang/test/Rewriter/objc-modern-property-attributes.mm index abebb2c0fef..f0d002caf61 100644 --- a/clang/test/Rewriter/objc-modern-property-attributes.mm +++ b/clang/test/Rewriter/objc-modern-property-attributes.mm @@ -16,6 +16,10 @@ typedef void (^void_block_t)(void); @property (copy) void_block_t completionBlock; @property (retain) PropertyClass* Yblock; +@property (readonly) PropertyClass* readonlyAttr; +@property (readonly,copy) PropertyClass* readonlyCopyAttr; +@property (readonly,retain) PropertyClass* readonlyRetainAttr; +@property (readonly,retain,nonatomic) PropertyClass* readonlyNonatomicAttr; @property (copy) id ID; @end @@ -25,6 +29,10 @@ typedef void (^void_block_t)(void); @dynamic r; // attributes should be "Ti,D" @synthesize completionBlock=__completion; // "T@?,C,V__completion" @synthesize Yblock = YVAR; // "T@\"PropertyClass\",&,VYVAR" +@synthesize readonlyAttr; +@synthesize readonlyCopyAttr; +@synthesize readonlyRetainAttr; +@synthesize readonlyNonatomicAttr; @synthesize ID; // "T@,C,VID" @end @@ -32,6 +40,10 @@ typedef void (^void_block_t)(void); // CHECK: Ti,D // CHECK: T@?,C,V__completion // CHECK: T@\"PropertyClass\",&,VYVAR +// CHECK: T@\"PropertyClass\",R,VreadonlyAttr +// CHECK: T@\"PropertyClass\",R,C,VreadonlyCopyAttr +// CHECK: T@\"PropertyClass\",R,&,VreadonlyRetainAttr +// CHECK: T@\"PropertyClass\",R,&,N,VreadonlyNonatomicAttr @interface Test @end @interface Test (Category) |