Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

ICE when pattern matching vec![] #92074

Closed
quornian opened this issue Dec 18, 2021 · 2 comments · Fixed by #92080
Closed

ICE when pattern matching vec![] #92074

quornian opened this issue Dec 18, 2021 · 2 comments · Fixed by #92080
Assignees
Labels
A-patterns Relating to patterns and pattern matching C-bug Category: This is a bug. glacier ICE tracked in rust-lang/glacier. I-ICE Issue: The compiler panicked, giving an Internal Compilation Error (ICE) ❄️ T-compiler Relevant to the compiler team, which will review and decide on the PR/issue.

Comments

@quornian
Copy link

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.

@quornian quornian added C-bug Category: This is a bug. I-ICE Issue: The compiler panicked, giving an Internal Compilation Error (ICE) ❄️ T-compiler Relevant to the compiler team, which will review and decide on the PR/issue. labels Dec 18, 2021
@jyn514
Copy link
Member

jyn514 commented Dec 18, 2021

Here's a reproduction without rustdoc involved:

// library is same as the original issue

// in a new crate:
fn main() -> Result<(), impl core::fmt::Debug> {
    use rustice::sub;

    let x = sub::make_struct()?;

    assert!(matches!(x, sub::En::A(sub::B { inner: vec![], .. })));
    Ok::<(), &'static str>(())
}

@jyn514
Copy link
Member

jyn514 commented Dec 18, 2021

Minimized:

pub enum En {
    A(Vec<u8>)
}

fn f() -> Result<(), impl core::fmt::Debug> {
    let x: En = loop {};

    assert!(matches!(x, En::A(vec![])));
    Ok::<(), &'static str>(())
}

@jyn514 jyn514 changed the title ICE when running doctests with automatic Result handling enabled ICE when pattern matching vec![] Dec 18, 2021
@jyn514 jyn514 added the A-patterns Relating to patterns and pattern matching label Dec 18, 2021
@Aaron1011 Aaron1011 self-assigned this Dec 18, 2021
@rust-lang-glacier-bot rust-lang-glacier-bot added the glacier ICE tracked in rust-lang/glacier. label Dec 20, 2021
bors added a commit to rust-lang-ci/rust that referenced this issue Jan 3, 2022
Move `PatKind::Lit` checking from ast_validation to ast lowering

Fixes rust-lang#92074

This allows us to insert an `ExprKind::Err` when an invalid expression
is used in a literal pattern, preventing later stages of compilation
from seeing an unexpected literal pattern.
@bors bors closed this as completed in 137c374 Jan 3, 2022
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
A-patterns Relating to patterns and pattern matching C-bug Category: This is a bug. glacier ICE tracked in rust-lang/glacier. I-ICE Issue: The compiler panicked, giving an Internal Compilation Error (ICE) ❄️ T-compiler Relevant to the compiler team, which will review and decide on the PR/issue.
Projects
None yet
Development

Successfully merging a pull request may close this issue.

4 participants