Don't emit an 'unused expression' warning for '||' and '&&' expressions that contain assignments

or similar side-effects.

llvm-svn: 100676
This commit is contained in:
Ted Kremenek 2010-04-07 18:49:21 +00:00
parent 198cb4df6e
commit 43a9c9626f
2 changed files with 28 additions and 12 deletions

View File

@ -837,19 +837,22 @@ bool Expr::isUnusedResultAWarning(SourceLocation &Loc, SourceRange &R1,
}
case BinaryOperatorClass: {
const BinaryOperator *BO = cast<BinaryOperator>(this);
// Consider comma to have side effects if the LHS or RHS does.
if (BO->getOpcode() == BinaryOperator::Comma) {
// ((foo = <blah>), 0) is an idiom for hiding the result (and
// lvalue-ness) of an assignment written in a macro.
if (IntegerLiteral *IE =
dyn_cast<IntegerLiteral>(BO->getRHS()->IgnoreParens()))
if (IE->getValue() == 0)
return false;
return (BO->getLHS()->isUnusedResultAWarning(Loc, R1, R2, Ctx) ||
BO->getRHS()->isUnusedResultAWarning(Loc, R1, R2, Ctx));
switch (BO->getOpcode()) {
default:
break;
// Consider ',', '||', '&&' to have side effects if the LHS or RHS does.
case BinaryOperator::Comma:
// ((foo = <blah>), 0) is an idiom for hiding the result (and
// lvalue-ness) of an assignment written in a macro.
if (IntegerLiteral *IE =
dyn_cast<IntegerLiteral>(BO->getRHS()->IgnoreParens()))
if (IE->getValue() == 0)
return false;
case BinaryOperator::LAnd:
case BinaryOperator::LOr:
return (BO->getLHS()->isUnusedResultAWarning(Loc, R1, R2, Ctx) ||
BO->getRHS()->isUnusedResultAWarning(Loc, R1, R2, Ctx));
}
if (BO->isAssignmentOp())
return false;
Loc = BO->getOperatorLoc();

View File

@ -51,3 +51,16 @@ void pr4806() {
*pi; // expected-warning {{expression result unused}}
*pj;
}
// Don't warn about unused '||', '&&' expressions that contain assignments.
int test_logical_foo1();
int test_logical_foo2();
int test_logical_foo3();
int test_logical_bar() {
int x = 0;
(x = test_logical_foo1()) || // no-warning
(x = test_logical_foo2()) || // no-warning
(x = test_logical_foo3()); // no-warning
return x;
}