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

GAT ICEs: different parameter counts, cat_expr Errd, broken MIR, debuginfo #71176

Closed
lily-commure opened this issue Apr 15, 2020 · 5 comments · Fixed by #84379
Closed

GAT ICEs: different parameter counts, cat_expr Errd, broken MIR, debuginfo #71176

lily-commure opened this issue Apr 15, 2020 · 5 comments · Fixed by #84379
Labels
A-debuginfo Area: Debugging information in compiled programs (DWARF, PDB, etc.) A-MIR Area: Mid-level IR (MIR) - https://blog.rust-lang.org/2016/04/19/MIR.html C-bug Category: This is a bug. E-needs-test Call for participation: An issue has been fixed and does not reproduce, but no test has been added. F-generic_associated_types `#![feature(generic_associated_types)]` a.k.a. GATs glacier ICE tracked in rust-lang/glacier. I-ICE Issue: The compiler panicked, giving an Internal Compilation Error (ICE) ❄️ regression-from-stable-to-stable Performance or correctness regression from one stable version to another. requires-nightly This issue requires a nightly compiler in some way. T-compiler Relevant to the compiler team, which will review and decide on the PR/issue.
Milestone

Comments

@lily-commure
Copy link
Contributor

The following code produces four separate ICEs, including the known #68648. The behavior is different between release and debug mode.

Code

Playground link

#![feature(generic_associated_types)]

trait Provider {
    type A<'a>;
}

impl Provider for () {
    type A<'a> = ();
}

struct Holder<B> {
  inner: Box<dyn Provider<A = B>>,
}

fn main() {
    Holder {
        inner: Box::new(()),
    };
}

Meta

(Environment is the Rust Playground)

rustc 1.44.0-nightly (edc02580e 2020-04-14) running on x86_64-unknown-linux-gnu

Error output

Release mode error output

   Compiling playground v0.0.1 (/playground)
warning: the feature `generic_associated_types` is incomplete and may cause the compiler to crash
 --> src/main.rs:1:12
  |
1 | #![feature(generic_associated_types)]
  |            ^^^^^^^^^^^^^^^^^^^^^^^^
  |
  = note: `#[warn(incomplete_features)]` on by default

warning: field is never read: `inner`
  --> src/main.rs:12:3
   |
12 |   inner: Box<dyn Provider<A = B>>,
   |   ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
   |
   = note: `#[warn(dead_code)]` on by default

warning: 2 warnings emitted

error: internal compiler error: impl item and trait item have different parameter counts

error: internal compiler error: cat_expr Errd
  --> src/main.rs:16:5
   |
16 | /     Holder {
17 | |         inner: Box::new(()),
18 | |     };
   | |_____^

error: internal compiler error: broken MIR in DefId(0:12 ~ playground[bef7]::main[0]) (LocalDecl { mutability: Not, local_info: Other, internal: false, is_block_tail: None, ty: Holder<[type error]>, user_ty: UserTypeProjections { contents: [] }, source_info: SourceInfo { span: src/main.rs:16:5: 18:6, scope: scope[0] } }): bad type Holder<[type error]>
  --> src/main.rs:15:1
   |
15 | / fn main() {
16 | |     Holder {
17 | |         inner: Box::new(()),
18 | |     };
19 | | }
   | |_^

error: internal compiler error: broken MIR in DefId(0:12 ~ playground[bef7]::main[0]) (LocalDecl { mutability: Mut, local_info: Other, internal: false, is_block_tail: None, ty: std::boxed::Box<dyn Provider<A = [type error]>>, user_ty: UserTypeProjections { contents: [] }, source_info: SourceInfo { span: src/main.rs:17:16: 17:28, scope: scope[0] } }): bad type std::boxed::Box<dyn Provider<A = [type error]>>
  --> src/main.rs:15:1
   |
15 | / fn main() {
16 | |     Holder {
17 | |         inner: Box::new(()),
18 | |     };
19 | | }
   | |_^

thread 'rustc' panicked at 'no errors encountered even though `delay_span_bug` issued', src/librustc_errors/lib.rs:366:17
stack backtrace:
   0: backtrace::backtrace::libunwind::trace
             at /cargo/registry/src/github.com-1ecc6299db9ec823/backtrace-0.3.46/src/backtrace/libunwind.rs:86
   1: backtrace::backtrace::trace_unsynchronized
             at /cargo/registry/src/github.com-1ecc6299db9ec823/backtrace-0.3.46/src/backtrace/mod.rs:66
   2: std::sys_common::backtrace::_print_fmt
             at src/libstd/sys_common/backtrace.rs:78
   3: <std::sys_common::backtrace::_print::DisplayBacktrace as core::fmt::Display>::fmt
             at src/libstd/sys_common/backtrace.rs:59
   4: core::fmt::write
             at src/libcore/fmt/mod.rs:1069
   5: std::io::Write::write_fmt
             at src/libstd/io/mod.rs:1504
   6: std::sys_common::backtrace::_print
             at src/libstd/sys_common/backtrace.rs:62
   7: std::sys_common::backtrace::print
             at src/libstd/sys_common/backtrace.rs:49
   8: std::panicking::default_hook::{{closure}}
             at src/libstd/panicking.rs:198
   9: std::panicking::default_hook
             at src/libstd/panicking.rs:218
  10: rustc_driver::report_ice
  11: std::panicking::rust_panic_with_hook
             at src/libstd/panicking.rs:515
  12: std::panicking::begin_panic
  13: <rustc_errors::HandlerInner as core::ops::drop::Drop>::drop
  14: core::ptr::drop_in_place
  15: <alloc::rc::Rc<T> as core::ops::drop::Drop>::drop
  16: core::ptr::drop_in_place
  17: rustc_interface::interface::run_compiler_in_existing_thread_pool
  18: scoped_tls::ScopedKey<T>::set
  19: rustc_ast::attr::with_globals
note: Some details are omitted, run with `RUST_BACKTRACE=full` for a verbose backtrace.

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: rustc 1.44.0-nightly (edc02580e 2020-04-14) running on x86_64-unknown-linux-gnu

note: compiler flags: -C opt-level=3 -C codegen-units=1 --crate-type bin

note: some of the compiler flags provided by cargo are hidden

query stack during panic:
end of query stack
error: could not compile `playground`.

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

Debug mode error output

   Compiling playground v0.0.1 (/playground)
warning: the feature `generic_associated_types` is incomplete and may cause the compiler to crash
 --> src/main.rs:1:12
  |
1 | #![feature(generic_associated_types)]
  |            ^^^^^^^^^^^^^^^^^^^^^^^^
  |
  = note: `#[warn(incomplete_features)]` on by default

warning: field is never read: `inner`
  --> src/main.rs:12:3
   |
12 |   inner: Box<dyn Provider<A = B>>,
   |   ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
   |
   = note: `#[warn(dead_code)]` on by default

error: internal compiler error: src/librustc_codegen_ssa/debuginfo/type_names.rs:207: debuginfo: Trying to create type name for unexpected type: [type error]

thread 'rustc' panicked at 'Box<Any>', src/librustc_errors/lib.rs:904:9
stack backtrace:
   0: backtrace::backtrace::libunwind::trace
             at /cargo/registry/src/github.com-1ecc6299db9ec823/backtrace-0.3.46/src/backtrace/libunwind.rs:86
   1: backtrace::backtrace::trace_unsynchronized
             at /cargo/registry/src/github.com-1ecc6299db9ec823/backtrace-0.3.46/src/backtrace/mod.rs:66
   2: std::sys_common::backtrace::_print_fmt
             at src/libstd/sys_common/backtrace.rs:78
   3: <std::sys_common::backtrace::_print::DisplayBacktrace as core::fmt::Display>::fmt
             at src/libstd/sys_common/backtrace.rs:59
   4: core::fmt::write
             at src/libcore/fmt/mod.rs:1069
   5: std::io::Write::write_fmt
             at src/libstd/io/mod.rs:1504
   6: std::sys_common::backtrace::_print
             at src/libstd/sys_common/backtrace.rs:62
   7: std::sys_common::backtrace::print
             at src/libstd/sys_common/backtrace.rs:49
   8: std::panicking::default_hook::{{closure}}
             at src/libstd/panicking.rs:198
   9: std::panicking::default_hook
             at src/libstd/panicking.rs:218
  10: rustc_driver::report_ice
  11: std::panicking::rust_panic_with_hook
             at src/libstd/panicking.rs:515
  12: std::panicking::begin_panic
  13: rustc_errors::HandlerInner::bug
  14: rustc_errors::Handler::bug
  15: rustc_middle::util::bug::opt_span_bug_fmt::{{closure}}
  16: rustc_middle::ty::context::tls::with_opt::{{closure}}
  17: rustc_middle::ty::context::tls::with_opt
  18: rustc_middle::util::bug::opt_span_bug_fmt
  19: rustc_middle::util::bug::bug_fmt
  20: rustc_codegen_ssa::debuginfo::type_names::push_debuginfo_type_name
  21: rustc_codegen_ssa::debuginfo::type_names::push_debuginfo_type_name::push_type_params
  22: rustc_codegen_ssa::debuginfo::type_names::compute_debuginfo_type_name
  23: rustc_codegen_llvm::debuginfo::metadata::type_metadata
  24: rustc_codegen_llvm::debuginfo::metadata::type_metadata::{{closure}}
  25: rustc_codegen_llvm::debuginfo::metadata::type_metadata
  26: rustc_codegen_llvm::debuginfo::<impl rustc_codegen_ssa::traits::debuginfo::DebugInfoMethods for rustc_codegen_llvm::context::CodegenCx>::create_function_debug_context::get_function_signature
  27: rustc_codegen_llvm::debuginfo::<impl rustc_codegen_ssa::traits::debuginfo::DebugInfoMethods for rustc_codegen_llvm::context::CodegenCx>::create_function_debug_context
  28: rustc_codegen_ssa::mir::codegen_mir
  29: <rustc_middle::mir::mono::MonoItem as rustc_codegen_ssa::mono_item::MonoItemExt>::define
  30: rustc_codegen_llvm::base::compile_codegen_unit::module_codegen
  31: rustc_query_system::dep_graph::graph::DepGraph<K>::with_task
  32: rustc_codegen_llvm::base::compile_codegen_unit
  33: rustc_codegen_ssa::base::codegen_crate
  34: <rustc_codegen_llvm::LlvmCodegenBackend as rustc_codegen_ssa::traits::backend::CodegenBackend>::codegen_crate
  35: rustc_interface::passes::start_codegen
  36: rustc_middle::ty::context::tls::enter_global
  37: rustc_interface::queries::Queries::ongoing_codegen
  38: rustc_interface::interface::run_compiler_in_existing_thread_pool
  39: scoped_tls::ScopedKey<T>::set
  40: rustc_ast::attr::with_globals
