-
Notifications
You must be signed in to change notification settings - Fork 13k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Auto merge of #38920 - petrochenkov:selfimpl, r=eddyb
Partially implement RFC 1647 (`Self` in impl headers) The name resolution part is easy, but the typeck part contains an unexpected problem. It turns out that `Self` type *depends* on bounds and `where` clauses, so we need to convert them first to determine what the `Self` type is! If bounds/`where` clauses can refer to `Self` then we have a cyclic dependency. This is required to support impls like this: ``` // Found in libcollections impl<I: IntoIterator> SpecExtend<I> for LinkedList<I::Item> { .... } ^^^^^ associated type `Item` is found using information from bounds ``` I'm not yet sure how to resolve this issue. One possible solution (that feels hacky) is to make two passes over generics - first collect predicates ignoring everything involving `Self`, then determine `Self`, then collect predicates again without ignoring anything. (Some kind of lazy on-demand checking or something looks like a proper solution.) This patch in its current state doesn't solve the problem with `Self` in bounds, so the only observable things it does is improving error messages and supporting `impl Trait<Self> for Type {}`. There's also a question about feature gating. It's non-trivial to *detect* "newly resolved" `Self`s to feature gate them, but it's simple to *enable* the new resolution behavior when the feature gate is already specified. Alternatively this can be considered a bug fix and merged without a feature gate. cc #38864 r? @nikomatsakis cc @eddyb Whitespace ignoring diff https://github.com/rust-lang/rust/pull/38920/files?w=1
- Loading branch information
Showing
5 changed files
with
122 additions
and
67 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,17 @@ | ||
// Copyright 2016 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<T = u8>(T); | ||
trait Tr<T = u8> {} | ||
|
||
impl Self for S {} //~ ERROR expected trait, found self type `Self` | ||
impl Self::N for S {} //~ ERROR cannot find trait `N` in `Self` | ||
|
||
fn main() {} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,26 @@ | ||
// Copyright 2016 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<T = u8>(T); | ||
trait Tr<T = u8> {} | ||
|
||
impl Tr<Self> for S {} // OK | ||
|
||
// FIXME: `Self` cannot be used in bounds because it depends on bounds itself. | ||
impl<T: Tr<Self>> Tr<T> for S {} //~ ERROR `Self` type is used before it's determined | ||
impl<T = Self> Tr<T> for S {} //~ ERROR `Self` type is used before it's determined | ||
impl Tr for S where Self: Copy {} //~ ERROR `Self` type is used before it's determined | ||
impl Tr for S where S<Self>: Copy {} //~ ERROR `Self` type is used before it's determined | ||
impl Tr for Self {} //~ ERROR `Self` type is used before it's determined | ||
impl Tr for S<Self> {} //~ ERROR `Self` type is used before it's determined | ||
impl Self {} //~ ERROR `Self` type is used before it's determined | ||
impl S<Self> {} //~ ERROR `Self` type is used before it's determined | ||
|
||
fn main() {} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,16 +1,8 @@ | ||
error[E0411]: cannot find type `Self` in this scope | ||
error: `Self` type is used before it's determined | ||
--> $DIR/issue-23305.rs:15:12 | ||
| | ||
15 | impl ToNbt<Self> {} | ||
| ^^^^ `Self` is only available in traits and impls | ||
|
||
error[E0038]: the trait `ToNbt` cannot be made into an object | ||
--> $DIR/issue-23305.rs:15:6 | ||
| | ||
15 | impl ToNbt<Self> {} | ||
| ^^^^^^^^^^^ the trait `ToNbt` cannot be made into an object | ||
| | ||
= note: method `new` has no receiver | ||
| ^^^^ | ||
|
||
error: aborting due to previous error | ||
|