From 95f27d11022a82a0d23931d1e8240fde42ae35cc Mon Sep 17 00:00:00 2001 From: Alexander Medvednikov Date: Tue, 14 Apr 2026 23:02:18 +0300 Subject: [PATCH] cgen: fix cgen error with `-cstrict -cc clang` and defer in match branch (fixes #19092) --- vlib/v/gen/c/fn.v | 14 ++++++++- .../defer_fn_match_branch_capture.out | 3 ++ .../testdata/defer_fn_match_branch_capture.vv | 30 +++++++++++++++++++ 3 files changed, 46 insertions(+), 1 deletion(-) create mode 100644 vlib/v/gen/c/testdata/defer_fn_match_branch_capture.out create mode 100644 vlib/v/gen/c/testdata/defer_fn_match_branch_capture.vv diff --git a/vlib/v/gen/c/fn.v b/vlib/v/gen/c/fn.v index 8c8a1e883..df5351983 100644 --- a/vlib/v/gen/c/fn.v +++ b/vlib/v/gen/c/fn.v @@ -1176,7 +1176,19 @@ fn (mut g Gen) gen_fn_decl(node &ast.FnDecl, skip bool) { if info.is_volatile { g.write('volatile ') } - g.writeln('${g.styp(info.typ)}${deref} ${c_name(var.name)};') + decl_typ := if deref == '*' { + info.typ.ref() + } else { + info.typ + } + default_expr := g.type_default(decl_typ) + if g.type_default_vars.len > 0 { + for decl in g.type_default_vars.str().trim_right('\n').split_into_lines() { + g.writeln(decl) + } + g.type_default_vars.clear() + } + g.writeln('${g.styp(info.typ)}${deref} ${c_name(var.name)} = ${default_expr};') } } } diff --git a/vlib/v/gen/c/testdata/defer_fn_match_branch_capture.out b/vlib/v/gen/c/testdata/defer_fn_match_branch_capture.out new file mode 100644 index 000000000..98ca40704 --- /dev/null +++ b/vlib/v/gen/c/testdata/defer_fn_match_branch_capture.out @@ -0,0 +1,3 @@ +42 false +123 false +42 false diff --git a/vlib/v/gen/c/testdata/defer_fn_match_branch_capture.vv b/vlib/v/gen/c/testdata/defer_fn_match_branch_capture.vv new file mode 100644 index 000000000..6bb569cf5 --- /dev/null +++ b/vlib/v/gen/c/testdata/defer_fn_match_branch_capture.vv @@ -0,0 +1,30 @@ +// vtest vflags: -cstrict -cc clang + +struct Object { +mut: + context bool +} + +fn (mut o Object) f(x int) int { + match x { + 0 { + old := o.context + defer(fn) { + o.context = old + } + o.context = true + } + 1 { + return 123 + } + else {} + } + return 42 +} + +fn main() { + mut o := Object{} + println('${o.f(0)} ${o.context}') + println('${o.f(1)} ${o.context}') + println('${o.f(2)} ${o.context}') +} -- 2.39.5