diff --git a/src/librustc_middle/traits/mod.rs b/src/librustc_middle/traits/mod.rs index d47e2d75fba3..c129b574fd38 100644 --- a/src/librustc_middle/traits/mod.rs +++ b/src/librustc_middle/traits/mod.rs @@ -6,7 +6,6 @@ pub mod query; pub mod select; pub mod specialization_graph; mod structural_impls; -pub mod util; use crate::mir::interpret::ErrorHandled; use crate::ty::subst::SubstsRef; diff --git a/src/librustc_middle/traits/specialization_graph.rs b/src/librustc_middle/traits/specialization_graph.rs index f66f94fe8c16..a2793f980500 100644 --- a/src/librustc_middle/traits/specialization_graph.rs +++ b/src/librustc_middle/traits/specialization_graph.rs @@ -211,7 +211,7 @@ impl<'tcx> Ancestors<'tcx> { if let Some(item) = node.item(tcx, trait_item_name, trait_item_kind, trait_def_id) { if finalizing_node.is_none() { let is_specializable = item.defaultness.is_default() - || super::util::impl_is_default(tcx, node.def_id()); + || tcx.impl_defaultness(node.def_id()).is_default(); if !is_specializable { finalizing_node = Some(node); diff --git a/src/librustc_middle/traits/util.rs b/src/librustc_middle/traits/util.rs deleted file mode 100644 index cb29cf0760eb..000000000000 --- a/src/librustc_middle/traits/util.rs +++ /dev/null @@ -1,17 +0,0 @@ -use crate::ty::TyCtxt; -use rustc_hir as hir; -use rustc_hir::def_id::DefId; - -pub fn impl_is_default(tcx: TyCtxt<'_>, node_item_def_id: DefId) -> bool { - match tcx.hir().as_local_hir_id(node_item_def_id) { - Some(hir_id) => { - let item = tcx.hir().expect_item(hir_id); - if let hir::ItemKind::Impl { defaultness, .. } = item.kind { - defaultness.is_default() - } else { - false - } - } - None => tcx.impl_defaultness(node_item_def_id).is_default(), - } -} diff --git a/src/librustc_trait_selection/traits/util.rs b/src/librustc_trait_selection/traits/util.rs index c28628678a93..6348673dab8b 100644 --- a/src/librustc_trait_selection/traits/util.rs +++ b/src/librustc_trait_selection/traits/util.rs @@ -8,7 +8,6 @@ use rustc_hir::def_id::DefId; use rustc_middle::ty::outlives::Component; use rustc_middle::ty::subst::{GenericArg, Subst, SubstsRef}; use rustc_middle::ty::{self, ToPolyTraitRef, ToPredicate, Ty, TyCtxt, WithConstness}; -use rustc_middle::traits::util::impl_is_default; use super::{Normalized, Obligation, ObligationCause, PredicateObligation, SelectionContext}; @@ -652,7 +651,7 @@ pub fn generator_trait_ref_and_outputs( } pub fn impl_item_is_final(tcx: TyCtxt<'_>, assoc_item: &ty::AssocItem) -> bool { - assoc_item.defaultness.is_final() && !impl_is_default(tcx, assoc_item.container.id()) + assoc_item.defaultness.is_final() && tcx.impl_defaultness(assoc_item.container.id()).is_final() } pub enum TupleArgumentsFlag { diff --git a/src/librustc_ty/ty.rs b/src/librustc_ty/ty.rs index 9d28447e212a..aefe61f60b87 100644 --- a/src/librustc_ty/ty.rs +++ b/src/librustc_ty/ty.rs @@ -165,6 +165,16 @@ fn associated_item(tcx: TyCtxt<'_>, def_id: DefId) -> ty::AssocItem { ) } +fn impl_defaultness(tcx: TyCtxt<'_>, def_id: DefId) -> hir::Defaultness { + let hir_id = tcx.hir().as_local_hir_id(def_id).unwrap(); + let item = tcx.hir().expect_item(hir_id); + if let hir::ItemKind::Impl { defaultness, .. } = item.kind { + defaultness + } else { + bug!("`impl_defaultness` called on {:?}", item); + } +} + /// Calculates the `Sized` constraint. /// /// In fact, there are only a few options for the types in the constraint: @@ -371,6 +381,7 @@ pub fn provide(providers: &mut ty::query::Providers<'_>) { crate_hash, instance_def_size_estimate, issue33140_self_ty, + impl_defaultness, ..*providers }; } diff --git a/src/librustc_typeck/check/mod.rs b/src/librustc_typeck/check/mod.rs index c85b5a4f2a25..3823efe9d927 100644 --- a/src/librustc_typeck/check/mod.rs +++ b/src/librustc_typeck/check/mod.rs @@ -110,7 +110,6 @@ use rustc_infer::infer::{self, InferCtxt, InferOk, InferResult, TyCtxtInferExt}; use rustc_middle::hir::map::blocks::FnLikeNode; use rustc_middle::middle::region; use rustc_middle::mir::interpret::ConstValue; -use rustc_middle::traits::util::impl_is_default; use rustc_middle::ty::adjustment::{ Adjust, Adjustment, AllowTwoPhase, AutoBorrow, AutoBorrowMutability, PointerCast, }; @@ -1943,7 +1942,7 @@ fn check_specialization_validity<'tcx>( // grandparent. In that case, if parent is a `default impl`, inherited items use the // "defaultness" from the grandparent, else they are final. None => { - if impl_is_default(tcx, parent_impl.def_id()) { + if tcx.impl_defaultness(parent_impl.def_id()).is_default() { None } else { Some(Err(parent_impl.def_id())) @@ -2118,7 +2117,7 @@ fn check_impl_items_against_trait<'tcx>( .map(|node_item| !node_item.defining_node.is_from_trait()) .unwrap_or(false); - if !is_implemented && !impl_is_default(tcx, impl_id) { + if !is_implemented && tcx.impl_defaultness(impl_id).is_final() { if !trait_item.defaultness.has_value() { missing_items.push(*trait_item); }