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:
parent
6414e0b5b3
commit
91e02177a1
@ -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)
|
||||||
|
@ -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)),
|
||||||
|
@ -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> {
|
||||||
|
@ -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,
|
|
||||||
),
|
|
||||||
..
|
|
||||||
}
|
|
||||||
)
|
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -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())
|
||||||
|
@ -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,
|
||||||
|
@ -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(
|
||||||
|
@ -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 {
|
||||||
|
@ -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()?;
|
||||||
|
@ -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(¶m, self.tcx);
|
let generic_param = generics.type_param(¶m, 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;
|
||||||
|
@ -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, .. } =
|
||||||
¶m.kind
|
¶m.kind
|
||||||
{
|
{
|
||||||
// We've found `fn foo(x: impl Trait)` instead of
|
// We've found `fn foo(x: impl Trait)` instead of
|
||||||
|
@ -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,
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
@ -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;
|
||||||
}
|
}
|
||||||
|
@ -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,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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
|
|
||||||
}
|
|
@ -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`.
|
|
@ -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 {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user