mirror of https://github.com/rust-lang/rust.git
Add and use generics.is_empty() and generics.is_own_empty, rather than using generics' attributes
This commit is contained in:
parent
84b9b6d16c
commit
4501ae89f1
|
@ -432,7 +432,7 @@ fn check_gat_where_clauses(tcx: TyCtxt<'_>, trait_def_id: LocalDefId) {
|
||||||
}
|
}
|
||||||
let gat_generics = tcx.generics_of(gat_def_id);
|
let gat_generics = tcx.generics_of(gat_def_id);
|
||||||
// FIXME(jackh726): we can also warn in the more general case
|
// FIXME(jackh726): we can also warn in the more general case
|
||||||
if gat_generics.own_params.is_empty() {
|
if gat_generics.is_own_empty() {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1409,7 +1409,7 @@ fn generics_args_err_extend<'a>(
|
||||||
// it was done based on the end of assoc segment but that sometimes
|
// it was done based on the end of assoc segment but that sometimes
|
||||||
// led to impossible spans and caused issues like #116473
|
// led to impossible spans and caused issues like #116473
|
||||||
let args_span = args.span_ext.with_lo(args.span_ext.lo() - BytePos(2));
|
let args_span = args.span_ext.with_lo(args.span_ext.lo() - BytePos(2));
|
||||||
if tcx.generics_of(adt_def.did()).count() == 0 {
|
if tcx.generics_of(adt_def.did()).is_empty() {
|
||||||
// FIXME(estebank): we could also verify that the arguments being
|
// FIXME(estebank): we could also verify that the arguments being
|
||||||
// work for the `enum`, instead of just looking if it takes *any*.
|
// work for the `enum`, instead of just looking if it takes *any*.
|
||||||
err.span_suggestion_verbose(
|
err.span_suggestion_verbose(
|
||||||
|
|
|
@ -412,7 +412,7 @@ impl<'tcx> dyn HirTyLowerer<'tcx> + '_ {
|
||||||
// Traits always have `Self` as a generic parameter, which means they will not return early
|
// Traits always have `Self` as a generic parameter, which means they will not return early
|
||||||
// here and so associated type bindings will be handled regardless of whether there are any
|
// here and so associated type bindings will be handled regardless of whether there are any
|
||||||
// non-`Self` generic parameters.
|
// non-`Self` generic parameters.
|
||||||
if generics.own_params.is_empty() {
|
if generics.is_own_empty() {
|
||||||
return (tcx.mk_args(parent_args), arg_count);
|
return (tcx.mk_args(parent_args), arg_count);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -181,7 +181,7 @@ pub fn check_crate(tcx: TyCtxt<'_>) {
|
||||||
let def_kind = tcx.def_kind(item_def_id);
|
let def_kind = tcx.def_kind(item_def_id);
|
||||||
match def_kind {
|
match def_kind {
|
||||||
DefKind::Static { .. } => tcx.ensure().eval_static_initializer(item_def_id),
|
DefKind::Static { .. } => tcx.ensure().eval_static_initializer(item_def_id),
|
||||||
DefKind::Const if tcx.generics_of(item_def_id).own_params.is_empty() => {
|
DefKind::Const if tcx.generics_of(item_def_id).is_empty() => {
|
||||||
let instance = ty::Instance::new(item_def_id.into(), ty::GenericArgs::empty());
|
let instance = ty::Instance::new(item_def_id.into(), ty::GenericArgs::empty());
|
||||||
let cid = GlobalId { instance, promoted: None };
|
let cid = GlobalId { instance, promoted: None };
|
||||||
let param_env = ty::ParamEnv::reveal_all();
|
let param_env = ty::ParamEnv::reveal_all();
|
||||||
|
|
|
@ -99,7 +99,7 @@ impl<'a, 'tcx> ConstraintContext<'a, 'tcx> {
|
||||||
debug!("build_constraints_for_item({})", tcx.def_path_str(def_id));
|
debug!("build_constraints_for_item({})", tcx.def_path_str(def_id));
|
||||||
|
|
||||||
// Skip items with no generics - there's nothing to infer in them.
|
// Skip items with no generics - there's nothing to infer in them.
|
||||||
if tcx.generics_of(def_id).count() == 0 {
|
if tcx.generics_of(def_id).is_empty() {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -41,7 +41,7 @@ fn crate_variances(tcx: TyCtxt<'_>, (): ()) -> CrateVariancesMap<'_> {
|
||||||
|
|
||||||
fn variances_of(tcx: TyCtxt<'_>, item_def_id: LocalDefId) -> &[ty::Variance] {
|
fn variances_of(tcx: TyCtxt<'_>, item_def_id: LocalDefId) -> &[ty::Variance] {
|
||||||
// Skip items with no generics - there's nothing to infer in them.
|
// Skip items with no generics - there's nothing to infer in them.
|
||||||
if tcx.generics_of(item_def_id).count() == 0 {
|
if tcx.generics_of(item_def_id).is_empty() {
|
||||||
return &[];
|
return &[];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -451,7 +451,7 @@ impl<'a, 'tcx> ConfirmContext<'a, 'tcx> {
|
||||||
// `foo.bar::<u32>(...)` -- the `Self` type here will be the
|
// `foo.bar::<u32>(...)` -- the `Self` type here will be the
|
||||||
// type of `foo` (possibly adjusted), but we don't want to
|
// type of `foo` (possibly adjusted), but we don't want to
|
||||||
// include that. We want just the `[_, u32]` part.
|
// include that. We want just the `[_, u32]` part.
|
||||||
if !args.is_empty() && !generics.own_params.is_empty() {
|
if !args.is_empty() && !generics.is_own_empty() {
|
||||||
let user_type_annotation = self.probe(|_| {
|
let user_type_annotation = self.probe(|_| {
|
||||||
let user_args = UserArgs {
|
let user_args = UserArgs {
|
||||||
args: GenericArgs::for_item(self.tcx, pick.item.def_id, |param, _| {
|
args: GenericArgs::for_item(self.tcx, pick.item.def_id, |param, _| {
|
||||||
|
|
|
@ -279,7 +279,7 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
|
||||||
if !self_ty_name.contains('<') {
|
if !self_ty_name.contains('<') {
|
||||||
if let ty::Adt(def, _) = self_ty.kind() {
|
if let ty::Adt(def, _) = self_ty.kind() {
|
||||||
let generics = self.tcx.generics_of(def.did());
|
let generics = self.tcx.generics_of(def.did());
|
||||||
if !generics.own_params.is_empty() {
|
if !generics.is_own_empty() {
|
||||||
let counts = generics.own_counts();
|
let counts = generics.own_counts();
|
||||||
self_ty_name += &format!(
|
self_ty_name += &format!(
|
||||||
"<{}>",
|
"<{}>",
|
||||||
|
|
|
@ -1754,7 +1754,7 @@ impl<'a, 'tcx> ProbeContext<'a, 'tcx> {
|
||||||
let generics = self.tcx.generics_of(method);
|
let generics = self.tcx.generics_of(method);
|
||||||
assert_eq!(args.len(), generics.parent_count);
|
assert_eq!(args.len(), generics.parent_count);
|
||||||
|
|
||||||
let xform_fn_sig = if generics.own_params.is_empty() {
|
let xform_fn_sig = if generics.is_own_empty() {
|
||||||
fn_sig.instantiate(self.tcx, args)
|
fn_sig.instantiate(self.tcx, args)
|
||||||
} else {
|
} else {
|
||||||
let args = GenericArgs::for_item(self.tcx, method, |param, _| {
|
let args = GenericArgs::for_item(self.tcx, method, |param, _| {
|
||||||
|
|
|
@ -391,6 +391,14 @@ impl<'tcx> Generics {
|
||||||
}
|
}
|
||||||
false
|
false
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn is_empty(&'tcx self) -> bool {
|
||||||
|
self.count() == 0
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn is_own_empty(&'tcx self) -> bool {
|
||||||
|
self.own_params.is_empty()
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Bounds on generics.
|
/// Bounds on generics.
|
||||||
|
|
|
@ -160,7 +160,7 @@ pub trait Printer<'tcx>: Sized {
|
||||||
// If we have any generic arguments to print, we do that
|
// If we have any generic arguments to print, we do that
|
||||||
// on top of the same path, but without its own generics.
|
// on top of the same path, but without its own generics.
|
||||||
_ => {
|
_ => {
|
||||||
if !generics.own_params.is_empty() && args.len() >= generics.count() {
|
if !generics.is_own_empty() && args.len() >= generics.count() {
|
||||||
let args = generics.own_args_no_defaults(self.tcx(), args);
|
let args = generics.own_args_no_defaults(self.tcx(), args);
|
||||||
return self.path_generic_args(
|
return self.path_generic_args(
|
||||||
|cx| cx.print_def_path(def_id, parent_args),
|
|cx| cx.print_def_path(def_id, parent_args),
|
||||||
|
|
|
@ -1429,7 +1429,7 @@ impl<'v> RootCollector<'_, 'v> {
|
||||||
match self.tcx.def_kind(id.owner_id) {
|
match self.tcx.def_kind(id.owner_id) {
|
||||||
DefKind::Enum | DefKind::Struct | DefKind::Union => {
|
DefKind::Enum | DefKind::Struct | DefKind::Union => {
|
||||||
if self.strategy == MonoItemCollectionStrategy::Eager
|
if self.strategy == MonoItemCollectionStrategy::Eager
|
||||||
&& self.tcx.generics_of(id.owner_id).count() == 0
|
&& self.tcx.generics_of(id.owner_id).is_empty()
|
||||||
{
|
{
|
||||||
debug!("RootCollector: ADT drop-glue for `{id:?}`",);
|
debug!("RootCollector: ADT drop-glue for `{id:?}`",);
|
||||||
|
|
||||||
|
|
|
@ -51,7 +51,7 @@ fn unused_generic_params<'tcx>(
|
||||||
debug!(?generics);
|
debug!(?generics);
|
||||||
|
|
||||||
// Exit early when there are no parameters to be unused.
|
// Exit early when there are no parameters to be unused.
|
||||||
if generics.count() == 0 {
|
if generics.is_empty() {
|
||||||
return UnusedGenericParams::new_all_used();
|
return UnusedGenericParams::new_all_used();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -398,7 +398,7 @@ pub fn object_safety_violations_for_assoc_item(
|
||||||
// Associated types can only be object safe if they have `Self: Sized` bounds.
|
// Associated types can only be object safe if they have `Self: Sized` bounds.
|
||||||
ty::AssocKind::Type => {
|
ty::AssocKind::Type => {
|
||||||
if !tcx.features().generic_associated_types_extended
|
if !tcx.features().generic_associated_types_extended
|
||||||
&& !tcx.generics_of(item.def_id).own_params.is_empty()
|
&& !tcx.generics_of(item.def_id).is_own_empty()
|
||||||
&& !item.is_impl_trait_in_trait()
|
&& !item.is_impl_trait_in_trait()
|
||||||
{
|
{
|
||||||
vec![ObjectSafetyViolation::GAT(item.name, item.ident(tcx).span)]
|
vec![ObjectSafetyViolation::GAT(item.name, item.ident(tcx).span)]
|
||||||
|
|
|
@ -619,7 +619,7 @@ impl<'cx, 'tcx> SelectionContext<'cx, 'tcx> {
|
||||||
// higher-ranked things.
|
// higher-ranked things.
|
||||||
// Prevent, e.g., `dyn Iterator<Item = str>`.
|
// Prevent, e.g., `dyn Iterator<Item = str>`.
|
||||||
for bound in self.tcx().item_bounds(assoc_type).transpose_iter() {
|
for bound in self.tcx().item_bounds(assoc_type).transpose_iter() {
|
||||||
let arg_bound = if defs.count() == 0 {
|
let arg_bound = if defs.is_empty() {
|
||||||
bound.instantiate(tcx, trait_predicate.trait_ref.args)
|
bound.instantiate(tcx, trait_predicate.trait_ref.args)
|
||||||
} else {
|
} else {
|
||||||
let mut args = smallvec::SmallVec::with_capacity(defs.count());
|
let mut args = smallvec::SmallVec::with_capacity(defs.count());
|
||||||
|
|
|
@ -1781,7 +1781,7 @@ impl<'cx, 'tcx> SelectionContext<'cx, 'tcx> {
|
||||||
// FIXME(generic-associated-types): This only detects one layer of inference,
|
// FIXME(generic-associated-types): This only detects one layer of inference,
|
||||||
// which is probably not what we actually want, but fixing it causes some ambiguity:
|
// which is probably not what we actually want, but fixing it causes some ambiguity:
|
||||||
// <https://github.com/rust-lang/rust/issues/125196>.
|
// <https://github.com/rust-lang/rust/issues/125196>.
|
||||||
if !generics.own_params.is_empty()
|
if !generics.is_own_empty()
|
||||||
&& obligation.predicate.args[generics.parent_count..].iter().any(|&p| {
|
&& obligation.predicate.args[generics.parent_count..].iter().any(|&p| {
|
||||||
p.has_non_region_infer()
|
p.has_non_region_infer()
|
||||||
&& match p.unpack() {
|
&& match p.unpack() {
|
||||||
|
|
|
@ -225,7 +225,7 @@ impl {self_ty_without_ref} {{
|
||||||
&& let ImplItemKind::Fn(sig, _) = item.kind
|
&& let ImplItemKind::Fn(sig, _) = item.kind
|
||||||
&& let FnRetTy::Return(ret) = sig.decl.output
|
&& let FnRetTy::Return(ret) = sig.decl.output
|
||||||
&& is_nameable_in_impl_trait(ret)
|
&& is_nameable_in_impl_trait(ret)
|
||||||
&& cx.tcx.generics_of(item_did).own_params.is_empty()
|
&& cx.tcx.generics_of(item_did).is_own_empty()
|
||||||
&& sig.decl.implicit_self == expected_implicit_self
|
&& sig.decl.implicit_self == expected_implicit_self
|
||||||
&& sig.decl.inputs.len() == 1
|
&& sig.decl.inputs.len() == 1
|
||||||
&& let Some(imp) = get_parent_as_impl(cx.tcx, item.hir_id())
|
&& let Some(imp) = get_parent_as_impl(cx.tcx, item.hir_id())
|
||||||
|
|
|
@ -176,7 +176,7 @@ fn qpath_certainty(cx: &LateContext<'_>, qpath: &QPath<'_>, resolves_to_type: bo
|
||||||
.get(*lang_item)
|
.get(*lang_item)
|
||||||
.map_or(Certainty::Uncertain, |def_id| {
|
.map_or(Certainty::Uncertain, |def_id| {
|
||||||
let generics = cx.tcx.generics_of(def_id);
|
let generics = cx.tcx.generics_of(def_id);
|
||||||
if generics.parent_count == 0 && generics.own_params.is_empty() {
|
if generics.is_empty() {
|
||||||
Certainty::Certain(if resolves_to_type { Some(def_id) } else { None })
|
Certainty::Certain(if resolves_to_type { Some(def_id) } else { None })
|
||||||
} else {
|
} else {
|
||||||
Certainty::Uncertain
|
Certainty::Uncertain
|
||||||
|
|
Loading…
Reference in New Issue