parent
d8c8487a98
commit
922e27de4c
|
@ -1274,16 +1274,22 @@ bool isSameExpression(bool cpp, bool macro, const Token *tok1, const Token *tok2
|
|||
}
|
||||
return false;
|
||||
}
|
||||
if (macro && (tok1->isExpandedMacro() || tok2->isExpandedMacro() || tok1->isTemplateArg() || tok2->isTemplateArg()))
|
||||
auto flagsDiffer = [](const Token* tok1, const Token* tok2, bool macro) {
|
||||
if (macro && (tok1->isExpandedMacro() || tok2->isExpandedMacro() || tok1->isTemplateArg() || tok2->isTemplateArg()))
|
||||
return true;
|
||||
if (tok1->isComplex() != tok2->isComplex())
|
||||
return true;
|
||||
if (tok1->isLong() != tok2->isLong())
|
||||
return true;
|
||||
if (tok1->isUnsigned() != tok2->isUnsigned())
|
||||
return true;
|
||||
if (tok1->isSigned() != tok2->isSigned())
|
||||
return true;
|
||||
return false;
|
||||
if (tok1->isComplex() != tok2->isComplex())
|
||||
return false;
|
||||
if (tok1->isLong() != tok2->isLong())
|
||||
return false;
|
||||
if (tok1->isUnsigned() != tok2->isUnsigned())
|
||||
return false;
|
||||
if (tok1->isSigned() != tok2->isSigned())
|
||||
};
|
||||
if (flagsDiffer(tok1, tok2, macro))
|
||||
return false;
|
||||
|
||||
if (pure && tok1->isName() && tok1->next()->str() == "(" && tok1->str() != "sizeof" && !(tok1->variable() && tok1 == tok1->variable()->nameToken())) {
|
||||
if (!tok1->function()) {
|
||||
if (Token::simpleMatch(tok1->previous(), ".")) {
|
||||
|
@ -1325,7 +1331,7 @@ bool isSameExpression(bool cpp, bool macro, const Token *tok1, const Token *tok2
|
|||
const Token *end1 = t1->link();
|
||||
const Token *end2 = t2->link();
|
||||
while (t1 && t2 && t1 != end1 && t2 != end2) {
|
||||
if (t1->str() != t2->str())
|
||||
if (t1->str() != t2->str() || flagsDiffer(t1, t2, macro))
|
||||
return false;
|
||||
t1 = t1->next();
|
||||
t2 = t2->next();
|
||||
|
@ -1346,9 +1352,7 @@ bool isSameExpression(bool cpp, bool macro, const Token *tok1, const Token *tok2
|
|||
const Token *t2 = tok2->next();
|
||||
while (t1 && t2 &&
|
||||
t1->str() == t2->str() &&
|
||||
t1->isLong() == t2->isLong() &&
|
||||
t1->isUnsigned() == t2->isUnsigned() &&
|
||||
t1->isSigned() == t2->isSigned() &&
|
||||
!flagsDiffer(t1, t2, macro) &&
|
||||
(t1->isName() || t1->str() == "*")) {
|
||||
t1 = t1->next();
|
||||
t2 = t2->next();
|
||||
|
|
|
@ -5603,13 +5603,33 @@ private:
|
|||
ASSERT_EQUALS("", errout.str());
|
||||
}
|
||||
|
||||
void duplicateExpressionTemplate() { // #6930
|
||||
check("template <int I> void f() {\n"
|
||||
void duplicateExpressionTemplate() {
|
||||
check("template <int I> void f() {\n" // #6930
|
||||
" if (I >= 0 && I < 3) {}\n"
|
||||
"}\n"
|
||||
"\n"
|
||||
"static auto a = f<0>();");
|
||||
ASSERT_EQUALS("", errout.str());
|
||||
|
||||
check("template<typename T>\n" // #7754
|
||||
"void f() {\n"
|
||||
" if (std::is_same_v<T, char> || std::is_same_v<T, unsigned char>) {}\n"
|
||||
"}\n");
|
||||
ASSERT_EQUALS("", errout.str());
|
||||
|
||||
check("typedef long long int64_t;"
|
||||
"template<typename T>\n"
|
||||
"void f() {\n"
|
||||
" if (std::is_same_v<T, long> || std::is_same_v<T, int64_t>) {}\n"
|
||||
"}\n");
|
||||
ASSERT_EQUALS("", errout.str());
|
||||
|
||||
checkP("#define int32_t int"
|
||||
"template<typename T>\n"
|
||||
"void f() {\n"
|
||||
" if (std::is_same_v<T, int> || std::is_same_v<T, int32_t>) {}\n"
|
||||
"}\n");
|
||||
ASSERT_EQUALS("", errout.str());
|
||||
}
|
||||
|
||||
void duplicateExpressionCompareWithZero() {
|
||||
|
|
Loading…
Reference in New Issue