Add feature gate for inherent associate types.
This commit is contained in:
parent
89d32eb1ea
commit
4f4e15d5eb
@ -103,7 +103,6 @@ E0198: include_str!("./error_codes/E0198.md"),
|
|||||||
E0199: include_str!("./error_codes/E0199.md"),
|
E0199: include_str!("./error_codes/E0199.md"),
|
||||||
E0200: include_str!("./error_codes/E0200.md"),
|
E0200: include_str!("./error_codes/E0200.md"),
|
||||||
E0201: include_str!("./error_codes/E0201.md"),
|
E0201: include_str!("./error_codes/E0201.md"),
|
||||||
E0202: include_str!("./error_codes/E0202.md"),
|
|
||||||
E0203: include_str!("./error_codes/E0203.md"),
|
E0203: include_str!("./error_codes/E0203.md"),
|
||||||
E0204: include_str!("./error_codes/E0204.md"),
|
E0204: include_str!("./error_codes/E0204.md"),
|
||||||
E0205: include_str!("./error_codes/E0205.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 @@ declare_features! (
|
|||||||
/// Allows `pub` on `macro_rules` items.
|
/// Allows `pub` on `macro_rules` items.
|
||||||
(active, pub_macro_rules, "1.52.0", Some(78855), None),
|
(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
|
// feature-group-end: actual feature gates
|
||||||
// -------------------------------------------------------------------------
|
// -------------------------------------------------------------------------
|
||||||
@ -666,6 +669,7 @@ pub const INCOMPLETE_FEATURES: &[Symbol] = &[
|
|||||||
sym::unsized_locals,
|
sym::unsized_locals,
|
||||||
sym::capture_disjoint_fields,
|
sym::capture_disjoint_fields,
|
||||||
sym::const_generics_defaults,
|
sym::const_generics_defaults,
|
||||||
|
sym::inherent_associated_types,
|
||||||
];
|
];
|
||||||
|
|
||||||
/// Some features are not allowed to be used together at the same time, if
|
/// Some features are not allowed to be used together at the same time, if
|
||||||
|
@ -627,6 +627,7 @@ symbols! {
|
|||||||
index_mut,
|
index_mut,
|
||||||
infer_outlives_requirements,
|
infer_outlives_requirements,
|
||||||
infer_static_outlives_requirements,
|
infer_static_outlives_requirements,
|
||||||
|
inherent_associated_types,
|
||||||
inlateout,
|
inlateout,
|
||||||
inline,
|
inline,
|
||||||
inline_const,
|
inline_const,
|
||||||
|
@ -1,4 +1,3 @@
|
|||||||
use crate::errors::AssocTypeOnInherentImpl;
|
|
||||||
use rustc_data_structures::fx::FxHashSet;
|
use rustc_data_structures::fx::FxHashSet;
|
||||||
use rustc_errors::{Applicability, ErrorReported, StashKey};
|
use rustc_errors::{Applicability, ErrorReported, StashKey};
|
||||||
use rustc_hir as hir;
|
use rustc_hir as hir;
|
||||||
@ -294,7 +293,7 @@ pub(super) fn type_of(tcx: TyCtxt<'_>, def_id: DefId) -> Ty<'_> {
|
|||||||
}
|
}
|
||||||
ImplItemKind::TyAlias(ref ty) => {
|
ImplItemKind::TyAlias(ref ty) => {
|
||||||
if tcx.impl_trait_ref(tcx.hir().get_parent_did(hir_id).to_def_id()).is_none() {
|
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)
|
icx.to_ty(ty)
|
||||||
@ -746,6 +745,16 @@ fn infer_placeholder_type(
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
fn report_assoc_ty_on_inherent_impl(tcx: TyCtxt<'_>, span: Span) {
|
fn check_feature_inherent_assoc_ty(tcx: TyCtxt<'_>, span: Span) {
|
||||||
tcx.sess.emit_err(AssocTypeOnInherentImpl { 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,
|
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)]
|
#[derive(SessionDiagnostic)]
|
||||||
#[error = "E0203"]
|
#[error = "E0203"]
|
||||||
pub struct MultipleRelaxedDefaultBounds {
|
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;
|
struct Foo;
|
||||||
|
|
||||||
impl 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)
|
error: associated type in `impl` without body
|
||||||
--> $DIR/assoc-inherent.rs:6:5
|
--> $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 @@ struct X;
|
|||||||
impl X {
|
impl X {
|
||||||
type Y;
|
type Y;
|
||||||
//~^ ERROR associated type in `impl` without body
|
//~^ 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;
|
type Z: Ord;
|
||||||
//~^ ERROR associated type in `impl` without body
|
//~^ ERROR associated type in `impl` without body
|
||||||
//~| ERROR bounds on `type`s in `impl`s have no effect
|
//~| 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;
|
type W: Ord where Self: Eq;
|
||||||
//~^ ERROR associated type in `impl` without body
|
//~^ ERROR associated type in `impl` without body
|
||||||
//~| ERROR bounds on `type`s in `impl`s have no effect
|
//~| 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;
|
type W where Self: Eq;
|
||||||
//~^ ERROR associated type in `impl` without body
|
//~^ 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: `#[warn(incomplete_features)]` on by default
|
||||||
= note: see issue #44265 <https://github.com/rust-lang/rust/issues/44265> for more information
|
= 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
|
--> $DIR/impl-item-type-no-body-semantic-fail.rs:9:5
|
||||||
|
|
|
|
||||||
LL | type Y;
|
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
|
--> $DIR/impl-item-type-no-body-semantic-fail.rs:12:5
|
||||||
|
|
|
|
||||||
LL | type Z: Ord;
|
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
|
--> $DIR/impl-item-type-no-body-semantic-fail.rs:16:5
|
||||||
|
|
|
|
||||||
LL | type W: Ord where Self: Eq;
|
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
|
--> $DIR/impl-item-type-no-body-semantic-fail.rs:20:5
|
||||||
|
|
|
|
||||||
LL | type W where Self: Eq;
|
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
|
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…
x
Reference in New Issue
Block a user