Change:
Discovered this ICE in the rollup that I'm preparing:
In Grust, I tried to change to: The crate compiles without an issue, but compiling another crate where this is used results in an ICE that looks to be this one.
Looks like I missed a case in
Nominating for 1.0 beta.
Are there any known workarounds for this problem? I ran into this in a hard way trying to update to the newest nightlies.
not sure, I'll try to get a PR up today
a new type wrapper around the object would probably work, ping me on irc () for more details
I just wanna run iron example on MAC 10.10 with rust-nightly, the same error occurs, I don't know if it's of the same case: error: internal compiler error: static call to invalid vtable: VtableObject(VtableObject(object_ty=error::Error + 'static))
This is also blocking Iron, which itself compiles well, but using the crate fails:
Fix in , sorry for the delay.
thanks for the work! I pulled your PR and built with it, and my code compiles again. Hooray!

Discussion:
param_substs, callee_substs) } <ins> traits::VtableObject(ref data) => { let trait_item_def_ids = ty::trait_item_def_ids(ccx.tcx(), trait_id); let method_offset_in_trait = trait_item_def_ids.iter() .position(|item| item.def_id() == method_id) .unwrap(); let (llfn, ty) = trans_object_shim(ccx, data.object_ty, trait_id, method_offset_in_trait); immediate_rvalue(llfn, ty) } </ins> _ => { tcx.sess.bug(&format!("static call to invalid vtable: {}", vtbl.repr(tcx))[]);

Callee { bcx: bcx, data: Fn(llfn) } } traits::VtableObject(ref data) => { <del> let llfn = trans_object_shim(bcx.ccx(), data.object_ty, trait_id, n_method); </del> <ins> let (llfn, _) = trans_object_shim(bcx.ccx(), data.object_ty, trait_id, n_method); </ins> Callee { bcx: bcx, data: Fn(llfn) } } traits::VtableBuiltin(..) |

object_ty: Ty<'tcx>, trait_id: ast::DefId, method_offset_in_trait: uint) <del> -> ValueRef </del> <ins> -> (ValueRef, Ty<'tcx>) </ins> { let _icx = push_ctxt("trans_object_shim"); let tcx = ccx.tcx();

finish_fn(&fcx, bcx, sig.output); <del> llfn </del> <ins> (llfn, method_bare_fn_ty) </ins> } /// Creates a returns a dynamic vtable for the given type and vtable origin.

<ins> // Copyright 2015 The Rust Project Developers. See the COPYRIGHT // file at the top-level directory of this distribution and at // http://rust-lang.org/COPYRIGHT. // // Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or // http://www.apache.org/licenses/LICENSE-2.0> or the MIT license // <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your // option. This file may not be copied, modified, or distributed // except according to those terms. // Regression test for #20676. Error was that we didn't support // UFCS-style calls to a method in `Trait` where `Self` was bound to a // trait object of type `Trait`. See also `ufcs-trait-object.rs`. use std::fmt; fn main() { let a: &fmt::Show = &1_i32; format!("{:?}", a); } </ins>

<ins> // Copyright 2015 The Rust Project Developers. See the COPYRIGHT // file at the top-level directory of this distribution and at // http://rust-lang.org/COPYRIGHT. // // Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or // http://www.apache.org/licenses/LICENSE-2.0> or the MIT license // <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your // option. This file may not be copied, modified, or distributed // except according to those terms. // Test that when you use ufcs form to invoke a trait method (on a // trait object) everything works fine. trait Foo { fn test(&self) -> i32; } impl Foo for i32 { fn test(&self) -> i32 { *self } } fn main() { let a: &Foo = &22_i32; assert_eq!(Foo::test(a), 22); } </ins>