Emit a slightly better warning for unused values for unary and binary operators:

t2.c:3:18: warning: expression result unused
     x = ++x, ++y, y+2;
     ~~~~~~~~~~~~^ ~~~

llvm-svn: 41551
This commit is contained in:
Chris Lattner 2007-08-28 18:40:30 +00:00
parent c11005faa1
commit 24b51ff752
1 changed files with 15 additions and 1 deletions

View File

@ -21,6 +21,20 @@
#include "clang/Lex/IdentifierTable.h" #include "clang/Lex/IdentifierTable.h"
using namespace clang; using namespace clang;
/// DiagnoseDeadExpr - The specified expression is side-effect free and
/// evaluated in a context where the result is unused. Emit a diagnostic to
/// warn about this if appropriate.
static void DiagnoseDeadExpr(Expr *E, Sema &S) {
if (const BinaryOperator *BO = dyn_cast<BinaryOperator>(E))
S.Diag(BO->getOperatorLoc(), diag::warn_unused_expr,
BO->getLHS()->getSourceRange(), BO->getRHS()->getSourceRange());
else if (const UnaryOperator *UO = dyn_cast<UnaryOperator>(E))
S.Diag(UO->getOperatorLoc(), diag::warn_unused_expr,
UO->getSubExpr()->getSourceRange());
else
S.Diag(E->getExprLoc(), diag::warn_unused_expr, E->getSourceRange());
}
Sema::StmtResult Sema::ParseExprStmt(ExprTy *expr) { Sema::StmtResult Sema::ParseExprStmt(ExprTy *expr) {
Expr *E = static_cast<Expr*>(expr); Expr *E = static_cast<Expr*>(expr);
assert(E && "ParseExprStmt(): missing expression"); assert(E && "ParseExprStmt(): missing expression");
@ -28,7 +42,7 @@ Sema::StmtResult Sema::ParseExprStmt(ExprTy *expr) {
// Exprs are statements, so there is no need to do a conversion here. However, // Exprs are statements, so there is no need to do a conversion here. However,
// diagnose some potentially bad code. // diagnose some potentially bad code.
if (!E->hasLocalSideEffect() && !E->getType()->isVoidType()) if (!E->hasLocalSideEffect() && !E->getType()->isVoidType())
Diag(E->getExprLoc(), diag::warn_unused_expr, E->getSourceRange()); DiagnoseDeadExpr(E, *this);
return E; return E;
} }