Skip to content

Compiler panic when matching on a reference to an enum with an unsized variant IF the field isn't being used #33445

Closed
@SnirkImmington

Description

@SnirkImmington

The compiler panics when matching on a reference to an enum containing a variant which is unsized IF the variable isn't being named.

Code

I tried this code on the playground and my local machine, on stable and nightly compilers:

pub enum UnsizedEnum {
    Variant([i32]) // Variant holding an unsized type
}

impl FnOnceWrapper {
    fn foo(&self) { // Function taking an &UnsizedEnum
        match self { // Some match on self (can use match *self as well)
            &UnsizedEnum::Variant(_) => // Variable isn't used
            println!("Shouldn't compile anyway?")
        }
    }
}

error: internal compiler error: ../src/librustc_trans/type_of.rs:166: Unexpected tail in unsized_info_ty: registry::types::RegistryData for ty=registry::types::RegistryData
Playpen link: http://is.gd/oY6R8Y

What should happen

The compiler should be emitting the same error as when the variable is named, I guess:

<anon>:8:34: 8:35 error: the trait bound `[i32]: std::marker::Sized` is not satisfied [E0277]
<anon>:8             UnsizedEnum::Variant(v) => 
                                          ^
<anon>:8:34: 8:35 help: see the detailed explanation for E0277
<anon>:8:34: 8:35 note: `[i32]` does not have a constant size known at compile-time
<anon>:8:34: 8:35 note: all local variables must have a statically known size
error: aborting due to previous error
playpen: application terminated with error code 101

Some examples may be compile-able if the unsized type is being ignored?

Reproduction

The bug should be reproducible on all three channels, using any unsized type in the enum variant (Variant([i32]), Variant(FnOnce()), etc.).

The variable must be _ (ignored) - a variable named _v will trigger the regular error.

A function with an owned self - fn foo(self) { match self { ... } } - does not cause the bug (it issues a regular error).

Using different matching schemes, i.e. match *self { Variant(ref _) => ... }, also caused the bug.

Replacing the enum variant with a sized type, such as Variant([i32; 5]) causes the code to compile.

Backtrace

In addition to the ones available on the playground, here's the log of my machine compiling my code:

error: internal compiler error: ../src/librustc_trans/type_of.rs:166: Unexpected tail in unsized_info_ty: BadEnum for ty=BadEnum
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 'Box<Any>', ../src/libsyntax/errors/mod.rs:576
stack backtrace:
   1:     0x7f5225112610 - std::sys::backtrace::tracing::imp::write::h9fb600083204ae7f
   2:     0x7f522511fd5b - std::panicking::default_hook::_$u7b$$u7b$closure$u7d$$u7d$::hca543c34f11229ac
   3:     0x7f522511f8fc - std::panicking::default_hook::hc2c969e7453d080c
   4:     0x7f52250e528f - std::sys_common::unwind::begin_unwind_inner::h30e12d15ce2b2e25
   5:     0x7f52207211c7 - std::sys_common::unwind::begin_unwind::h24c4c0fa2cfe995a
   6:     0x7f5220720ff5 - syntax::errors::Handler::bug::h4846e60601033e50
   7:     0x7f52217d43f2 - rustc::session::opt_span_bug_fmt::_$u7b$$u7b$closure$u7d$$u7d$::hf0fb5697f8f25f40
   8:     0x7f52217d4282 - rustc::session::opt_span_bug_fmt::hc581ba88c4e2ec53
   9:     0x7f52217ec086 - rustc::session::bug_fmt::had96c08cb43bd8a1
  10:     0x7f5223d42ba5 - rustc_trans::type_of::unsized_info_ty::hce316b0f61e418ac
  11:     0x7f5223c1ed00 - rustc_trans::type_of::in_memory_type_of::h97b017bde8fe1e03
  12:     0x7f5223c11d51 - rustc_trans::abi::FnType::unadjusted::_$u7b$$u7b$closure$u7d$$u7d$::h70131b4b2d0cfbee
  13:     0x7f5223c0f6ab - rustc_trans::abi::FnType::unadjusted::hca5902507eb050fc
  14:     0x7f5223c1e79e - rustc_trans::type_of::in_memory_type_of::h97b017bde8fe1e03
  15:     0x7f5223c86533 - rustc_trans::callee::get_fn::h691a55e881985779
  16:     0x7f5223c29d60 - rustc_trans::callee::Callee::def::ha169529fef0048b5
  17:     0x7f5223c54552 - rustc_trans::base::trans_item::hdc785ae68a9e6500
  18:     0x7f5223c6decb - _<base..TransItemsWithinModVisitor<'a, 'tcx> as rustc..hir..intravisit..Visitor<'v>>::visit_item::h22c1c36dec64effa
  19:     0x7f5223c6bce7 - rustc::hir::intravisit::walk_item::he78478ac5852ebcf
  20:     0x7f5223c5cabf - rustc_trans::base::trans_crate::h6ed1dbd6e572a8c2
  21:     0x7f52256776ff - rustc_driver::driver::phase_4_translate_to_llvm::hd7579aae98641824
  22:     0x7f5225675d8f - rustc_driver::driver::compile_input::_$u7b$$u7b$closure$u7d$$u7d$::he3c6b6ab9afe28dd
  23:     0x7f5225672630 - rustc_driver::driver::phase_3_run_analysis_passes::_$u7b$$u7b$closure$u7d$$u7d$::h06c776ef4d1c70b6
  24:     0x7f522566bf5e - rustc::ty::context::TyCtxt::create_and_enter::hb0e0e916c7274a64
  25:     0x7f522563e90d - rustc_driver::driver::compile_input::h0629572e6f316b31
  26:     0x7f522561f53c - rustc_driver::run_compiler::h8902aebf8b1849a8
  27:     0x7f522561cc41 - std::sys_common::unwind::try::try_fn::h4c74456035d0fcc7
  28:     0x7f522510fdeb - __rust_try
  29:     0x7f522510fd7d - std::sys_common::unwind::inner_try::h47a4d9cd4a369dcd
  30:     0x7f522561d48a - _<F as std..boxed..FnBox<A>>::call_box::h27f542a39f1d61ef
  31:     0x7f522511def4 - std::sys::thread::Thread::new::thread_start::h6f266e069bf4ec2b
  32:     0x7f521cea5423 - start_thread
  33:     0x7f5224d7ccbc - clone
  34:                0x0 - <unknown>

error: Could not compile `bug-report`.

To learn more, run the command again with --verbose.

$ rustc --version --verbose

rustc 1.10.0-nightly (8da2bcac5 2016-04-28)
binary: rustc
commit-hash: 8da2bcac5db1e091b90cceb19d0496f0f7501c88
commit-date: 2016-04-28
host: x86_64-unknown-linux-gnu
release: 1.10.0-nightly

Sorry if this is a duplicate report, I saw a couple that looked similar but they had both been closed.
(update: added rustc version with --verbose

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions