Use is_lang_item more aggressively
This commit is contained in:
@@ -67,9 +67,9 @@ impl<'cx, 'tcx> SelectionContext<'cx, 'tcx> {
|
||||
// Other bounds. Consider both in-scope bounds from fn decl
|
||||
// and applicable impls. There is a certain set of precedence rules here.
|
||||
let def_id = obligation.predicate.def_id();
|
||||
let lang_items = self.tcx().lang_items();
|
||||
let tcx = self.tcx();
|
||||
|
||||
if lang_items.copy_trait() == Some(def_id) {
|
||||
if tcx.is_lang_item(def_id, LangItem::Copy) {
|
||||
debug!(obligation_self_ty = ?obligation.predicate.skip_binder().self_ty());
|
||||
|
||||
// User-defined copy impls are permitted, but only for
|
||||
@@ -79,16 +79,16 @@ impl<'cx, 'tcx> SelectionContext<'cx, 'tcx> {
|
||||
// For other types, we'll use the builtin rules.
|
||||
let copy_conditions = self.copy_clone_conditions(obligation);
|
||||
self.assemble_builtin_bound_candidates(copy_conditions, &mut candidates);
|
||||
} else if lang_items.discriminant_kind_trait() == Some(def_id) {
|
||||
} else if tcx.is_lang_item(def_id, LangItem::DiscriminantKind) {
|
||||
// `DiscriminantKind` is automatically implemented for every type.
|
||||
candidates.vec.push(BuiltinCandidate { has_nested: false });
|
||||
} else if lang_items.async_destruct_trait() == Some(def_id) {
|
||||
} else if tcx.is_lang_item(def_id, LangItem::AsyncDestruct) {
|
||||
// `AsyncDestruct` is automatically implemented for every type.
|
||||
candidates.vec.push(BuiltinCandidate { has_nested: false });
|
||||
} else if lang_items.pointee_trait() == Some(def_id) {
|
||||
} else if tcx.is_lang_item(def_id, LangItem::PointeeTrait) {
|
||||
// `Pointee` is automatically implemented for every type.
|
||||
candidates.vec.push(BuiltinCandidate { has_nested: false });
|
||||
} else if lang_items.sized_trait() == Some(def_id) {
|
||||
} else if tcx.is_lang_item(def_id, LangItem::Sized) {
|
||||
// Sized is never implementable by end-users, it is
|
||||
// always automatically computed.
|
||||
|
||||
@@ -101,22 +101,22 @@ impl<'cx, 'tcx> SelectionContext<'cx, 'tcx> {
|
||||
|
||||
let sized_conditions = self.sized_conditions(obligation);
|
||||
self.assemble_builtin_bound_candidates(sized_conditions, &mut candidates);
|
||||
} else if lang_items.unsize_trait() == Some(def_id) {
|
||||
} else if tcx.is_lang_item(def_id, LangItem::Unsize) {
|
||||
self.assemble_candidates_for_unsizing(obligation, &mut candidates);
|
||||
} else if lang_items.destruct_trait() == Some(def_id) {
|
||||
} else if tcx.is_lang_item(def_id, LangItem::Destruct) {
|
||||
self.assemble_const_destruct_candidates(obligation, &mut candidates);
|
||||
} else if lang_items.transmute_trait() == Some(def_id) {
|
||||
} else if tcx.is_lang_item(def_id, LangItem::TransmuteTrait) {
|
||||
// User-defined transmutability impls are permitted.
|
||||
self.assemble_candidates_from_impls(obligation, &mut candidates);
|
||||
self.assemble_candidates_for_transmutability(obligation, &mut candidates);
|
||||
} else if lang_items.tuple_trait() == Some(def_id) {
|
||||
} else if tcx.is_lang_item(def_id, LangItem::Tuple) {
|
||||
self.assemble_candidate_for_tuple(obligation, &mut candidates);
|
||||
} else if lang_items.pointer_like() == Some(def_id) {
|
||||
} else if tcx.is_lang_item(def_id, LangItem::PointerLike) {
|
||||
self.assemble_candidate_for_pointer_like(obligation, &mut candidates);
|
||||
} else if lang_items.fn_ptr_trait() == Some(def_id) {
|
||||
} else if tcx.is_lang_item(def_id, LangItem::FnPtrTrait) {
|
||||
self.assemble_candidates_for_fn_ptr_trait(obligation, &mut candidates);
|
||||
} else {
|
||||
if lang_items.clone_trait() == Some(def_id) {
|
||||
if tcx.is_lang_item(def_id, LangItem::Clone) {
|
||||
// Same builtin conditions as `Copy`, i.e., every type which has builtin support
|
||||
// for `Copy` also has builtin support for `Clone`, and tuples/arrays of `Clone`
|
||||
// types have builtin support for `Clone`.
|
||||
@@ -124,17 +124,17 @@ impl<'cx, 'tcx> SelectionContext<'cx, 'tcx> {
|
||||
self.assemble_builtin_bound_candidates(clone_conditions, &mut candidates);
|
||||
}
|
||||
|
||||
if lang_items.coroutine_trait() == Some(def_id) {
|
||||
if tcx.is_lang_item(def_id, LangItem::Coroutine) {
|
||||
self.assemble_coroutine_candidates(obligation, &mut candidates);
|
||||
} else if lang_items.future_trait() == Some(def_id) {
|
||||
} else if tcx.is_lang_item(def_id, LangItem::Future) {
|
||||
self.assemble_future_candidates(obligation, &mut candidates);
|
||||
} else if lang_items.iterator_trait() == Some(def_id) {
|
||||
} else if tcx.is_lang_item(def_id, LangItem::Iterator) {
|
||||
self.assemble_iterator_candidates(obligation, &mut candidates);
|
||||
} else if lang_items.fused_iterator_trait() == Some(def_id) {
|
||||
} else if tcx.is_lang_item(def_id, LangItem::FusedIterator) {
|
||||
self.assemble_fused_iterator_candidates(obligation, &mut candidates);
|
||||
} else if lang_items.async_iterator_trait() == Some(def_id) {
|
||||
} else if tcx.is_lang_item(def_id, LangItem::AsyncIterator) {
|
||||
self.assemble_async_iterator_candidates(obligation, &mut candidates);
|
||||
} else if lang_items.async_fn_kind_helper() == Some(def_id) {
|
||||
} else if tcx.is_lang_item(def_id, LangItem::AsyncFnKindHelper) {
|
||||
self.assemble_async_fn_kind_helper_candidates(obligation, &mut candidates);
|
||||
}
|
||||
|
||||
@@ -755,7 +755,7 @@ impl<'cx, 'tcx> SelectionContext<'cx, 'tcx> {
|
||||
candidates.ambiguous = true;
|
||||
}
|
||||
ty::Coroutine(coroutine_def_id, _)
|
||||
if self.tcx().lang_items().unpin_trait() == Some(def_id) =>
|
||||
if self.tcx().is_lang_item(def_id, LangItem::Unpin) =>
|
||||
{
|
||||
match self.tcx().coroutine_movability(coroutine_def_id) {
|
||||
hir::Movability::Static => {
|
||||
|
||||
@@ -258,16 +258,16 @@ impl<'cx, 'tcx> SelectionContext<'cx, 'tcx> {
|
||||
) -> Vec<PredicateObligation<'tcx>> {
|
||||
debug!(?obligation, ?has_nested, "confirm_builtin_candidate");
|
||||
|
||||
let lang_items = self.tcx().lang_items();
|
||||
let tcx = self.tcx();
|
||||
let obligations = if has_nested {
|
||||
let trait_def = obligation.predicate.def_id();
|
||||
let conditions = if Some(trait_def) == lang_items.sized_trait() {
|
||||
let conditions = if tcx.is_lang_item(trait_def, LangItem::Sized) {
|
||||
self.sized_conditions(obligation)
|
||||
} else if Some(trait_def) == lang_items.copy_trait() {
|
||||
} else if tcx.is_lang_item(trait_def, LangItem::Copy) {
|
||||
self.copy_clone_conditions(obligation)
|
||||
} else if Some(trait_def) == lang_items.clone_trait() {
|
||||
} else if tcx.is_lang_item(trait_def, LangItem::Clone) {
|
||||
self.copy_clone_conditions(obligation)
|
||||
} else if Some(trait_def) == lang_items.fused_iterator_trait() {
|
||||
} else if tcx.is_lang_item(trait_def, LangItem::FusedIterator) {
|
||||
self.fused_iterator_conditions(obligation)
|
||||
} else {
|
||||
bug!("unexpected builtin trait {:?}", trait_def)
|
||||
@@ -1444,7 +1444,7 @@ impl<'cx, 'tcx> SelectionContext<'cx, 'tcx> {
|
||||
| ty::Foreign(_) => {}
|
||||
|
||||
// `ManuallyDrop` is trivially drop
|
||||
ty::Adt(def, _) if Some(def.did()) == tcx.lang_items().manually_drop() => {}
|
||||
ty::Adt(def, _) if def.is_manually_drop() => {}
|
||||
|
||||
// These types are built-in, so we can fast-track by registering
|
||||
// nested predicates for their constituent type(s)
|
||||
|
||||
@@ -32,6 +32,7 @@ use rustc_data_structures::stack::ensure_sufficient_stack;
|
||||
use rustc_errors::{Diag, EmissionGuarantee};
|
||||
use rustc_hir as hir;
|
||||
use rustc_hir::def_id::DefId;
|
||||
use rustc_hir::LangItem;
|
||||
use rustc_infer::infer::relate::TypeRelation;
|
||||
use rustc_infer::infer::BoundRegionConversionTime;
|
||||
use rustc_infer::infer::BoundRegionConversionTime::HigherRankedType;
|
||||
@@ -2800,19 +2801,18 @@ impl<'tcx> SelectionContext<'_, 'tcx> {
|
||||
let predicates = predicates.instantiate_own(tcx, args);
|
||||
let mut obligations = Vec::with_capacity(predicates.len());
|
||||
for (index, (predicate, span)) in predicates.into_iter().enumerate() {
|
||||
let cause =
|
||||
if Some(parent_trait_pred.def_id()) == tcx.lang_items().coerce_unsized_trait() {
|
||||
cause.clone()
|
||||
} else {
|
||||
cause.clone().derived_cause(parent_trait_pred, |derived| {
|
||||
ObligationCauseCode::ImplDerived(Box::new(ImplDerivedCause {
|
||||
derived,
|
||||
impl_or_alias_def_id: def_id,
|
||||
impl_def_predicate_index: Some(index),
|
||||
span,
|
||||
}))
|
||||
})
|
||||
};
|
||||
let cause = if tcx.is_lang_item(parent_trait_pred.def_id(), LangItem::CoerceUnsized) {
|
||||
cause.clone()
|
||||
} else {
|
||||
cause.clone().derived_cause(parent_trait_pred, |derived| {
|
||||
ObligationCauseCode::ImplDerived(Box::new(ImplDerivedCause {
|
||||
derived,
|
||||
impl_or_alias_def_id: def_id,
|
||||
impl_def_predicate_index: Some(index),
|
||||
span,
|
||||
}))
|
||||
})
|
||||
};
|
||||
let clause = normalize_with_depth_to(
|
||||
self,
|
||||
param_env,
|
||||
|
||||
Reference in New Issue
Block a user