From: Fariborz Jahanian Date: Tue, 19 Jun 2012 22:51:22 +0000 (+0000) Subject: objective-c: warn when autosynthesizing a property which has same X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=63d40202fb478b331abeddcf2b12517f42db0f86;p=platform%2Fupstream%2Fllvm.git objective-c: warn when autosynthesizing a property which has same name as an existing ivar since this is common source of error when people remove @synthesize to take advantage of autosynthesis. // rdar://11671080 llvm-svn: 158756 --- diff --git a/clang/include/clang/Basic/DiagnosticSemaKinds.td b/clang/include/clang/Basic/DiagnosticSemaKinds.td index 9ca078d..d27acf7 100644 --- a/clang/include/clang/Basic/DiagnosticSemaKinds.td +++ b/clang/include/clang/Basic/DiagnosticSemaKinds.td @@ -630,6 +630,9 @@ def warn_auto_synthesizing_protocol_property :Warning< "auto property synthesis will not synthesize property" " declared in a protocol">, InGroup>; +def warn_autosynthesis_property_ivar_match :Warning< + "auto autosynthesized property has same name as an existing ivar">, + InGroup>; def warn_missing_explicit_synthesis : Warning < "auto property synthesis is synthesizing property not explicitly synthesized">, InGroup>, DefaultIgnore; diff --git a/clang/lib/Sema/SemaObjCProperty.cpp b/clang/lib/Sema/SemaObjCProperty.cpp index 84dc9cae..20dbf58 100644 --- a/clang/lib/Sema/SemaObjCProperty.cpp +++ b/clang/lib/Sema/SemaObjCProperty.cpp @@ -755,6 +755,22 @@ Decl *Sema::ActOnPropertyImplDecl(Scope *S, } if (!Ivar) { + if (AtLoc.isInvalid()) { + // Check when default synthesizing a property that there is + // an ivar matching property name and issue warning; since this + // is the most common case of not using an ivar used for backing + // property in non-default synthesis case. + ObjCInterfaceDecl *ClassDeclared=0; + ObjCIvarDecl *originalIvar = + IDecl->lookupInstanceVariable(property->getIdentifier(), + ClassDeclared); + if (originalIvar) { + Diag(PropertyDiagLoc, + diag::warn_autosynthesis_property_ivar_match); + Diag(property->getLocation(), diag::note_property_declare); + Diag(originalIvar->getLocation(), diag::note_ivar_decl); + } + } // In ARC, give the ivar a lifetime qualifier based on the // property attributes. if (getLangOpts().ObjCAutoRefCount && diff --git a/clang/test/SemaObjC/default-synthesize-2.m b/clang/test/SemaObjC/default-synthesize-2.m index b95f263..eeeab5f 100644 --- a/clang/test/SemaObjC/default-synthesize-2.m +++ b/clang/test/SemaObjC/default-synthesize-2.m @@ -41,12 +41,13 @@ // Test3 @interface Test3 { - id uid; + id uid; // expected-note {{ivar is declared here}} } -@property (readwrite, assign) id uid; +@property (readwrite, assign) id uid; // expected-note {{property declared here}} @end -@implementation Test3 +// rdar://11671080 +@implementation Test3 // expected-warning {{auto autosynthesized property has same name as an existing ivar}} // Oops, forgot to write @synthesize! will be default synthesized - (void) myMethod { self.uid = 0; // Use of the “setter”