Skip to content

Commit 223258a

Browse files
committed
Fix #14972 [regression] Syntax Error: AST broken, '!' doesn't have an operand.
1 parent dfcec18 commit 223258a

2 files changed

Lines changed: 11 additions & 2 deletions

File tree

lib/tokenize.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5238,7 +5238,7 @@ static Token * matchMemberVarName(const Member &var, const std::list<ScopeInfo2>
52385238
{
52395239
Token *tok = matchMemberName(var, scopeInfo);
52405240
if (Token::Match(tok, "%name%")) {
5241-
if (!tok->next() || tok->strAt(1) != "(" || (tok->tokAt(2) && tok->tokAt(2)->isLiteral()))
5241+
if (!tok->next() || tok->strAt(1) != "(" || (tok->tokAt(2) && (tok->tokAt(2)->isLiteral() || tok->tokAt(2)->isOp())))
52425242
return tok;
52435243
}
52445244
return nullptr;
@@ -5338,7 +5338,7 @@ void Tokenizer::setVarIdPass2()
53385338
}
53395339
if (!tok->next())
53405340
syntaxError(tok);
5341-
if (Token::Match(tok, "%name% (") && !(tok->tokAt(2) && tok->tokAt(2)->isLiteral()))
5341+
if (Token::Match(tok, "%name% (") && !(tok->tokAt(2) && (tok->tokAt(2)->isLiteral() || tok->tokAt(2)->isOp())))
53425342
allMemberFunctions.emplace_back(scope, usingnamespaces, tok1);
53435343
else
53445344
allMemberVars.emplace_back(scope, usingnamespaces, tok1);

test/testvarid.cpp

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -222,6 +222,7 @@ class TestVarID : public TestFixture {
222222
TEST_CASE(varidclass18);
223223
TEST_CASE(varidclass19); // initializer list
224224
TEST_CASE(varidclass20); // #7578: int (*p)[2]
225+
TEST_CASE(varidclass21);
225226
TEST_CASE(varid_classnameshaddowsvariablename); // #3990
226227
TEST_CASE(varid_classnametemplate); // #10221
227228

@@ -4021,6 +4022,14 @@ class TestVarID : public TestFixture {
40214022
ASSERT_EQUALS(expected, tokenize(code));
40224023
}
40234024

4025+
void varidclass21() {
4026+
const char code[] = "struct T { static bool b; };\n" // #14972
4027+
"bool T::b(!false);\n";
4028+
const char expected[] = "1: struct T { static bool b@1 ; } ;\n"
4029+
"2: bool T :: b@1 ( ! false ) ;\n";
4030+
ASSERT_EQUALS(expected, tokenize(code));
4031+
}
4032+
40244033
void varidenum1() {
40254034
const char code[] = "const int eStart = 6;\n"
40264035
"enum myEnum {\n"

0 commit comments

Comments
 (0)