Skip to content

Commit 6b5df68

Browse files
Fix #11001 syntaxError for valid C code sizeof(enum ...) (#4045)
1 parent 961ecfb commit 6b5df68

2 files changed

Lines changed: 15 additions & 1 deletion

File tree

lib/symboldatabase.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4648,7 +4648,7 @@ const Token * Scope::addEnum(const Token * tok, bool isCpp)
46484648
if (tok2 == end) {
46494649
tok2 = tok2->next();
46504650

4651-
if (tok2 && tok2->str() != ";")
4651+
if (tok2 && tok2->str() != ";" && (isCpp || tok2->str() != ")"))
46524652
tok2 = nullptr;
46534653
} else
46544654
tok2 = nullptr;

test/testsymboldatabase.cpp

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -376,6 +376,7 @@ class TestSymbolDatabase : public TestFixture {
376376
TEST_CASE(enum7);
377377
TEST_CASE(enum8);
378378
TEST_CASE(enum9);
379+
TEST_CASE(enum10); // #11001
379380

380381
TEST_CASE(sizeOfType);
381382

@@ -5307,6 +5308,19 @@ class TestSymbolDatabase : public TestFixture {
53075308
ASSERT_EQUALS(X1->value, 8);
53085309
}
53095310

5311+
void enum10() { // #11001
5312+
GET_SYMBOL_DB_C("int b = sizeof(enum etag {X, Y});\n");
5313+
ASSERT(db != nullptr);
5314+
const Enumerator *X = db->scopeList.back().findEnumerator("X");
5315+
ASSERT(X);
5316+
ASSERT(X->value_known);
5317+
ASSERT_EQUALS(X->value, 0);
5318+
const Enumerator *Y = db->scopeList.back().findEnumerator("Y");
5319+
ASSERT(Y);
5320+
ASSERT(Y->value_known);
5321+
ASSERT_EQUALS(Y->value, 1);
5322+
}
5323+
53105324
void sizeOfType() {
53115325
// #7615 - crash in Symboldatabase::sizeOfType()
53125326
GET_SYMBOL_DB("enum e;\n"

0 commit comments

Comments
 (0)