Skip to content

Commit f6fb333

Browse files
Set enumerator in ctor init list (refs #10045) (#5599)
1 parent e8671c9 commit f6fb333

2 files changed

Lines changed: 32 additions & 1 deletion

File tree

lib/symboldatabase.cpp

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5106,6 +5106,15 @@ const Enumerator * SymbolDatabase::findEnumerator(const Token * tok, std::set<st
51065106
}
51075107
}
51085108
} else { // unqualified name
5109+
5110+
if (tok->scope()->type == Scope::eGlobal) {
5111+
const Token* astTop = tok->astTop();
5112+
if (Token::simpleMatch(astTop, ":") && Token::simpleMatch(astTop->astOperand1(), "(")) { // ctor init list
5113+
const Token* ctor = astTop->astOperand1()->previous();
5114+
if (ctor && ctor->function() && ctor->function()->nestedIn)
5115+
scope = ctor->function()->nestedIn;
5116+
}
5117+
}
51095118
const Enumerator * enumerator = scope->findEnumerator(tokStr);
51105119

51115120
if (enumerator && !(enumerator->scope && enumerator->scope->enumClass))

test/testsymboldatabase.cpp

Lines changed: 23 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5943,11 +5943,33 @@ class TestSymbolDatabase : public TestFixture {
59435943
std::advance(it, 2);
59445944
const Enumerator* E0 = it->findEnumerator("E0");
59455945
ASSERT(E0 && E0->value_known && E0->value == 0);
5946-
std::advance(it, 1);
59475946
const Token* const e = Token::findsimplematch(tokenizer.tokens(), "E0 ;");
59485947
ASSERT(e && e->enumerator());
59495948
ASSERT_EQUALS(E0, e->enumerator());
59505949
}
5950+
{
5951+
GET_SYMBOL_DB("struct S {\n"
5952+
" enum E { E0 };\n"
5953+
" void f(int i);\n"
5954+
" S();\n"
5955+
" int m;\n"
5956+
"};\n"
5957+
"S::S() : m(E0) {}\n"
5958+
"void S::f(int i) {\n"
5959+
" if (i != E0) {}\n"
5960+
"}\n");
5961+
ASSERT(db != nullptr);
5962+
auto it = db->scopeList.begin();
5963+
std::advance(it, 2);
5964+
const Enumerator* E0 = it->findEnumerator("E0");
5965+
ASSERT(E0 && E0->value_known && E0->value == 0);
5966+
const Token* e = Token::findsimplematch(tokenizer.tokens(), "E0 )");
5967+
ASSERT(e && e->enumerator());
5968+
ASSERT_EQUALS(E0, e->enumerator());
5969+
e = Token::findsimplematch(e->next(), "E0 )");
5970+
ASSERT(e && e->enumerator());
5971+
ASSERT_EQUALS(E0, e->enumerator());
5972+
}
59515973
}
59525974

59535975
void sizeOfType() {

0 commit comments

Comments
 (0)