Fix #11739 Assert failure in valueflow.cpp / setSymbolic() (#5104)

This commit is contained in:
chrchr-github 2023-06-03 11:08:06 +02:00 committed by GitHub
parent 82e9c076da
commit 1b98be458d
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 27 additions and 1 deletions

View File

@ -1584,7 +1584,13 @@ void SymbolDatabase::createSymbolDatabaseExprIds()
inConstExpr = tok->next()->link(); inConstExpr = tok->next()->link();
} }
} }
for (const Scope * scope : functionScopes) {
auto exprScopes = functionScopes; // functions + global lambdas
std::copy_if(scopeList.front().nestedList.begin(), scopeList.front().nestedList.end(), std::back_inserter(exprScopes), [](const Scope* scope) {
return scope && scope->type == Scope::eLambda;
});
for (const Scope * scope : exprScopes) {
nonneg int thisId = 0; nonneg int thisId = 0;
std::unordered_map<std::string, std::vector<Token*>> exprs; std::unordered_map<std::string, std::vector<Token*>> exprs;

View File

@ -232,6 +232,7 @@ private:
TEST_CASE(decltype2); TEST_CASE(decltype2);
TEST_CASE(exprid1); TEST_CASE(exprid1);
TEST_CASE(exprid2);
TEST_CASE(structuredBindings); TEST_CASE(structuredBindings);
} }
@ -3760,6 +3761,25 @@ private:
ASSERT_EQUALS(expected, actual); ASSERT_EQUALS(expected, actual);
} }
void exprid2() {
const std::string actual = tokenizeExpr( // #11739
"struct S { std::unique_ptr<int> u; };\n"
"auto f = [](const S& s) -> std::unique_ptr<int> {\n"
" if (auto p = s.u.get())\n"
" return std::make_unique<int>(*p);\n"
" return nullptr;\n"
"};\n");
const char expected[] = "1: struct S { std :: unique_ptr < int > u ; } ;\n"
"2: auto f ; f = [ ] ( const S & s ) . std :: unique_ptr < int > {\n"
"3: if (@5 auto p@4 =@6 s@3 .@7 u@5 .@8 get (@9 ) ) {\n"
"4: return std ::@10 make_unique < int > (@11 *@12 p@4 ) ; }\n"
"5: return nullptr ;\n"
"6: } ;\n";
ASSERT_EQUALS(expected, actual);
}
void structuredBindings() { void structuredBindings() {
const char code[] = "int foo() { auto [x,y] = xy(); return x+y; }"; const char code[] = "int foo() { auto [x,y] = xy(); return x+y; }";
ASSERT_EQUALS("1: int foo ( ) { auto [ x@1 , y@2 ] = xy ( ) ; return x@1 + y@2 ; }\n", ASSERT_EQUALS("1: int foo ( ) { auto [ x@1 , y@2 ] = xy ( ) ; return x@1 + y@2 ; }\n",