Rollup merge of #110237 - oli-obk:impl_trait_in_assoc_tys, r=jackh726
Split out a separate feature gate for impl trait in associated types in https://github.com/rust-lang/rust/issues/107645 it was decided that we'll take a new route for type alias impl trait. The exact route isn't clear yet, so while I'm working on implementing some of these proposed changes (e.g. in https://github.com/rust-lang/rust/pull/110010) to be able to experiment with them, I will also work on stabilizing another sugar version first: impl trait in associated types. Similarly I'll look into creating feature gates for impl trait in const/static types. This PR does nothing but split the feature gate, so that you need to enable a different feature gate for ```rust impl Trait for Type { type Assoc = impl SomeTrait; } ``` than what you need for `type Foo = impl SomeTrait;`
This commit is contained in:
commit
214e4ef4ef
68 changed files with 217 additions and 148 deletions
|
@ -121,24 +121,34 @@ impl<'a> PostExpansionVisitor<'a> {
|
|||
}
|
||||
|
||||
/// Feature gate `impl Trait` inside `type Alias = $type_expr;`.
|
||||
fn check_impl_trait(&self, ty: &ast::Ty) {
|
||||
fn check_impl_trait(&self, ty: &ast::Ty, in_associated_ty: bool) {
|
||||
struct ImplTraitVisitor<'a> {
|
||||
vis: &'a PostExpansionVisitor<'a>,
|
||||
in_associated_ty: bool,
|
||||
}
|
||||
impl Visitor<'_> for ImplTraitVisitor<'_> {
|
||||
fn visit_ty(&mut self, ty: &ast::Ty) {
|
||||
if let ast::TyKind::ImplTrait(..) = ty.kind {
|
||||
gate_feature_post!(
|
||||
&self.vis,
|
||||
type_alias_impl_trait,
|
||||
ty.span,
|
||||
"`impl Trait` in type aliases is unstable"
|
||||
);
|
||||
if self.in_associated_ty {
|
||||
gate_feature_post!(
|
||||
&self.vis,
|
||||
impl_trait_in_assoc_type,
|
||||
ty.span,
|
||||
"`impl Trait` in associated types is unstable"
|
||||
);
|
||||
} else {
|
||||
gate_feature_post!(
|
||||
&self.vis,
|
||||
type_alias_impl_trait,
|
||||
ty.span,
|
||||
"`impl Trait` in type aliases is unstable"
|
||||
);
|
||||
}
|
||||
}
|
||||
visit::walk_ty(self, ty);
|
||||
}
|
||||
}
|
||||
ImplTraitVisitor { vis: self }.visit_ty(ty);
|
||||
ImplTraitVisitor { vis: self, in_associated_ty }.visit_ty(ty);
|
||||
}
|
||||
|
||||
fn check_late_bound_lifetime_defs(&self, params: &[ast::GenericParam]) {
|
||||
|
@ -294,7 +304,7 @@ impl<'a> Visitor<'a> for PostExpansionVisitor<'a> {
|
|||
}
|
||||
|
||||
ast::ItemKind::TyAlias(box ast::TyAlias { ty: Some(ty), .. }) => {
|
||||
self.check_impl_trait(&ty)
|
||||
self.check_impl_trait(&ty, false)
|
||||
}
|
||||
|
||||
_ => {}
|
||||
|
@ -520,7 +530,7 @@ impl<'a> Visitor<'a> for PostExpansionVisitor<'a> {
|
|||
);
|
||||
}
|
||||
if let Some(ty) = ty {
|
||||
self.check_impl_trait(ty);
|
||||
self.check_impl_trait(ty, true);
|
||||
}
|
||||
false
|
||||
}
|
||||
|
|
|
@ -416,6 +416,8 @@ declare_features! (
|
|||
(active, half_open_range_patterns_in_slices, "1.66.0", Some(67264), None),
|
||||
/// Allows `if let` guard in match arms.
|
||||
(active, if_let_guard, "1.47.0", Some(51114), None),
|
||||
/// Allows `impl Trait` to be used inside associated types (RFC 2515).
|
||||
(active, impl_trait_in_assoc_type, "CURRENT_RUSTC_VERSION", Some(63063), None),
|
||||
/// Allows `impl Trait` as output type in `Fn` traits in return position of functions.
|
||||
(active, impl_trait_in_fn_trait_return, "1.64.0", Some(99697), None),
|
||||
/// Allows referencing `Self` and projections in impl-trait.
|
||||
|
|
|
@ -801,6 +801,7 @@ symbols! {
|
|||
ignore,
|
||||
impl_header_lifetime_elision,
|
||||
impl_lint_pass,
|
||||
impl_trait_in_assoc_type,
|
||||
impl_trait_in_bindings,
|
||||
impl_trait_in_fn_trait_return,
|
||||
impl_trait_projections,
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue