about summary refs log tree commit diff
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
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`
```
-rw-r--r--compiler/rustc_error_codes/src/error_codes.rs1
-rw-r--r--compiler/rustc_error_codes/src/error_codes/E0202.md15
-rw-r--r--compiler/rustc_feature/src/active.rs4
-rw-r--r--compiler/rustc_span/src/symbol.rs1
-rw-r--r--compiler/rustc_typeck/src/collect/type_of.rs17
-rw-r--r--compiler/rustc_typeck/src/errors.rs7
-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
12 files changed, 89 insertions, 45 deletions
diff --git a/compiler/rustc_error_codes/src/error_codes.rs b/compiler/rustc_error_codes/src/error_codes.rs
index c4330694504..4b529734328 100644
--- a/compiler/rustc_error_codes/src/error_codes.rs
+++ b/compiler/rustc_error_codes/src/error_codes.rs
@@ -103,7 +103,6 @@ E0198: include_str!("./error_codes/E0198.md"),
 E0199: include_str!("./error_codes/E0199.md"),
 E0200: include_str!("./error_codes/E0200.md"),
 E0201: include_str!("./error_codes/E0201.md"),
-E0202: include_str!("./error_codes/E0202.md"),
 E0203: include_str!("./error_codes/E0203.md"),
 E0204: include_str!("./error_codes/E0204.md"),
 E0205: include_str!("./error_codes/E0205.md"),
diff --git a/compiler/rustc_error_codes/src/error_codes/E0202.md b/compiler/rustc_error_codes/src/error_codes/E0202.md
deleted file mode 100644
index afc61ec2e48..00000000000
--- a/compiler/rustc_error_codes/src/error_codes/E0202.md
+++ /dev/null
@@ -1,15 +0,0 @@
-Inherent associated types were part of [RFC 195] but are not yet implemented.
-See [the tracking issue][iss8995] for the status of this implementation.
-
-Erroneous code example:
-
-```compile_fail,E0202
-struct Foo;
-
-impl Foo {
-    type Bar = isize; // error!
-}
-```
-
-[RFC 195]: https://github.com/rust-lang/rfcs/blob/master/text/0195-associated-items.md
-[iss8995]: https://github.com/rust-lang/rust/issues/8995
diff --git a/compiler/rustc_feature/src/active.rs b/compiler/rustc_feature/src/active.rs
index 6960b735f33..8ee995a59d8 100644
--- a/compiler/rustc_feature/src/active.rs
+++ b/compiler/rustc_feature/src/active.rs
@@ -641,6 +641,9 @@ declare_features! (
     /// Allows `pub` on `macro_rules` items.
     (active, pub_macro_rules, "1.52.0", Some(78855), None),
 
+    /// Allows associated types in inherent impls.
+    (active, inherent_associated_types, "1.52.0", Some(8995), None),
+
     // -------------------------------------------------------------------------
     // feature-group-end: actual feature gates
     // -------------------------------------------------------------------------
@@ -666,6 +669,7 @@ pub const INCOMPLETE_FEATURES: &[Symbol] = &[
     sym::unsized_locals,
     sym::capture_disjoint_fields,
     sym::const_generics_defaults,
+    sym::inherent_associated_types,
 ];
 
 /// Some features are not allowed to be used together at the same time, if
diff --git a/compiler/rustc_span/src/symbol.rs b/compiler/rustc_span/src/symbol.rs
index f87267da9f6..27bb45bcc85 100644
--- a/compiler/rustc_span/src/symbol.rs
+++ b/compiler/rustc_span/src/symbol.rs
@@ -634,6 +634,7 @@ symbols! {
         index_mut,
         infer_outlives_requirements,
         infer_static_outlives_requirements,
+        inherent_associated_types,
         inlateout,
         inline,
         inline_const,
diff --git a/compiler/rustc_typeck/src/collect/type_of.rs b/compiler/rustc_typeck/src/collect/type_of.rs
index a2aa3b308ec..e6f771cfd53 100644
--- a/compiler/rustc_typeck/src/collect/type_of.rs
+++ b/compiler/rustc_typeck/src/collect/type_of.rs
@@ -1,4 +1,3 @@
-use crate::errors::AssocTypeOnInherentImpl;
 use rustc_data_structures::fx::FxHashSet;
 use rustc_errors::{Applicability, ErrorReported, StashKey};
 use rustc_hir as hir;
@@ -294,7 +293,7 @@ pub(super) fn type_of(tcx: TyCtxt<'_>, def_id: DefId) -> Ty<'_> {
             }
             ImplItemKind::TyAlias(ref ty) => {
                 if tcx.impl_trait_ref(tcx.hir().get_parent_did(hir_id).to_def_id()).is_none() {
-                    report_assoc_ty_on_inherent_impl(tcx, item.span);
+                    check_feature_inherent_assoc_ty(tcx, item.span);
                 }
 
                 icx.to_ty(ty)
@@ -746,6 +745,16 @@ fn infer_placeholder_type(
     })
 }
 
-fn report_assoc_ty_on_inherent_impl(tcx: TyCtxt<'_>, span: Span) {
-    tcx.sess.emit_err(AssocTypeOnInherentImpl { span });
+fn check_feature_inherent_assoc_ty(tcx: TyCtxt<'_>, span: Span) {
+    if !tcx.features().inherent_associated_types {
+        use rustc_session::parse::feature_err;
+        use rustc_span::symbol::sym;
+        feature_err(
+            &tcx.sess.parse_sess,
+            sym::inherent_associated_types,
+            span,
+            "inherent associated types are unstable",
+        )
+        .emit();
+    }
 }
diff --git a/compiler/rustc_typeck/src/errors.rs b/compiler/rustc_typeck/src/errors.rs
index a769e48d2ca..5068242692a 100644
--- a/compiler/rustc_typeck/src/errors.rs
+++ b/compiler/rustc_typeck/src/errors.rs
@@ -83,13 +83,6 @@ pub struct CopyImplOnTypeWithDtor {
 }
 
 #[derive(SessionDiagnostic)]
-#[error = "E0202"]
-pub struct AssocTypeOnInherentImpl {
-    #[message = "associated types are not yet supported in inherent impls (see #8995)"]
-    pub span: Span,
-}
-
-#[derive(SessionDiagnostic)]
 #[error = "E0203"]
 pub struct MultipleRelaxedDefaultBounds {
     #[message = "type parameter has more than one relaxed default bound, only one is supported"]
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`.