rust-lang / rust

Empowering everyone to build reliable and efficient software.
https://www.rust-lang.org
Other
98.99k stars 12.79k forks source link

ICE returning unboxed closure #16672

Closed pfalabella closed 10 years ago

pfalabella commented 10 years ago

I get an ICE when trying to compile the following:

#![feature(unboxed_closures)]

fn main() {
    let f = |&: x: uint| x.to_string();
    let bar = foo(f);
    println!("{}", bar.call((1,)));
}

fn foo<A, B, F: Fn<(A,) ,B>>(f: F) -> Box<Fn<(A,) ,B>> {
   ( box |&: x: A| f.call((x,))) as Box<Fn<(A,) ,B>>
}

the ICE:

error: internal compiler error: fictitious type ty_param(middle::ty::ParamTy{space: FnSpace, idx: 2u, def_id: syntax::ast::DefId{krate: 0u32, node: 98u32}}) in sizing_type_of()
note: the compiler hit an unexpected failure path. this is a bug.
note: we would appreciate a bug report: http://doc.rust-lang.org/complement-bugreport.html
note: run with `RUST_BACKTRACE=1` for a backtrace
task 'rustc' failed at 'Box<Any>', C:\bot\slave\nightly-win\build\src\libsyntax\ast_util.rs:776

Rust version:

$ rustc -v
rustc 0.12.0-pre-nightly (4dfdc697e 2014-08-21 00:51:00 +0000)

maybe related to https://github.com/rust-lang/rust/issues/13970 ?

pfalabella commented 10 years ago

correction... the closure does not actually need to be generic. Simplified repro:

#![feature(unboxed_closures)]

fn main() {
    let f = |&: x:uint| {x};
    let bar = foo(f);
    println!("{}", bar.call((1,)));
}

fn foo<F: Fn<(uint,), uint>>(f: F) -> Box<Fn<(uint,),uint>> {
   ( box |&: x: uint| f.call((x,))) as Box<Fn<(uint,), uint>>
}
pfalabella commented 10 years ago

Now needs explicit 'static bound to repro:

#![feature(unboxed_closures)]

fn main() {
    let f = |&: | { };
    let bar = foo(f);
    println!("{}" , bar.call (()) );
}

fn foo<F: Fn<(), ()> + 'static>(f: F) -> Box<Fn<(), ()> + 'static> {
    ( box |&: | f.call(())) as Box<Fn<(), ()>>
}
error: internal compiler error: fictitious type F in sizing_type_of()
note: the compiler hit an unexpected failure path. this is a bug.
note: we would appreciate a bug report: http://doc.rust-lang.org/complement-bugreport.html
note: run with `RUST_BACKTRACE=1` for a backtrace
task 'rustc' failed at 'Box<Any>', /build/rust-git/src/rust/src/libsyntax/ast_util.rs:784
pfalabella commented 10 years ago

now needs move to repro:

#![feature(unboxed_closures)]

fn main() {
    let f = |&: | { };
    let bar = foo(f);
    println!("{}" , bar.call (()) );
}

fn foo<F: Fn<(), ()> + 'static>(f: F) -> Box<Fn<(), ()> + 'static> {
    ( box move |&: | f.call(())) as Box<Fn<(), ()>>
}

error is now reported in diagnostic.rs though

error: internal compiler error: fictitious type F in sizing_type_of()
note: the compiler hit an unexpected failure path. this is a bug.
note: we would appreciate a bug report: http://doc.rust-lang.org/complement-bugreport.html
note: run with `RUST_BACKTRACE=1` for a backtrace
task 'rustc' failed at 'Box<Any>', /build/rust-git/src/rust/src/libsyntax/diagnostic.rs:169

backtrace

stack backtrace:
   1:         0x66be29a8 - ZN2rt9backtrace3imp5write20hc5b481d5cd57af2aE9qE
   2:         0x66be641b - ZN2rt4init20hffee7254612f46fffnrE
   3:         0x668461cd - ZN6unwind18begin_unwind_inner20h484cd690c7389d13QhdE
   4:         0x6a675f76 - ZN10diagnostic11SpanHandler8span_bug20h61400d8c039e9bc6GMFE
   5:         0x6a676587 - ZN10diagnostic7Handler3bug20h637401670639e998ISFE
   6:           0x6ec9a2 - ZN6driver7session7Session3bug20h63d7d8460a66e09cFyxE
   7:           0xa83406 - ZN6middle5trans7type_of14sizing_type_of20hdd8be8c0c6eb6373zH9E
   8:           0xb7db11 - ZN6middle5trans3adt27PointerField...std..cmp..Eq27assert_receiver_is_tota
