forked from OSchip/llvm-project
-Wunsequenced: if the LHS of an &&, || or ?: is not constant, check for
unsequenced operations in the RHS. We don't compare the RHS with the rest of the expression yet; such checks will need care to avoid diagnosing unsequenced operations which are both in conditionally-evaluated subexpressions which actually can't occur together, such as in '(b && ++x) + (!b && ++x)'. llvm-svn: 172760
This commit is contained in:
parent
50dc8a6a38
commit
01a7fba820
|
@ -5507,9 +5507,18 @@ public:
|
|||
|
||||
bool Result;
|
||||
if (!BO->getLHS()->isValueDependent() &&
|
||||
BO->getLHS()->EvaluateAsBooleanCondition(Result, SemaRef.Context) &&
|
||||
!Result)
|
||||
Visit(BO->getRHS());
|
||||
BO->getLHS()->EvaluateAsBooleanCondition(Result, SemaRef.Context)) {
|
||||
if (!Result)
|
||||
Visit(BO->getRHS());
|
||||
} else {
|
||||
// Check for unsequenced operations in the RHS, treating it as an
|
||||
// entirely separate evaluation.
|
||||
//
|
||||
// FIXME: If there are operations in the RHS which are unsequenced
|
||||
// with respect to operations outside the RHS, and those operations
|
||||
// are unconditionally evaluated, diagnose them.
|
||||
SequenceChecker(SemaRef, BO->getRHS());
|
||||
}
|
||||
}
|
||||
void VisitBinLAnd(BinaryOperator *BO) {
|
||||
{
|
||||
|
@ -5519,9 +5528,12 @@ public:
|
|||
|
||||
bool Result;
|
||||
if (!BO->getLHS()->isValueDependent() &&
|
||||
BO->getLHS()->EvaluateAsBooleanCondition(Result, SemaRef.Context) &&
|
||||
Result)
|
||||
Visit(BO->getRHS());
|
||||
BO->getLHS()->EvaluateAsBooleanCondition(Result, SemaRef.Context)) {
|
||||
if (Result)
|
||||
Visit(BO->getRHS());
|
||||
} else {
|
||||
SequenceChecker(SemaRef, BO->getRHS());
|
||||
}
|
||||
}
|
||||
|
||||
// Only visit the condition, unless we can be sure which subexpression will
|
||||
|
@ -5534,6 +5546,10 @@ public:
|
|||
if (!CO->getCond()->isValueDependent() &&
|
||||
CO->getCond()->EvaluateAsBooleanCondition(Result, SemaRef.Context))
|
||||
Visit(Result ? CO->getTrueExpr() : CO->getFalseExpr());
|
||||
else {
|
||||
SequenceChecker(SemaRef, CO->getTrueExpr());
|
||||
SequenceChecker(SemaRef, CO->getFalseExpr());
|
||||
}
|
||||
}
|
||||
|
||||
void VisitCXXConstructExpr(CXXConstructExpr *CCE) {
|
||||
|
|
|
@ -88,4 +88,11 @@ void test() {
|
|||
xs[0] = (a = 1, a); // ok
|
||||
(a -= 128) &= 128; // ok
|
||||
++a += 1; // ok
|
||||
|
||||
xs[8] ? ++a + a++ : 0; // expected-warning {{multiple unsequenced modifications}}
|
||||
xs[8] ? 0 : ++a + a++; // expected-warning {{multiple unsequenced modifications}}
|
||||
xs[8] ? ++a : a++; // ok
|
||||
|
||||
xs[8] && (++a + a++); // expected-warning {{multiple unsequenced modifications}}
|
||||
xs[8] || (++a + a++); // expected-warning {{multiple unsequenced modifications}}
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue