mirror of
https://github.com/rust-lang/rust.git
synced 2026-04-27 18:57:42 +03:00
Rollup merge of #134984 - compiler-errors:obligation-tweaks, r=lqd
`ObligationCause` construction tweaks in typeck Mostly just consolidating the way we construct obligations in `FnCtxt`.
This commit is contained in:
@@ -7,7 +7,7 @@
|
||||
use rustc_hir::{self as hir, HirId, LangItem};
|
||||
use rustc_hir_analysis::autoderef::Autoderef;
|
||||
use rustc_infer::infer;
|
||||
use rustc_infer::traits::{self, Obligation, ObligationCause, ObligationCauseCode};
|
||||
use rustc_infer::traits::{Obligation, ObligationCause, ObligationCauseCode};
|
||||
use rustc_middle::ty::adjustment::{
|
||||
Adjust, Adjustment, AllowTwoPhase, AutoBorrow, AutoBorrowMutability,
|
||||
};
|
||||
@@ -512,7 +512,7 @@ fn confirm_builtin_call(
|
||||
self.register_bound(
|
||||
ty,
|
||||
self.tcx.require_lang_item(hir::LangItem::Tuple, Some(sp)),
|
||||
traits::ObligationCause::new(sp, self.body_id, ObligationCauseCode::RustCall),
|
||||
self.cause(sp, ObligationCauseCode::RustCall),
|
||||
);
|
||||
self.require_type_is_sized(ty, sp, ObligationCauseCode::RustCall);
|
||||
} else {
|
||||
|
||||
@@ -580,11 +580,7 @@ fn coerce_unsized(&self, mut source: Ty<'tcx>, mut target: Ty<'tcx>) -> CoerceRe
|
||||
let mut selcx = traits::SelectionContext::new(self);
|
||||
|
||||
// Create an obligation for `Source: CoerceUnsized<Target>`.
|
||||
let cause =
|
||||
ObligationCause::new(self.cause.span, self.body_id, ObligationCauseCode::Coercion {
|
||||
source,
|
||||
target,
|
||||
});
|
||||
let cause = self.cause(self.cause.span, ObligationCauseCode::Coercion { source, target });
|
||||
|
||||
// Use a FIFO queue for this custom fulfillment procedure.
|
||||
//
|
||||
|
||||
@@ -22,7 +22,6 @@
|
||||
use rustc_hir_analysis::hir_ty_lowering::{FeedConstTy, HirTyLowerer as _};
|
||||
use rustc_infer::infer;
|
||||
use rustc_infer::infer::{DefineOpaqueTypes, InferOk};
|
||||
use rustc_infer::traits::ObligationCause;
|
||||
use rustc_infer::traits::query::NoSolution;
|
||||
use rustc_middle::ty::adjustment::{Adjust, Adjustment, AllowTwoPhase};
|
||||
use rustc_middle::ty::error::{ExpectedFound, TypeError};
|
||||
@@ -1174,9 +1173,8 @@ fn point_at_return_for_opaque_ty_error(
|
||||
for err in errors {
|
||||
let cause = &mut err.obligation.cause;
|
||||
if let ObligationCauseCode::OpaqueReturnType(None) = cause.code() {
|
||||
let new_cause = ObligationCause::new(
|
||||
let new_cause = self.cause(
|
||||
cause.span,
|
||||
cause.body_id,
|
||||
ObligationCauseCode::OpaqueReturnType(Some((return_expr_ty, hir_id))),
|
||||
);
|
||||
*cause = new_cause;
|
||||
@@ -3856,7 +3854,15 @@ fn check_expr_offset_of(
|
||||
|
||||
// Enums are anyway always sized. But just to safeguard against future
|
||||
// language extensions, let's double-check.
|
||||
self.require_type_is_sized(field_ty, expr.span, ObligationCauseCode::Misc);
|
||||
self.require_type_is_sized(
|
||||
field_ty,
|
||||
expr.span,
|
||||
ObligationCauseCode::FieldSized {
|
||||
adt_kind: AdtKind::Enum,
|
||||
span: self.tcx.def_span(field.did),
|
||||
last: false,
|
||||
},
|
||||
);
|
||||
|
||||
if field.vis.is_accessible_from(sub_def_scope, self.tcx) {
|
||||
self.tcx.check_stability(field.did, Some(expr.hir_id), expr.span, None);
|
||||
@@ -3884,11 +3890,7 @@ fn check_expr_offset_of(
|
||||
let field_ty = self.field_ty(expr.span, field, args);
|
||||
|
||||
if self.tcx.features().offset_of_slice() {
|
||||
self.require_type_has_static_alignment(
|
||||
field_ty,
|
||||
expr.span,
|
||||
ObligationCauseCode::Misc,
|
||||
);
|
||||
self.require_type_has_static_alignment(field_ty, expr.span);
|
||||
} else {
|
||||
self.require_type_is_sized(
|
||||
field_ty,
|
||||
@@ -3917,11 +3919,7 @@ fn check_expr_offset_of(
|
||||
{
|
||||
if let Some(&field_ty) = tys.get(index) {
|
||||
if self.tcx.features().offset_of_slice() {
|
||||
self.require_type_has_static_alignment(
|
||||
field_ty,
|
||||
expr.span,
|
||||
ObligationCauseCode::Misc,
|
||||
);
|
||||
self.require_type_has_static_alignment(field_ty, expr.span);
|
||||
} else {
|
||||
self.require_type_is_sized(
|
||||
field_ty,
|
||||
|
||||
@@ -384,7 +384,7 @@ pub(crate) fn require_type_meets(
|
||||
code: traits::ObligationCauseCode<'tcx>,
|
||||
def_id: DefId,
|
||||
) {
|
||||
self.register_bound(ty, def_id, traits::ObligationCause::new(span, self.body_id, code));
|
||||
self.register_bound(ty, def_id, self.cause(span, code));
|
||||
}
|
||||
|
||||
pub(crate) fn require_type_is_sized(
|
||||
@@ -410,12 +410,7 @@ pub(crate) fn require_type_is_sized_deferred(
|
||||
}
|
||||
}
|
||||
|
||||
pub(crate) fn require_type_has_static_alignment(
|
||||
&self,
|
||||
ty: Ty<'tcx>,
|
||||
span: Span,
|
||||
code: traits::ObligationCauseCode<'tcx>,
|
||||
) {
|
||||
pub(crate) fn require_type_has_static_alignment(&self, ty: Ty<'tcx>, span: Span) {
|
||||
if !ty.references_error() {
|
||||
let tail = self.tcx.struct_tail_raw(
|
||||
ty,
|
||||
@@ -434,7 +429,7 @@ pub(crate) fn require_type_has_static_alignment(
|
||||
} else {
|
||||
// We can't be sure, let's required full `Sized`.
|
||||
let lang_item = self.tcx.require_lang_item(LangItem::Sized, None);
|
||||
self.require_type_meets(ty, span, code, lang_item);
|
||||
self.require_type_meets(ty, span, ObligationCauseCode::Misc, lang_item);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -572,7 +567,7 @@ pub(crate) fn register_wf_obligation(
|
||||
code: traits::ObligationCauseCode<'tcx>,
|
||||
) {
|
||||
// WF obligations never themselves fail, so no real need to give a detailed cause:
|
||||
let cause = traits::ObligationCause::new(span, self.body_id, code);
|
||||
let cause = self.cause(span, code);
|
||||
self.register_predicate(traits::Obligation::new(
|
||||
self.tcx,
|
||||
cause,
|
||||
@@ -1426,9 +1421,7 @@ fn add_required_obligations_with_code(
|
||||
let bounds = self.instantiate_bounds(span, def_id, args);
|
||||
|
||||
for obligation in traits::predicates_for_generics(
|
||||
|idx, predicate_span| {
|
||||
traits::ObligationCause::new(span, self.body_id, code(idx, predicate_span))
|
||||
},
|
||||
|idx, predicate_span| self.cause(span, code(idx, predicate_span)),
|
||||
param_env,
|
||||
bounds,
|
||||
) {
|
||||
@@ -1561,7 +1554,7 @@ pub(crate) fn probe_instantiate_query_response(
|
||||
query_result: &Canonical<'tcx, QueryResponse<'tcx, Ty<'tcx>>>,
|
||||
) -> InferResult<'tcx, Ty<'tcx>> {
|
||||
self.instantiate_query_response_and_region_obligations(
|
||||
&traits::ObligationCause::misc(span, self.body_id),
|
||||
&self.misc(span),
|
||||
self.param_env,
|
||||
original_values,
|
||||
query_result,
|
||||
|
||||
@@ -207,7 +207,7 @@ pub(in super::super) fn check_argument_types(
|
||||
self.register_wf_obligation(
|
||||
fn_input_ty.into(),
|
||||
arg_expr.span,
|
||||
ObligationCauseCode::Misc,
|
||||
ObligationCauseCode::WellFormed(None),
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
@@ -601,7 +601,7 @@ fn add_obligations(
|
||||
self.call_expr.hir_id,
|
||||
idx,
|
||||
);
|
||||
traits::ObligationCause::new(self.span, self.body_id, code)
|
||||
self.cause(self.span, code)
|
||||
},
|
||||
self.param_env,
|
||||
method_predicates,
|
||||
|
||||
@@ -1739,8 +1739,8 @@ fn select_trait_candidate(
|
||||
&self,
|
||||
trait_ref: ty::TraitRef<'tcx>,
|
||||
) -> traits::SelectionResult<'tcx, traits::Selection<'tcx>> {
|
||||
let cause = traits::ObligationCause::misc(self.span, self.body_id);
|
||||
let obligation = traits::Obligation::new(self.tcx, cause, self.param_env, trait_ref);
|
||||
let obligation =
|
||||
traits::Obligation::new(self.tcx, self.misc(self.span), self.param_env, trait_ref);
|
||||
traits::SelectionContext::new(self).select(&obligation)
|
||||
}
|
||||
|
||||
@@ -1841,7 +1841,7 @@ fn consider_probe(
|
||||
self.scope_expr_id,
|
||||
idx,
|
||||
);
|
||||
ObligationCause::new(self.span, self.body_id, code)
|
||||
self.cause(self.span, code)
|
||||
},
|
||||
self.param_env,
|
||||
impl_bounds,
|
||||
|
||||
@@ -105,8 +105,7 @@ fn predicate_bounds_generic_param<'tcx>(
|
||||
return false;
|
||||
};
|
||||
let trait_ref = ty::TraitRef::new(self.tcx, into_iterator_trait, [ty]);
|
||||
let cause = ObligationCause::new(span, self.body_id, ObligationCauseCode::Misc);
|
||||
let obligation = Obligation::new(self.tcx, cause, self.param_env, trait_ref);
|
||||
let obligation = Obligation::new(self.tcx, self.misc(span), self.param_env, trait_ref);
|
||||
if !self.predicate_must_hold_modulo_regions(&obligation) {
|
||||
return false;
|
||||
}
|
||||
@@ -3489,7 +3488,7 @@ fn suggest_traits_to_import(
|
||||
let pred = ty::TraitRef::new(self.tcx, unpin_trait, [*rcvr_ty]);
|
||||
let unpin = self.predicate_must_hold_considering_regions(&Obligation::new(
|
||||
self.tcx,
|
||||
ObligationCause::misc(rcvr.span, self.body_id),
|
||||
self.misc(rcvr.span),
|
||||
self.param_env,
|
||||
pred,
|
||||
));
|
||||
|
||||
Reference in New Issue
Block a user