From 25894417a54e5ad527cb98f00bf3f67b4e0c53ca Mon Sep 17 00:00:00 2001 From: Alexander Medvednikov Date: Wed, 11 Mar 2026 13:52:04 +0300 Subject: [PATCH] cgen: error that occures when using gcc, clang or msvc but not tcc (fixes #25711) --- vlib/v/gen/c/cgen.v | 11 ++++++- .../sumtypes/sumtype_as_cast_fn_call_test.v | 32 +++++++++++++++++++ 2 files changed, 42 insertions(+), 1 deletion(-) create mode 100644 vlib/v/tests/sumtypes/sumtype_as_cast_fn_call_test.v diff --git a/vlib/v/gen/c/cgen.v b/vlib/v/gen/c/cgen.v index c29c957d0..e21a02f86 100644 --- a/vlib/v/gen/c/cgen.v +++ b/vlib/v/gen/c/cgen.v @@ -8548,8 +8548,14 @@ fn (mut g Gen) as_cast(node ast.AsCast) { } } else { mut is_optional_ident_var := false + mut wrap_in_addr := false if g.inside_smartcast { - g.write('&') + if node.expr.is_lvalue() { + g.write('&') + } else { + wrap_in_addr = true + g.write('ADDR(${styp}, ') + } } if node.expr is ast.Ident { if node.expr.info is ast.IdentVar && node.expr.info.is_option @@ -8574,6 +8580,9 @@ fn (mut g Gen) as_cast(node ast.AsCast) { if !is_optional_ident_var { g.expr(node.expr) } + if wrap_in_addr { + g.write(')') + } } } diff --git a/vlib/v/tests/sumtypes/sumtype_as_cast_fn_call_test.v b/vlib/v/tests/sumtypes/sumtype_as_cast_fn_call_test.v new file mode 100644 index 000000000..9a4c0215f --- /dev/null +++ b/vlib/v/tests/sumtypes/sumtype_as_cast_fn_call_test.v @@ -0,0 +1,32 @@ +module main + +type AstNode = BoolCondition | Expression + +struct Expression { + value int +} + +struct BoolCondition { +mut: + con_simple AstNode + is_simple bool +} + +fn parse_expression() Expression { + return Expression{ + value: 1 + } +} + +fn parse_simple_boolean_expr() BoolCondition { + mut final_expr := BoolCondition{} + final_expr.is_simple = true + final_expr.con_simple = parse_expression() as Expression + return final_expr +} + +fn test_sumtype_as_cast_of_fn_call() { + result := parse_simple_boolean_expr() + assert result.is_simple + assert (result.con_simple as Expression).value == 1 +} -- 2.39.5