Fixed #11232 (Syntax Error: AST broken, binary operator '!=' doesn't have two operands)

This commit is contained in:
Daniel Marjamäki 2022-08-27 18:02:19 +02:00
parent f0ac0d8910
commit 5e0fc24bb7
2 changed files with 22 additions and 0 deletions

View File

@ -1390,10 +1390,19 @@ void Tokenizer::simplifyTypedef()
if (sameStartEnd)
typeEnd = typeStart;
// Is this a "T()" expression where T is a pointer type?
const bool isPointerTypeCall = !inOperator && Token::Match(tok2, "%name% ( )") && !pointers.empty();
// start substituting at the typedef name by replacing it with the type
Token* replStart = tok2; // track first replaced token
for (Token* tok3 = typeStart; tok3->str() != ";"; tok3 = tok3->next())
tok3->isSimplifiedTypedef(true);
if (isPointerTypeCall) {
tok2->deleteThis();
tok2->insertToken("0");
tok2 = tok2->next();
tok2->next()->insertToken("0");
}
tok2->str(typeStart->str());
// restore qualification if it was removed

View File

@ -188,6 +188,7 @@ private:
TEST_CASE(simplifyTypedef139);
TEST_CASE(simplifyTypedef140); // #10798
TEST_CASE(simplifyTypedef141); // #10144
TEST_CASE(simplifyTypedef142); // T() when T is a pointer type
TEST_CASE(simplifyTypedefFunction1);
TEST_CASE(simplifyTypedefFunction2); // ticket #1685
@ -3051,6 +3052,18 @@ private:
ASSERT_EQUALS("class C { struct I { } ; } ;", tok(code));
}
void simplifyTypedef142() { // T() when T is a pointer type
// #11232
const char code1[] = "typedef int* T;\n"
"a = T();\n";
ASSERT_EQUALS("a = ( int * ) 0 ;", tok(code1));
// #9479
const char code2[] = "typedef int* T;\n"
"void f(T = T()){}\n";
ASSERT_EQUALS("void f ( int * = ( int * ) 0 ) { }", tok(code2));
}
void simplifyTypedefFunction1() {
{
const char code[] = "typedef void (*my_func)();\n"