<p dir="auto"><code class="notranslate">rustc</code> is not checking that all types that are put into a sized-context are in fact sized.</p>
<p dir="auto">Consider for example:</p>
<div class="highlight highlight-source-rust notranslate position-relative overflow-auto" dir="auto" data-snippet-clipboard-copy-content="pub enum BsonValue {
    A([u8]),
    B([BsonValue]),
}

pub fn set_value(_v:&amp;BsonValue)
{
}

fn main()
{
}"><pre class="notranslate"><span class="pl-k">pub</span> <span class="pl-k">enum</span> <span class="pl-smi">BsonValue</span> <span class="pl-kos">{</span>
    <span class="pl-v">A</span><span class="pl-kos">(</span><span class="pl-kos">[</span><span class="pl-smi">u8</span><span class="pl-kos">]</span><span class="pl-kos">)</span><span class="pl-kos">,</span>
    <span class="pl-v">B</span><span class="pl-kos">(</span><span class="pl-kos">[</span><span class="pl-smi">BsonValue</span><span class="pl-kos">]</span><span class="pl-kos">)</span><span class="pl-kos">,</span>
<span class="pl-kos">}</span>

<span class="pl-k">pub</span> <span class="pl-k">fn</span> <span class="pl-en">set_value</span><span class="pl-kos">(</span><span class="pl-s1">_v</span><span class="pl-kos">:</span><span class="pl-c1">&amp;</span><span class="pl-smi">BsonValue</span><span class="pl-kos">)</span>
<span class="pl-kos">{</span>
<span class="pl-kos">}</span>

<span class="pl-k">fn</span> <span class="pl-en">main</span><span class="pl-kos">(</span><span class="pl-kos">)</span>
<span class="pl-kos">{</span>
<span class="pl-kos">}</span></pre></div>
<p dir="auto">This yields an ICE:</p>
<div class="snippet-clipboard-content notranslate position-relative overflow-auto" data-snippet-clipboard-copy-content="thread 'rustc' panicked at 'Unexpected type returned from struct_tail: BsonValue for ty=BsonValue', /home/rustbuild/src/rust-buildbot/slave/beta-dist-rustc-linux/build/src/librustc_trans/trans/type_of.rs:366"><pre class="notranslate"><code class="notranslate">thread 'rustc' panicked at 'Unexpected type returned from struct_tail: BsonValue for ty=BsonValue', /home/rustbuild/src/rust-buildbot/slave/beta-dist-rustc-linux/build/src/librustc_trans/trans/type_of.rs:366
</code></pre></div>
<h2 dir="auto">Original bug report follows</h2>
<div class="snippet-clipboard-content notranslate position-relative overflow-auto" data-snippet-clipboard-copy-content="erics-air-2:Elmo eric$ rustc --version
rustc 1.0.0-beta.3 (5241bf9c3 2015-04-25) (built 2015-04-25)"><pre class="notranslate"><code class="notranslate">erics-air-2:Elmo eric$ rustc --version
rustc 1.0.0-beta.3 (5241bf9c3 2015-04-25) (built 2015-04-25)
</code></pre></div>
<p dir="auto">I'm on MacOS X Mavericks.</p>
<p dir="auto">Here's the source file that causes the problem (I'm a rust newbie):</p>
<div class="snippet-clipboard-content notranslate position-relative overflow-auto" data-snippet-clipboard-copy-content="enum BsonValue {
    BDouble(f64),
    BString(String),
    BInt64(i64),
    BInt32(i32),
    BUndefined,
    BObjectID([u8]),
    BNull,
    BRegex(String,String),
    BJSCode(String),
    BJSCodeWithScope(String),
    BBinary(u8,[u8]),
    BMinKey,
    BMaxKey,
    BDateTime(i64),
    BTimeStamp(i64),
    BBoolean(bool),
    BArray([BsonValue]),
    BDocument([(String,BsonValue)]),
}

fn setValueForKey (doc:&amp;BsonValue, k:String, v:&amp;BsonValue)
{
}

