From 2e3f1096bbd1598465696f77f764cca448a72dce Mon Sep 17 00:00:00 2001 From: Marijn Haverbeke Date: Thu, 15 Mar 2012 15:07:25 +0100 Subject: [PATCH] Fix bug in vtable builder Closes #1947 , which I completely misdiagnosed. --- src/rustc/middle/trans/impl.rs | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/src/rustc/middle/trans/impl.rs b/src/rustc/middle/trans/impl.rs index a228e499b604..faa9066cf5c5 100644 --- a/src/rustc/middle/trans/impl.rs +++ b/src/rustc/middle/trans/impl.rs @@ -231,6 +231,7 @@ fn make_impl_vtable(ccx: @crate_ctxt, impl_id: ast::def_id, substs: [ty::t], vtables: typeck::vtable_res) -> ValueRef { let tcx = ccx.tcx; let ifce_id = ty::ty_to_def_id(option::get(ty::impl_iface(tcx, impl_id))); + let has_tps = (*ty::lookup_item_type(ccx.tcx, impl_id).bounds).len() > 0u; make_vtable(ccx, vec::map(*ty::iface_methods(tcx, ifce_id), {|im| let fty = ty::substitute_type_params(tcx, substs, ty::mk_fn(tcx, im.fty)); @@ -238,7 +239,13 @@ fn make_impl_vtable(ccx: @crate_ctxt, impl_id: ast::def_id, substs: [ty::t], C_null(type_of_fn_from_ty(ccx, fty)) } else { let m_id = method_with_name(ccx, impl_id, im.ident); - monomorphic_fn(ccx, m_id, substs, some(vtables)).val + if has_tps { + monomorphic_fn(ccx, m_id, substs, some(vtables)).val + } else if m_id.crate == ast::local_crate { + get_item_val(ccx, m_id.node) + } else { + trans_external_path(ccx, m_id, fty) + } } })) }