Fix 8872: Crash in LifetimeStore when there is no scope for variable
This fixes crash in: ```cpp struct edit_line_paste_over { void operator()(agi::Context *c) override { paste_lines(c, true, [&](AssDialogue *new_line) -> AssDialogue * { AssDialogue *ret = paste_over(c->parent, pasteOverOptions, new_line, static_cast<AssDialogue*>(&*pos)); return ret; }); } }; ```
This commit is contained in:
parent
67dd822910
commit
b841b818d2
|
@ -2751,6 +2751,8 @@ static void valueFlowLifetime(TokenList *tokenlist, SymbolDatabase*, ErrorLogger
|
||||||
|
|
||||||
auto isCapturingVariable = [&](const Variable *var) {
|
auto isCapturingVariable = [&](const Variable *var) {
|
||||||
const Scope *scope = var->scope();
|
const Scope *scope = var->scope();
|
||||||
|
if (!scope)
|
||||||
|
return false;
|
||||||
if (scopes.count(scope) > 0)
|
if (scopes.count(scope) > 0)
|
||||||
return false;
|
return false;
|
||||||
if (scope->isNestedIn(bodyScope))
|
if (scope->isNestedIn(bodyScope))
|
||||||
|
|
|
@ -1510,6 +1510,7 @@ private:
|
||||||
"}\n");
|
"}\n");
|
||||||
ASSERT_EQUALS("", errout.str());
|
ASSERT_EQUALS("", errout.str());
|
||||||
|
|
||||||
|
<<<<<<< HEAD
|
||||||
<<<<<<< HEAD
|
<<<<<<< HEAD
|
||||||
check("void f() {\n"
|
check("void f() {\n"
|
||||||
" struct b {\n"
|
" struct b {\n"
|
||||||
|
@ -1540,6 +1541,38 @@ private:
|
||||||
" A &&a = T{1, 2, 3}[1]();\n"
|
" A &&a = T{1, 2, 3}[1]();\n"
|
||||||
"}\n");
|
"}\n");
|
||||||
ASSERT_EQUALS("", errout.str());
|
ASSERT_EQUALS("", errout.str());
|
||||||
|
=======
|
||||||
|
// Make sure we dont hang
|
||||||
|
check("struct A;\n"
|
||||||
|
"void f() {\n"
|
||||||
|
" using T = A[3];\n"
|
||||||
|
" A &&a = T{1, 2, 3}[1];\n"
|
||||||
|
"}\n");
|
||||||
|
ASSERT_EQUALS("", errout.str());
|
||||||
|
|
||||||
|
// Make sure we dont hang
|
||||||
|
check("struct A;\n"
|
||||||
|
"void f() {\n"
|
||||||
|
" using T = A[3];\n"
|
||||||
|
" A &&a = T{1, 2, 3}[1]();\n"
|
||||||
|
"}\n");
|
||||||
|
ASSERT_EQUALS("", errout.str());
|
||||||
|
|
||||||
|
// Crash #8872
|
||||||
|
check("struct a {\n"
|
||||||
|
" void operator()(b c) override {\n"
|
||||||
|
" d(c, [&] { c->e });\n"
|
||||||
|
" }\n"
|
||||||
|
"};\n");
|
||||||
|
ASSERT_EQUALS("", errout.str());
|
||||||
|
|
||||||
|
check("struct a {\n"
|
||||||
|
" void operator()(b c) override {\n"
|
||||||
|
" d(c, [=] { c->e });\n"
|
||||||
|
" }\n"
|
||||||
|
"};\n");
|
||||||
|
ASSERT_EQUALS("", errout.str());
|
||||||
|
>>>>>>> 6586f2d354d3f9dc26d830b6e641f158a5c58432
|
||||||
}
|
}
|
||||||
|
|
||||||
void danglingLifetimeFunction() {
|
void danglingLifetimeFunction() {
|
||||||
|
|
Loading…
Reference in New Issue