Odin icon indicating copy to clipboard operation
Odin copied to clipboard

Empty struct with default parameters fails using parapoly.

Open dmitsuki opened this issue 2 years ago • 1 comments

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); 
}

dmitsuki avatar May 09 '23 23:05 dmitsuki