Fixed wrongly detected unconditional scope with C++11-style initialization in SymbolDatabase (#6581)
This commit is contained in:
parent
eefea507b9
commit
eb2b0fa0d0
|
@ -823,8 +823,10 @@ SymbolDatabase::SymbolDatabase(const Tokenizer *tokenizer, const Settings *setti
|
||||||
else if (scope->type == Scope::eCatch)
|
else if (scope->type == Scope::eCatch)
|
||||||
scope->checkVariable(tok->tokAt(2), Throw, &settings->library); // check for variable declaration and add it to new scope if found
|
scope->checkVariable(tok->tokAt(2), Throw, &settings->library); // check for variable declaration and add it to new scope if found
|
||||||
tok = scopeStartTok;
|
tok = scopeStartTok;
|
||||||
} else if (tok->str() == "{" && !tok->previous()->varId()) {
|
} else if (tok->str() == "{") {
|
||||||
if (tok->strAt(-1) == ")" && tok->linkAt(-1)->strAt(-1) == "]") {
|
if (tok->previous()->varId())
|
||||||
|
tok = tok->link();
|
||||||
|
else if (tok->strAt(-1) == ")" && tok->linkAt(-1)->strAt(-1) == "]") {
|
||||||
scopeList.push_back(Scope(this, tok->linkAt(-1)->linkAt(-1), scope, Scope::eLambda, tok));
|
scopeList.push_back(Scope(this, tok->linkAt(-1)->linkAt(-1), scope, Scope::eLambda, tok));
|
||||||
scope->nestedList.push_back(&scopeList.back());
|
scope->nestedList.push_back(&scopeList.back());
|
||||||
scope = &scopeList.back();
|
scope = &scopeList.back();
|
||||||
|
|
|
@ -233,6 +233,7 @@ private:
|
||||||
TEST_CASE(symboldatabase49); // #6424
|
TEST_CASE(symboldatabase49); // #6424
|
||||||
TEST_CASE(symboldatabase50); // #6432
|
TEST_CASE(symboldatabase50); // #6432
|
||||||
TEST_CASE(symboldatabase51); // #6538
|
TEST_CASE(symboldatabase51); // #6538
|
||||||
|
TEST_CASE(symboldatabase52); // #6581
|
||||||
|
|
||||||
TEST_CASE(isImplicitlyVirtual);
|
TEST_CASE(isImplicitlyVirtual);
|
||||||
|
|
||||||
|
@ -2174,6 +2175,21 @@ private:
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void symboldatabase52() { // #6581
|
||||||
|
GET_SYMBOL_DB("void foo() {\n"
|
||||||
|
" int i = 0;\n"
|
||||||
|
" S s{ { i }, 0 };\n"
|
||||||
|
"}");
|
||||||
|
|
||||||
|
ASSERT(db != nullptr);
|
||||||
|
if (db) {
|
||||||
|
ASSERT_EQUALS(2, db->scopeList.size());
|
||||||
|
ASSERT_EQUALS(2, db->getVariableListSize()-1);
|
||||||
|
ASSERT(db->getVariableFromVarId(1));
|
||||||
|
ASSERT(db->getVariableFromVarId(2));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void isImplicitlyVirtual() {
|
void isImplicitlyVirtual() {
|
||||||
{
|
{
|
||||||
GET_SYMBOL_DB("class Base {\n"
|
GET_SYMBOL_DB("class Base {\n"
|
||||||
|
|
Loading…
Reference in New Issue