Skip to content

ICE when pattern matching vec![] #92074

Closed
@quornian

Description

@quornian

Note: this only occurs when the type of the code block is a result. Removing the Ok line and swapping ? for .unwrap() does not yield the ICE.

Code

//! Library
//!
//! ```
//! use rustice::sub;
//!
//! let x = sub::make_struct()?;
//!
//! assert!(matches!(x, sub::En::A(sub::B { inner: vec![], .. })));
//! Ok::<(), &'static str>(())
//! ```

pub mod sub {
    pub enum En {
        A(B),
    }

    pub struct B {
        inner: Vec<u8>,
    }

    pub fn make_struct() -> Result<En, &'static str> {
        Ok(En::A(B { inner: vec![] }))
    }

    impl B {
        pub fn inner(&self) -> &Vec<u8> {
            &self.inner
        }
    }
}

Meta

rustc --version --verbose:

rustc 1.55.0 (c8dfcfe04 2021-09-06)
binary: rustc
commit-hash: c8dfcfe046a7680554bf4eb612bad840e7631c4b
commit-date: 2021-09-06
host: x86_64-unknown-linux-gnu
release: 1.55.0
LLVM version: 12.0.1

and after a rustup, (still getting the same ICE):

rustc 1.57.0 (f1edd0429 2021-11-29)
binary: rustc
commit-hash: f1edd0429582dd29cccacaf50fd134b05593bd9c
commit-date: 2021-11-29
host: x86_64-unknown-linux-gnu
release: 1.57.0
LLVM version: 13.0.0

Error output

$ cargo test --doc
   Compiling rustice v0.1.0 (/home/ian/src/rust-ice)
    Finished test [unoptimized + debuginfo] target(s) in 0.20s
   Doc-tests rustice

running 1 test
test src/lib.rs - (line 3) ... FAILED

failures:

---- src/lib.rs - (line 3) stdout ----
error: arbitrary expressions aren't allowed in patterns
 --> src/lib.rs:8:48
  |
8 | assert!(matches!(x, sub::En::A(sub::B { inner: vec![], .. })));
  |                                                ^^^^^^
  |
  = note: this error originates in the macro `vec` (in Nightly builds, run with -Z macro-backtrace for more info)

