From b0553e21ccd4d34cf53875adacd5dd502614f7c2 Mon Sep 17 00:00:00 2001 From: Fariborz Jahanian Date: Mon, 16 Feb 2015 23:49:44 +0000 Subject: [PATCH] [Objctive-C sema]. Do not do the unused-getter-return-value warning when property getter is used in direct method call and return value of property is unused. rdar://19773512 llvm-svn: 229458 --- clang/lib/AST/Expr.cpp | 4 +--- clang/lib/Sema/SemaStmt.cpp | 4 ---- clang/test/SemaObjC/unused.m | 30 +++++++++++++++++++++++++++--- 3 files changed, 28 insertions(+), 10 deletions(-) diff --git a/clang/lib/AST/Expr.cpp b/clang/lib/AST/Expr.cpp index e7b7f20..6f54008 100644 --- a/clang/lib/AST/Expr.cpp +++ b/clang/lib/AST/Expr.cpp @@ -2238,9 +2238,7 @@ bool Expr::isUnusedResultAWarning(const Expr *&WarnE, SourceLocation &Loc, } if (const ObjCMethodDecl *MD = ME->getMethodDecl()) - if (MD->hasAttr() || - (MD->isPropertyAccessor() && !MD->getReturnType()->isVoidType() && - !ME->getReceiverType()->isObjCIdType())) { + if (MD->hasAttr()) { WarnE = this; Loc = getExprLoc(); return true; diff --git a/clang/lib/Sema/SemaStmt.cpp b/clang/lib/Sema/SemaStmt.cpp index 4761c32..bc5c155 100644 --- a/clang/lib/Sema/SemaStmt.cpp +++ b/clang/lib/Sema/SemaStmt.cpp @@ -265,10 +265,6 @@ void Sema::DiagnoseUnusedExprResult(const Stmt *S) { Diag(Loc, diag::warn_unused_result) << R1 << R2; return; } - if (MD->isPropertyAccessor()) { - Diag(Loc, diag::warn_unused_property_expr); - return; - } } } else if (const PseudoObjectExpr *POE = dyn_cast(E)) { const Expr *Source = POE->getSyntacticForm(); diff --git a/clang/test/SemaObjC/unused.m b/clang/test/SemaObjC/unused.m index 6ea3fe8..f31e470 100644 --- a/clang/test/SemaObjC/unused.m +++ b/clang/test/SemaObjC/unused.m @@ -91,8 +91,7 @@ void rdar15596883(id x) { void test3(PropertyObject *o) { - [o length]; // expected-warning {{property access result unused - getters should not be used for side effects}} - (void)[o length]; + [o length]; // No warning. property name used in direct method call. } void test4(id o) @@ -102,5 +101,30 @@ void test4(id o) void test5(id

p) { - [p property]; // expected-warning {{property access result unused - getters should not be used for side effects}} + [p property]; // No warning. property name used in direct method call. } + +// rdar://19773512 +@interface Model +@property (nonatomic, retain, setter=setOrCreateGroup:, getter=getOrCreateGroup) id group; +@end + +@implementation Model { + id _group; +} +- (void)method { + [self getOrCreateGroup]; + self.getOrCreateGroup; // expected-warning {{property access result unused - getters should not be used for side effects}} + self.group; // expected-warning {{property access result unused - getters should not be used for side effects}} + self.group = (void*)0; + [self setOrCreateGroup : ((void*)0)]; + +} +- (id)getOrCreateGroup { + if (!_group) { + _group = @"group"; + } + return _group; +} +@end + -- 2.7.4