ponyc icon indicating copy to clipboard operation
ponyc copied to clipboard

Compiler assert failure in gen_box related to union of tuple.

Open jemc opened this issue 8 years ago • 3 comments

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
}

jemc avatar Mar 27 '17 06:03 jemc