Skip to content

Commit 37fcdee

Browse files
yuyi98raw-bin
authored andcommitted
cgen: fix smartcasting a reference to a sumtype value (vlang#21730)
1 parent 55d43af commit 37fcdee

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
@@ -4972,7 +4972,14 @@ fn (mut g Gen) ident(node ast.Ident) {
49724972
if node.obj.is_inherited {
49734973
g.write(closure_ctx + '->')
49744974
}
4975-
g.write(name)
4975+
if node.obj.typ.nr_muls() > 1 {
4976+
g.write('(')
4977+
g.write('*'.repeat(node.obj.typ.nr_muls() - 1))
4978+
g.write(name)
4979+
g.write(')')
4980+
} else {
4981+
g.write(name)
4982+
}
49764983
if node.obj.orig_type.is_ptr() {
49774984
is_ptr = true
49784985
}

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)