forked from OSchip/llvm-project
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:
parent
198cb4df6e
commit
43a9c9626f
|
@ -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();
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue