Skip to content

ICE on associated type violating its bounds in a blanket impl #54108

Closed
@askeksa

Description

@askeksa

When I give this code to rustc:

use std::ops::Add;

pub trait Encoder {
	type Size: Add<Output = Self::Size>;

	fn foo(&self) -> Self::Size;
}

pub trait SubEncoder : Encoder {
	type ActualSize;

	fn bar(&self) -> Self::Size;
}

impl<T> Encoder for T where T: SubEncoder {
	type Size = <Self as SubEncoder>::ActualSize;

	fn foo(&self) -> Self::Size {
		self.bar() + self.bar()
	}
}

pub struct UnitEncoder;

impl SubEncoder for UnitEncoder {
	type ActualSize = ();

	fn bar(&self) {}
}


fn main() {
	fun(&UnitEncoder {});
}

pub fn fun<R: Encoder>(encoder: &R) {
	encoder.foo();
}

I get this output:

error: internal compiler error: librustc\traits\codegen\mod.rs:68: Encountered error `Unimplemented` selecting `Binder(<() as std::ops::Add>)` during codegen

thread 'main' panicked at 'Box<Any>', librustc_errors\lib.rs:554:9
stack backtrace:
   0: <std::sync::mpsc::select::Select as core::fmt::Debug>::fmt
   1: std::stdsimd::arch::detect::os::check_for
   2: std::panicking::take_hook
   3: std::panicking::take_hook
   4: <rustc::ty::query::on_disk_cache::CacheEncoder<'enc, 'a, 'tcx, serialize::opaque::Encoder<'enc>> as serialize::serialize::SpecializedEncoder<rustc::ich::fingerprint::Fingerprint>>::specialized_encode
   5: std::panicking::rust_panic_with_hook
   6: <rustc_errors::emitter::ColorConfig as core::fmt::Debug>::fmt
   7: rustc_errors::Handler::bug
   8: <rustc::hir::map::MapEntry<'hir> as core::clone::Clone>::clone
   9: rustc::ty::context::tls::track_diagnostic
  10: rustc::ty::context::tls::track_diagnostic
  11: rustc::ty::context::tls::track_diagnostic
  12: rustc::session::bug_fmt
  13: rustc::session::bug_fmt
  14: rustc::ty::context::tls::track_diagnostic
  15: rustc::traits::codegen::codegen_fulfill_obligation
  16: rustc::ty::query::on_disk_cache::__ty_decoder_impl::<impl serialize::serialize::Decoder for rustc::ty::query::on_disk_cache::CacheDecoder<'a, 'tcx, 'x>>::read_str
  17: rustc::ty::context::tls::track_diagnostic
  18: rustc::dep_graph::graph::DepGraph::assert_ignored
  19: rustc::ty::context::tls::track_diagnostic
  20: rustc::ty::query::plumbing::<impl rustc::ty::context::TyCtxt<'a, 'gcx, 'tcx>>::try_print_query_stack
  21: rustc::ty::query::plumbing::<impl rustc::ty::context::TyCtxt<'a, 'gcx, 'tcx>>::try_print_query_stack
  22: rustc::ty::instance::Instance::resolve
  23: <rustc_mir::monomorphize::collector::MirNeighborCollector<'a, 'tcx> as rustc::mir::visit::Visitor<'tcx>>::visit_terminator_kind
  24: rustc_mir::monomorphize::collector::collect_crate_mono_items
  25: rustc_mir::monomorphize::collector::collect_crate_mono_items
  26: rustc_mir::monomorphize::collector::collect_crate_mono_items
  27: rustc_mir::monomorphize::collector::collect_crate_mono_items
  28: rustc_mir::monomorphize::collector::collect_crate_mono_items
  29: <rustc_codegen_llvm::time_graph::TimelineId as core::fmt::Debug>::fmt
  30: <rustc_codegen_llvm::base::ValueIter as core::iter::iterator::Iterator>::next
  31: rustc::ty::context::tls::track_diagnostic
  32: rustc::dep_graph::graph::DepGraph::assert_ignored
  33: rustc::ty::context::tls::track_diagnostic
  34: rustc::ty::query::plumbing::<impl rustc::ty::context::TyCtxt<'a, 'gcx, 'tcx>>::try_print_query_stack
  35: rustc::ty::query::plumbing::<impl rustc::ty::context::TyCtxt<'a, 'gcx, 'tcx>>::try_print_query_stack
  36: <rustc_codegen_llvm::base::ValueIter as core::iter::iterator::Iterator>::next
  37: <rustc_codegen_llvm::LlvmCodegenBackend as rustc_codegen_utils::codegen_backend::CodegenBackend>::codegen_crate
  38: rustc_driver::driver::build_output_filenames
  39: rustc_driver::driver::phase_4_codegen
  40: rustc_driver::profile::dump
  41: <rustc_driver::derive_registrar::Finder as rustc::hir::itemlikevisit::ItemLikeVisitor<'v>>::visit_impl_item
  42: <rustc_driver::pretty::IdentifiedAnnotation<'hir> as rustc_driver::pretty::PrinterSupport>::sess
  43: <unknown>
  44: rustc_driver::driver::compile_input
  45: rustc_driver::run_compiler
  46: rustc_driver::target_features::add_configuration
  47: <rustc_driver::pretty::IdentifiedAnnotation<'hir> as rustc_driver::pretty::PrinterSupport>::sess
  48: _rust_maybe_catch_panic
  49: <rustc_driver::derive_registrar::Finder as rustc::hir::itemlikevisit::ItemLikeVisitor<'v>>::visit_item
  50: rustc_driver::main
  51: <unknown>
  52: std::panicking::update_panic_count
  53: _rust_maybe_catch_panic
  54: std::rt::lang_start_internal
  55: <unknown>
  56: <unknown>
  57: BaseThreadInitThunk
  58: RtlUserThreadStart
query stack during panic:
#0 [codegen_fulfill_obligation] checking if `std::ops::Add` fulfills its obligations
#1 [collect_and_partition_mono_items] collect_and_partition_mono_items
end of query stack
error: aborting due to previous error


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.28.0 (9634041f0 2018-07-30) running on x86_64-pc-windows-msvc

(The same crash occurs with rustc 1.30.0-nightly (2d4e34ca8 2018-09-09).)

It seems the line

	type Size = <Self as SubEncoder>::ActualSize;

should have resulted in an error stating that the trait bounds for Size are not fulfilled, but no such error was generated, and the subsequent use of + on an expression of type Size with Size as a type not implementing Add caused the compiler to panic.

Metadata

Metadata

Assignees

No one assigned

    Labels

    A-associated-itemsArea: Associated items (types, constants & functions)C-bugCategory: This is a bug.E-needs-testCall for participation: An issue has been fixed and does not reproduce, but no test has been added.I-ICEIssue: The compiler panicked, giving an Internal Compilation Error (ICE) ❄️P-mediumMedium priorityT-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