Skip to content

Commit 6bc164e

Browse files
Fix #12122 FP knownConditionTrueFalse with type traits (#5595)
1 parent 689187d commit 6bc164e

2 files changed

Lines changed: 23 additions & 15 deletions

File tree

lib/astutils.cpp

Lines changed: 17 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1506,12 +1506,8 @@ bool isSameExpression(bool cpp, bool macro, const Token *tok1, const Token *tok2
15061506
if (cpp) {
15071507
if (tok1->str() == "." && tok1->astOperand1() && tok1->astOperand1()->str() == "this")
15081508
tok1 = tok1->astOperand2();
1509-
while (Token::simpleMatch(tok1, "::") && tok1->astOperand2())
1510-
tok1 = tok1->astOperand2();
15111509
if (tok2->str() == "." && tok2->astOperand1() && tok2->astOperand1()->str() == "this")
15121510
tok2 = tok2->astOperand2();
1513-
while (Token::simpleMatch(tok2, "::") && tok2->astOperand2())
1514-
tok2 = tok2->astOperand2();
15151511
}
15161512
// Skip double not
15171513
if (Token::simpleMatch(tok1, "!") && Token::simpleMatch(tok1->astOperand1(), "!") && !Token::simpleMatch(tok1->astParent(), "=") && astIsBoolLike(tok2)) {
@@ -1523,20 +1519,26 @@ bool isSameExpression(bool cpp, bool macro, const Token *tok1, const Token *tok2
15231519
const bool tok_str_eq = tok1->str() == tok2->str();
15241520
if (!tok_str_eq && isDifferentKnownValues(tok1, tok2))
15251521
return false;
1526-
if (isSameConstantValue(macro, tok1, tok2))
1522+
1523+
const Token *followTok1 = tok1, *followTok2 = tok2;
1524+
while (Token::simpleMatch(followTok1, "::") && followTok1->astOperand2())
1525+
followTok1 = followTok1->astOperand2();
1526+
while (Token::simpleMatch(followTok2, "::") && followTok2->astOperand2())
1527+
followTok2 = followTok2->astOperand2();
1528+
if (isSameConstantValue(macro, followTok1, followTok2))
15271529
return true;
15281530

15291531
// Follow variable
1530-
if (followVar && !tok_str_eq && (tok1->varId() || tok2->varId() || tok1->enumerator() || tok2->enumerator())) {
1531-
const Token * varTok1 = followVariableExpression(tok1, cpp, tok2);
1532-
if ((varTok1->str() == tok2->str()) || isSameConstantValue(macro, varTok1, tok2)) {
1533-
followVariableExpressionError(tok1, varTok1, errors);
1534-
return isSameExpression(cpp, macro, varTok1, tok2, library, true, followVar, errors);
1535-
}
1536-
const Token * varTok2 = followVariableExpression(tok2, cpp, tok1);
1537-
if ((tok1->str() == varTok2->str()) || isSameConstantValue(macro, tok1, varTok2)) {
1538-
followVariableExpressionError(tok2, varTok2, errors);
1539-
return isSameExpression(cpp, macro, tok1, varTok2, library, true, followVar, errors);
1532+
if (followVar && !tok_str_eq && (followTok1->varId() || followTok2->varId() || followTok1->enumerator() || followTok2->enumerator())) {
1533+
const Token * varTok1 = followVariableExpression(followTok1, cpp, followTok2);
1534+
if ((varTok1->str() == followTok2->str()) || isSameConstantValue(macro, varTok1, followTok2)) {
1535+
followVariableExpressionError(followTok1, varTok1, errors);
1536+
return isSameExpression(cpp, macro, varTok1, followTok2, library, true, followVar, errors);
1537+
}
1538+
const Token * varTok2 = followVariableExpression(followTok2, cpp, followTok1);
1539+
if ((followTok1->str() == varTok2->str()) || isSameConstantValue(macro, followTok1, varTok2)) {
1540+
followVariableExpressionError(followTok2, varTok2, errors);
1541+
return isSameExpression(cpp, macro, followTok1, varTok2, library, true, followVar, errors);
15401542
}
15411543
if ((varTok1->str() == varTok2->str()) || isSameConstantValue(macro, varTok1, varTok2)) {
15421544
followVariableExpressionError(tok1, varTok1, errors);

test/testother.cpp

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6900,6 +6900,12 @@ class TestOther : public TestFixture {
69006900
"[test.cpp:14]: (style) The comparison '0 > S::E0' is always false.\n"
69016901
"[test.cpp:15]: (style) The comparison '0 > S::F::F0' is always false.\n",
69026902
errout.str());
6903+
6904+
check("template<typename T, typename U>\n" // #12122
6905+
"void f() {\n"
6906+
" static_assert(std::is_same<T, U>::value || std::is_integral<T>::value);\n"
6907+
"}\n");
6908+
ASSERT_EQUALS("", errout.str());
69036909
}
69046910

69056911
void duplicateExpressionLoop() {

0 commit comments

Comments
 (0)