diff options
| author | Ariel Ben-Yehuda <arielb1@mail.tau.ac.il> | 2015-05-20 21:22:05 +0300 |
|---|---|---|
| committer | Ariel Ben-Yehuda <arielb1@mail.tau.ac.il> | 2015-05-20 21:23:41 +0300 |
| commit | 7b1e8446d1a7b8cccc05441e2a1f52f7c2d2871b (patch) | |
| tree | 344d2a87f6eef3506af8922c419fe9cbc86c4f68 | |
| parent | cec980a1a706fd6afc27dd54c1eed7c51800d753 (diff) | |
| download | rust-7b1e8446d1a7b8cccc05441e2a1f52f7c2d2871b.tar.gz rust-7b1e8446d1a7b8cccc05441e2a1f52f7c2d2871b.zip | |
Substitute free lifetimes when `Self` is used within a method body
This is needed because `Self` can be substituted to a type with lifetime parameters. Fixes #24308 Fixes #25071 Fixes #25259 Fixes #25279
| -rw-r--r-- | src/librustc_typeck/astconv.rs | 6 | ||||
| -rw-r--r-- | src/test/run-pass/issue-24308.rs | 26 | ||||
| -rw-r--r-- | src/test/run-pass/issue-25279.rs | 25 |
3 files changed, 56 insertions, 1 deletions
diff --git a/src/librustc_typeck/astconv.rs b/src/librustc_typeck/astconv.rs index 54ec1aace92..b9a5e597c26 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 00000000000..0a483fc987a --- /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 <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. + +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() { + <Self as Foo>::method1(); + } +} + +fn main() { + <Slice<()> 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 00000000000..e483866790f --- /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 <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. + +struct S<'a>(&'a ()); + +impl<'a> S<'a> { + fn foo(self) -> &'a () { + <Self>::bar(self) + } + + fn bar(self) -> &'a () { + self.0 + } +} + +fn main() { + S(&()).foo(); +} |