note: Some details are omitted, run with `RUST_BACKTRACE=full` for a verbose backtrace.

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: rustc 1.44.0-nightly (edc02580e 2020-04-14) running on x86_64-unknown-linux-gnu

note: compiler flags: -C codegen-units=1 -C debuginfo=2 --crate-type bin

note: some of the compiler flags provided by cargo are hidden

query stack during panic:
end of query stack
error: aborting due to previous error; 2 warnings emitted

error: could not compile `playground`.

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

@lily-commure lily-commure 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 Apr 15, 2020
@jonas-schievink jonas-schievink added A-debuginfo Area: Debugging information in compiled programs (DWARF, PDB, etc.) A-MIR Area: Mid-level IR (MIR) - https://blog.rust-lang.org/2016/04/19/MIR.html requires-nightly This issue requires a nightly compiler in some way. F-generic_associated_types `#![feature(generic_associated_types)]` a.k.a. GATs labels Apr 15, 2020
@rust-lang-glacier-bot rust-lang-glacier-bot added the glacier ICE tracked in rust-lang/glacier. label Apr 16, 2020
@casey
Copy link
Contributor

casey commented Oct 24, 2020

This now only produces the parameter count ICE.

I tried to cut it down a little bit, and the following is as minimal as I could get it:

trait A {
    type B<'a>;
}

struct C(&'static dyn A<B = ()>);

fn main() {}

The message is now error: internal compiler error: compiler/rustc_middle/src/ty/subst.rs:475:25: Region parameter out of range when substituting in region 'a (index=1).

Additionally, there is a related ICE which produces a slightly different error message:

trait A {
    type B<T>;
}

trait C {
    type D: A<B = ()>;
}

fn main() {}

Which produces the message error: internal compiler error: compiler/rustc_middle/src/ty/subst.rs:528:17: type parameter `T/#1` (T/1) out of range when substituting, substs=[<Self as C>::D].

@matthiaskrgr
Copy link
Member

matthiaskrgr commented Dec 20, 2020

The last example that @casey posted which does not use a feature gate crashes nightly 1.50.0 and beta 1.49.0-beta.4 but not stable 1.48.0.

@rustbot modify labels: +regression-from-stable-to-beta

@rustbot rustbot added the regression-from-stable-to-beta Performance or correctness regression from stable to beta. label Dec 20, 2020
@matthiaskrgr
Copy link
Member

ICE in

trait A {
    type B<T>;
}

trait C {
    type D: A<B = ()>;
}

fn main() {}

bisected to 08e2d46 cc @matthewjasper

@matthewjasper
Copy link
Contributor

#79554 is the proper fix for this. I guess I could put in a temporary fatal error when specifying a GAT in a trait path for now if people think that it is worth it.

@Mark-Simulacrum Mark-Simulacrum added this to the 1.49.0 milestone Jan 21, 2021
@Mark-Simulacrum Mark-Simulacrum added regression-from-stable-to-stable Performance or correctness regression from one stable version to another. and removed regression-from-stable-to-beta Performance or correctness regression from stable to beta. labels Jan 21, 2021
@jackh726
Copy link
Member

jackh726 commented Feb 5, 2021

Should work after #79554

@jackh726 jackh726 added the E-needs-test Call for participation: An issue has been fixed and does not reproduce, but no test has been added. label Feb 5, 2021
marmeladema added a commit to marmeladema/rust that referenced this issue Apr 20, 2021
Dylan-DPC-zz pushed a commit to Dylan-DPC-zz/rust that referenced this issue Apr 21, 2021
m-ou-se added a commit to m-ou-se/rust that referenced this issue Apr 21, 2021
@bors bors closed this as completed in e7f2033 Apr 22, 2021
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
A-debuginfo Area: Debugging information in compiled programs (DWARF, PDB, etc.) A-MIR Area: Mid-level IR (MIR) - https://blog.rust-lang.org/2016/04/19/MIR.html C-bug Category: This is a bug. E-needs-test Call for participation: An issue has been fixed and does not reproduce, but no test has been added. F-generic_associated_types `#![feature(generic_associated_types)]` a.k.a. GATs glacier ICE tracked in rust-lang/glacier. I-ICE Issue: The compiler panicked, giving an Internal Compilation Error (ICE) ❄️ regression-from-stable-to-stable Performance or correctness regression from one stable version to another. requires-nightly This issue requires a nightly compiler in some way. 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.

9 participants