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 computing the size of a specialized associated trait type #51892

Closed
mjbshaw opened this issue Jun 29, 2018 · 2 comments · Fixed by #84496
Closed

ICE when computing the size of a specialized associated trait type #51892

mjbshaw opened this issue Jun 29, 2018 · 2 comments · Fixed by #84496
Labels
A-associated-items Area: Associated items such as associated types and consts. A-specialization Area: Trait impl specialization 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-specialization `#![feature(specialization)]` glacier ICE tracked in rust-lang/glacier. I-ICE Issue: The compiler panicked, giving an Internal Compilation Error (ICE) ❄️ 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.

Comments

@mjbshaw
Copy link
Contributor

mjbshaw commented Jun 29, 2018

The following code creates a trait (creatively named Trait) that has an associated type (creatively named Type). An default implementation of this trait is given for all types, with Type = [u8; 1]. Specializing the trait (for *const T, for example) works, except that doing size_of::<<T as Trait>::Type>() causes an ICE.

(Playground link)

#![feature(specialization)]

pub trait Trait {
  type Type;
}

impl<T: ?Sized> Trait for T {
  default type Type = [u8; 1];
}

impl<T: Trait> Trait for *const T {
  type Type = [u8; std::mem::size_of::<<T as Trait>::Type>()];
}

Expected behavior: I believe this code should compile just fine, with *const T's Trait::Type being equivalent to to T's Trait::Type.

Actual behavior: ICE: error: internal compiler error: librustc/ty/subst.rs:479: Type parameter T/#0 (T/0) out of range when substituting (root type=Some(fn() -> usize {std::mem::size_of::<<T as Trait>::Type>})) substs=[]

Rust version: rustc --version --verbose:

rustc 1.28.0-nightly (cd494c1f0 2018-06-27)
binary: rustc
commit-hash: cd494c1f0915da00a63c03454a96d504afe764ff
commit-date: 2018-06-27
host: x86_64-apple-darwin
release: 1.28.0-nightly
LLVM version: 6.0

Backtrace:

