Diagnose unused expression results for all statements, just not compound statements.

llvm-svn: 77631
This commit is contained in:
Anders Carlsson 2009-07-30 22:39:03 +00:00
parent 499de4252d
commit 5c5f160c7f
2 changed files with 36 additions and 5 deletions

View File

@ -52,7 +52,7 @@ Sema::OwningStmtResult Sema::ActOnDeclStmt(DeclGroupPtrTy dg,
}
void Sema::DiagnoseUnusedExprResult(const Stmt *S) {
const Expr *E = dyn_cast<Expr>(S);
const Expr *E = dyn_cast_or_null<Expr>(S);
if (!E)
return;
@ -215,6 +215,7 @@ Sema::ActOnIfStmt(SourceLocation IfLoc, FullExprArg CondVal,
}
Stmt *thenStmt = ThenVal.takeAs<Stmt>();
DiagnoseUnusedExprResult(thenStmt);
// Warn if the if block has a null body without an else value.
// this helps prevent bugs due to typos, such as
@ -225,9 +226,12 @@ Sema::ActOnIfStmt(SourceLocation IfLoc, FullExprArg CondVal,
Diag(stmt->getSemiLoc(), diag::warn_empty_if_body);
}
Stmt *elseStmt = ElseVal.takeAs<Stmt>();
DiagnoseUnusedExprResult(elseStmt);
CondResult.release();
return Owned(new (Context) IfStmt(IfLoc, condExpr, thenStmt,
ElseLoc, ElseVal.takeAs<Stmt>()));
ElseLoc, elseStmt));
}
Action::OwningStmtResult
@ -571,9 +575,11 @@ Sema::ActOnWhileStmt(SourceLocation WhileLoc, FullExprArg Cond, StmtArg Body) {
<< condType << condExpr->getSourceRange());
}
Stmt *bodyStmt = Body.takeAs<Stmt>();
DiagnoseUnusedExprResult(bodyStmt);
CondArg.release();
return Owned(new (Context) WhileStmt(condExpr, Body.takeAs<Stmt>(),
WhileLoc));
return Owned(new (Context) WhileStmt(condExpr, bodyStmt, WhileLoc));
}
Action::OwningStmtResult
@ -597,8 +603,11 @@ Sema::ActOnDoStmt(SourceLocation DoLoc, StmtArg Body,
<< condType << condExpr->getSourceRange());
}
Stmt *bodyStmt = Body.takeAs<Stmt>();
DiagnoseUnusedExprResult(bodyStmt);
Cond.release();
return Owned(new (Context) DoStmt(Body.takeAs<Stmt>(), condExpr, DoLoc,
return Owned(new (Context) DoStmt(bodyStmt, condExpr, DoLoc,
WhileLoc, CondRParen));
}
@ -639,6 +648,9 @@ Sema::ActOnForStmt(SourceLocation ForLoc, SourceLocation LParenLoc,
diag::err_typecheck_statement_requires_scalar)
<< SecondType << Second->getSourceRange());
}
DiagnoseUnusedExprResult(Body);
first.release();
second.release();
third.release();

View File

@ -50,4 +50,23 @@ void nowarn(unsigned char* a, unsigned char* b)
((void)0), y = x;
}
void t4(int a) {
int b = 0;
if (a)
b == 1; // expected-warning{{expression result unused}}
else
b == 2; // expected-warning{{expression result unused}}
while (1)
b == 3; // expected-warning{{expression result unused}}
do
b == 4; // expected-warning{{expression result unused}}
while (1);
for (;;)
b == 5; // expected-warning{{expression result unused}}
}