diff --git a/src/librustc_typeck/astconv.rs b/src/librustc_typeck/astconv.rs index 54ec1aace9211..b9a5e597c260c 100644 --- a/src/librustc_typeck/astconv.rs +++ b/src/librustc_typeck/astconv.rs @@ -1395,7 +1395,11 @@ fn base_def_to_ty<'tcx>(this: &AstConv<'tcx>, // Self in impl (we know the concrete type). check_path_args(tcx, base_segments, NO_TPS | NO_REGIONS); if let Some(&ty) = tcx.ast_ty_to_ty_cache.borrow().get(&self_ty_id) { - ty + if let Some(free_substs) = this.get_free_substs() { + ty.subst(tcx, free_substs) + } else { + ty + } } else { tcx.sess.span_bug(span, "self type has not been fully resolved") } diff --git a/src/test/run-pass/issue-24308.rs b/src/test/run-pass/issue-24308.rs new file mode 100644 index 0000000000000..0a483fc987adc --- /dev/null +++ b/src/test/run-pass/issue-24308.rs @@ -0,0 +1,26 @@ +// 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 or the MIT license +// , at your +// option. This file may not be copied, modified, or distributed +// except according to those terms. + +pub trait Foo { + fn method1() {} + fn method2(); +} + +struct Slice<'a, T: 'a>(&'a [T]); + +impl<'a, T: 'a> Foo for Slice<'a, T> { + fn method2() { + ::method1(); + } +} + +fn main() { + as Foo>::method2(); +} diff --git a/src/test/run-pass/issue-25279.rs b/src/test/run-pass/issue-25279.rs new file mode 100644 index 0000000000000..e483866790f62 --- /dev/null +++ b/src/test/run-pass/issue-25279.rs @@ -0,0 +1,25 @@ +// 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 or the MIT license +// , at your +// option. This file may not be copied, modified, or distributed +// except according to those terms. + +struct S<'a>(&'a ()); + +impl<'a> S<'a> { + fn foo(self) -> &'a () { + ::bar(self) + } + + fn bar(self) -> &'a () { + self.0 + } +} + +fn main() { + S(&()).foo(); +}