From 7bd2bef1ae251d13f8e816ba22cb882638355ba0 Mon Sep 17 00:00:00 2001 From: Felipe Pena Date: Mon, 28 Oct 2024 11:56:43 -0300 Subject: [PATCH] parser: fix generic struct init detection `T{}` (#22682) --- vlib/v/parser/expr.v | 3 +++ vlib/v/tests/structs/struct_generic_init_test.v | 16 ++++++++++++++++ 2 files changed, 19 insertions(+) create mode 100644 vlib/v/tests/structs/struct_generic_init_test.v diff --git a/vlib/v/parser/expr.v b/vlib/v/parser/expr.v index 9a20f0a3e..38d7f63dd 100644 --- a/vlib/v/parser/expr.v +++ b/vlib/v/parser/expr.v @@ -72,6 +72,9 @@ fn (mut p Parser) check_expr(precedence int) !ast.Expr { } else if p.inside_for_expr && p.tok.kind == .name && p.tok.lit[0].is_capital() && p.peek_tok.kind == .lcbr && p.peek_token(2).kind in [.rcbr, .name] { node = p.struct_init(p.mod + '.' + p.tok.lit, .normal, false) + } else if p.is_generic_name() && p.peek_tok.kind == .lcbr + && p.peek_token(2).kind == .rcbr && p.peek_token(2).line_nr == p.tok.line_nr { + node = p.struct_init(p.mod + '.' + p.tok.lit, .normal, false) } else { if p.inside_comptime_if && p.is_generic_name() && p.peek_tok.kind != .dot { // $if T is string {} diff --git a/vlib/v/tests/structs/struct_generic_init_test.v b/vlib/v/tests/structs/struct_generic_init_test.v new file mode 100644 index 000000000..75ff21cfa --- /dev/null +++ b/vlib/v/tests/structs/struct_generic_init_test.v @@ -0,0 +1,16 @@ +struct St[T] { +mut: + a T +} + +fn (mut s St[T]) f(e T) { + if e != T{} { + s.a = e + } +} + +fn test_main() { + mut s := St[int]{} + s.f(1) + assert s.a == 1 +} -- 2.39.5