Array.index function genereated for array of sumtype references produces C error.
islonely opened this issue · comments
Adam Oates commented
V version: V 0.2.4 223b96a.1fc9e1a
OS: linux, "Manjaro Linux"
What did you do?
struct Element {
AbstractNode
mut:
name string
value string
attributes []&Attribute
}
struct Attribute {
AbstractNode
mut:
name string
value string
}
pub type Node = Attribute | Element
struct AbstractNode {
pub mut:
child_nodes []&Node
}
pub fn (mut n AbstractNode) append_child(child &Node) {
n.child_nodes << child
}
pub fn (n &AbstractNode) has_child(child &Node) int {
return n.child_nodes.index(child)
}
fn main() {
mut parent := &Element{
name: 'parent'
}
mut child := &Element{
name: 'child'
}
parent.append_child(child)
println(parent.has_child(child))
dump(parent)
}
What did you expect to see?
Expected code to compile and the has_child
function to return an integer.
What did you see instead?
The code doesn't compile because the generated C code is invalid.
/usr/lib64/crt1.o: error: Invalid relocation entry [15] '.rela.debug_info' @ 000004f5
tcc: error: file 'crt1.o' not found
/tmp/v_1000/test.9025346761131596870.tmp.c:2213: error: cannot convert 'struct main__Node *' to 'struct main__Node'
static int Array_dom__Node_ptr_index(Array_dom__Node_ptr a, dom__Node* v) {
dom__Node** pelem = a.data;
for (int i = 0; i < a.len; ++i, ++pelem) {
if (dom__Node_sumtype_eq(*pelem, v)) {
return i;
}
}
return -1;
}