ponyc
ponyc copied to clipboard
Compiler assert failure in gen_box related to union of tuple.
The following minimal program causes an assert failure in gen_box on latest ponyc master:
type Foo is (Any box | (Any box, Any box))
actor Main
new create(env: Env) =>
this(Array[(Array[U8], USize)])
fun apply(x: ReadSeq[Foo] box) =>
for v in x.values() do
None
end
Building builtin -> /home/jemc/1/code/gitx/ponyc/packages/builtin
Building . -> /home/jemc/1/code/gitx/ponyc/test.jemc
Generating
Reachability
Selector painting
Data prototypes
Data types
Function prototypes
Functions
src/libponyc/codegen/genbox.c:15: gen_box: Assertion `t != NULL` failed.
Backtrace:
../build/debug/ponyc(ponyint_assert_fail+0xb2) [0x791fa2]
../build/debug/ponyc(gen_box+0x97) [0x777cd7]
../build/debug/ponyc(gen_assign_cast+0x152) [0x7203d2]
../build/debug/ponyc() [0x7688bd]
../build/debug/ponyc(genfun_method_bodies+0xc7) [0x7684f7]
../build/debug/ponyc(gentypes+0x384) [0x760ba4]
../build/debug/ponyc(genexe+0x226) [0x77ad16]
../build/debug/ponyc(codegen+0xf4) [0x715cc4]
../build/debug/ponyc(generate_passes+0x36) [0x6b2ec6]
../build/debug/ponyc() [0x6b1fa0]
../build/debug/ponyc(main+0x47d) [0x6b1dcd]
/lib64/libc.so.6(__libc_start_main+0xf0) [0x7f71edf74700]
../build/debug/ponyc(_start+0x29) [0x6b1879]
(lldb) bt
* thread #1: tid = 1704, 0x00007fa1cdc1d9c8 libc.so.6`__GI_raise + 56, name = 'ponyc', stop reason = signal SIGABRT
* frame #0: 0x00007fa1cdc1d9c8 libc.so.6`__GI_raise + 56
frame #1: 0x00007fa1cdc1f65a libc.so.6`__GI_abort + 362
frame #2: 0x000000000079209b ponyc`ponyint_assert_fail(expr=0x0000000001926562, file=0x000000000193b44e, line=15, func=0x000000000193b46c) + 427 at ponyassert.c:60
frame #3: 0x0000000000777cd7 ponyc`gen_box(c=0x00007fff199c0a28, type=0x00007fa1ca98bc80, value=0x00000000038deaa0) + 151 at genbox.c:15
frame #4: 0x00000000007203d2 ponyc`gen_assign_cast(c=0x00007fff199c0a28, l_type=0x000000000382bce0, r_value=0x00000000038deaa0, type=0x00007fa1ca98bc80) + 338 at genexpr.c:274
frame #5: 0x00000000007688bd ponyc`genfun_forward(c=0x00007fff199c0a28, t=0x00007fa1ca9ea000, n=0x00007fa1ca995c80, m=0x00007fa1ca978500) + 589 at genfun.c:592
frame #6: 0x00000000007684f7 ponyc`genfun_method_bodies(c=0x00007fff199c0a28, t=0x00007fa1ca9ea000) + 199 at genfun.c:722
frame #7: 0x0000000000760ba4 ponyc`gentypes(c=0x00007fff199c0a28) + 900 at gentype.c:802
frame #8: 0x000000000077ad16 ponyc`genexe(c=0x00007fff199c0a28, program=0x00007fa1cdba8d00) + 550 at genexe.c:401
frame #9: 0x0000000000715cc4 ponyc`codegen(program=0x00007fa1cdba8d00, opt=0x00007fff199c0ed8) + 244 at codegen.c:1000
frame #10: 0x00000000006b2ec6 ponyc`generate_passes(program=0x00007fa1cdba8d00, options=0x00007fff199c0ed8) + 54 at pass.c:291
frame #11: 0x00000000006b1fa0 ponyc`compile_package(path=0x0000000001a0e1a0, opt=0x00007fff199c0ed8, print_program_ast=false, print_package_ast=false) + 160 at main.c:245
frame #12: 0x00000000006b1dcd ponyc`main(argc=1, argv=0x00007fff199c1048) + 1149 at main.c:367
frame #13: 0x00007fa1cdc09700 libc.so.6`__libc_start_main + 240
frame #14: 0x00000000006b1879 ponyc`_start + 41
(lldb) f 5
frame #5: 0x00000000007688bd ponyc`genfun_forward(c=0x00007fff199c0a28, t=0x00007fa1ca9ea000, n=0x00007fa1ca995c80, m=0x00007fa1ca978500) + 589 at genfun.c:592
589 }
590
591 LLVMValueRef ret = codegen_call(c, m2->func, args, count);
-> 592 ret = gen_assign_cast(c, m->result->use_type, ret, m2->result->ast);
593 LLVMBuildRet(c->builder, ret);
594 codegen_finishfun(c);
595 return true;
(lldb) p *m
(reach_method_t) $0 = {
name = 0x00007fa1ca9ceac0 "ref_next"
mangled_name = 0x00007fa1ca9ceb40 "ref_next_o"
full_name = 0x00007fa1ca995e80 "ArrayValues_t2_Array_U8_val_ref_USize_val_Array_t2_Array_U8_val_ref_USize_val_val_ref_next_o"
cap = TK_REF
typeargs = 0x0000000000000000
r_fun = 0x00007fa1ca9850c0
vtable_index = 2
func_type = 0x0000000003874ae0
msg_type = 0x0000000000000000
func = 0x00000000038781e8
func_handler = 0x0000000000000000
di_method = 0x0000000003836eb8
di_file = 0x0000000003832840
intrinsic = false
internal = false
forwarding = true
subordinate = 0x0000000000000000
param_count = 0
params = 0x00007fa1ca996ee0
result = 0x00007fa1cab36000
}
(lldb) p *m2
(reach_method_t) $1 = {
name = 0x00007fa1ca9ceac0 "ref_next"
mangled_name = 0x00007fa1ca996e60 "ref_next_2oZ"
full_name = 0x00007fa1ca995e00 "ArrayValues_t2_Array_U8_val_ref_USize_val_Array_t2_Array_U8_val_ref_USize_val_val_ref_next_2oZ"
cap = TK_REF
typeargs = 0x0000000000000000
r_fun = 0x00007fa1ca97b6c0
vtable_index = 1
func_type = 0x0000000003874a90
msg_type = 0x0000000000000000
func = 0x00000000038777f8
func_handler = 0x0000000000000000
di_method = 0x0000000003878118
di_file = 0x0000000003832840
intrinsic = false
internal = false
forwarding = false
subordinate = 0x0000000000000000
param_count = 0
params = 0x00007fa1ca996da0
result = 0x00007fa1ca9ea200
}