Skip to content

Commit 98a1ee2

Browse files
authored
cgen: fix smartcasting a reference to a sumtype value (#21730)
1 parent 5b93582 commit 98a1ee2

File tree

3 files changed

+40
-1
lines changed

3 files changed

+40
-1
lines changed

vlib/v/gen/c/cgen.v

+8-1
Original file line numberDiff line numberDiff line change
@@ -4931,7 +4931,14 @@ fn (mut g Gen) ident(node ast.Ident) {
49314931
if node.obj.is_inherited {
49324932
g.write(closure_ctx + '->')
49334933
}
4934-
g.write(name)
4934+
if node.obj.typ.nr_muls() > 1 {
4935+
g.write('(')
4936+
g.write('*'.repeat(node.obj.typ.nr_muls() - 1))
4937+
g.write(name)
4938+
g.write(')')
4939+
} else {
4940+
g.write(name)
4941+
}
49354942
if node.obj.orig_type.is_ptr() {
49364943
is_ptr = true
49374944
}

vlib/v/gen/c/infix.v

+3
Original file line numberDiff line numberDiff line change
@@ -695,6 +695,9 @@ fn (mut g Gen) infix_expr_is_op(node ast.InfixExpr) {
695695

696696
cmp_op := if node.op == .key_is { '==' } else { '!=' }
697697
g.write('(')
698+
if node.left_type.nr_muls() > 1 {
699+
g.write('*'.repeat(node.left_type.nr_muls() - 1))
700+
}
698701
if is_aggregate {
699702
g.write('${node.left}')
700703
} else {
+29
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
struct Parse {
2+
mut:
3+
stack []&Element
4+
}
5+
6+
struct Balise {}
7+
8+
struct RawText {
9+
s string
10+
}
11+
12+
type Element = Balise | RawText
13+
14+
fn (mut p Parse) process_open_tag() string {
15+
mut last := &p.stack[0]
16+
if mut last is RawText {
17+
println(last)
18+
return last.s
19+
} else {
20+
return ''
21+
}
22+
}
23+
24+
fn test_sumtype_with_reference() {
25+
mut parse := Parse{
26+
stack: [&RawText{'raw'}]
27+
}
28+
assert parse.process_open_tag() == 'raw'
29+
}

0 commit comments

Comments
 (0)