Don't warn about unused values in ternary ?: expressions unless both the LHS and RHS are "unused" (side-effect free).

Patch by Justin Bogner!  Fixes PR 8282.

llvm-svn: 126779
This commit is contained in:
Ted Kremenek 2011-03-01 20:34:48 +00:00
parent a7a795bed1
commit e96dad9544
2 changed files with 16 additions and 5 deletions

View File

@ -1404,13 +1404,15 @@ bool Expr::isUnusedResultAWarning(SourceLocation &Loc, SourceRange &R1,
return false;
case ConditionalOperatorClass: {
// The condition must be evaluated, but if either the LHS or RHS is a
// warning, warn about them.
// If only one of the LHS or RHS is a warning, the operator might
// be being used for control flow. Only warn if both the LHS and
// RHS are warnings.
const ConditionalOperator *Exp = cast<ConditionalOperator>(this);
if (Exp->getLHS() &&
Exp->getLHS()->isUnusedResultAWarning(Loc, R1, R2, Ctx))
if (!Exp->getRHS()->isUnusedResultAWarning(Loc, R1, R2, Ctx))
return false;
if (!Exp->getLHS())
return true;
return Exp->getRHS()->isUnusedResultAWarning(Loc, R1, R2, Ctx);
return Exp->getLHS()->isUnusedResultAWarning(Loc, R1, R2, Ctx);
}
case MemberExprClass:

View File

@ -72,6 +72,15 @@ int test_logical_bar() {
return x;
}
// PR8282
void conditional_for_control_flow(int cond, int x, int y)
{
cond? y++ : x; // no-warning
cond? y : ++x; // no-warning
cond? (x |= y) : ++x; // no-warning
cond? y : x; // expected-warning {{expression result unused}}
}
struct s0 { int f0; };
void f0(int a);