From 690961b79626e0a6b2682fdda3a43f50ca8b276d Mon Sep 17 00:00:00 2001 From: shove Date: Thu, 11 Jan 2024 20:31:31 +0800 Subject: [PATCH] parser: fix close_scope() missing, when field.name is `sort` or `sorted` (fix#20436) (#20485) --- vlib/v/parser/parser.v | 9 +++------ vlib/v/tests/selectorexpt_field_name_test.v | 15 +++++++++++++++ 2 files changed, 18 insertions(+), 6 deletions(-) create mode 100644 vlib/v/tests/selectorexpt_field_name_test.v diff --git a/vlib/v/parser/parser.v b/vlib/v/parser/parser.v index aa05372aa..6b3528177 100644 --- a/vlib/v/parser/parser.v +++ b/vlib/v/parser/parser.v @@ -3205,6 +3205,9 @@ fn (mut p Parser) dot_expr(left ast.Expr) ast.Expr { is_filter := field_name in ['filter', 'map', 'any', 'all'] if is_filter || field_name == 'sort' || field_name == 'sorted' { p.open_scope() + defer { + p.close_scope() + } } // ! in mutable methods if p.tok.kind == .not && p.peek_tok.kind == .lpar { @@ -3267,9 +3270,6 @@ fn (mut p Parser) dot_expr(left ast.Expr) ast.Expr { scope: p.scope comments: comments } - if is_filter || field_name == 'sort' || field_name == 'sorted' { - p.close_scope() - } return mcall_expr } mut is_mut := false @@ -3315,9 +3315,6 @@ fn (mut p Parser) dot_expr(left ast.Expr) ast.Expr { next_token: p.tok.kind } - if is_filter { - p.close_scope() - } return sel_expr } diff --git a/vlib/v/tests/selectorexpt_field_name_test.v b/vlib/v/tests/selectorexpt_field_name_test.v new file mode 100644 index 000000000..68fa25be2 --- /dev/null +++ b/vlib/v/tests/selectorexpt_field_name_test.v @@ -0,0 +1,15 @@ +// for issue 20436 +// phenomenon: +// close_scope() is lost when selectexpr has two special names: sort and sorted. +// This problem can be tested using closure arguments. +struct Foo { + sort []int +} + +fn test_main() { + f := Foo{} + + fn [f] () { + assert f.sort.len == 0 + }() +} -- 2.39.5