about summary refs log tree commit diff
path: root/src
diff options
context:
space:
mode:
authorYuki Okushi <huyuumi.dev@gmail.com>2021-03-02 21:23:15 +0900
committerGitHub <noreply@github.com>2021-03-02 21:23:15 +0900
commit5e68c60406741c41d7dff65e74d05f641ee6022f (patch)
treeb9520af8789e24ebeb6aedeab006b9586840adcc /src
parentae5e024194a99bf265c874d64999e6beae916cde (diff)
parent4f4e15d5eb9750c4ac8c140207612122562d6c51 (diff)
downloadrust-5e68c60406741c41d7dff65e74d05f641ee6022f.tar.gz
rust-5e68c60406741c41d7dff65e74d05f641ee6022f.zip
Rollup merge of #82516 - PoignardAzur:inherent-impl-ty, r=oli-obk
Add incomplete feature gate for inherent associate types.

Mentored by ``````@oli-obk``````

So far the only change is that instead of giving an automatic error, the following code compiles:

```rust
struct Foo;

impl Foo {
    type Bar = isize;
}
```

The backend work to make it actually usable isn't there yet. In particular, this:

```rust
let x : Foo::Bar;
```

will give you:

```sh
error[E0223]: ambiguous associated type
  --> /$RUSTC_DIR/src/test/ui/assoc-inherent.rs:15:13
   |
LL |     let x : Foo::Bar;
   |             ^^^^^^^^ help: use fully-qualified syntax: `<Foo as Trait>::Bar`
```
Diffstat (limited to 'src')
-rw-r--r--src/test/ui/assoc-inherent.rs17
-rw-r--r--src/test/ui/assoc-inherent.stderr20
-rw-r--r--src/test/ui/feature-gates/feature-gate-inherent_associated_types.rs10
-rw-r--r--src/test/ui/feature-gates/feature-gate-inherent_associated_types.stderr12
-rw-r--r--src/test/ui/parser/impl-item-type-no-body-semantic-fail.rs8
-rw-r--r--src/test/ui/parser/impl-item-type-no-body-semantic-fail.stderr22
6 files changed, 71 insertions, 18 deletions
diff --git a/src/test/ui/assoc-inherent.rs b/src/test/ui/assoc-inherent.rs
index 05329a27142..c579c962ffc 100644
--- a/src/test/ui/assoc-inherent.rs
+++ b/src/test/ui/assoc-inherent.rs
@@ -1,9 +1,20 @@
-// Test associated types are, until #8995 is implemented, forbidden in inherent impls.
+// Test that inherent associated types work with
+// inherent_associated_types feature gate.
+
+#![feature(inherent_associated_types)]
+#![allow(incomplete_features)]
 
 struct Foo;
 
 impl Foo {
-    type Bar = isize; //~ERROR associated types are not yet supported in inherent impls (see #8995)
+    type Bar = isize;
 }
 
