summaryrefslogtreecommitdiffstats
path: root/clang/lib
diff options
context:
space:
mode:
authorMatt Beaumont-Gay <matthewbg@google.com>2013-02-26 19:34:08 +0000
committerMatt Beaumont-Gay <matthewbg@google.com>2013-02-26 19:34:08 +0000
commit1c417da558e97f9b77706ed45f90f9c04e6cc085 (patch)
tree4183c4f051cba05c590276b2b8be5047aaf867c2 /clang/lib
parentc0550990c50625c9b084c4aa3c2ba8c0960e61eb (diff)
downloadbcm5719-llvm-1c417da558e97f9b77706ed45f90f9c04e6cc085.tar.gz
bcm5719-llvm-1c417da558e97f9b77706ed45f90f9c04e6cc085.zip
Warn on dropping the return value from a warn_unused_result function, even in
macros. llvm-svn: 176114
Diffstat (limited to 'clang/lib')
-rw-r--r--clang/lib/Sema/SemaStmt.cpp22
1 files changed, 17 insertions, 5 deletions
diff --git a/clang/lib/Sema/SemaStmt.cpp b/clang/lib/Sema/SemaStmt.cpp
index 3b6d073470e..9b7ba04044e 100644
--- a/clang/lib/Sema/SemaStmt.cpp
+++ b/clang/lib/Sema/SemaStmt.cpp
@@ -158,9 +158,14 @@ void Sema::DiagnoseUnusedExprResult(const Stmt *S) {
if (!E)
return;
SourceLocation ExprLoc = E->IgnoreParens()->getExprLoc();
- if (SourceMgr.isInSystemMacro(ExprLoc) ||
- SourceMgr.isMacroBodyExpansion(ExprLoc))
- return;
+ // In most cases, we don't want to warn if the expression is written in a
+ // macro body, or if the macro comes from a system header. If the offending
+ // expression is a call to a function with the warn_unused_result attribute,
+ // we warn no matter the location. Because of the order in which the various
+ // checks need to happen, we factor out the macro-related test here.
+ bool ShouldSuppress =
+ SourceMgr.isMacroBodyExpansion(ExprLoc) ||
+ SourceMgr.isInSystemMacro(ExprLoc);
const Expr *WarnExpr;
SourceLocation Loc;
@@ -193,12 +198,16 @@ void Sema::DiagnoseUnusedExprResult(const Stmt *S) {
return;
// If the callee has attribute pure, const, or warn_unused_result, warn with
- // a more specific message to make it clear what is happening.
+ // a more specific message to make it clear what is happening. If the call
+ // is written in a macro body, only warn if it has the warn_unused_result
+ // attribute.
if (const Decl *FD = CE->getCalleeDecl()) {
if (FD->getAttr<WarnUnusedResultAttr>()) {
Diag(Loc, diag::warn_unused_result) << R1 << R2;
return;
}
+ if (ShouldSuppress)
+ return;
if (FD->getAttr<PureAttr>()) {
Diag(Loc, diag::warn_unused_call) << R1 << R2 << "pure";
return;
@@ -208,7 +217,10 @@ void Sema::DiagnoseUnusedExprResult(const Stmt *S) {
return;
}
}
- } else if (const ObjCMessageExpr *ME = dyn_cast<ObjCMessageExpr>(E)) {
+ } else if (ShouldSuppress)
+ return;
+
+ if (const ObjCMessageExpr *ME = dyn_cast<ObjCMessageExpr>(E)) {
if (getLangOpts().ObjCAutoRefCount && ME->isDelegateInitCall()) {
Diag(Loc, diag::err_arc_unused_init_message) << R1;
return;
OpenPOWER on IntegriCloud