From d353dd6e8a3d4b54acc4935528c54ce2c45cd18f Mon Sep 17 00:00:00 2001 From: Felipe Pena Date: Thu, 9 Mar 2023 10:24:43 -0300 Subject: [PATCH] cgen: fix selector accessing field (#17567) --- vlib/v/gen/c/cgen.v | 7 ++++++- vlib/v/tests/option_selector_test.v | 27 +++++++++++++++++++++++++++ 2 files changed, 33 insertions(+), 1 deletion(-) create mode 100644 vlib/v/tests/option_selector_test.v diff --git a/vlib/v/gen/c/cgen.v b/vlib/v/gen/c/cgen.v index 2dc55a70c7..46e4e4a593 100644 --- a/vlib/v/gen/c/cgen.v +++ b/vlib/v/gen/c/cgen.v @@ -3461,7 +3461,12 @@ fn (mut g Gen) selector_expr(node ast.SelectorExpr) { g.write('*(') } g.expr(node.expr) - g.write('.${field_name}') + if node.expr_type.is_ptr() { + g.write('->') + } else { + g.write('.') + } + g.write(field_name) if is_ptr { g.write(')') } diff --git a/vlib/v/tests/option_selector_test.v b/vlib/v/tests/option_selector_test.v new file mode 100644 index 0000000000..e4ae6a1976 --- /dev/null +++ b/vlib/v/tests/option_selector_test.v @@ -0,0 +1,27 @@ +module main + +struct JsonParser { +mut: + js string + tokens []string + pos int + tok_next int + tok_super ?int +} + +fn new_parser(qty int) JsonParser { + return JsonParser{ + tokens: []string{cap: qty} + } +} + +fn (mut p JsonParser) parse() int { + j := p.tok_super or { 999 } + return j +} + +fn test_main() { + mut x := new_parser(100) + i := x.parse() + assert i == 999 +}