From: Fariborz Jahanian Date: Wed, 20 Jun 2012 17:18:31 +0000 (+0000) Subject: objc: improved diagnostic when property autosynthesis may cause X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=e95f8ef6563bdf26de5294873733a3425c09db42;p=clang objc: improved diagnostic when property autosynthesis may cause change in behavior. // rdar://11671080 git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@158828 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/include/clang/Basic/DiagnosticSemaKinds.td b/include/clang/Basic/DiagnosticSemaKinds.td index 60b52dfa6b..b2035eaac2 100644 --- a/include/clang/Basic/DiagnosticSemaKinds.td +++ b/include/clang/Basic/DiagnosticSemaKinds.td @@ -631,7 +631,8 @@ def warn_auto_synthesizing_protocol_property :Warning< " declared in a protocol">, InGroup>; def warn_autosynthesis_property_ivar_match :Warning< - "auto autosynthesized property has same name as an existing ivar">, + "autosynthesized property %0 will use %select{|synthesized}1 instance variable " + "%2, not existing instance variable %3">, InGroup>; def warn_missing_explicit_synthesis : Warning < "auto property synthesis is synthesizing property not explicitly synthesized">, diff --git a/lib/Sema/SemaObjCProperty.cpp b/lib/Sema/SemaObjCProperty.cpp index 71112f7701..95fbde39af 100644 --- a/lib/Sema/SemaObjCProperty.cpp +++ b/lib/Sema/SemaObjCProperty.cpp @@ -753,24 +753,26 @@ Decl *Sema::ActOnPropertyImplDecl(Scope *S, Context.getObjCGCQualType(PropertyIvarType, Qualifiers::Weak); } } - - 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); - } + 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) + << property->getName() << (Ivar == 0) << PropertyIvar->getName() + << originalIvar->getName(); + Diag(property->getLocation(), diag::note_property_declare); + Diag(originalIvar->getLocation(), diag::note_ivar_decl); } + } + + if (!Ivar) { // In ARC, give the ivar a lifetime qualifier based on the // property attributes. if (getLangOpts().ObjCAutoRefCount && diff --git a/test/SemaObjC/default-synthesize-2.m b/test/SemaObjC/default-synthesize-2.m index eeeab5f5c4..ec298f5bf5 100644 --- a/test/SemaObjC/default-synthesize-2.m +++ b/test/SemaObjC/default-synthesize-2.m @@ -47,7 +47,7 @@ @end // rdar://11671080 -@implementation Test3 // expected-warning {{auto autosynthesized property has same name as an existing ivar}} +@implementation Test3 // expected-warning {{autosynthesized property uid will use synthesized instance variable _uid, not existing instance variable uid}} // Oops, forgot to write @synthesize! will be default synthesized - (void) myMethod { self.uid = 0; // Use of the “setter” @@ -115,3 +115,15 @@ int* _object; } @end +// rdar://11671080 +@interface Test8 +{ + id _y; + id y; // expected-note {{ivar is declared here}} +} +@property(copy) id y; // expected-note {{property declared here}} +@end + + +@implementation Test8 @end // expected-warning {{autosynthesized property y will use instance variable _y, not existing instance variable y}} +