diff options
| author | Fariborz Jahanian <fjahanian@apple.com> | 2013-09-19 17:18:55 +0000 |
|---|---|---|
| committer | Fariborz Jahanian <fjahanian@apple.com> | 2013-09-19 17:18:55 +0000 |
| commit | 5c005839f6795a39fe4d5af03e30f3415136a6c7 (patch) | |
| tree | 1c6628a194649d651cbe89de42bd7a56b67a3584 /clang | |
| parent | ab675128e9058e11df6b5017468c3a7bf72c80b6 (diff) | |
| download | bcm5719-llvm-5c005839f6795a39fe4d5af03e30f3415136a6c7.tar.gz bcm5719-llvm-5c005839f6795a39fe4d5af03e30f3415136a6c7.zip | |
Refinement to my previous patch for
objc_returns_inner_pointer on properties. // rdar://14990439
llvm-svn: 191016
Diffstat (limited to 'clang')
| -rw-r--r-- | clang/include/clang/Basic/Attr.td | 2 | ||||
| -rw-r--r-- | clang/lib/Sema/SemaDeclAttr.cpp | 8 | ||||
| -rw-r--r-- | clang/test/SemaObjC/arc-property-lifetime.m | 2 |
3 files changed, 10 insertions, 2 deletions
diff --git a/clang/include/clang/Basic/Attr.td b/clang/include/clang/Basic/Attr.td index 161e9c87d83..5681dafc30d 100644 --- a/clang/include/clang/Basic/Attr.td +++ b/clang/include/clang/Basic/Attr.td @@ -571,7 +571,7 @@ def ObjCPreciseLifetime : InheritableAttr { def ObjCReturnsInnerPointer : InheritableAttr { let Spellings = [GNU<"objc_returns_inner_pointer">]; - let Subjects = [ObjCMethod]; + let Subjects = [ObjCMethod, ObjCProperty]; } def ObjCRequiresSuper : InheritableAttr { diff --git a/clang/lib/Sema/SemaDeclAttr.cpp b/clang/lib/Sema/SemaDeclAttr.cpp index d9e99724497..8a2d126dd61 100644 --- a/clang/lib/Sema/SemaDeclAttr.cpp +++ b/clang/lib/Sema/SemaDeclAttr.cpp @@ -4145,6 +4145,11 @@ static void handleNSReturnsRetainedAttr(Sema &S, Decl *D, static void handleObjCReturnsInnerPointerAttr(Sema &S, Decl *D, const AttributeList &attr) { + enum { + EP_ObjCMethod = 1, + EP_ObjCProperty + }; + SourceLocation loc = attr.getLoc(); QualType resultType; @@ -4167,7 +4172,8 @@ static void handleObjCReturnsInnerPointerAttr(Sema &S, Decl *D, (!resultType->isPointerType() || resultType->isObjCRetainableType())) { S.Diag(D->getLocStart(), diag::warn_ns_attribute_wrong_return_type) << SourceRange(loc) - << attr.getName() << (method ? /*method*/ 1 : /*property*/ 2) << /*non-retainable pointer*/ 2; + << attr.getName() << (method ? EP_ObjCMethod : EP_ObjCProperty) + << /*non-retainable pointer*/ 2; // Drop the attribute. return; diff --git a/clang/test/SemaObjC/arc-property-lifetime.m b/clang/test/SemaObjC/arc-property-lifetime.m index 766a6141be6..962154438bd 100644 --- a/clang/test/SemaObjC/arc-property-lifetime.m +++ b/clang/test/SemaObjC/arc-property-lifetime.m @@ -174,6 +174,8 @@ void foo(Baz *f) { { const void * innerPointerIvar __attribute__((objc_returns_inner_pointer)); // expected-error {{'objc_returns_inner_pointer' attribute only applies to methods and properties}} } +@property (readonly) Boom * NotInnerPointer __attribute__((objc_returns_inner_pointer)); // expected-warning {{'objc_returns_inner_pointer' attribute only applies to properties that return a non-retainable pointer}} +- (Boom *) NotInnerPointerMethod __attribute__((objc_returns_inner_pointer)); // expected-warning {{'objc_returns_inner_pointer' attribute only applies to methods that return a non-retainable pointer}} @property (readonly) const void * innerPointer __attribute__((objc_returns_inner_pointer)); @end |

