summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorFariborz Jahanian <fjahanian@apple.com>2014-01-02 22:42:09 +0000
committerFariborz Jahanian <fjahanian@apple.com>2014-01-02 22:42:09 +0000
commit5b3105d2cb1931fc5a271dc7f59c5adb4e58ca01 (patch)
treefef1cbdb882cfe9d0c835fd1ef6a907cf19cb7d2
parent44ebc079b91a9846d40eb092da87c537a6b190f5 (diff)
downloadbcm5719-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.h8
-rw-r--r--clang/lib/Sema/SemaDeclObjC.cpp11
-rw-r--r--clang/lib/Sema/SemaExprObjC.cpp4
-rw-r--r--clang/lib/Serialization/ASTReaderDecl.cpp1
-rw-r--r--clang/lib/Serialization/ASTWriterDecl.cpp1
-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
+
OpenPOWER on IntegriCloud