From 1812a7b540e929bb1688880541fb4c8e3b80bf6d Mon Sep 17 00:00:00 2001 From: Raphael Catolino Date: Wed, 8 Jan 2014 00:56:16 +0100 Subject: [PATCH] Remove unnecessary substitution of type params when generating vtable methods before translating the ref to the method itself. --- src/librustc/middle/trans/meth.rs | 7 ++---- src/test/run-pass/trait-cast-generic.rs | 30 +++++++++++++++++++++++++ 2 files changed, 32 insertions(+), 5 deletions(-) create mode 100644 src/test/run-pass/trait-cast-generic.rs diff --git a/src/librustc/middle/trans/meth.rs b/src/librustc/middle/trans/meth.rs index d54dd23af96..ae756aa75ac 100644 --- a/src/librustc/middle/trans/meth.rs +++ b/src/librustc/middle/trans/meth.rs @@ -630,11 +630,8 @@ fn emit_vtable_methods(bcx: @Block, debug!("(making impl vtable) emitting method {} at subst {}", m.repr(tcx), substs.repr(tcx)); - let fty = ty::subst_tps(tcx, - substs, - None, - ty::mk_bare_fn(tcx, m.fty.clone())); - if m.generics.has_type_params() || ty::type_has_self(fty) { + if m.generics.has_type_params() || + ty::type_has_self(ty::mk_bare_fn(tcx, m.fty.clone())) { debug!("(making impl vtable) method has self or type params: {}", tcx.sess.str_of(ident)); C_null(Type::nil().ptr_to()) diff --git a/src/test/run-pass/trait-cast-generic.rs b/src/test/run-pass/trait-cast-generic.rs new file mode 100644 index 00000000000..af9633d679e --- /dev/null +++ b/src/test/run-pass/trait-cast-generic.rs @@ -0,0 +1,30 @@ +// Copyright 2014 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 or the MIT license +// , at your +// option. This file may not be copied, modified, or distributed +// except according to those terms. + +// Testing casting of a generic Struct to a Trait with a generic method. +// This is test for issue 10955. +#[allow(unused_variable)]; + +trait Foo { + fn f(a: A) -> A { + a + } +} + +struct Bar { + x: T, +} + +impl Foo for Bar { } + +pub fn main() { + let a = Bar { x: 1 }; + let b = &a as &Foo; +}