Closed
Description
After #20307 was merged, I tried using associated types again to improve an API, but ran into an ICE demonstrated by the following example.
#![feature(associated_types)]
trait Foo {
fn foo(&self) -> ();
}
trait Bar {
type F: Foo;
}
struct Wat<B: Bar> {
fs: Vec<B::F>,
}
impl<B: Bar> Wat<B> {
fn new() -> Self {
Wat { fs: Vec::new() }
}
fn wat(&mut self) -> () {
Foo::foo(&self.fs.pop().unwrap());
}
}
struct FooImpl;
impl Foo for FooImpl {
fn foo(&self) -> () {}
}
struct BarImpl;
impl Bar for BarImpl {
type F = FooImpl;
}
fn main() {
// error is caused by this line.
let wat: Wat<BarImpl> = Wat::new();
}
Error:
error: internal compiler error: type_of with ty_projection
note: the compiler unexpectedly panicked. this is a bug.
note: we would appreciate a bug report: http://doc.rust-lang.org/complement-bugreport.html
note: run with `RUST_BACKTRACE=1` for a backtrace
thread 'rustc' panicked at 'Box<Any>', /Users/samuel/Documents/rust/src/libsyntax/diagnostic.rs:182
stack backtrace:
1: 0x10b98aa25 - sys::backtrace::write::h79fcf57f48f2accbUpt
2: 0x10b9af473 - failure::on_fail::he313666202ab06e0wwz
3: 0x10b9156aa - rt::unwind::begin_unwind_inner::h3818eca49d000e060dz
4: 0x10988fe47 - rt::unwind::begin_unwind::h2232683046508229913
5: 0x1098907b8 - diagnostic::Handler::bug::hd878cdd91e904135bVF
6: 0x108edc1e8 - session::Session::bug::he3e7f8e3682f0beezyp
7: 0x1084d0001 - trans::type_of::type_of::h9197635c60619429njp
8: 0x1084d020f - trans::type_of::type_of::h9197635c60619429njp
9: 0x1085f5c15 - vec::Vec<T>.FromIterator<T>::from_iter::h6585550067129994724
10: 0x1084d04c3 - trans::type_of::type_of::h9197635c60619429njp
11: 0x1084cf3ac - trans::type_of::type_of::h9197635c60619429njp
12: 0x1085f5c15 - vec::Vec<T>.FromIterator<T>::from_iter::h6585550067129994724
13: 0x1084d04c3 - trans::type_of::type_of::h9197635c60619429njp
14: 0x1084cf3ac - trans::type_of::type_of::h9197635c60619429njp
15: 0x1085f5c15 - vec::Vec<T>.FromIterator<T>::from_iter::h6585550067129994724
16: 0x1084d04c3 - trans::type_of::type_of::h9197635c60619429njp
17: 0x1084cf3ac - trans::type_of::type_of::h9197635c60619429njp
18: 0x1084d8eed - trans::base::alloc_ty::h0ff116b4545bfc9eFFt
19: 0x1085be404 - trans::_match::mk_binding_alloca::h1489438822966140848
20: 0x1084c99e3 - trans::base::init_local::h78d0086b1f8238539qt
21: 0x1084cae95 - trans::controlflow::trans_block::h2f26f7b25eb8f55a2ae
22: 0x1085883a4 - trans::base::trans_closure::hd27e32dcce03144cKju
23: 0x1084bac1b - trans::base::trans_fn::hb6a8bb6b558798cazuu
24: 0x1084b6276 - trans::base::trans_item::h823c6709f851fa543Ru
25: 0x10858f1f8 - trans::base::trans_crate::he3d01922f8b5bab14Ov
26: 0x1082ebd0e - driver::phase_4_translate_to_llvm::hc27e2b2792fb5383eFa
27: 0x1082ce0b1 - driver::compile_input::hf6a1e42e515c971bwba
28: 0x1083ff393 - thunk::F.Invoke<A, R>::invoke::h1106905942537841072
29: 0x1083fc4f0 - rt::unwind::try::try_fn::h16870325584336102008
30: 0x10ba19649 - rust_try_inner
31: 0x10ba19636 - rust_try
32: 0x1083fcc36 - thunk::F.Invoke<A, R>::invoke::h8218093585600920335
33: 0x10b99bd84 - sys::thread::thread_start::hccba841055eeb8d6Dfw
34: 0x7fff8d7932fc - _pthread_body
35: 0x7fff8d793279 - _pthread_body