Odin
Odin copied to clipboard
Empty struct with default parameters fails using parapoly.
Odin: dev-2023-05
OS: Unknown Linux Distro, Linux 6.2.13-arch1-1
CPU: AMD Ryzen 9 5900X 12-Core Processor
RAM: 64217 MiB
package bug
import "core:fmt"
import "core:runtime"
One :: struct
{
}
Two :: struct
{
data: int,
}
ParaPolyFunction :: proc($T: typeid, value: T = T{})
{
fmt.println(typeid_of(T));
fmt.println(value);
}
main :: proc()
{
ParaPolyFunction(One);
ParaPolyFunction(Two);
ParaPolyFunction(One);
}
Using this code, this will fail to compile with the error
bug.main
lb_emit_conv: src -> dst
Not Identical One != Two
Not Identical struct {} != struct {data: int}
Not Identical 7f4f28939fd0 != 7f4f2893a640
Not Identical 7f4f2893a050 != 7f4f2893a6c0
src/llvm_backend_expr.cpp(2218): Panic: Invalid type conversion: 'One' to 'Two' for procedure 'bug.main'
[1] 84086 illegal hardware instruction (core dumped) odin build ./ -out:./build/bug
However
package bug
import "core:fmt"
import "core:runtime"
One :: struct
{
}
Two :: struct
{
data: int,
}
ParaPolyFunction :: proc($T: typeid, value: T = T{})
{
fmt.println(typeid_of(T));
fmt.println(value);
}
main :: proc()
{
ParaPolyFunction(One, One{});
ParaPolyFunction(Two, Two{});
ParaPolyFunction(One, One{});
}
Compiles and runs as expected. The result is also as expected if neither structs are empty, IE
package bug
import "core:fmt"
import "core:runtime"
One :: struct
{
data:int,
}
Two :: struct
{
data: int,
}
ParaPolyFunction :: proc($T: typeid, value: T = T{})
{
fmt.println(typeid_of(T));
fmt.println(value);
}
main :: proc()
{
ParaPolyFunction(One);
ParaPolyFunction(Two);
ParaPolyFunction(One);
}