diff options
| author | bors <bors@rust-lang.org> | 2013-06-26 12:08:33 -0700 |
|---|---|---|
| committer | bors <bors@rust-lang.org> | 2013-06-26 12:08:33 -0700 |
| commit | 23fb2278c7c50cf5785b1c109bc399bf87fdd542 (patch) | |
| tree | 10259f6dc2abe39e41539fc3f575cd9e2e0fb944 | |
| parent | 3433851a37f04621e0c091ec2180aeddbdd5ada5 (diff) | |
| parent | 276463f06416e54d83f1ba628f82b1f014142426 (diff) | |
| download | rust-23fb2278c7c50cf5785b1c109bc399bf87fdd542.tar.gz rust-23fb2278c7c50cf5785b1c109bc399bf87fdd542.zip | |
auto merge of #7356 : msullivan/rust/default-methods, r=bblum
r?
| -rw-r--r-- | src/librustc/middle/typeck/check/method.rs | 23 | ||||
| -rw-r--r-- | src/test/run-pass/bug-7295.rs | 22 |
2 files changed, 31 insertions, 14 deletions
diff --git a/src/librustc/middle/typeck/check/method.rs b/src/librustc/middle/typeck/check/method.rs index 60855e6cd96..338342f9307 100644 --- a/src/librustc/middle/typeck/check/method.rs +++ b/src/librustc/middle/typeck/check/method.rs @@ -300,13 +300,8 @@ impl<'self> LookupContext<'self> { ty_self(self_did) => { // Call is of the form "self.foo()" and appears in one // of a trait's default method implementations. - let substs = substs { - self_r: None, - self_ty: None, - tps: ~[] - }; self.push_inherent_candidates_from_self( - self_ty, self_did, &substs); + self_ty, self_did); } ty_enum(did, _) | ty_struct(did, _) => { if self.check_traits == CheckTraitsAndInherentMethods { @@ -462,12 +457,12 @@ impl<'self> LookupContext<'self> { pub fn push_inherent_candidates_from_self(&self, self_ty: ty::t, - did: def_id, - substs: &ty::substs) { + did: def_id) { struct MethodInfo { method_ty: @ty::Method, trait_def_id: ast::def_id, - index: uint + index: uint, + trait_ref: @ty::TraitRef } let tcx = self.tcx(); @@ -479,7 +474,8 @@ impl<'self> LookupContext<'self> { method_info = Some(MethodInfo { method_ty: methods[i], index: i, - trait_def_id: did + trait_def_id: did, + trait_ref: ty::lookup_trait_def(tcx, did).trait_ref }); } None => () @@ -494,7 +490,8 @@ impl<'self> LookupContext<'self> { method_info = Some(MethodInfo { method_ty: supertrait_methods[i], index: i, - trait_def_id: trait_ref.def_id + trait_def_id: trait_ref.def_id, + trait_ref: *trait_ref }); break; } @@ -505,8 +502,6 @@ impl<'self> LookupContext<'self> { match method_info { Some(ref info) => { // We've found a method -- return it - let rcvr_substs = substs {self_ty: Some(self_ty), - ..copy *substs }; let origin = if did == info.trait_def_id { method_self(info.trait_def_id, info.index) } else { @@ -514,7 +509,7 @@ impl<'self> LookupContext<'self> { }; self.inherent_candidates.push(Candidate { rcvr_ty: self_ty, - rcvr_substs: rcvr_substs, + rcvr_substs: copy info.trait_ref.substs, method_ty: info.method_ty, origin: origin }); diff --git a/src/test/run-pass/bug-7295.rs b/src/test/run-pass/bug-7295.rs new file mode 100644 index 00000000000..080a0dbd91a --- /dev/null +++ b/src/test/run-pass/bug-7295.rs @@ -0,0 +1,22 @@ +// Copyright 2013 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. + +#[allow(default_methods)]; +pub trait Foo<T> { + pub fn func1<U>(&self, t: U); + + pub fn func2<U>(&self, t: U) { + self.func1(t); + } +} + +pub fn main() { + +} |
