rustc: Remove `#[rustc_synthetic]`

This function parameter attribute was introduced in https://github.com/rust-lang/rust/pull/44866 as an intermediate step in implementing `impl Trait`, it's not necessary or used anywhere by itself.
This commit is contained in:
Vadim Petrochenkov 2021-11-18 13:25:27 +08:00
parent 6414e0b5b3
commit 91e02177a1
17 changed files with 37 additions and 163 deletions

View File

@ -1338,10 +1338,7 @@ impl<'a, 'hir> LoweringContext<'a, 'hir> {
pure_wrt_drop: false, pure_wrt_drop: false,
bounds: hir_bounds, bounds: hir_bounds,
span: self.lower_span(span), span: self.lower_span(span),
kind: hir::GenericParamKind::Type { kind: hir::GenericParamKind::Type { default: None, synthetic: true },
default: None,
synthetic: Some(hir::SyntheticTyParamKind::ImplTrait),
},
}); });
hir::TyKind::Path(hir::QPath::Resolved( hir::TyKind::Path(hir::QPath::Resolved(
@ -1954,12 +1951,7 @@ impl<'a, 'hir> LoweringContext<'a, 'hir> {
default: default.as_ref().map(|x| { default: default.as_ref().map(|x| {
self.lower_ty(x, ImplTraitContext::Disallowed(ImplTraitPosition::Other)) self.lower_ty(x, ImplTraitContext::Disallowed(ImplTraitPosition::Other))
}), }),
synthetic: param synthetic: false,
.attrs
.iter()
.filter(|attr| attr.has_name(sym::rustc_synthetic))
.map(|_| hir::SyntheticTyParamKind::FromAttr)
.next(),
}; };
(hir::ParamName::Plain(self.lower_ident(param.ident)), kind) (hir::ParamName::Plain(self.lower_ident(param.ident)), kind)

View File

@ -601,7 +601,6 @@ pub const BUILTIN_ATTRIBUTES: &[BuiltinAttribute] = &[
TEST, rustc_expected_cgu_reuse, Normal, TEST, rustc_expected_cgu_reuse, Normal,
template!(List: r#"cfg = "...", module = "...", kind = "...""#), template!(List: r#"cfg = "...", module = "...", kind = "...""#),
), ),
rustc_attr!(TEST, rustc_synthetic, Normal, template!(Word)),
rustc_attr!(TEST, rustc_symbol_name, Normal, template!(Word)), rustc_attr!(TEST, rustc_symbol_name, Normal, template!(Word)),
rustc_attr!(TEST, rustc_polymorphize_error, Normal, template!(Word)), rustc_attr!(TEST, rustc_polymorphize_error, Normal, template!(Word)),
rustc_attr!(TEST, rustc_def_path, Normal, template!(Word)), rustc_attr!(TEST, rustc_def_path, Normal, template!(Word)),

View File

@ -504,7 +504,7 @@ pub enum GenericParamKind<'hir> {
}, },
Type { Type {
default: Option<&'hir Ty<'hir>>, default: Option<&'hir Ty<'hir>>,
synthetic: Option<SyntheticTyParamKind>, synthetic: bool,
}, },
Const { Const {
ty: &'hir Ty<'hir>, ty: &'hir Ty<'hir>,
@ -577,16 +577,6 @@ impl Generics<'hir> {
} }
} }
/// Synthetic type parameters are converted to another form during lowering; this allows
/// us to track the original form they had, and is useful for error messages.
#[derive(Copy, Clone, PartialEq, Eq, Encodable, Decodable, Hash, Debug)]
#[derive(HashStable_Generic)]
pub enum SyntheticTyParamKind {
ImplTrait,
// Created by the `#[rustc_synthetic]` attribute.
FromAttr,
}
/// A where-clause in a definition. /// A where-clause in a definition.
#[derive(Debug, HashStable_Generic)] #[derive(Debug, HashStable_Generic)]
pub struct WhereClause<'hir> { pub struct WhereClause<'hir> {

View File

@ -3,7 +3,6 @@ use crate::ty;
use crate::ty::subst::{Subst, SubstsRef}; use crate::ty::subst::{Subst, SubstsRef};
use rustc_ast as ast; use rustc_ast as ast;
use rustc_data_structures::fx::FxHashMap; use rustc_data_structures::fx::FxHashMap;
use rustc_hir as hir;
use rustc_hir::def_id::DefId; use rustc_hir::def_id::DefId;
use rustc_span::symbol::Symbol; use rustc_span::symbol::Symbol;
use rustc_span::Span; use rustc_span::Span;
@ -13,14 +12,8 @@ use super::{EarlyBoundRegion, InstantiatedPredicates, ParamConst, ParamTy, Predi
#[derive(Clone, Debug, TyEncodable, TyDecodable, HashStable)] #[derive(Clone, Debug, TyEncodable, TyDecodable, HashStable)]
pub enum GenericParamDefKind { pub enum GenericParamDefKind {
Lifetime, Lifetime,
Type { Type { has_default: bool, object_lifetime_default: ObjectLifetimeDefault, synthetic: bool },
has_default: bool, Const { has_default: bool },
object_lifetime_default: ObjectLifetimeDefault,
synthetic: Option<hir::SyntheticTyParamKind>,
},
Const {
has_default: bool,
},
} }
impl GenericParamDefKind { impl GenericParamDefKind {
@ -202,15 +195,7 @@ impl<'tcx> Generics {
/// Returns `true` if `params` has `impl Trait`. /// Returns `true` if `params` has `impl Trait`.
pub fn has_impl_trait(&'tcx self) -> bool { pub fn has_impl_trait(&'tcx self) -> bool {
self.params.iter().any(|param| { self.params.iter().any(|param| {
matches!( matches!(param.kind, ty::GenericParamDefKind::Type { synthetic: true, .. })
param.kind,
ty::GenericParamDefKind::Type {
synthetic: Some(
hir::SyntheticTyParamKind::ImplTrait | hir::SyntheticTyParamKind::FromAttr,
),
..
}
)
}) })
} }
} }

View File

@ -1810,12 +1810,10 @@ impl<'tcx> LifetimeContext<'_, 'tcx> {
let (span, sugg) = if let Some(param) = generics.params.iter().find(|p| { let (span, sugg) = if let Some(param) = generics.params.iter().find(|p| {
!matches!( !matches!(
p.kind, p.kind,
hir::GenericParamKind::Type { hir::GenericParamKind::Type { synthetic: true, .. }
synthetic: Some(hir::SyntheticTyParamKind::ImplTrait), | hir::GenericParamKind::Lifetime {
.. kind: hir::LifetimeParamKind::Elided,
} | hir::GenericParamKind::Lifetime { }
kind: hir::LifetimeParamKind::Elided,
}
) )
}) { }) {
(param.span.shrink_to_lo(), format!("{}, ", lifetime_ref)) (param.span.shrink_to_lo(), format!("{}, ", lifetime_ref))
@ -2042,12 +2040,10 @@ impl<'tcx> LifetimeContext<'_, 'tcx> {
if let Some(param) = generics.params.iter().find(|p| { if let Some(param) = generics.params.iter().find(|p| {
!matches!( !matches!(
p.kind, p.kind,
hir::GenericParamKind::Type { hir::GenericParamKind::Type { synthetic: true, .. }
synthetic: Some(hir::SyntheticTyParamKind::ImplTrait), | hir::GenericParamKind::Lifetime {
.. kind: hir::LifetimeParamKind::Elided
} | hir::GenericParamKind::Lifetime { }
kind: hir::LifetimeParamKind::Elided
}
) )
}) { }) {
(param.span.shrink_to_lo(), "'a, ".to_string()) (param.span.shrink_to_lo(), "'a, ".to_string())

View File

@ -1148,7 +1148,6 @@ symbols! {
rustc_std_internal_symbol, rustc_std_internal_symbol,
rustc_strict_coherence, rustc_strict_coherence,
rustc_symbol_name, rustc_symbol_name,
rustc_synthetic,
rustc_test_marker, rustc_test_marker,
rustc_then_this_would_need, rustc_then_this_would_need,
rustc_trivial_field_reads, rustc_trivial_field_reads,

View File

@ -290,9 +290,10 @@ fn suggest_restriction(
} else { } else {
// Trivial case: `T` needs an extra bound: `T: Bound`. // Trivial case: `T` needs an extra bound: `T: Bound`.
let (sp, suggestion) = match ( let (sp, suggestion) = match (
generics.params.iter().find(|p| { generics
!matches!(p.kind, hir::GenericParamKind::Type { synthetic: Some(_), .. }) .params
}), .iter()
.find(|p| !matches!(p.kind, hir::GenericParamKind::Type { synthetic: true, .. })),
super_traits, super_traits,
) { ) {
(_, None) => predicate_constraint( (_, None) => predicate_constraint(

View File

@ -464,16 +464,7 @@ impl<'o, 'tcx> dyn AstConv<'tcx> + 'o {
.params .params
.iter() .iter()
.filter(|param| { .filter(|param| {
matches!( matches!(param.kind, ty::GenericParamDefKind::Type { synthetic: true, .. })
param.kind,
ty::GenericParamDefKind::Type {
synthetic: Some(
hir::SyntheticTyParamKind::ImplTrait
| hir::SyntheticTyParamKind::FromAttr
),
..
}
)
}) })
.count() .count()
} else { } else {

View File

@ -607,10 +607,7 @@ fn compare_number_of_generics<'tcx>(
.params .params
.iter() .iter()
.filter_map(|p| match p.kind { .filter_map(|p| match p.kind {
GenericParamKind::Type { GenericParamKind::Type { synthetic: true, .. } => Some(p.span),
synthetic: Some(hir::SyntheticTyParamKind::ImplTrait),
..
} => Some(p.span),
_ => None, _ => None,
}) })
.collect(); .collect();
@ -627,10 +624,7 @@ fn compare_number_of_generics<'tcx>(
.params .params
.iter() .iter()
.filter_map(|p| match p.kind { .filter_map(|p| match p.kind {
GenericParamKind::Type { GenericParamKind::Type { synthetic: true, .. } => Some(p.span),
synthetic: Some(hir::SyntheticTyParamKind::ImplTrait),
..
} => Some(p.span),
_ => None, _ => None,
}) })
.collect(); .collect();
@ -823,7 +817,7 @@ fn compare_synthetic_generics<'tcx>(
match (impl_synthetic, trait_synthetic) { match (impl_synthetic, trait_synthetic) {
// The case where the impl method uses `impl Trait` but the trait method uses // The case where the impl method uses `impl Trait` but the trait method uses
// explicit generics // explicit generics
(Some(hir::SyntheticTyParamKind::ImplTrait), None) => { (true, false) => {
err.span_label(impl_span, "expected generic parameter, found `impl Trait`"); err.span_label(impl_span, "expected generic parameter, found `impl Trait`");
(|| { (|| {
// try taking the name from the trait impl // try taking the name from the trait impl
@ -864,7 +858,7 @@ fn compare_synthetic_generics<'tcx>(
} }
// The case where the trait method uses `impl Trait`, but the impl method uses // The case where the trait method uses `impl Trait`, but the impl method uses
// explicit generics. // explicit generics.
(None, Some(hir::SyntheticTyParamKind::ImplTrait)) => { (false, true) => {
err.span_label(impl_span, "expected `impl Trait`, found generic parameter"); err.span_label(impl_span, "expected `impl Trait`, found generic parameter");
(|| { (|| {
let impl_m = impl_m.def_id.as_local()?; let impl_m = impl_m.def_id.as_local()?;

View File

@ -2025,7 +2025,7 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
fn point_at_param_definition(&self, err: &mut DiagnosticBuilder<'_>, param: ty::ParamTy) { fn point_at_param_definition(&self, err: &mut DiagnosticBuilder<'_>, param: ty::ParamTy) {
let generics = self.tcx.generics_of(self.body_id.owner.to_def_id()); let generics = self.tcx.generics_of(self.body_id.owner.to_def_id());
let generic_param = generics.type_param(&param, self.tcx); let generic_param = generics.type_param(&param, self.tcx);
if let ty::GenericParamDefKind::Type { synthetic: Some(..), .. } = generic_param.kind { if let ty::GenericParamDefKind::Type { synthetic: true, .. } = generic_param.kind {
return; return;
} }
let param_def_id = generic_param.def_id; let param_def_id = generic_param.def_id;

View File

@ -1490,7 +1490,7 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
Node::GenericParam(param) => { Node::GenericParam(param) => {
let mut impl_trait = false; let mut impl_trait = false;
let has_bounds = let has_bounds =
if let hir::GenericParamKind::Type { synthetic: Some(_), .. } = if let hir::GenericParamKind::Type { synthetic: true, .. } =
&param.kind &param.kind
{ {
// We've found `fn foo(x: impl Trait)` instead of // We've found `fn foo(x: impl Trait)` instead of

View File

@ -1543,7 +1543,7 @@ fn generics_of(tcx: TyCtxt<'_>, def_id: DefId) -> ty::Generics {
kind: ty::GenericParamDefKind::Type { kind: ty::GenericParamDefKind::Type {
has_default: false, has_default: false,
object_lifetime_default: rl::Set1::Empty, object_lifetime_default: rl::Set1::Empty,
synthetic: None, synthetic: false,
}, },
}); });
@ -1673,7 +1673,7 @@ fn generics_of(tcx: TyCtxt<'_>, def_id: DefId) -> ty::Generics {
kind: ty::GenericParamDefKind::Type { kind: ty::GenericParamDefKind::Type {
has_default: false, has_default: false,
object_lifetime_default: rl::Set1::Empty, object_lifetime_default: rl::Set1::Empty,
synthetic: None, synthetic: false,
}, },
})); }));
} }
@ -1690,7 +1690,7 @@ fn generics_of(tcx: TyCtxt<'_>, def_id: DefId) -> ty::Generics {
kind: ty::GenericParamDefKind::Type { kind: ty::GenericParamDefKind::Type {
has_default: false, has_default: false,
object_lifetime_default: rl::Set1::Empty, object_lifetime_default: rl::Set1::Empty,
synthetic: None, synthetic: false,
}, },
}); });
} }

View File

@ -456,9 +456,7 @@ impl Clean<Generics> for hir::Generics<'_> {
// scans them first. // scans them first.
fn is_impl_trait(param: &hir::GenericParam<'_>) -> bool { fn is_impl_trait(param: &hir::GenericParam<'_>) -> bool {
match param.kind { match param.kind {
hir::GenericParamKind::Type { synthetic, .. } => { hir::GenericParamKind::Type { synthetic, .. } => synthetic,
synthetic == Some(hir::SyntheticTyParamKind::ImplTrait)
}
_ => false, _ => false,
} }
} }
@ -557,7 +555,7 @@ impl<'a, 'tcx> Clean<Generics> for (&'a ty::Generics, ty::GenericPredicates<'tcx
assert_eq!(param.index, 0); assert_eq!(param.index, 0);
return None; return None;
} }
if synthetic == Some(hir::SyntheticTyParamKind::ImplTrait) { if synthetic {
impl_trait.insert(param.index.into(), vec![]); impl_trait.insert(param.index.into(), vec![]);
return None; return None;
} }

View File

@ -1238,20 +1238,9 @@ impl WherePredicate {
#[derive(Clone, PartialEq, Eq, Debug, Hash)] #[derive(Clone, PartialEq, Eq, Debug, Hash)]
crate enum GenericParamDefKind { crate enum GenericParamDefKind {
Lifetime { Lifetime { outlives: Vec<Lifetime> },
outlives: Vec<Lifetime>, Type { did: DefId, bounds: Vec<GenericBound>, default: Option<Box<Type>>, synthetic: bool },
}, Const { did: DefId, ty: Box<Type>, default: Option<Box<String>> },
Type {
did: DefId,
bounds: Vec<GenericBound>,
default: Option<Box<Type>>,
synthetic: Option<hir::SyntheticTyParamKind>,
},
Const {
did: DefId,
ty: Box<Type>,
default: Option<Box<String>>,
},
} }
impl GenericParamDefKind { impl GenericParamDefKind {
@ -1285,7 +1274,7 @@ impl GenericParamDef {
crate fn is_synthetic_type_param(&self) -> bool { crate fn is_synthetic_type_param(&self) -> bool {
match self.kind { match self.kind {
GenericParamDefKind::Lifetime { .. } | GenericParamDefKind::Const { .. } => false, GenericParamDefKind::Lifetime { .. } | GenericParamDefKind::Const { .. } => false,
GenericParamDefKind::Type { ref synthetic, .. } => synthetic.is_some(), GenericParamDefKind::Type { synthetic, .. } => synthetic,
} }
} }

View File

@ -1,28 +0,0 @@
#![feature(rustc_attrs)]
fn func<#[rustc_synthetic] T>(_: T) {}
struct Foo;
impl Foo {
pub fn func<#[rustc_synthetic] T>(_: T) {}
}
struct Bar<S> {
t: S
}
impl<S> Bar<S> {
pub fn func<#[rustc_synthetic] T>(_: T) {}
}
fn main() {
func::<u8>(42); //~ ERROR cannot provide explicit generic arguments
func(42); // Ok
Foo::func::<u8>(42); //~ ERROR cannot provide explicit generic arguments
Foo::func(42); // Ok
Bar::<i8>::func::<u8>(42); //~ ERROR cannot provide explicit generic arguments
Bar::<i8>::func(42); // Ok
}

View File

@ -1,30 +0,0 @@
error[E0632]: cannot provide explicit generic arguments when `impl Trait` is used in argument position
--> $DIR/synthetic-param.rs:20:12
|
LL | func::<u8>(42);
| ^^ explicit generic argument not allowed
|
= note: see issue #83701 <https://github.com/rust-lang/rust/issues/83701> for more information
= help: add `#![feature(explicit_generic_args_with_impl_trait)]` to the crate attributes to enable
error[E0632]: cannot provide explicit generic arguments when `impl Trait` is used in argument position
--> $DIR/synthetic-param.rs:23:17
|
LL | Foo::func::<u8>(42);
| ^^ explicit generic argument not allowed
|
= note: see issue #83701 <https://github.com/rust-lang/rust/issues/83701> for more information
= help: add `#![feature(explicit_generic_args_with_impl_trait)]` to the crate attributes to enable
error[E0632]: cannot provide explicit generic arguments when `impl Trait` is used in argument position
--> $DIR/synthetic-param.rs:26:23
|
LL | Bar::<i8>::func::<u8>(42);
| ^^ explicit generic argument not allowed
|
= note: see issue #83701 <https://github.com/rust-lang/rust/issues/83701> for more information
= help: add `#![feature(explicit_generic_args_with_impl_trait)]` to the crate attributes to enable
error: aborting due to 3 previous errors
For more information about this error, try `rustc --explain E0632`.

View File

@ -3,10 +3,8 @@ use clippy_utils::source::snippet;
use clippy_utils::{match_def_path, paths}; use clippy_utils::{match_def_path, paths};
use if_chain::if_chain; use if_chain::if_chain;
use rustc_errors::Applicability; use rustc_errors::Applicability;
use rustc_hir::{ use rustc_hir::{self as hir, GenericArg, GenericBounds, GenericParamKind};
self as hir, GenericArg, GenericBounds, GenericParamKind, HirId, Lifetime, MutTy, Mutability, Node, QPath, use rustc_hir::{HirId, Lifetime, MutTy, Mutability, Node, QPath, TyKind};
SyntheticTyParamKind, TyKind,
};
use rustc_lint::LateContext; use rustc_lint::LateContext;
use super::BORROWED_BOX; use super::BORROWED_BOX;
@ -105,7 +103,7 @@ fn get_bounds_if_impl_trait<'tcx>(cx: &LateContext<'tcx>, qpath: &QPath<'_>, id:
if let Some(did) = cx.qpath_res(qpath, id).opt_def_id(); if let Some(did) = cx.qpath_res(qpath, id).opt_def_id();
if let Some(Node::GenericParam(generic_param)) = cx.tcx.hir().get_if_local(did); if let Some(Node::GenericParam(generic_param)) = cx.tcx.hir().get_if_local(did);
if let GenericParamKind::Type { synthetic, .. } = generic_param.kind; if let GenericParamKind::Type { synthetic, .. } = generic_param.kind;
if synthetic == Some(SyntheticTyParamKind::ImplTrait); if synthetic;
then { then {
Some(generic_param.bounds) Some(generic_param.bounds)
} else { } else {