-fn main() {}
+impl Foo {
+    type Baz; //~ ERROR associated type in `impl` without body
+}
+
+fn main() {
+    let x : Foo::Bar; //~ERROR ambiguous associated type
+    x = 0isize;
+}
diff --git a/src/test/ui/assoc-inherent.stderr b/src/test/ui/assoc-inherent.stderr
index f9ea3365cb8..b703453fa03 100644
--- a/src/test/ui/assoc-inherent.stderr
+++ b/src/test/ui/assoc-inherent.stderr
@@ -1,9 +1,17 @@
-error[E0202]: associated types are not yet supported in inherent impls (see #8995)
-  --> $DIR/assoc-inherent.rs:6:5
+error: associated type in `impl` without body
+  --> $DIR/assoc-inherent.rs:14:5
    |
-LL |     type Bar = isize;
-   |     ^^^^^^^^^^^^^^^^^
+LL |     type Baz;
+   |     ^^^^^^^^-
+   |             |
+   |             help: provide a definition for the type: `= <type>;`
 
-error: aborting due to previous error
+error[E0223]: ambiguous associated type
+  --> $DIR/assoc-inherent.rs:18:13
+   |
+LL |     let x : Foo::Bar;
+   |             ^^^^^^^^ help: use fully-qualified syntax: `<Foo as Trait>::Bar`
+
+error: aborting due to 2 previous errors
 
-For more information about this error, try `rustc --explain E0202`.
+For more information about this error, try `rustc --explain E0223`.
diff --git a/src/test/ui/feature-gates/feature-gate-inherent_associated_types.rs b/src/test/ui/feature-gates/feature-gate-inherent_associated_types.rs
new file mode 100644
index 00000000000..fc7c6dbc02e
--- /dev/null
+++ b/src/test/ui/feature-gates/feature-gate-inherent_associated_types.rs
@@ -0,0 +1,10 @@
+// Test that inherent associated types cannot be used when inherent_associated_types
+// feature gate is not used.
+
+struct Foo;
+
+impl Foo {
+    type Bar = isize; //~ERROR inherent associated types are unstable
+}
+
+fn main() {}
diff --git a/src/test/ui/feature-gates/feature-gate-inherent_associated_types.stderr b/src/test/ui/feature-gates/feature-gate-inherent_associated_types.stderr
new file mode 100644
index 00000000000..76e65d239f8
--- /dev/null
+++ b/src/test/ui/feature-gates/feature-gate-inherent_associated_types.stderr
@@ -0,0 +1,12 @@
+error[E0658]: inherent associated types are unstable
+  --> $DIR/feature-gate-inherent_associated_types.rs:7:5
+   |
+LL |     type Bar = isize;
+   |     ^^^^^^^^^^^^^^^^^
+   |
+   = note: see issue #8995 <https://github.com/rust-lang/rust/issues/8995> for more information
+   = help: add `#![feature(inherent_associated_types)]` to the crate attributes to enable
+
+error: aborting due to previous error
+
+For more information about this error, try `rustc --explain E0658`.
diff --git a/src/test/ui/parser/impl-item-type-no-body-semantic-fail.rs b/src/test/ui/parser/impl-item-type-no-body-semantic-fail.rs
index fa9c7ababcf..1ccc9497d9d 100644
--- a/src/test/ui/parser/impl-item-type-no-body-semantic-fail.rs
+++ b/src/test/ui/parser/impl-item-type-no-body-semantic-fail.rs
@@ -8,16 +8,16 @@ struct X;
 impl X {
     type Y;
     //~^ ERROR associated type in `impl` without body
-    //~| ERROR associated types are not yet supported in inherent impls
+    //~| ERROR inherent associated types are unstable
     type Z: Ord;
     //~^ ERROR associated type in `impl` without body
     //~| ERROR bounds on `type`s in `impl`s have no effect
-    //~| ERROR associated types are not yet supported in inherent impls
+    //~| ERROR inherent associated types are unstable
     type W: Ord where Self: Eq;
     //~^ ERROR associated type in `impl` without body
     //~| ERROR bounds on `type`s in `impl`s have no effect
-    //~| ERROR associated types are not yet supported in inherent impls
+    //~| ERROR inherent associated types are unstable
     type W where Self: Eq;
     //~^ ERROR associated type in `impl` without body
-    //~| ERROR associated types are not yet supported in inherent impls
+    //~| ERROR inherent associated types are unstable
 }
diff --git a/src/test/ui/parser/impl-item-type-no-body-semantic-fail.stderr b/src/test/ui/parser/impl-item-type-no-body-semantic-fail.stderr
index 214467793bc..818d73c898d 100644
--- a/src/test/ui/parser/impl-item-type-no-body-semantic-fail.stderr
+++ b/src/test/ui/parser/impl-item-type-no-body-semantic-fail.stderr
@@ -51,30 +51,42 @@ LL | #![feature(generic_associated_types)]
    = note: `#[warn(incomplete_features)]` on by default
    = note: see issue #44265 <https://github.com/rust-lang/rust/issues/44265> for more information
 
-error[E0202]: associated types are not yet supported in inherent impls (see #8995)
+error[E0658]: inherent associated types are unstable
   --> $DIR/impl-item-type-no-body-semantic-fail.rs:9:5
    |
 LL |     type Y;
    |     ^^^^^^^
+   |
+   = note: see issue #8995 <https://github.com/rust-lang/rust/issues/8995> for more information
+   = help: add `#![feature(inherent_associated_types)]` to the crate attributes to enable
 
-error[E0202]: associated types are not yet supported in inherent impls (see #8995)
+error[E0658]: inherent associated types are unstable
   --> $DIR/impl-item-type-no-body-semantic-fail.rs:12:5
    |
 LL |     type Z: Ord;
    |     ^^^^^^^^^^^^
+   |
+   = note: see issue #8995 <https://github.com/rust-lang/rust/issues/8995> for more information
+   = help: add `#![feature(inherent_associated_types)]` to the crate attributes to enable
 
-error[E0202]: associated types are not yet supported in inherent impls (see #8995)
+error[E0658]: inherent associated types are unstable
   --> $DIR/impl-item-type-no-body-semantic-fail.rs:16:5
    |
 LL |     type W: Ord where Self: Eq;
    |     ^^^^^^^^^^^^^^^^^^^^^^^^^^^
+   |
+   = note: see issue #8995 <https://github.com/rust-lang/rust/issues/8995> for more information
+   = help: add `#![feature(inherent_associated_types)]` to the crate attributes to enable
 
-error[E0202]: associated types are not yet supported in inherent impls (see #8995)
+error[E0658]: inherent associated types are unstable
   --> $DIR/impl-item-type-no-body-semantic-fail.rs:20:5
    |
 LL |     type W where Self: Eq;
    |     ^^^^^^^^^^^^^^^^^^^^^^
+   |
+   = note: see issue #8995 <https://github.com/rust-lang/rust/issues/8995> for more information
+   = help: add `#![feature(inherent_associated_types)]` to the crate attributes to enable
 
 error: aborting due to 10 previous errors; 1 warning emitted
 
-For more information about this error, try `rustc --explain E0202`.
+For more information about this error, try `rustc --explain E0658`.