Closed
Description
I came across this failure while trying to implement double dispatch. Here's the reduced code to reproduce it:
pub trait MatBase {
// Base method for double dispatch.
// Performs: MatBase * f32
fn mul_scalar(&self, scalar: &f32) -> Mat {
Mat::new()
}
// Base method for double dispatch.
// Performs: MatBase * MatBase
fn mul_mat<T:MatBase>(&self, rhs: &T) -> Mat {
Mat::new()
}
}
pub struct Mat {
pub r: uint,
}
impl Mat {
pub fn new() -> Mat {
Mat {r: 0}
}
}
impl MatBase for Mat {
}
impl<T:MatBase, U: LMulMatBase> Mul<U, Mat> for T {
fn mul(&self, rhs: &U) -> Mat {
rhs.lmul_matbase(self)
}
}
// Trait for double dispatch. Called for `MatBase * X`
trait LMulMatBase {
fn lmul_matbase<T:MatBase>(&self, &T) -> Mat;
}
impl LMulMatBase for f32 {
fn lmul_matbase<T:MatBase>(&self, rhs: &T) -> Mat {
rhs.mul_scalar(self)
}
}
impl<U:MatBase> LMulMatBase for U {
fn lmul_matbase<T:MatBase>(&self, rhs: &T) -> Mat {
rhs.mul_mat(self)
}
}
pub fn generate_ice() {
let v = Mat::new();
// ICE
let foo = v * 2.0;
let bar = v * 2;
}
fn main() {
}
Produces...
ice.rs:31:5: 33:6 error: method `mul` has an incompatible type for trait: expected type parameter, found &-ptr [E0053]
ice.rs:31 fn mul(&self, rhs: &U) -> Mat {
ice.rs:32 rhs.lmul_matbase(self)
ice.rs:33 }
error: internal compiler error: Impl DefId { krate: 0, node: 104 }:f32.LMulMatBase was matchable against Obligation(trait_ref=<_ : LMulMatBase>,depth=1) but now is not
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
task 'rustc' panicked at 'Box<Any>', /home/rustbuild/src/rust-buildbot/slave/nightly-linux/build/src/libsyntax/diagnostic.rs:188
stack backtrace:
1: 0x7f7baf436c60 - rt::backtrace::imp::write::hb0dcc4a5fc17fd0bFUx
2: 0x7f7baf43a030 - failure::on_fail::hcd3ce97bacbef1b03ly
3: 0x7f7baf07a790 - unwind::begin_unwind_inner::h670ccdf2c60477f7aNc
4: 0x7f7bac76e010 - unwind::begin_unwind::h18115787115103468845
5: 0x7f7bac76e8c0 - diagnostic::Handler::bug::h266854e4787d0d95KHF
6: 0x7f7bad6be650 - middle::traits::select::SelectionContext<'cx, 'tcx>::rematch_impl::h85fa8dd1c7168e08QsZ
7: 0x7f7bad6b22b0 - middle::traits::select::SelectionContext<'cx, 'tcx>::confirm_candidate::h73c92f23e4b19127mZY
8: 0x7f7bad6ac800 - middle::traits::select::SelectionContext<'cx, 'tcx>::select::h1f6b87c67ed6992dTyX
9: 0x7f7bad6a6360 - middle::traits::fulfill::FulfillmentContext<'tcx>::select::h1c32dca2315fb0adjYW
10: 0x7f7bad5261b0 - middle::traits::fulfill::FulfillmentContext<'tcx>::select_all_or_error::hfb69502c35931f954UW
11: 0x7f7bae5eec70 - check::vtable::select_all_fcx_obligations_or_error::ha9d04af899db1229Ceb
12: 0x7f7bae6c6430 - check::check_bare_fn::h3e6a0e77e248363agck
13: 0x7f7bae6bdfc0 - check::check_item::h2b10ccbb63916a23Gvk
14: 0x7f7bae915d50 - check_crate::unboxed_closure.42746
15: 0x7f7bae910a60 - check_crate::h0d4db076e0bb3313fZy
16: 0x7f7baf88a8b0 - driver::phase_3_run_analysis_passes::h86f5117df0f02e2eEta
17: 0x7f7baf86dc50 - driver::compile_input::h024b52963d907b7crba
18: 0x7f7bafa21c90 - run_compiler::h028a909c6b8b5e8fAYb
19: 0x7f7bafa188d0 - thunk::F.Invoke<A, R>::invoke::h18183104788496625744
20: 0x7f7baf40f010 - thunk::F.Invoke<A, R>::invoke::h2541757334713289964
21: 0x7f7baf078f00 - task::Task::spawn_thunk::closure.5783
22: 0x7f7baf0d7a70 - rust_try_inner
23: 0x7f7baf0d7a60 - rust_try
24: 0x7f7baf079010 - unwind::try::h558067038ea79d14rCc
25: 0x7f7baf078da0 - task::Task::run::h0a756e41b4d98f97sNb
26: 0x7f7baf078510 - thunk::F.Invoke<A, R>::invoke::h14009063998732615525
27: 0x7f7baf079e60 - thread::thread_start::h3654652a3d324e1eM4b
28: 0x7f7ba9bd30c0 - start_thread
29: 0x7f7baed3dec9 - __clone
30: 0x0 - <unknown>
With rust version:
rustc 0.13.0-nightly (42deaa5e4 2014-12-16 17:51:23 +0000)
binary: rustc
commit-hash: 42deaa5e42c0b8a9e305aa5de5d6953b24b77aca
commit-date: 2014-12-16 17:51:23 +0000
host: x86_64-unknown-linux-gnu
release: 0.13.0-nightly
This might be a duplicate of #18623 , but I'm not positive.