mirror of
https://github.com/vlang/v.git
synced 2025-09-17 19:36:35 -04:00
cgen: fix generic sumtype with repeated concrete type (#21948)
This commit is contained in:
parent
58827fa978
commit
104eb25a87
@ -442,7 +442,12 @@ fn (mut g Gen) gen_str_for_union_sum_type(info ast.SumType, styp string, typ_str
|
|||||||
clean_sum_type_v_type_name = util.strip_main_name(typ_str)
|
clean_sum_type_v_type_name = util.strip_main_name(typ_str)
|
||||||
}
|
}
|
||||||
fn_builder.writeln('\tswitch(x._typ) {')
|
fn_builder.writeln('\tswitch(x._typ) {')
|
||||||
|
mut idxs := []int{}
|
||||||
for typ in info.variants {
|
for typ in info.variants {
|
||||||
|
if typ in idxs {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
idxs << typ
|
||||||
typ_name := g.typ(typ)
|
typ_name := g.typ(typ)
|
||||||
mut func_name := g.get_str_fn(typ)
|
mut func_name := g.get_str_fn(typ)
|
||||||
sym := g.table.sym(typ)
|
sym := g.table.sym(typ)
|
||||||
|
@ -1000,9 +1000,14 @@ pub fn (mut g Gen) write_typeof_functions() {
|
|||||||
tidx := g.table.find_type_idx(sym.name)
|
tidx := g.table.find_type_idx(sym.name)
|
||||||
g.writeln('\tswitch(sidx) {')
|
g.writeln('\tswitch(sidx) {')
|
||||||
g.writeln('\t\tcase ${tidx}: return "${util.strip_main_name(sym.name)}";')
|
g.writeln('\t\tcase ${tidx}: return "${util.strip_main_name(sym.name)}";')
|
||||||
|
mut idxs := []int{}
|
||||||
for v in sum_info.variants {
|
for v in sum_info.variants {
|
||||||
|
if v in idxs {
|
||||||
|
continue
|
||||||
|
}
|
||||||
subtype := g.table.sym(v)
|
subtype := g.table.sym(v)
|
||||||
g.writeln('\t\tcase ${int(v)}: return "${util.strip_main_name(subtype.name)}";')
|
g.writeln('\t\tcase ${int(v)}: return "${util.strip_main_name(subtype.name)}";')
|
||||||
|
idxs << v
|
||||||
}
|
}
|
||||||
g.writeln('\t\tdefault: return "unknown ${util.strip_main_name(sym.name)}";')
|
g.writeln('\t\tdefault: return "unknown ${util.strip_main_name(sym.name)}";')
|
||||||
g.writeln('\t}')
|
g.writeln('\t}')
|
||||||
@ -1021,8 +1026,13 @@ pub fn (mut g Gen) write_typeof_functions() {
|
|||||||
tidx := g.table.find_type_idx(sym.name)
|
tidx := g.table.find_type_idx(sym.name)
|
||||||
g.writeln('\tswitch(sidx) {')
|
g.writeln('\tswitch(sidx) {')
|
||||||
g.writeln('\t\tcase ${tidx}: return ${int(ityp)};')
|
g.writeln('\t\tcase ${tidx}: return ${int(ityp)};')
|
||||||
|
mut idxs := []int{}
|
||||||
for v in sum_info.variants {
|
for v in sum_info.variants {
|
||||||
|
if v in idxs {
|
||||||
|
continue
|
||||||
|
}
|
||||||
g.writeln('\t\tcase ${int(v)}: return ${int(v)};')
|
g.writeln('\t\tcase ${int(v)}: return ${int(v)};')
|
||||||
|
idxs << v
|
||||||
}
|
}
|
||||||
g.writeln('\t\tdefault: return ${int(ityp)};')
|
g.writeln('\t\tdefault: return ${int(ityp)};')
|
||||||
g.writeln('\t}')
|
g.writeln('\t}')
|
||||||
@ -6678,12 +6688,22 @@ fn (mut g Gen) write_types(symbols []&ast.TypeSymbol) {
|
|||||||
g.typedefs.writeln('typedef struct ${name} ${name};')
|
g.typedefs.writeln('typedef struct ${name} ${name};')
|
||||||
g.type_definitions.writeln('')
|
g.type_definitions.writeln('')
|
||||||
g.type_definitions.writeln('// Union sum type ${name} = ')
|
g.type_definitions.writeln('// Union sum type ${name} = ')
|
||||||
|
mut idxs := []int{}
|
||||||
for variant in sym.info.variants {
|
for variant in sym.info.variants {
|
||||||
|
if variant in idxs {
|
||||||
|
continue
|
||||||
|
}
|
||||||
g.type_definitions.writeln('// | ${variant:4d} = ${g.typ(variant.idx()):-20s}')
|
g.type_definitions.writeln('// | ${variant:4d} = ${g.typ(variant.idx()):-20s}')
|
||||||
|
idxs << variant
|
||||||
}
|
}
|
||||||
|
idxs.clear()
|
||||||
g.type_definitions.writeln('struct ${name} {')
|
g.type_definitions.writeln('struct ${name} {')
|
||||||
g.type_definitions.writeln('\tunion {')
|
g.type_definitions.writeln('\tunion {')
|
||||||
for variant in sym.info.variants {
|
for variant in sym.info.variants {
|
||||||
|
if variant in idxs {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
idxs << variant
|
||||||
variant_sym := g.table.sym(variant)
|
variant_sym := g.table.sym(variant)
|
||||||
mut var := if variant.has_flag(.option) { variant } else { variant.ref() }
|
mut var := if variant.has_flag(.option) { variant } else { variant.ref() }
|
||||||
variant_name := g.get_sumtype_variant_name(variant, variant_sym)
|
variant_name := g.get_sumtype_variant_name(variant, variant_sym)
|
||||||
|
7
vlib/v/tests/generic_sumtype_repeated_test.v
Normal file
7
vlib/v/tests/generic_sumtype_repeated_test.v
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
type Name[T] = T | int | string
|
||||||
|
|
||||||
|
fn test_main() {
|
||||||
|
a := Name[int](123)
|
||||||
|
assert dump(a) == Name[int](123)
|
||||||
|
println(a)
|
||||||
|
}
|
Loading…
x
Reference in New Issue
Block a user