From 857bfe0c214db2e07334db1a42800dba04f52b5c Mon Sep 17 00:00:00 2001 From: Alexander Medvednikov Date: Mon, 25 May 2026 13:41:43 +0300 Subject: [PATCH] ast: count duplicate sumtype fields once (#27253) --- vlib/v/ast/table.v | 5 +++ ...mtype_common_fields_duplicate_embed_test.v | 41 +++++++++++++++++++ 2 files changed, 46 insertions(+) create mode 100644 vlib/v/tests/sumtype_common_fields_duplicate_embed_test.v diff --git a/vlib/v/ast/table.v b/vlib/v/ast/table.v index 2ed29ba0a..10e3fbbab 100644 --- a/vlib/v/ast/table.v +++ b/vlib/v/ast/table.v @@ -872,7 +872,12 @@ pub fn (t &Table) resolve_common_sumtype_fields(mut sym TypeSymbol) { } } + mut counted_field_names := map[string]bool{} for field in fields { + if field.name in counted_field_names { + continue + } + counted_field_names[field.name] = true if field.name !in field_map { field_map[field.name] = field field_usages[field.name]++ diff --git a/vlib/v/tests/sumtype_common_fields_duplicate_embed_test.v b/vlib/v/tests/sumtype_common_fields_duplicate_embed_test.v new file mode 100644 index 000000000..4f553fa62 --- /dev/null +++ b/vlib/v/tests/sumtype_common_fields_duplicate_embed_test.v @@ -0,0 +1,41 @@ +struct CommonTrace { +mut: + name string + marker int +} + +struct TraceWithDuplicateMarker { + CommonTrace +mut: + marker int +} + +struct TraceWithMarker { + CommonTrace +} + +struct TraceWithoutMarker { +mut: + name string +} + +type Trace = TraceWithDuplicateMarker | TraceWithMarker | TraceWithoutMarker + +fn test_duplicate_embedded_fields_do_not_create_false_common_sumtype_field() { + traces := [ + Trace(TraceWithDuplicateMarker{ + name: 'duplicate' + marker: 1 + }), + Trace(TraceWithMarker{ + name: 'marker' + }), + Trace(TraceWithoutMarker{ + name: 'plain' + }), + ] + + assert traces[0].name == 'duplicate' + assert traces[1].name == 'marker' + assert traces[2].name == 'plain' +} -- 2.39.5