error: internal compiler error: compiler/rustc_mir_build/src/thir/pattern/mod.rs:558:22: not a literal: Expr { hir_id: HirId { owner: DefId(0:5 ~ rust_out[6150]::main::_doctest_main_src_lib_rs_3_0), local_id: 39 }, kind: Call(Expr { hir_id: HirId { owner: DefId(0:5 ~ rust_out[6150]::main::_doctest_main_src_lib_rs_3_0), local_id: 38 }, kind: Path(TypeRelative(Ty { hir_id: HirId { owner: DefId(0:5 ~ rust_out[6150]::main::_doctest_main_src_lib_rs_3_0), local_id: 36 }, kind: Path(Resolved(None, Path { span: /home/ian/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/alloc/src/macros.rs:43:36: 43:52 (#6), res: Def(Struct, DefId(5:6801 ~ alloc[197d]::vec::Vec)), segments: [PathSegment { ident: $crate#6, hir_id: Some(HirId { owner: DefId(0:5 ~ rust_out[6150]::main::_doctest_main_src_lib_rs_3_0), local_id: 33 }), res: Some(Err), args: None, infer_args: true }, PathSegment { ident: vec#6, hir_id: Some(HirId { owner: DefId(0:5 ~ rust_out[6150]::main::_doctest_main_src_lib_rs_3_0), local_id: 34 }), res: Some(Def(Mod, DefId(5:6024 ~ alloc[197d]::vec))), args: None, infer_args: true }, PathSegment { ident: Vec#6, hir_id: Some(HirId { owner: DefId(0:5 ~ rust_out[6150]::main::_doctest_main_src_lib_rs_3_0), local_id: 35 }), res: Some(Err), args: None, infer_args: true }] })), span: /home/ian/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/alloc/src/macros.rs:43:36: 43:52 (#6) }, PathSegment { ident: new#6, hir_id: Some(HirId { owner: DefId(0:5 ~ rust_out[6150]::main::_doctest_main_src_lib_rs_3_0), local_id: 37 }), res: Some(Err), args: None, infer_args: true })), span: /home/ian/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/alloc/src/macros.rs:43:36: 43:57 (#6) }, []), span: /home/ian/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/alloc/src/macros.rs:43:36: 43:59 (#6) }
 --> src/lib.rs:8:48
  |
8 | assert!(matches!(x, sub::En::A(sub::B { inner: vec![], .. })));
  |                                                ^^^^^^
  |
  = note: this error: internal compiler error originates in the macro `vec` (in Nightly builds, run with -Z macro-backtrace for more info)

thread 'rustc' panicked at 'Box<dyn Any>', /rustc/c8dfcfe046a7680554bf4eb612bad840e7631c4b/compiler/rustc_errors/src/lib.rs:980:9
note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace

note: the compiler unexpectedly panicked. this is a bug.

note: we would appreciate a bug report: https://github.com/rust-lang/rust/issues/new?labels=C-bug%2C+I-ICE%2C+T-compiler&template=ice.md

note: rustc 1.55.0 (c8dfcfe04 2021-09-06) running on x86_64-unknown-linux-gnu

note: compiler flags: -C codegen-units=1 -C embed-bitcode=no --crate-type bin

query stack during panic:
#0 [thir_body] building THIR for `main::_doctest_main_src_lib_rs_3_0`
#1 [mir_built] building MIR for `main::_doctest_main_src_lib_rs_3_0`
end of query stack
error: aborting due to 2 previous errors

Couldn't compile the test.

failures:
    src/lib.rs - (line 3)

test result: FAILED. 0 passed; 1 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.05s

error: test failed, to rerun pass '--doc'
Backtrace

thread 'rustc' panicked at 'Box<dyn Any>', /rustc/c8dfcfe046a7680554bf4eb612bad840e7631c4b/compiler/rustc_errors/src/lib.rs:980:9
stack backtrace:
   0: std::panicking::begin_panic
   1: std::panic::panic_any
   2: rustc_errors::HandlerInner::span_bug
   3: rustc_errors::Handler::span_bug
   4: rustc_middle::ty::context::tls::with_opt
   5: rustc_middle::util::bug::opt_span_bug_fmt
   6: rustc_middle::util::bug::span_bug_fmt
   7: rustc_mir_build::thir::pattern::PatCtxt::lower_lit
   8: rustc_mir_build::thir::pattern::PatCtxt::lower_pattern
   9: <alloc::vec::Vec<T> as alloc::vec::spec_from_iter::SpecFromIter<T,I>>::from_iter
  10: rustc_mir_build::thir::pattern::PatCtxt::lower_pattern
  11: <alloc::vec::Vec<T> as alloc::vec::spec_from_iter::SpecFromIter<T,I>>::from_iter
  12: rustc_mir_build::thir::pattern::PatCtxt::lower_pattern
  13: rustc_mir_build::thir::pattern::pat_from_hir
  14: rustc_mir_build::thir::cx::expr::<impl rustc_mir_build::thir::cx::Cx>::convert_arm
  15: <alloc::vec::Vec<T> as alloc::vec::spec_from_iter::SpecFromIter<T,I>>::from_iter
  16: rustc_mir_build::thir::cx::expr::<impl rustc_mir_build::thir::cx::Cx>::make_mirror_unadjusted
  17: rustc_mir_build::thir::cx::expr::<impl rustc_mir_build::thir::cx::Cx>::mirror_expr_inner
  18: rustc_mir_build::thir::cx::expr::<impl rustc_mir_build::thir::cx::Cx>::make_mirror_unadjusted
  19: rustc_mir_build::thir::cx::expr::<impl rustc_mir_build::thir::cx::Cx>::mirror_expr_inner
  20: rustc_mir_build::thir::cx::expr::<impl rustc_mir_build::thir::cx::Cx>::make_mirror_unadjusted
  21: rustc_mir_build::thir::cx::expr::<impl rustc_mir_build::thir::cx::Cx>::mirror_expr_inner
  22: core::ops::function::impls::<impl core::ops::function::FnMut<A> for &mut F>::call_mut
  23: <alloc::vec::Vec<T> as alloc::vec::spec_from_iter::SpecFromIter<T,I>>::from_iter
  24: rustc_mir_build::thir::cx::block::<impl rustc_mir_build::thir::cx::Cx>::mirror_block
  25: rustc_mir_build::thir::cx::expr::<impl rustc_mir_build::thir::cx::Cx>::make_mirror_unadjusted
  26: rustc_mir_build::thir::cx::expr::<impl rustc_mir_build::thir::cx::Cx>::mirror_expr_inner
  27: rustc_mir_build::thir::cx::thir_body
  28: rustc_query_system::query::plumbing::get_query_impl
  29: <rustc_query_impl::Queries as rustc_middle::ty::query::QueryEngine>::thir_body
  30: rustc_infer::infer::InferCtxtBuilder::enter
  31: rustc_mir_build::build::mir_built
  32: rustc_query_system::query::plumbing::get_query_impl
  33: <rustc_query_impl::Queries as rustc_middle::ty::query::QueryEngine>::mir_built
  34: rustc_mir::transform::check_unsafety::unsafety_check_result
  35: core::ops::function::FnOnce::call_once
  36: rustc_query_system::query::plumbing::get_query_impl
  37: <rustc_query_impl::Queries as rustc_middle::ty::query::QueryEngine>::unsafety_check_result
  38: rustc_mir::transform::mir_const
  39: rustc_query_system::query::plumbing::get_query_impl
  40: <rustc_query_impl::Queries as rustc_middle::ty::query::QueryEngine>::mir_const
  41: rustc_mir::transform::mir_promoted
  42: rustc_query_system::query::plumbing::get_query_impl
  43: <rustc_query_impl::Queries as rustc_middle::ty::query::QueryEngine>::mir_promoted
  44: rustc_mir::borrow_check::mir_borrowck
  45: core::ops::function::FnOnce::call_once
  46: rustc_query_system::query::plumbing::get_query_impl
  47: <rustc_query_impl::Queries as rustc_middle::ty::query::QueryEngine>::mir_borrowck
  48: rustc_typeck::collect::type_of::type_of
  49: rustc_query_system::query::plumbing::get_query_impl
  50: <rustc_query_impl::Queries as rustc_middle::ty::query::QueryEngine>::type_of
  51: rustc_typeck::check::check::check_item_type
  52: rustc_middle::hir::map::Map::visit_item_likes_in_module
  53: rustc_typeck::check::check::check_mod_item_types
  54: rustc_query_system::query::plumbing::get_query_impl
  55: <rustc_query_impl::Queries as rustc_middle::ty::query::QueryEngine>::check_mod_item_types
  56: rustc_session::utils::<impl rustc_session::session::Session>::time
  57: rustc_typeck::check_crate
  58: rustc_interface::passes::analysis
  59: rustc_query_system::query::plumbing::get_query_impl
  60: <rustc_query_impl::Queries as rustc_middle::ty::query::QueryEngine>::analysis
  61: rustc_interface::queries::<impl rustc_interface::interface::Compiler>::enter
  62: rustc_span::with_source_map
  63: rustc_interface::interface::create_compiler_and_run
  64: scoped_tls::ScopedKey<T>::set
note: Some details are omitted, run with `RUST_BACKTRACE=full` for a verbose backtrace.

Metadata

Metadata

Assignees

Labels

A-patternsRelating to patterns and pattern matchingC-bugCategory: This is a bug.I-ICEIssue: The compiler panicked, giving an Internal Compilation Error (ICE) ❄️T-compilerRelevant to the compiler team, which will review and decide on the PR/issue.glacierICE tracked in rust-lang/glacier.

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions