Skip to content

Commit 8771912

Browse files
authored
Fixed #11908 (SymbolDatabase: array not parsed properly 'int (**rs)[32]') (#5430)
1 parent f9b18bc commit 8771912

2 files changed

Lines changed: 35 additions & 3 deletions

File tree

lib/symboldatabase.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2243,7 +2243,7 @@ void Variable::evaluate(const Settings* settings)
22432243
setFlag(fIsConst, true);
22442244
setFlag(fIsStatic, true);
22452245
} else if (tok->str() == "*") {
2246-
setFlag(fIsPointer, !isArray() || (isContainer && !Token::Match(tok->next(), "%name% [")) || Token::Match(tok->previous(), "( * %name% )"));
2246+
setFlag(fIsPointer, !isArray() || (isContainer && !Token::Match(tok->next(), "%name% [")) || Token::Match(tok, "* const| %name% )"));
22472247
setFlag(fIsConst, false); // Points to const, isn't necessarily const itself
22482248
} else if (tok->str() == "&") {
22492249
if (isReference())

test/testsymboldatabase.cpp

Lines changed: 34 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -137,7 +137,9 @@ class TestSymbolDatabase : public TestFixture {
137137
TEST_CASE(test_isVariableDeclarationIdentifiesDeclarationWithMultipleIndirection);
138138
TEST_CASE(test_isVariableDeclarationIdentifiesArray);
139139
TEST_CASE(test_isVariableDeclarationIdentifiesPointerArray);
140-
TEST_CASE(test_isVariableDeclarationIdentifiesOfArrayPointers);
140+
TEST_CASE(test_isVariableDeclarationIdentifiesOfArrayPointers1);
141+
TEST_CASE(test_isVariableDeclarationIdentifiesOfArrayPointers2);
142+
TEST_CASE(test_isVariableDeclarationIdentifiesOfArrayPointers3);
141143
TEST_CASE(test_isVariableDeclarationIdentifiesArrayOfFunctionPointers);
142144
TEST_CASE(isVariableDeclarationIdentifiesTemplatedPointerVariable);
143145
TEST_CASE(isVariableDeclarationIdentifiesTemplatedPointerToPointerVariable);
@@ -872,7 +874,7 @@ class TestSymbolDatabase : public TestFixture {
872874
ASSERT(false == v.isReference());
873875
}
874876

875-
void test_isVariableDeclarationIdentifiesOfArrayPointers() {
877+
void test_isVariableDeclarationIdentifiesOfArrayPointers1() {
876878
reset();
877879
GET_SYMBOL_DB("A (*a)[5];");
878880
const bool result = db->scopeList.front().isVariableDeclaration(tokenizer.tokens(), vartok, typetok);
@@ -887,6 +889,36 @@ class TestSymbolDatabase : public TestFixture {
887889
ASSERT(false == v.isReference());
888890
}
889891

892+
void test_isVariableDeclarationIdentifiesOfArrayPointers2() {
893+
reset();
894+
GET_SYMBOL_DB("A (*const a)[5];");
895+
const bool result = db->scopeList.front().isVariableDeclaration(tokenizer.tokens(), vartok, typetok);
896+
ASSERT_EQUALS(true, result);
897+
ASSERT_EQUALS("a", vartok->str());
898+
ASSERT_EQUALS("A", typetok->str());
899+
Variable v(vartok, typetok, vartok->previous(), 0, AccessControl::Public, nullptr, nullptr, &settings1);
900+
ASSERT(true == v.isPointer());
901+
ASSERT(false == v.isArray());
902+
ASSERT(true == v.isPointerToArray());
903+
ASSERT(false == v.isPointerArray());
904+
ASSERT(false == v.isReference());
905+
}
906+
907+
void test_isVariableDeclarationIdentifiesOfArrayPointers3() {
908+
reset();
909+
GET_SYMBOL_DB("A (** a)[5];");
910+
const bool result = db->scopeList.front().isVariableDeclaration(tokenizer.tokens(), vartok, typetok);
911+
ASSERT_EQUALS(true, result);
912+
ASSERT_EQUALS("a", vartok->str());
913+
ASSERT_EQUALS("A", typetok->str());
914+
Variable v(vartok, typetok, vartok->previous(), 0, AccessControl::Public, nullptr, nullptr, &settings1);
915+
ASSERT(true == v.isPointer());
916+
ASSERT(false == v.isArray());
917+
ASSERT(true == v.isPointerToArray());
918+
ASSERT(false == v.isPointerArray());
919+
ASSERT(false == v.isReference());
920+
}
921+
890922
void test_isVariableDeclarationIdentifiesArrayOfFunctionPointers() {
891923
reset();
892924
GET_SYMBOL_DB("int (*a[])(int) = { g };"); // #11596

0 commit comments

Comments
 (0)