Merge pull request #73798 from vonagam/fix-bad-continue-in-lambda

GDScript: Fix parsing unexpected break/continue in lambda
This commit is contained in:
Rémi Verschelde 2023-02-23 13:54:56 +01:00
commit 76d80c2cba
No known key found for this signature in database
GPG key ID: C3336907360768E1
5 changed files with 35 additions and 0 deletions

View file

@ -3138,6 +3138,14 @@ GDScriptParser::ExpressionNode *GDScriptParser::parse_lambda(ExpressionNode *p_p
bool previous_in_lambda = in_lambda;
in_lambda = true;
// Save break/continue state.
bool could_break = can_break;
bool could_continue = can_continue;
// Disallow break/continue.
can_break = false;
can_continue = false;
function->body = parse_suite("lambda declaration", body, true);
complete_extents(function);
complete_extents(lambda);
@ -3155,6 +3163,11 @@ GDScriptParser::ExpressionNode *GDScriptParser::parse_lambda(ExpressionNode *p_p
current_function = previous_function;
in_lambda = previous_in_lambda;
lambda->function = function;
// Reset break/continue state.
can_break = could_break;
can_continue = could_continue;
return lambda;
}

View file

@ -0,0 +1,5 @@
func test():
for index in range(0, 1):
var lambda := func():
continue
print('not ok')

View file

@ -0,0 +1,2 @@
GDTEST_PARSER_ERROR
Cannot use "continue" outside of a loop.

View file

@ -0,0 +1,13 @@
func test():
var i_string := ''
for i in 3:
if i == 1: continue
var lambda := func():
var j_string := ''
for j in 3:
if j == 1: continue
j_string += str(j)
return j_string
i_string += lambda.call()
assert(i_string == '0202')
print('ok')

View file

@ -0,0 +1,2 @@
GDTEST_OK
ok