Skip to content

Commit 610777d

Browse files
Set enum ValueType for :: (#5298)
1 parent 072212e commit 610777d

2 files changed

Lines changed: 23 additions & 1 deletion

File tree

lib/symboldatabase.cpp

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6414,8 +6414,12 @@ void SymbolDatabase::setValueType(Token* tok, const ValueType& valuetype, Source
64146414
if (it != typeScope->varlist.end())
64156415
var = &*it;
64166416
}
6417-
if (var)
6417+
if (var) {
64186418
setValueType(parent, *var);
6419+
return;
6420+
}
6421+
if (const Enumerator* enu = parent->astOperand2()->enumerator())
6422+
setValueType(parent, *enu);
64196423
return;
64206424
}
64216425

test/testsymboldatabase.cpp

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -384,6 +384,7 @@ class TestSymbolDatabase : public TestFixture {
384384
TEST_CASE(enum10); // #11001
385385
TEST_CASE(enum11);
386386
TEST_CASE(enum12);
387+
TEST_CASE(enum13);
387388

388389
TEST_CASE(sizeOfType);
389390

@@ -5701,6 +5702,23 @@ class TestSymbolDatabase : public TestFixture {
57015702
ASSERT_EQUALS(e->enumerator(), E0);
57025703
}
57035704

5705+
void enum13() {
5706+
GET_SYMBOL_DB("struct S { enum E { E0, E1 }; };\n"
5707+
"void f(bool b) {\n"
5708+
" auto e = b ? S::E0 : S::E1;\n"
5709+
"}\n");
5710+
ASSERT(db != nullptr);
5711+
auto it = db->scopeList.begin();
5712+
std::advance(it, 2);
5713+
const Enumerator* E1 = it->findEnumerator("E1");
5714+
ASSERT(E1 && E1->value_known);
5715+
ASSERT_EQUALS(E1->value, 1);
5716+
const Token* const a = Token::findsimplematch(tokenizer.tokens(), "auto");
5717+
ASSERT(a && a->valueType());
5718+
TODO_ASSERT(E1->scope == a->valueType()->typeScope);
5719+
ASSERT_EQUALS(a->valueType()->type, ValueType::INT);
5720+
}
5721+
57045722
void sizeOfType() {
57055723
// #7615 - crash in Symboldatabase::sizeOfType()
57065724
GET_SYMBOL_DB("enum e;\n"

0 commit comments

Comments
 (0)