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` ```
This commit is contained in:
commit
5e68c60406
@ -103,7 +103,6 @@
|
||||
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"),
|
||||
|
@ -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
|
@ -641,6 +641,9 @@ pub fn set(&self, features: &mut Features, span: Span) {
|
||||
/// 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 fn set(&self, features: &mut Features, span: Span) {
|
||||
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
|
||||
|
@ -634,6 +634,7 @@
|
||||
index_mut,
|
||||
infer_outlives_requirements,
|
||||
infer_static_outlives_requirements,
|
||||
inherent_associated_types,
|
||||
inlateout,
|
||||
inline,
|
||||
inline_const,
|
||||
|
@ -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();
|
||||
}
|
||||
}
|
||||
|
@ -82,13 +82,6 @@ pub struct CopyImplOnTypeWithDtor {
|
||||
pub span: Span,
|
||||
}
|
||||
|
||||
#[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 {
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -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`
|
||||
|
||||
For more information about this error, try `rustc --explain E0202`.
|
||||
error: aborting due to 2 previous errors
|
||||
|
||||
For more information about this error, try `rustc --explain E0223`.
|
||||
|
@ -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() {}
|
@ -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`.
|
@ -8,16 +8,16 @@ fn main() {}
|
||||
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
|
||||
}
|
||||
|
@ -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`.
|
||||
|
Loading…
Reference in New Issue
Block a user