fn main()
{
}"><pre class="notranslate"><code class="notranslate">enum BsonValue {
    BDouble(f64),
    BString(String),
    BInt64(i64),
    BInt32(i32),
    BUndefined,
    BObjectID([u8]),
    BNull,
    BRegex(String,String),
    BJSCode(String),
    BJSCodeWithScope(String),
    BBinary(u8,[u8]),
    BMinKey,
    BMaxKey,
    BDateTime(i64),
    BTimeStamp(i64),
    BBoolean(bool),
    BArray([BsonValue]),
    BDocument([(String,BsonValue)]),
}

fn setValueForKey (doc:&amp;BsonValue, k:String, v:&amp;BsonValue)
{
}

fn main()
{
}
</code></pre></div>
<p dir="auto">And here's the output of the compiler:</p>
<div class="snippet-clipboard-content notranslate position-relative overflow-auto" data-snippet-clipboard-copy-content="erics-air-2:Elmo eric$ RUST_BACKTRACE=1 rustc b.rs
b.rs:2:1: 21:2 warning: enum is never used: `BsonValue`, #[warn(dead_code)] on by default
b.rs:2 enum BsonValue {
b.rs:3     BDouble(f64),
b.rs:4     BString(String),
b.rs:5     BInt64(i64),
b.rs:6     BInt32(i32),
b.rs:7     BUndefined,
       ...
b.rs:23:1: 25:2 warning: function is never used: `setValueForKey`, #[warn(dead_code)] on by default
b.rs:23 fn setValueForKey (doc:&amp;BsonValue, k:String, v:&amp;BsonValue)
b.rs:24 {
b.rs:25 }
b.rs:23:20: 23:23 warning: unused variable: `doc`, #[warn(unused_variables)] on by default
b.rs:23 fn setValueForKey (doc:&amp;BsonValue, k:String, v:&amp;BsonValue)
                           ^~~
b.rs:23:36: 23:37 warning: unused variable: `k`, #[warn(unused_variables)] on by default
b.rs:23 fn setValueForKey (doc:&amp;BsonValue, k:String, v:&amp;BsonValue)
                                           ^
b.rs:23:46: 23:47 warning: unused variable: `v`, #[warn(unused_variables)] on by default
b.rs:23 fn setValueForKey (doc:&amp;BsonValue, k:String, v:&amp;BsonValue)
                                                     ^
b.rs:23:1: 25:2 warning: function `setValueForKey` should have a snake case name such as `set_value_for_key`, #[warn(non_snake_case)] on by default
b.rs:23 fn setValueForKey (doc:&amp;BsonValue, k:String, v:&amp;BsonValue)
b.rs:24 {
b.rs:25 }
error: internal compiler error: unexpected panic
note: the compiler unexpectedly panicked. this is a bug.
note: we would appreciate a bug report: https://github.com/rust-lang/rust/blob/master/CONTRIBUTING.md#bug-reports
note: run with `RUST_BACKTRACE=1` for a backtrace
thread 'rustc' panicked at 'Unexpected type returned from struct_tail: BsonValue for ty=BsonValue', /Users/rustbuild/src/rust-buildbot/slave/beta-dist-rustc-mac/build/src/librustc_trans/trans/type_of.rs:366

stack backtrace:
   1:        0x1085cc33f - sys::backtrace::write::h0f2fc53eb11eb814gWr
   2:        0x1085d4942 - panicking::on_panic::hd617a4042e8486fciUv
   3:        0x108591375 - rt::unwind::begin_unwind_inner::hd84dfec22ac3667d1Bv
   4:        0x108592206 - rt::unwind::begin_unwind_fmt::h5bb6fa95bd57b24bFAv
   5:        0x10566046f - trans::type_of::in_memory_type_of::hb4e9c324c5b50f3epkL
   6:        0x105732682 - trans::type_of::type_of_rust_fn::h693a4c7fdf6ff62b87K
   7:        0x10566e00c - trans::declare::declare_rust_fn::hb0911ef870c7fe86SJz
   8:        0x10569462f - trans::base::register_fn::ha9cdc6c185aa084bVmi
   9:        0x10568f2d1 - trans::base::get_item_val::hfda21a63917f43e1Dzi
  10:        0x10568b3c7 - trans::base::trans_item::h2033cab24c2319dbFbi
  11:        0x10569a220 - trans::base::trans_crate::h3375b1d0f4de8d89F0i
  12:        0x10511ed4e - driver::phase_4_translate_to_llvm::hc94112f0d91aac3chOa
  13:        0x1050f72a4 - driver::compile_input::h4747d8bb1c595fdfQba
  14:        0x1051be8f3 - run_compiler::hc8c95c5858347fdbz4b
  15:        0x1051bc41a - boxed::F.FnBox&lt;A&gt;::call_box::h7872786064439979928
  16:        0x1051bb8b7 - rt::unwind::try::try_fn::h10239991317224243769
  17:        0x1086557c8 - rust_try_inner
  18:        0x1086557b5 - rust_try
  19:        0x1051bbb90 - boxed::F.FnBox&lt;A&gt;::call_box::h4543691575426869824
  20:        0x1085d348d - sys::thread::create::thread_start::h499b3be451a7bbb8AZu
  21:     0x7fff8aca1898 - _pthread_body
  22:     0x7fff8aca1729 - _pthread_start"><pre class="notranslate"><code class="notranslate">erics-air-2:Elmo eric$ RUST_BACKTRACE=1 rustc b.rs
b.rs:2:1: 21:2 warning: enum is never used: `BsonValue`, #[warn(dead_code)] on by default
b.rs:2 enum BsonValue {
b.rs:3     BDouble(f64),
b.rs:4     BString(String),
b.rs:5     BInt64(i64),
b.rs:6     BInt32(i32),
b.rs:7     BUndefined,
       ...
b.rs:23:1: 25:2 warning: function is never used: `setValueForKey`, #[warn(dead_code)] on by default
b.rs:23 fn setValueForKey (doc:&amp;BsonValue, k:String, v:&amp;BsonValue)
b.rs:24 {
b.rs:25 }
b.rs:23:20: 23:23 warning: unused variable: `doc`, #[warn(unused_variables)] on by default
b.rs:23 fn setValueForKey (doc:&amp;BsonValue, k:String, v:&amp;BsonValue)
                           ^~~
b.rs:23:36: 23:37 warning: unused variable: `k`, #[warn(unused_variables)] on by default
b.rs:23 fn setValueForKey (doc:&amp;BsonValue, k:String, v:&amp;BsonValue)
                                           ^
b.rs:23:46: 23:47 warning: unused variable: `v`, #[warn(unused_variables)] on by default
b.rs:23 fn setValueForKey (doc:&amp;BsonValue, k:String, v:&amp;BsonValue)
                                                     ^
b.rs:23:1: 25:2 warning: function `setValueForKey` should have a snake case name such as `set_value_for_key`, #[warn(non_snake_case)] on by default
b.rs:23 fn setValueForKey (doc:&amp;BsonValue, k:String, v:&amp;BsonValue)
b.rs:24 {
b.rs:25 }
error: internal compiler error: unexpected panic
note: the compiler unexpectedly panicked. this is a bug.
note: we would appreciate a bug report: https://github.com/rust-lang/rust/blob/master/CONTRIBUTING.md#bug-reports
note: run with `RUST_BACKTRACE=1` for a backtrace
thread 'rustc' panicked at 'Unexpected type returned from struct_tail: BsonValue for ty=BsonValue', /Users/rustbuild/src/rust-buildbot/slave/beta-dist-rustc-mac/build/src/librustc_trans/trans/type_of.rs:366

stack backtrace:
   1:        0x1085cc33f - sys::backtrace::write::h0f2fc53eb11eb814gWr
   2:        0x1085d4942 - panicking::on_panic::hd617a4042e8486fciUv
   3:        0x108591375 - rt::unwind::begin_unwind_inner::hd84dfec22ac3667d1Bv
   4:        0x108592206 - rt::unwind::begin_unwind_fmt::h5bb6fa95bd57b24bFAv
   5:        0x10566046f - trans::type_of::in_memory_type_of::hb4e9c324c5b50f3epkL
   6:        0x105732682 - trans::type_of::type_of_rust_fn::h693a4c7fdf6ff62b87K
   7:        0x10566e00c - trans::declare::declare_rust_fn::hb0911ef870c7fe86SJz
   8:        0x10569462f - trans::base::register_fn::ha9cdc6c185aa084bVmi
   9:        0x10568f2d1 - trans::base::get_item_val::hfda21a63917f43e1Dzi
  10:        0x10568b3c7 - trans::base::trans_item::h2033cab24c2319dbFbi
  11:        0x10569a220 - trans::base::trans_crate::h3375b1d0f4de8d89F0i
  12:        0x10511ed4e - driver::phase_4_translate_to_llvm::hc94112f0d91aac3chOa
  13:        0x1050f72a4 - driver::compile_input::h4747d8bb1c595fdfQba
  14:        0x1051be8f3 - run_compiler::hc8c95c5858347fdbz4b
  15:        0x1051bc41a - boxed::F.FnBox&lt;A&gt;::call_box::h7872786064439979928
  16:        0x1051bb8b7 - rt::unwind::try::try_fn::h10239991317224243769
  17:        0x1086557c8 - rust_try_inner
  18:        0x1086557b5 - rust_try
  19:        0x1051bbb90 - boxed::F.FnBox&lt;A&gt;::call_box::h4543691575426869824
  20:        0x1085d348d - sys::thread::create::thread_start::h499b3be451a7bbb8AZu
  21:     0x7fff8aca1898 - _pthread_body
  22:     0x7fff8aca1729 - _pthread_start
</code></pre></div>
<div class="highlight highlight-source-rust notranslate position-relative overflow-auto" dir="auto" data-snippet-clipboard-copy-content="enum Foo {
    Bar(int, [int]),
}

fn main() {
    // Either of these lines can cause the ICE
    let _x: &amp;(int, [int]);
    let _y: &amp;Foo;
}"><pre class="notranslate"><span class="pl-k">enum</span> <span class="pl-smi">Foo</span> <span class="pl-kos">{</span>
    <span class="pl-v">Bar</span><span class="pl-kos">(</span><span class="pl-smi">int</span><span class="pl-kos">,</span> <span class="pl-kos">[</span><span class="pl-smi">int</span><span class="pl-kos">]</span><span class="pl-kos">)</span><span class="pl-kos">,</span>
<span class="pl-kos">}</span>

