From: Fariborz Jahanian Date: Thu, 16 May 2013 19:08:44 +0000 (+0000) Subject: Objective-C arc: Diagnose when user attempts to X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=b8ed071b88c1fd100eaa701f5fd7f5ebe8b9e362;p=clang Objective-C arc: Diagnose when user attempts to synthesize a property getter method that overrides a method definition named 'retain' and the like. Fixes // rdar://13885083 git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@182039 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/include/clang/Basic/DiagnosticSemaKinds.td b/include/clang/Basic/DiagnosticSemaKinds.td index c8ea19336b..a5b57e05ea 100644 --- a/include/clang/Basic/DiagnosticSemaKinds.td +++ b/include/clang/Basic/DiagnosticSemaKinds.td @@ -3854,7 +3854,7 @@ def err_arc_objc_property_default_assign_on_object : Error< def err_arc_illegal_selector : Error< "ARC forbids use of %0 in a @selector">; def err_arc_illegal_method_def : Error< - "ARC forbids implementation of %0">; + "ARC forbids %select{implementation|synthesis}0 of %1">; def warn_arc_strong_pointer_objc_pointer : Warning< "method parameter of type %0 with no explicit ownership">, InGroup>, DefaultIgnore; diff --git a/lib/Sema/SemaDeclObjC.cpp b/lib/Sema/SemaDeclObjC.cpp index 3265ab02dc..d8517f49f4 100644 --- a/lib/Sema/SemaDeclObjC.cpp +++ b/lib/Sema/SemaDeclObjC.cpp @@ -350,7 +350,7 @@ void Sema::ActOnStartOfObjCMethodDef(Scope *FnBodyScope, Decl *D) { case OMF_release: case OMF_autorelease: Diag(MDecl->getLocation(), diag::err_arc_illegal_method_def) - << MDecl->getSelector(); + << 0 << MDecl->getSelector(); break; case OMF_None: diff --git a/lib/Sema/SemaObjCProperty.cpp b/lib/Sema/SemaObjCProperty.cpp index 91f0881ae0..269c65e608 100644 --- a/lib/Sema/SemaObjCProperty.cpp +++ b/lib/Sema/SemaObjCProperty.cpp @@ -1158,6 +1158,18 @@ Decl *Sema::ActOnPropertyImplDecl(Scope *S, diag::warn_property_getter_owning_mismatch); Diag(property->getLocation(), diag::note_property_declare); } + if (getLangOpts().ObjCAutoRefCount && Synthesize) + switch (getterMethod->getMethodFamily()) { + case OMF_retain: + case OMF_retainCount: + case OMF_release: + case OMF_autorelease: + Diag(getterMethod->getLocation(), diag::err_arc_illegal_method_def) + << 1 << getterMethod->getSelector(); + break; + default: + break; + } } if (ObjCMethodDecl *setterMethod = property->getSetterMethodDecl()) { setterMethod->createImplicitParams(Context, IDecl); diff --git a/test/SemaObjC/arc-property-lifetime.m b/test/SemaObjC/arc-property-lifetime.m index b824b2a456..570c8d1af6 100644 --- a/test/SemaObjC/arc-property-lifetime.m +++ b/test/SemaObjC/arc-property-lifetime.m @@ -182,3 +182,26 @@ void foo(Baz *f) { @implementation Foo2 @end + +// rdar://13885083 +@interface NSObject +-(id)init; +@end + +typedef char BOOL; +@interface Test13885083 : NSObject + +@property (nonatomic, assign) BOOL retain; // expected-error {{ARC forbids synthesis of 'retain'}} + +-(id)init; + +@end + +@implementation Test13885083 +-(id) init +{ + self = [super init]; + return self; +} +@end +