thread 'main' panicked at 'Box<Any>', librustc_errors/lib.rs:499:9
stack backtrace:
   0: std::sys::unix::backtrace::tracing::imp::unwind_backtrace
   1: std::sys_common::backtrace::print
   2: std::panicking::default_hook::{{closure}}
   3: std::panicking::default_hook
   4: rustc::util::common::panic_hook
   5: std::panicking::rust_panic_with_hook
   6: std::panicking::begin_panic
   7: rustc_errors::Handler::span_bug
   8: rustc::session::opt_span_bug_fmt::{{closure}}
   9: rustc::ty::context::tls::with_opt::{{closure}}
  10: rustc::ty::context::tls::with_context_opt
  11: rustc::ty::context::tls::with_opt
  12: rustc::session::opt_span_bug_fmt
  13: rustc::session::span_bug_fmt
  14: <rustc::ty::subst::SubstFolder<'a, 'gcx, 'tcx> as rustc::ty::fold::TypeFolder<'gcx, 'tcx>>::fold_ty
  15: <rustc_data_structures::accumulate_vec::AccumulateVec<A> as core::iter::traits::FromIterator<<A as rustc_data_structures::array_vec::Array>::Element>>::from_iter
  16: rustc::ty::fold::TypeFoldable::fold_with
  17: rustc::ty::structural_impls::<impl rustc::ty::fold::TypeFoldable<'tcx> for &'tcx rustc::ty::TyS<'tcx>>::super_fold_with
  18: <rustc::ty::subst::SubstFolder<'a, 'gcx, 'tcx> as rustc::ty::fold::TypeFolder<'gcx, 'tcx>>::fold_ty
  19: <rustc_data_structures::accumulate_vec::AccumulateVec<A> as core::iter::traits::FromIterator<<A as rustc_data_structures::array_vec::Array>::Element>>::from_iter
  20: rustc::ty::fold::TypeFoldable::fold_with
  21: rustc::ty::structural_impls::<impl rustc::ty::fold::TypeFoldable<'tcx> for &'tcx rustc::ty::TyS<'tcx>>::super_fold_with
  22: <rustc::ty::subst::SubstFolder<'a, 'gcx, 'tcx> as rustc::ty::fold::TypeFolder<'gcx, 'tcx>>::fold_ty
  23: <rustc_mir::interpret::eval_context::EvalContext<'a, 'mir, 'tcx, M>>::eval_operand
  24: rustc_mir::interpret::terminator::<impl rustc_mir::interpret::eval_context::EvalContext<'a, 'mir, 'tcx, M>>::eval_terminator
  25: rustc_mir::interpret::step::<impl rustc_mir::interpret::eval_context::EvalContext<'a, 'mir, 'tcx, M>>::step
  26: rustc_mir::interpret::const_eval::eval_body_using_ecx
  27: rustc_mir::interpret::const_eval::const_eval_provider
  28: rustc::ty::query::__query_compute::const_eval
  29: rustc::ty::query::<impl rustc::ty::query::config::QueryAccessors<'tcx> for rustc::ty::query::queries::const_eval<'tcx>>::compute
  30: rustc::ty::context::tls::with_context
  31: rustc::dep_graph::graph::DepGraph::with_task_impl
  32: rustc::ty::context::tls::with_related_context
  33: rustc::ty::query::plumbing::<impl rustc::ty::context::TyCtxt<'a, 'gcx, 'tcx>>::force_query_with_job
  34: rustc::ty::query::plumbing::<impl rustc::ty::context::TyCtxt<'a, 'gcx, 'tcx>>::get_query
  35: <rustc::traits::project::AssociatedTypeNormalizer<'a, 'b, 'gcx, 'tcx> as rustc::ty::fold::TypeFolder<'gcx, 'tcx>>::fold_const
  36: rustc::ty::structural_impls::<impl rustc::ty::fold::TypeFoldable<'tcx> for &'tcx rustc::ty::TyS<'tcx>>::super_fold_with
  37: <rustc::traits::project::AssociatedTypeNormalizer<'a, 'b, 'gcx, 'tcx> as rustc::ty::fold::TypeFolder<'gcx, 'tcx>>::fold_ty
  38: rustc::traits::project::opt_normalize_projection_type
  39: rustc::traits::project::normalize_projection_type
  40: <rustc::traits::project::AssociatedTypeNormalizer<'a, 'b, 'gcx, 'tcx> as rustc::ty::fold::TypeFolder<'gcx, 'tcx>>::fold_ty
  41: <rustc_data_structures::accumulate_vec::AccumulateVec<A> as core::iter::traits::FromIterator<<A as rustc_data_structures::array_vec::Array>::Element>>::from_iter
  42: rustc::ty::fold::TypeFoldable::fold_with
  43: rustc::ty::fold::TypeFoldable::fold_with
  44: rustc::ty::fold::TypeFoldable::fold_with
  45: rustc::traits::project::normalize
  46: core::ops::function::impls::<impl core::ops::function::FnOnce<A> for &'a mut F>::call_once
  47: <core::iter::FlatMap<I, U, F> as core::iter::iterator::Iterator>::next
  48: <alloc::vec::Vec<T> as alloc::vec::SpecExtend<T, I>>::from_iter
  49: rustc::ty::wf::WfPredicates::normalize
  50: rustc::ty::wf::trait_obligations
  51: rustc::ty::context::tls::with_related_context
  52: rustc::infer::InferCtxtBuilder::enter
  53: rustc_typeck::check::wfcheck::check_item_well_formed
  54: rustc::ty::query::<impl rustc::ty::query::config::QueryAccessors<'tcx> for rustc::ty::query::queries::check_item_well_formed<'tcx>>::compute
  55: rustc::ty::context::tls::with_context
  56: rustc::dep_graph::graph::DepGraph::with_task_impl
  57: rustc::ty::context::tls::with_related_context
  58: rustc::ty::query::plumbing::<impl rustc::ty::context::TyCtxt<'a, 'gcx, 'tcx>>::force_query_with_job
  59: rustc::ty::query::plumbing::<impl rustc::ty::context::TyCtxt<'a, 'gcx, 'tcx>>::get_query
  60: rustc::ty::query::plumbing::<impl rustc::ty::context::TyCtxt<'a, 'gcx, 'tcx>>::ensure_query
  61: rustc::hir::Crate::visit_all_item_likes
  62: rustc::session::Session::track_errors
  63: rustc::util::common::time
  64: rustc_typeck::check_crate
  65: rustc::ty::context::tls::enter_context
  66: <std::thread::local::LocalKey<T>>::with
  67: rustc::ty::context::TyCtxt::create_and_enter
  68: rustc_driver::driver::compile_input
  69: rustc_driver::run_compiler_with_pool
  70: <scoped_tls::ScopedKey<T>>::set
  71: syntax::with_globals
  72: <std::panic::AssertUnwindSafe<F> as core::ops::function::FnOnce<()>>::call_once
  73: __rust_maybe_catch_panic
  74: rustc_driver::run
  75: rustc_driver::main
  76: std::rt::lang_start::{{closure}}
  77: std::panicking::try::do_call
  78: __rust_maybe_catch_panic
  79: std::rt::lang_start_internal
  80: main
query stack during panic:
#0 [const_eval] const-evaluating `<*const T as TypeEncoding>::Type::{{constant}}`
#1 [check_item_well_formed] processing `<*const T as TypeEncoding>`
end of query stack
@mjbshaw
Copy link
Contributor Author

mjbshaw commented Jun 29, 2018

This looks related to #43408 (see in particular MageSlayer's comment).

@memoryruins memoryruins added the I-ICE Issue: The compiler panicked, giving an Internal Compilation Error (ICE) ❄️ label Sep 11, 2018
@jonas-schievink jonas-schievink added A-associated-items Area: Associated items such as associated types and consts. A-specialization Area: Trait impl specialization C-bug Category: This is a bug. F-specialization `#![feature(specialization)]` 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. labels Aug 6, 2019
@rust-lang-glacier-bot rust-lang-glacier-bot added the glacier ICE tracked in rust-lang/glacier. label Oct 15, 2019
@JohnTitor
Copy link
Member

Triage:
This is no longer ICE with the latest nightly: https://play.rust-lang.org/?version=nightly&mode=debug&edition=2018&gist=76f84478a83b3a63284a65e0b3580c35

@JohnTitor JohnTitor added the E-needs-test Call for participation: An issue has been fixed and does not reproduce, but no test has been added. label Dec 30, 2020
marmeladema added a commit to marmeladema/rust that referenced this issue Apr 23, 2021
@bors bors closed this as completed in ec61abf Apr 24, 2021
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
A-associated-items Area: Associated items such as associated types and consts. A-specialization Area: Trait impl specialization 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-specialization `#![feature(specialization)]` glacier ICE tracked in rust-lang/glacier. I-ICE Issue: The compiler panicked, giving an Internal Compilation Error (ICE) ❄️ 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.

5 participants