forked from OSchip/llvm-project
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:
parent
a7a795bed1
commit
e96dad9544
|
@ -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:
|
||||
|
|
|
@ -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);
|
||||
|
|
Loading…
Reference in New Issue