Skip to content

ICE in rematch_impl during attempt at double dispatch #19976

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

Closed
stuglaser opened this issue Dec 18, 2014 · 2 comments · Fixed by #25344
Closed

ICE in rematch_impl during attempt at double dispatch #19976

stuglaser opened this issue Dec 18, 2014 · 2 comments · Fixed by #25344
Labels
I-ICE Issue: The compiler panicked, giving an Internal Compilation Error (ICE) ❄️

Comments

@stuglaser
Copy link

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.

@kmcallister kmcallister added the I-ICE Issue: The compiler panicked, giving an Internal Compilation Error (ICE) ❄️ label Jan 9, 2015
@tamird
Copy link
Contributor

tamird commented Apr 21, 2015

Still reproducible, though the code in this issue no longer compiles. I'd close this as there's a repro case in #22645. @steveklabnik?

@arielb1
Copy link
Contributor

arielb1 commented May 12, 2015

Should be a duplicate of #24352.

arielb1 pushed a commit to arielb1/rust that referenced this issue May 12, 2015
There is no subtyping relationship between the types (or their non-freshened
variants), so they can not be merged.

Fixes rust-lang#22645
Fixes rust-lang#24352
Fixes rust-lang#23825

Should fix rust-lang#25235 (no test in issue).
Should fix rust-lang#19976 (test is outdated).
bors added a commit that referenced this issue May 13, 2015
There is no subtyping relationship between the types (or their non-freshened
variants), so they can not be merged.

Fixes #22645
Fixes #24352
Fixes #23825

Should fix #25235 (no test in issue).
Should fix #19976 (test is outdated).
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
I-ICE Issue: The compiler panicked, giving an Internal Compilation Error (ICE) ❄️
Projects
None yet
Development

Successfully merging a pull request may close this issue.

5 participants