<span class="pl-k">fn</span> <span class="pl-en">main</span><span class="pl-kos">(</span><span class="pl-kos">)</span> <span class="pl-kos">{</span>
    <span class="pl-c">// Either of these lines can cause the ICE</span>
    <span class="pl-k">let</span> _x<span class="pl-kos">:</span> <span class="pl-c1">&amp;</span><span class="pl-kos">(</span><span class="pl-smi">int</span><span class="pl-kos">,</span> <span class="pl-kos">[</span><span class="pl-smi">int</span><span class="pl-kos">]</span><span class="pl-kos">)</span><span class="pl-kos">;</span>
    <span class="pl-k">let</span> _y<span class="pl-kos">:</span> <span class="pl-c1">&amp;</span><span class="pl-smi">Foo</span><span class="pl-kos">;</span>
<span class="pl-kos">}</span></pre></div>
<p dir="auto">Backtrace:</p>
<div class="snippet-clipboard-content notranslate position-relative overflow-auto" data-snippet-clipboard-copy-content="   1:     0x7f2a127e8580 - rt::backtrace::imp::write::h0180e7ded76a3ff2c0q
   2:     0x7f2a127eb770 - failure::on_fail::h3f169393c89b5f90Tlr
   3:     0x7f2a12fd24f0 - unwind::begin_unwind_inner::haeb9517b5061bc86Zie
   4:     0x7f2a133ad670 - unwind::begin_unwind::h17017358962417336117
   5:     0x7f2a13803a20 - middle::ty::unsized_part_of_type::h8eae6d239e9b7af3tnG
   6:     0x7f2a138037c0 - middle::trans::type_of::type_of::type_of_unsize_info::h67819f63aa2acfb5Xh9
   7:     0x7f2a1377b050 - middle::trans::type_of::type_of::h3c89a1738d384c45Ih9
   8:     0x7f2a1377b050 - middle::trans::type_of::type_of::h3c89a1738d384c45Ih9
   9:     0x7f2a137b0860 - middle::trans::base::alloc_ty::h5485998eeb61d023mTd
  10:     0x7f2a13859870 - middle::trans::_match::mk_binding_alloca::h11628361498234501597
  11:     0x7f2a1385bdf0 - middle::trans::_match::store_local::create_dummy_locals::closure.119283
  12:     0x7f2a13681560 - middle::pat_util::pat_bindings::closure.112016
  13:     0x7f2a0ea1ccb0 - ast_util::walk_pat::hc858153057fb5965oRB
  14:     0x7f2a138205f0 - middle::trans::_match::store_local::h9195017fe21b4124A2h
  15:     0x7f2a13772d10 - middle::trans::base::init_local::h5e8a493dc2ae05b1WFd
  16:     0x7f2a13772220 - middle::trans::controlflow::trans_stmt::hf26d5cee55a6056blhY
  17:     0x7f2a13773c40 - middle::trans::controlflow::trans_block::h004dea36138a75c8wmY
  18:     0x7f2a13829560 - middle::trans::base::trans_closure::h655acfc433ac13fevye
  19:     0x7f2a13764670 - middle::trans::base::trans_fn::hf0a444fa9ff43aebiKe
  20:     0x7f2a1375f9b0 - middle::trans::base::trans_item::hda4d4160cb2b58dfi2e
  21:     0x7f2a138341f0 - middle::trans::base::trans_crate::hff0f87c98e6356c8JWf
  22:     0x7f2a13c058d0 - driver::driver::phase_4_translate_to_llvm::h8223ee9d7ab4951cpzy
  23:     0x7f2a13bfd280 - driver::driver::compile_input::hfa4fd95c9e6a2ceeQby
  24:     0x7f2a13c8f0a0 - driver::run_compiler::h32bdccca6ed9465cJIB
  25:     0x7f2a13c8efb0 - driver::main_args::closure.138206
  26:     0x7f2a13ca1240 - task::TaskBuilder&lt;S&gt;::try_future::closure.139324
  27:     0x7f2a13ca1040 - task::TaskBuilder&lt;S&gt;::spawn_internal::closure.139301
  28:     0x7f2a146dcf10 - task::spawn_opts::closure.8369
  29:     0x7f2a1302af90 - rust_try_inner
  30:     0x7f2a1302af80 - rust_try
  31:     0x7f2a12fcfb20 - unwind::try::h03d8d1d4cb0de0c1f7d
  32:     0x7f2a12fcf8e0 - task::Task::run::hafab6bcab45e61e5zdd
  33:     0x7f2a146dcc70 - task::spawn_opts::closure.8315
  34:     0x7f2a12fd16e0 - thread::thread_start::hba588af1f803bb5blCd
  35:     0x7f2a1227f0c0 - start_thread
  36:     0x7f2a12c99359 - __clone
  37:                0x0 - &lt;unknown&gt;"><pre class="notranslate"><code class="notranslate">   1:     0x7f2a127e8580 - rt::backtrace::imp::write::h0180e7ded76a3ff2c0q
   2:     0x7f2a127eb770 - failure::on_fail::h3f169393c89b5f90Tlr
   3:     0x7f2a12fd24f0 - unwind::begin_unwind_inner::haeb9517b5061bc86Zie
   4:     0x7f2a133ad670 - unwind::begin_unwind::h17017358962417336117
   5:     0x7f2a13803a20 - middle::ty::unsized_part_of_type::h8eae6d239e9b7af3tnG
   6:     0x7f2a138037c0 - middle::trans::type_of::type_of::type_of_unsize_info::h67819f63aa2acfb5Xh9
   7:     0x7f2a1377b050 - middle::trans::type_of::type_of::h3c89a1738d384c45Ih9
   8:     0x7f2a1377b050 - middle::trans::type_of::type_of::h3c89a1738d384c45Ih9
   9:     0x7f2a137b0860 - middle::trans::base::alloc_ty::h5485998eeb61d023mTd
  10:     0x7f2a13859870 - middle::trans::_match::mk_binding_alloca::h11628361498234501597
  11:     0x7f2a1385bdf0 - middle::trans::_match::store_local::create_dummy_locals::closure.119283
  12:     0x7f2a13681560 - middle::pat_util::pat_bindings::closure.112016
  13:     0x7f2a0ea1ccb0 - ast_util::walk_pat::hc858153057fb5965oRB
  14:     0x7f2a138205f0 - middle::trans::_match::store_local::h9195017fe21b4124A2h
  15:     0x7f2a13772d10 - middle::trans::base::init_local::h5e8a493dc2ae05b1WFd
  16:     0x7f2a13772220 - middle::trans::controlflow::trans_stmt::hf26d5cee55a6056blhY
  17:     0x7f2a13773c40 - middle::trans::controlflow::trans_block::h004dea36138a75c8wmY
  18:     0x7f2a13829560 - middle::trans::base::trans_closure::h655acfc433ac13fevye
  19:     0x7f2a13764670 - middle::trans::base::trans_fn::hf0a444fa9ff43aebiKe
  20:     0x7f2a1375f9b0 - middle::trans::base::trans_item::hda4d4160cb2b58dfi2e
  21:     0x7f2a138341f0 - middle::trans::base::trans_crate::hff0f87c98e6356c8JWf
  22:     0x7f2a13c058d0 - driver::driver::phase_4_translate_to_llvm::h8223ee9d7ab4951cpzy
  23:     0x7f2a13bfd280 - driver::driver::compile_input::hfa4fd95c9e6a2ceeQby
  24:     0x7f2a13c8f0a0 - driver::run_compiler::h32bdccca6ed9465cJIB
  25:     0x7f2a13c8efb0 - driver::main_args::closure.138206
  26:     0x7f2a13ca1240 - task::TaskBuilder&lt;S&gt;::try_future::closure.139324
  27:     0x7f2a13ca1040 - task::TaskBuilder&lt;S&gt;::spawn_internal::closure.139301
  28:     0x7f2a146dcf10 - task::spawn_opts::closure.8369
  29:     0x7f2a1302af90 - rust_try_inner
  30:     0x7f2a1302af80 - rust_try
  31:     0x7f2a12fcfb20 - unwind::try::h03d8d1d4cb0de0c1f7d
  32:     0x7f2a12fcf8e0 - task::Task::run::hafab6bcab45e61e5zdd
  33:     0x7f2a146dcc70 - task::spawn_opts::closure.8315
  34:     0x7f2a12fd16e0 - thread::thread_start::hba588af1f803bb5blCd
  35:     0x7f2a1227f0c0 - start_thread
  36:     0x7f2a12c99359 - __clone
  37:                0x0 - &lt;unknown&gt;
</code></pre></div>
<p dir="auto">This seems to occur when using a non-struct type that contains an unsized type. This is probably because <a href="https://github.com/rust-lang/rust/blob/7932b719ec2b65acfa8c3e74aad29346d47ee992/src/librustc/middle/ty.rs#L2938-L2956"><code class="notranslate">unsized_part_of_type</code></a> only handles <code class="notranslate">ty_struct</code> and the base unsized types. This should be extended to handle enums and tuples as well.</p>