l_eq20ha32c3709fd4604c4JutE
   9:           0xa7c679 - ZN6middle5trans3adt14represent_type20h1294e6e14e5ff75ey5sE
  10:           0xa77577 - ZN6middle5trans7type_of7type_of20hafb26f53ba254fd53N9E
  11:           0xab45b5 - ZN6middle5trans7closure25make_closure_from_bare_fn20h4f1bcbc87f46e2c3lljE

  12:           0xab503e - ZN6middle5trans7closure25make_closure_from_bare_fn20h4f1bcbc87f46e2c3lljE

  13:           0xaaaf48 - ZN6middle2ty9expr_kind20h949e0064a45a1e82ilGE
  14:           0xa729df - ZN6middle5trans4expr5trans20ha48b94e0db233834pN2E
  15:           0xaaab87 - ZN6middle2ty9expr_kind20h949e0064a45a1e82ilGE
  16:           0xa729df - ZN6middle5trans4expr5trans20ha48b94e0db233834pN2E
  17:           0xaad323 - ZN6middle2ty9expr_kind20h949e0064a45a1e82ilGE
  18:           0xa71723 - ZN6middle5trans4expr10trans_into20h96733f5255894c9dvJ2E
  19:           0xa71a5b - ZN6middle5trans11controlflow11trans_block20hc018d4181ef5114d2WYE
  20:           0xb15c90 - ZN6middle5trans4base13trans_closure20hfb78e3f15b7b784dTQeE
  21:           0xa6411d - ZN6middle5trans4base8trans_fn20h94c1533573410e77h2eE
  22:           0xa658e1 - ZN6middle5trans12monomorphize14monomorphic_fn20h1618738c6d1617aeKoYE
  23:           0xa9921a - ZN6middle5trans6callee24trans_fn_ref_with_substs20h26b3d37002d9819aFD1E
  24:           0xa95e6e - ZN6middle5trans6callee12trans_fn_ref20hc6e86523bc4e67a9fs1E
  25:           0xa9de9c - ZN6middle5trans6common9expr_info20haa29a9eb7befc8d0bZ5E
  26:           0xa78a4b - ZN6middle5trans6callee16trans_call_inner20hf94d81b3cc0dc994nZ1E
  27:           0xa9d5e0 - ZN6middle5trans6callee10trans_call20h61df90c183273a62IT1E
  28:           0xaace3b - ZN6middle2ty9expr_kind20h949e0064a45a1e82ilGE
  29:           0xa71723 - ZN6middle5trans4expr10trans_into20h96733f5255894c9dvJ2E
  30:           0xb40c48 - ZN6middle5trans7cleanup9var_scope20h86fc45f82162f649VtxE
  31:           0xb40b18 - ZN6middle5trans7cleanup9var_scope20h86fc45f82162f649VtxE
  32:           0xb0d88f - ZN6middle5trans6_match11store_local20hac621f306ab9420b9eiE
  33:           0xa70d13 - ZN6middle5trans4base10init_local20hf01d11915bad5b1btZdE
  34:           0xa701e6 - ZN6middle5trans11controlflow10trans_stmt20h6a327ed75a825439WRYE
  35:           0xa71969 - ZN6middle5trans11controlflow11trans_block20hc018d4181ef5114d2WYE
  36:           0xb15c90 - ZN6middle5trans4base13trans_closure20hfb78e3f15b7b784dTQeE
  37:           0xa6411d - ZN6middle5trans4base8trans_fn20h94c1533573410e77h2eE
  38:           0xa617ec - ZN6middle5trans4base10trans_item20h7a9c36ad77c3fd91AlfE
  39:           0xb1f009 - ZN6middle5trans4base11trans_crate20ha6d41362f46fe1abQlgE
  40:           0xf4daf9 - ZN6driver6driver25phase_4_translate_to_llvm20hc8eefbd8dad9706cjZwE
  41:           0xf461f4 - ZN6driver6driver13compile_input20h0eef3c908953a111ewwE
  42:           0xfc2dff - ZN6driver7monitor20hcdaa282087678b71SaBE
  43:           0xfc1170 - ZN6driver7monitor20hcdaa282087678b71SaBE
  44:           0x71bf55 - ZN6driver6driver35OutputFilenames...std..clone..Clone5clone20h22daf11eed5
36512ElxE
  45:           0x71be97 - ZN6driver6driver35OutputFilenames...std..clone..Clone5clone20h22daf11eed5
36512ElxE
  46:         0x7072945c - ZN4task10spawn_opts20hae91090f93dc8031FteE
  47:         0x668aab5f - rust_try
  48:         0x668aab39 - rust_try
  49:         0x6684432e - ZN6unwind3try20hba110656f3557a7bU4cE
  50:         0x66844189 - ZN4task4Task3run20hdb858a047ca67fa4kzcE
  51:         0x707292b6 - ZN4task10spawn_opts20hae91090f93dc8031FteE
  52:         0x66845807 - ZN4task11BlockedTask14cast_from_uint20hffe040d42c989c01XRcE
  53:         0x76ad59ed - BaseThreadInitThunk
bkoropoff commented 10 years ago

I think this is the same as #16791. In particular, the closure is capturing a free variable with a generic type which trans fails to monomorphize and chokes on.

bkoropoff commented 10 years ago

The latest example now builds for me, and I think the existing tests cover this well enough, so this issue can be closed.

alexcrichton commented 10 years ago

Thanks @bkoropoff!