Fix issue 9367: FP knownConditionTrueFalse (#2209)
This commit is contained in:
parent
c1ff3419a6
commit
0df4876059
|
@ -766,12 +766,10 @@ static void setTokenValue(Token* tok, const ValueFlow::Value &value, const Setti
|
||||||
parent->astOperand1() &&
|
parent->astOperand1() &&
|
||||||
parent->astOperand2()) {
|
parent->astOperand2()) {
|
||||||
|
|
||||||
// Dont compare impossible values
|
const bool noninvertible = parent->isComparisonOp() || Token::Match(parent, "%|/|&|%or%");
|
||||||
if (parent->isComparisonOp() && value.isImpossible())
|
|
||||||
return;
|
|
||||||
|
|
||||||
// Skip operators with impossible values that are not invertible
|
// Skip operators with impossible values that are not invertible
|
||||||
if (Token::Match(parent, "%|/|&|%or%") && value.isImpossible())
|
if (noninvertible && value.isImpossible())
|
||||||
return;
|
return;
|
||||||
|
|
||||||
// known result when a operand is 0.
|
// known result when a operand is 0.
|
||||||
|
@ -793,11 +791,15 @@ static void setTokenValue(Token* tok, const ValueFlow::Value &value, const Setti
|
||||||
}
|
}
|
||||||
|
|
||||||
for (const ValueFlow::Value &value1 : parent->astOperand1()->values()) {
|
for (const ValueFlow::Value &value1 : parent->astOperand1()->values()) {
|
||||||
|
if (noninvertible && value1.isImpossible())
|
||||||
|
continue;
|
||||||
if (!value1.isIntValue() && !value1.isFloatValue() && !value1.isTokValue())
|
if (!value1.isIntValue() && !value1.isFloatValue() && !value1.isTokValue())
|
||||||
continue;
|
continue;
|
||||||
if (value1.isTokValue() && (!parent->isComparisonOp() || value1.tokvalue->tokType() != Token::eString))
|
if (value1.isTokValue() && (!parent->isComparisonOp() || value1.tokvalue->tokType() != Token::eString))
|
||||||
continue;
|
continue;
|
||||||
for (const ValueFlow::Value &value2 : parent->astOperand2()->values()) {
|
for (const ValueFlow::Value &value2 : parent->astOperand2()->values()) {
|
||||||
|
if (noninvertible && value2.isImpossible())
|
||||||
|
continue;
|
||||||
if (!value2.isIntValue() && !value2.isFloatValue() && !value2.isTokValue())
|
if (!value2.isIntValue() && !value2.isFloatValue() && !value2.isTokValue())
|
||||||
continue;
|
continue;
|
||||||
if (value2.isTokValue() && (!parent->isComparisonOp() || value2.tokvalue->tokType() != Token::eString || value1.isTokValue()))
|
if (value2.isTokValue() && (!parent->isComparisonOp() || value2.tokvalue->tokType() != Token::eString || value1.isTokValue()))
|
||||||
|
|
|
@ -3312,6 +3312,15 @@ private:
|
||||||
" }\n"
|
" }\n"
|
||||||
"}\n");
|
"}\n");
|
||||||
ASSERT_EQUALS("", errout.str());
|
ASSERT_EQUALS("", errout.str());
|
||||||
|
|
||||||
|
// #9367
|
||||||
|
check("void f(long x) {\n"
|
||||||
|
" if (x <= 0L)\n"
|
||||||
|
" return;\n"
|
||||||
|
" if (x % 360L == 0)\n"
|
||||||
|
" return;\n"
|
||||||
|
"}\n");
|
||||||
|
ASSERT_EQUALS("", errout.str());
|
||||||
}
|
}
|
||||||
|
|
||||||
void alwaysTrueContainer() {
|
void alwaysTrueContainer() {
|
||||||
|
|
Loading…
Reference in New Issue