From 3427682d365174f5d69d55e2c6deef49ace0668b Mon Sep 17 00:00:00 2001 From: Fariborz Jahanian Date: Thu, 31 May 2012 23:18:32 +0000 Subject: [PATCH] objc: properties of NSObject attribute must have correct pointer type or issue error, instead of crashing in IRGen. // rdar:// 11569860 git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@157780 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Sema/SemaDeclAttr.cpp | 10 +++++++++- test/SemaObjC/nsobject-attribute.m | 12 +++++++++++- 2 files changed, 20 insertions(+), 2 deletions(-) diff --git a/lib/Sema/SemaDeclAttr.cpp b/lib/Sema/SemaDeclAttr.cpp index 4175ec1a26..c98d2bb9f4 100644 --- a/lib/Sema/SemaDeclAttr.cpp +++ b/lib/Sema/SemaDeclAttr.cpp @@ -2085,7 +2085,15 @@ static void handleObjCNSObject(Sema &S, Decl *D, const AttributeList &Attr) { return; } } - else if (!isa(D)) { + else if (ObjCPropertyDecl *PD = dyn_cast(D)) { + QualType T = PD->getType(); + if (!T->isPointerType() || + !T->getAs()->getPointeeType()->isRecordType()) { + S.Diag(PD->getLocation(), diag::err_nsobject_attribute); + return; + } + } + else { // It is okay to include this attribute on properties, e.g.: // // @property (retain, nonatomic) struct Bork *Q __attribute__((NSObject)); diff --git a/test/SemaObjC/nsobject-attribute.m b/test/SemaObjC/nsobject-attribute.m index f41df89328..e3f28740dc 100644 --- a/test/SemaObjC/nsobject-attribute.m +++ b/test/SemaObjC/nsobject-attribute.m @@ -46,9 +46,19 @@ int main(int argc, char *argv[]) { __attribute__((NSObject)) void * color; // expected-warning {{__attribute ((NSObject)) may be put on a typedef only, attribute is ignored}} } // -@property (nonatomic, retain) __attribute__((NSObject)) void * color; // // no-warning +@property (nonatomic, retain) __attribute__((NSObject)) CGColorRefNoNSObject color; // // no-warning @end void test_10453342() { char* __attribute__((NSObject)) string2 = 0; // expected-warning {{__attribute ((NSObject)) may be put on a typedef only, attribute is ignored}} } +// rdar://11569860 +@interface A { int i; } +@property(retain) __attribute__((NSObject)) int i; // expected-error {{__attribute ((NSObject)) is for pointer types only}} \ + // expected-error {{property with 'retain (or strong)' attribute must be of object type}} +@end + +@implementation A +@synthesize i; +@end + -- 2.40.0