cgen: fix appending struct to interface array (#14388)
parent
5a427907d5
commit
f983dd8a95
|
@ -183,6 +183,9 @@ fn (mut g Gen) struct_init(node ast.StructInit) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if !cloned {
|
if !cloned {
|
||||||
|
inside_cast_in_heap := g.inside_cast_in_heap
|
||||||
|
g.inside_cast_in_heap = 0 // prevent use of pointers in child structs
|
||||||
|
|
||||||
if field_type_sym.kind == .array_fixed && sfield.expr is ast.Ident {
|
if field_type_sym.kind == .array_fixed && sfield.expr is ast.Ident {
|
||||||
fixed_array_info := field_type_sym.info as ast.ArrayFixed
|
fixed_array_info := field_type_sym.info as ast.ArrayFixed
|
||||||
g.write('{')
|
g.write('{')
|
||||||
|
@ -202,6 +205,7 @@ fn (mut g Gen) struct_init(node ast.StructInit) {
|
||||||
}
|
}
|
||||||
g.expr_with_cast(sfield.expr, sfield.typ, sfield.expected_type)
|
g.expr_with_cast(sfield.expr, sfield.typ, sfield.expected_type)
|
||||||
}
|
}
|
||||||
|
g.inside_cast_in_heap = inside_cast_in_heap // restore value for further struct inits
|
||||||
}
|
}
|
||||||
if is_multiline {
|
if is_multiline {
|
||||||
g.writeln(',')
|
g.writeln(',')
|
||||||
|
|
|
@ -0,0 +1,43 @@
|
||||||
|
struct Vec {
|
||||||
|
mut:
|
||||||
|
x f64
|
||||||
|
y f64
|
||||||
|
z f64
|
||||||
|
}
|
||||||
|
|
||||||
|
struct Plane {
|
||||||
|
position Vec
|
||||||
|
normal Vec
|
||||||
|
}
|
||||||
|
|
||||||
|
struct Sphere {
|
||||||
|
position Vec
|
||||||
|
radius f64
|
||||||
|
}
|
||||||
|
|
||||||
|
interface Object {
|
||||||
|
position Vec
|
||||||
|
}
|
||||||
|
|
||||||
|
fn test_append_struct_to_interface_array() {
|
||||||
|
mut scene := []Object{}
|
||||||
|
|
||||||
|
scene << Plane{
|
||||||
|
position: Vec{0, -10, 0}
|
||||||
|
normal: Vec{0, -1, 0}
|
||||||
|
}
|
||||||
|
scene << Sphere{
|
||||||
|
position: Vec{0, 0, -20}
|
||||||
|
radius: 7
|
||||||
|
}
|
||||||
|
|
||||||
|
println(scene)
|
||||||
|
|
||||||
|
assert scene.len == 2
|
||||||
|
assert scene[0].position.x == 0
|
||||||
|
assert scene[0].position.y == -10
|
||||||
|
assert scene[0].position.z == 0
|
||||||
|
assert scene[1].position.x == 0
|
||||||
|
assert scene[1].position.y == 0
|
||||||
|
assert scene[1].position.z == -20
|
||||||
|
}
|
Loading…
Reference in New Issue