From f6fb3334f3fdf5f9497d4244c30e45a4c79da9e9 Mon Sep 17 00:00:00 2001 From: chrchr-github <78114321+chrchr-github@users.noreply.github.com> Date: Sat, 28 Oct 2023 13:51:52 +0200 Subject: [PATCH] Set enumerator in ctor init list (refs #10045) (#5599) --- lib/symboldatabase.cpp | 9 +++++++++ test/testsymboldatabase.cpp | 24 +++++++++++++++++++++++- 2 files changed, 32 insertions(+), 1 deletion(-) diff --git a/lib/symboldatabase.cpp b/lib/symboldatabase.cpp index c58f61c8c..6098b8dc7 100644 --- a/lib/symboldatabase.cpp +++ b/lib/symboldatabase.cpp @@ -5106,6 +5106,15 @@ const Enumerator * SymbolDatabase::findEnumerator(const Token * tok, std::setscope()->type == Scope::eGlobal) { + const Token* astTop = tok->astTop(); + if (Token::simpleMatch(astTop, ":") && Token::simpleMatch(astTop->astOperand1(), "(")) { // ctor init list + const Token* ctor = astTop->astOperand1()->previous(); + if (ctor && ctor->function() && ctor->function()->nestedIn) + scope = ctor->function()->nestedIn; + } + } const Enumerator * enumerator = scope->findEnumerator(tokStr); if (enumerator && !(enumerator->scope && enumerator->scope->enumClass)) diff --git a/test/testsymboldatabase.cpp b/test/testsymboldatabase.cpp index d6b8c13b7..fa7fba6ab 100644 --- a/test/testsymboldatabase.cpp +++ b/test/testsymboldatabase.cpp @@ -5943,11 +5943,33 @@ private: std::advance(it, 2); const Enumerator* E0 = it->findEnumerator("E0"); ASSERT(E0 && E0->value_known && E0->value == 0); - std::advance(it, 1); const Token* const e = Token::findsimplematch(tokenizer.tokens(), "E0 ;"); ASSERT(e && e->enumerator()); ASSERT_EQUALS(E0, e->enumerator()); } + { + GET_SYMBOL_DB("struct S {\n" + " enum E { E0 };\n" + " void f(int i);\n" + " S();\n" + " int m;\n" + "};\n" + "S::S() : m(E0) {}\n" + "void S::f(int i) {\n" + " if (i != E0) {}\n" + "}\n"); + ASSERT(db != nullptr); + auto it = db->scopeList.begin(); + std::advance(it, 2); + const Enumerator* E0 = it->findEnumerator("E0"); + ASSERT(E0 && E0->value_known && E0->value == 0); + const Token* e = Token::findsimplematch(tokenizer.tokens(), "E0 )"); + ASSERT(e && e->enumerator()); + ASSERT_EQUALS(E0, e->enumerator()); + e = Token::findsimplematch(e->next(), "E0 )"); + ASSERT(e && e->enumerator()); + ASSERT_EQUALS(E0, e->enumerator()); + } } void sizeOfType() {