Skip to content

Commit 104eb25

Browse files
authored
cgen: fix generic sumtype with repeated concrete type (#21948)
1 parent 58827fa commit 104eb25

File tree

3 files changed

+32
-0
lines changed

3 files changed

+32
-0
lines changed

vlib/v/gen/c/auto_str_methods.v

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -442,7 +442,12 @@ fn (mut g Gen) gen_str_for_union_sum_type(info ast.SumType, styp string, typ_str
442442
clean_sum_type_v_type_name = util.strip_main_name(typ_str)
443443
}
444444
fn_builder.writeln('\tswitch(x._typ) {')
445+
mut idxs := []int{}
445446
for typ in info.variants {
447+
if typ in idxs {
448+
continue
449+
}
450+
idxs << typ
446451
typ_name := g.typ(typ)
447452
mut func_name := g.get_str_fn(typ)
448453
sym := g.table.sym(typ)

vlib/v/gen/c/cgen.v

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1000,9 +1000,14 @@ pub fn (mut g Gen) write_typeof_functions() {
10001000
tidx := g.table.find_type_idx(sym.name)
10011001
g.writeln('\tswitch(sidx) {')
10021002
g.writeln('\t\tcase ${tidx}: return "${util.strip_main_name(sym.name)}";')
1003+
mut idxs := []int{}
10031004
for v in sum_info.variants {
1005+
if v in idxs {
1006+
continue
1007+
}
10041008
subtype := g.table.sym(v)
10051009
g.writeln('\t\tcase ${int(v)}: return "${util.strip_main_name(subtype.name)}";')
1010+
idxs << v
10061011
}
10071012
g.writeln('\t\tdefault: return "unknown ${util.strip_main_name(sym.name)}";')
10081013
g.writeln('\t}')
@@ -1021,8 +1026,13 @@ pub fn (mut g Gen) write_typeof_functions() {
10211026
tidx := g.table.find_type_idx(sym.name)
10221027
g.writeln('\tswitch(sidx) {')
10231028
g.writeln('\t\tcase ${tidx}: return ${int(ityp)};')
1029+
mut idxs := []int{}
10241030
for v in sum_info.variants {
1031+
if v in idxs {
1032+
continue
1033+
}
10251034
g.writeln('\t\tcase ${int(v)}: return ${int(v)};')
1035+
idxs << v
10261036
}
10271037
g.writeln('\t\tdefault: return ${int(ityp)};')
10281038
g.writeln('\t}')
@@ -6678,12 +6688,22 @@ fn (mut g Gen) write_types(symbols []&ast.TypeSymbol) {
66786688
g.typedefs.writeln('typedef struct ${name} ${name};')
66796689
g.type_definitions.writeln('')
66806690
g.type_definitions.writeln('// Union sum type ${name} = ')
6691+
mut idxs := []int{}
66816692
for variant in sym.info.variants {
6693+
if variant in idxs {
6694+
continue
6695+
}
66826696
g.type_definitions.writeln('// | ${variant:4d} = ${g.typ(variant.idx()):-20s}')
6697+
idxs << variant
66836698
}
6699+
idxs.clear()
66846700
g.type_definitions.writeln('struct ${name} {')
66856701
g.type_definitions.writeln('\tunion {')
66866702
for variant in sym.info.variants {
6703+
if variant in idxs {
6704+
continue
6705+
}
6706+
idxs << variant
66876707
variant_sym := g.table.sym(variant)
66886708
mut var := if variant.has_flag(.option) { variant } else { variant.ref() }
66896709
variant_name := g.get_sumtype_variant_name(variant, variant_sym)
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
type Name[T] = T | int | string
2+
3+
fn test_main() {
4+
a := Name[int](123)
5+
assert dump(a) == Name[int](123)
6+
println(a)
7+
}

0 commit comments

Comments
 (0)