diff options
author | Fariborz Jahanian <fjahanian@apple.com> | 2014-01-02 22:42:09 +0000 |
---|---|---|
committer | Fariborz Jahanian <fjahanian@apple.com> | 2014-01-02 22:42:09 +0000 |
commit | 5b3105d2cb1931fc5a271dc7f59c5adb4e58ca01 (patch) | |
tree | fef1cbdb882cfe9d0c835fd1ef6a907cf19cb7d2 | |
parent | 44ebc079b91a9846d40eb092da87c537a6b190f5 (diff) | |
download | bcm5719-llvm-5b3105d2cb1931fc5a271dc7f59c5adb4e58ca01.tar.gz bcm5719-llvm-5b3105d2cb1931fc5a271dc7f59c5adb4e58ca01.zip |
ObjectiveC. Remove false positive warning for missing property
backing ivar by not issuing this warning if ivar is referenced
somewhere and accessor makes method calls. // rdar://15727325
llvm-svn: 198367
-rw-r--r-- | clang/include/clang/AST/DeclObjC.h | 8 | ||||
-rw-r--r-- | clang/lib/Sema/SemaDeclObjC.cpp | 11 | ||||
-rw-r--r-- | clang/lib/Sema/SemaExprObjC.cpp | 4 | ||||
-rw-r--r-- | clang/lib/Serialization/ASTReaderDecl.cpp | 1 | ||||
-rw-r--r-- | clang/lib/Serialization/ASTWriterDecl.cpp | 1 | ||||
-rw-r--r-- | clang/test/SemaObjC/unused-backing-ivar-warning.m (renamed from clang/test/SemaObjC/unsued-backing-ivar-warning.m) | 20 |
6 files changed, 40 insertions, 5 deletions
diff --git a/clang/include/clang/AST/DeclObjC.h b/clang/include/clang/AST/DeclObjC.h index 5ac82ecfc12..51bdfe2e6ad 100644 --- a/clang/include/clang/AST/DeclObjC.h +++ b/clang/include/clang/AST/DeclObjC.h @@ -161,6 +161,9 @@ private: /// \brief Indicates if the method was a definition but its body was skipped. unsigned HasSkippedBody : 1; + + /// \brief True if method body makes a method call. + unsigned MethodCallsMethod : 1; // Result type of this method. QualType MethodDeclType; @@ -242,7 +245,7 @@ private: DeclImplementation(impControl), objcDeclQualifier(OBJC_TQ_None), RelatedResultType(HasRelatedResultType), SelLocsKind(SelLoc_StandardNoSpace), IsOverriding(0), HasSkippedBody(0), - MethodDeclType(T), ResultTInfo(ResultTInfo), + MethodCallsMethod(0), MethodDeclType(T), ResultTInfo(ResultTInfo), ParamsAndSelLocs(0), NumParams(0), DeclEndLoc(endLoc), Body(), SelfDecl(0), CmdDecl(0) { setImplicit(isImplicitlyDeclared); @@ -436,6 +439,9 @@ public: bool hasSkippedBody() const { return HasSkippedBody; } void setHasSkippedBody(bool Skipped = true) { HasSkippedBody = Skipped; } + bool getMethodCallsMethod() const { return MethodCallsMethod; } + void setMethodCallsMethod(bool val = true) { MethodCallsMethod = val; } + /// \brief Returns the property associated with this method's selector. /// /// Note that even if this particular method is not marked as a property diff --git a/clang/lib/Sema/SemaDeclObjC.cpp b/clang/lib/Sema/SemaDeclObjC.cpp index 7024cf6cb35..edbd7141844 100644 --- a/clang/lib/Sema/SemaDeclObjC.cpp +++ b/clang/lib/Sema/SemaDeclObjC.cpp @@ -3521,8 +3521,13 @@ void Sema::DiagnoseUnusedBackingIvarInAccessor(Scope *S) { const ObjCPropertyDecl *PDecl; const ObjCIvarDecl *IV = GetIvarBackingPropertyAccessor(CurMethod, PDecl); if (IV && !IV->getBackingIvarReferencedInAccessor()) { - Diag(getCurMethodDecl()->getLocation(), diag::warn_unused_property_backing_ivar) - << IV->getDeclName(); - Diag(PDecl->getLocation(), diag::note_property_declare); + // Do not issue this warning if backing ivar is used somewhere and accessor + // implementation makes a call to a method. This is to prevent false positive in + // some corner cases. + if (!IV->isReferenced() || !CurMethod->getMethodCallsMethod()) { + Diag(getCurMethodDecl()->getLocation(), diag::warn_unused_property_backing_ivar) + << IV->getDeclName(); + Diag(PDecl->getLocation(), diag::note_property_declare); + } } } diff --git a/clang/lib/Sema/SemaExprObjC.cpp b/clang/lib/Sema/SemaExprObjC.cpp index ca67094f80f..8b1befe4f85 100644 --- a/clang/lib/Sema/SemaExprObjC.cpp +++ b/clang/lib/Sema/SemaExprObjC.cpp @@ -2643,7 +2643,9 @@ ExprResult Sema::BuildInstanceMessage(Expr *Receiver, } } } - + if (ObjCMethodDecl *CurMeth = getCurMethodDecl()) + CurMeth->setMethodCallsMethod(true); + return MaybeBindToTemporary(Result); } diff --git a/clang/lib/Serialization/ASTReaderDecl.cpp b/clang/lib/Serialization/ASTReaderDecl.cpp index c2e286814bc..9f10c607bae 100644 --- a/clang/lib/Serialization/ASTReaderDecl.cpp +++ b/clang/lib/Serialization/ASTReaderDecl.cpp @@ -702,6 +702,7 @@ void ASTDeclReader::VisitObjCMethodDecl(ObjCMethodDecl *MD) { MD->setDefined(Record[Idx++]); MD->IsOverriding = Record[Idx++]; MD->HasSkippedBody = Record[Idx++]; + MD->MethodCallsMethod = Record[Idx++]; MD->IsRedeclaration = Record[Idx++]; MD->HasRedeclaration = Record[Idx++]; diff --git a/clang/lib/Serialization/ASTWriterDecl.cpp b/clang/lib/Serialization/ASTWriterDecl.cpp index 56ed503e840..604ce567512 100644 --- a/clang/lib/Serialization/ASTWriterDecl.cpp +++ b/clang/lib/Serialization/ASTWriterDecl.cpp @@ -438,6 +438,7 @@ void ASTDeclWriter::VisitObjCMethodDecl(ObjCMethodDecl *D) { Record.push_back(D->isDefined()); Record.push_back(D->IsOverriding); Record.push_back(D->HasSkippedBody); + Record.push_back(D->MethodCallsMethod); Record.push_back(D->IsRedeclaration); Record.push_back(D->HasRedeclaration); diff --git a/clang/test/SemaObjC/unsued-backing-ivar-warning.m b/clang/test/SemaObjC/unused-backing-ivar-warning.m index 9861d5048f7..d07e52df776 100644 --- a/clang/test/SemaObjC/unsued-backing-ivar-warning.m +++ b/clang/test/SemaObjC/unused-backing-ivar-warning.m @@ -104,3 +104,23 @@ typedef char BOOL; return 0; } @end + +// rdar://15727327 +@interface Radar15727327 : NSObject +@property (assign, readonly) long p; +@property (assign) long q; // expected-note 2 {{property declared here}} +@property (assign, readonly) long r; // expected-note {{property declared here}} +- (long)Meth; +@end + +@implementation Radar15727327 +@synthesize p; +@synthesize q; +@synthesize r; +- (long)Meth { return p; } +- (long) p { [self Meth]; return 0; } +- (long) q { return 0; } // expected-warning {{ivar 'q' which backs the property is not referenced in this property's accessor}} +- (void) setQ : (long) val { } // expected-warning {{ivar 'q' which backs the property is not referenced in this property's accessor}} +- (long) r { [self Meth]; return p; } // expected-warning {{ivar 'r' which backs the property is not referenced in this property's accessor}} +@end + |