From: Anders Carlsson Date: Thu, 30 Jul 2009 22:39:03 +0000 (+0000) Subject: Diagnose unused expression results for all statements, just not compound statements. X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=754431107b61a0523df5271c2876a73dd5a051e9;p=clang Diagnose unused expression results for all statements, just not compound statements. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@77631 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Sema/SemaStmt.cpp b/lib/Sema/SemaStmt.cpp index badeba79ce..f00d60089b 100644 --- a/lib/Sema/SemaStmt.cpp +++ b/lib/Sema/SemaStmt.cpp @@ -52,7 +52,7 @@ Sema::OwningStmtResult Sema::ActOnDeclStmt(DeclGroupPtrTy dg, } void Sema::DiagnoseUnusedExprResult(const Stmt *S) { - const Expr *E = dyn_cast(S); + const Expr *E = dyn_cast_or_null(S); if (!E) return; @@ -215,6 +215,7 @@ Sema::ActOnIfStmt(SourceLocation IfLoc, FullExprArg CondVal, } Stmt *thenStmt = ThenVal.takeAs(); + 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(); + DiagnoseUnusedExprResult(elseStmt); + CondResult.release(); return Owned(new (Context) IfStmt(IfLoc, condExpr, thenStmt, - ElseLoc, ElseVal.takeAs())); + ElseLoc, elseStmt)); } Action::OwningStmtResult @@ -571,9 +575,11 @@ Sema::ActOnWhileStmt(SourceLocation WhileLoc, FullExprArg Cond, StmtArg Body) { << condType << condExpr->getSourceRange()); } + Stmt *bodyStmt = Body.takeAs(); + DiagnoseUnusedExprResult(bodyStmt); + CondArg.release(); - return Owned(new (Context) WhileStmt(condExpr, Body.takeAs(), - 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(); + DiagnoseUnusedExprResult(bodyStmt); + Cond.release(); - return Owned(new (Context) DoStmt(Body.takeAs(), 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(); diff --git a/test/Sema/unused-expr.c b/test/Sema/unused-expr.c index a5e5ec4e14..c55afeadc4 100644 --- a/test/Sema/unused-expr.c +++ b/test/Sema/unused-expr.c @@ -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}} +} +