From 6944d542577d0cd6b4f95abf5abd6da49a9473d5 Mon Sep 17 00:00:00 2001 From: yuyi Date: Sat, 4 Mar 2023 17:47:49 +0800 Subject: [PATCH] parser, cgen: fix option variable error (fix #17460) (#17479) --- vlib/v/gen/c/assign.v | 5 ++++- vlib/v/gen/c/cgen.v | 3 ++- vlib/v/gen/c/if.v | 1 + vlib/v/parser/if_match.v | 2 +- vlib/v/tests/option_var_2_test.v | 26 ++++++++++++++++++++++++++ 5 files changed, 34 insertions(+), 3 deletions(-) create mode 100644 vlib/v/tests/option_var_2_test.v diff --git a/vlib/v/gen/c/assign.v b/vlib/v/gen/c/assign.v index 35966102f3..f0edf4054a 100644 --- a/vlib/v/gen/c/assign.v +++ b/vlib/v/gen/c/assign.v @@ -103,8 +103,10 @@ fn (mut g Gen) assign_stmt(node_ ast.AssignStmt) { mut return_type := ast.void_type is_decl := node.op == .decl_assign g.assign_op = node.op + g.inside_assign = true defer { g.assign_op = .unknown + g.inside_assign = false } op := if is_decl { token.Kind.assign } else { node.op } right_expr := node.right[0] @@ -597,7 +599,8 @@ fn (mut g Gen) assign_stmt(node_ ast.AssignStmt) { if val.is_auto_deref_var() { g.write('*') } - if var_type.has_flag(.option) || gen_or { + if (var_type.has_flag(.option) && val !in [ast.Ident, ast.SelectorExpr]) + || gen_or { g.expr_with_opt_or_block(val, val_type, left, var_type) } else if val is ast.ArrayInit { g.array_init(val, c_name(ident.name)) diff --git a/vlib/v/gen/c/cgen.v b/vlib/v/gen/c/cgen.v index eb78c6dc76..94f3d828e9 100644 --- a/vlib/v/gen/c/cgen.v +++ b/vlib/v/gen/c/cgen.v @@ -120,6 +120,7 @@ mut: inside_ternary int // ?: comma separated statements on a single line inside_map_postfix bool // inside map++/-- postfix expr inside_map_infix bool // inside map<