From eaefe4d941e458c7959fa928efea4370d08c7d53 Mon Sep 17 00:00:00 2001 From: Alexander Medvednikov Date: Tue, 14 Apr 2026 12:45:24 +0300 Subject: [PATCH] cgen: Subtle runtime segfault on Linux x86_64 in GitHub actions CI (fixes #26121) --- vlib/v/gen/c/cgen.v | 13 +++++ .../tests/sumtype_default_common_field_test.v | 49 +++++++++++++++++++ 2 files changed, 62 insertions(+) create mode 100644 vlib/v/tests/sumtype_default_common_field_test.v diff --git a/vlib/v/gen/c/cgen.v b/vlib/v/gen/c/cgen.v index 660bd0c73..4f6723cc3 100644 --- a/vlib/v/gen/c/cgen.v +++ b/vlib/v/gen/c/cgen.v @@ -9746,6 +9746,19 @@ fn (mut g Gen) type_default_sumtype(typ_ ast.Type, sym ast.TypeSymbol) string { } else { g.type_default_no_sumtype(first_typ) } + sumtype_info := sym.info as ast.SumType + if sumtype_info.fields.len > 0 && !g.inside_global_decl && !g.inside_const { + // Route local defaults through the cast helper so common-field pointers stay valid. + fname := g.get_sumtype_casting_fn(first_typ, typ_) + mut first_default := g.type_default(first_typ) + if first_default[0] == `{` { + first_default = '(${first_styp})${first_default}' + } + if first_sym.info is ast.FnType { + return '${fname}(${first_default})' + } + return '${fname}(HEAP(${first_styp}, (${first_default})), true)' + } if default_str[0] == `{` { return '(${g.styp(typ_)}){._${first_field}=HEAP(${first_styp}, ((${first_styp})${default_str})),._typ=${u32(first_typ)}}' } else { diff --git a/vlib/v/tests/sumtype_default_common_field_test.v b/vlib/v/tests/sumtype_default_common_field_test.v new file mode 100644 index 000000000..aaff3b272 --- /dev/null +++ b/vlib/v/tests/sumtype_default_common_field_test.v @@ -0,0 +1,49 @@ +module main + +struct DefaultAlpha { + x int +} + +struct DefaultBeta { + x int +} + +type DefaultSum = DefaultAlpha | DefaultBeta + +struct DefaultHolder { + s DefaultSum +} + +struct NestedAlpha { + x int +} + +struct NestedBeta { + x int +} + +struct NestedGamma { + x int +} + +struct NestedDelta { + x int +} + +type NestedLeft = NestedAlpha | NestedBeta +type NestedRight = NestedDelta | NestedGamma +type NestedOuter = NestedLeft | NestedRight + +struct NestedHolder { + o NestedOuter +} + +fn test_default_sumtype_common_field_is_accessible() { + holder := DefaultHolder{} + assert holder.s.x == 0 +} + +fn test_default_nested_sumtype_common_field_is_accessible() { + holder := NestedHolder{} + assert holder.o.x == 0 +} -- 2.39.5