1
Fork 0

Make the derived obligation cause parent private

This commit is contained in:
Oli Scherer 2022-05-10 11:10:27 +00:00
parent 5b5b549580
commit 9ba6ddb929
4 changed files with 21 additions and 14 deletions

View file

@ -497,7 +497,15 @@ pub struct DerivedObligationCause<'tcx> {
pub parent_trait_pred: ty::PolyTraitPredicate<'tcx>, pub parent_trait_pred: ty::PolyTraitPredicate<'tcx>,
/// The parent trait had this cause. /// The parent trait had this cause.
pub parent_code: Lrc<ObligationCauseCode<'tcx>>, parent_code: Lrc<ObligationCauseCode<'tcx>>,
}
impl<'tcx> DerivedObligationCause<'tcx> {
/// Get a reference to the derived obligation cause's parent code.
#[must_use]
pub fn parent_code(&self) -> &ObligationCauseCode<'tcx> {
self.parent_code.as_ref()
}
} }
#[derive(Clone, Debug, TypeFoldable, Lift)] #[derive(Clone, Debug, TypeFoldable, Lift)]

View file

@ -1868,7 +1868,7 @@ impl<'a, 'tcx> InferCtxtPrivExt<'a, 'tcx> for InferCtxt<'a, 'tcx> {
match code { match code {
ObligationCauseCode::BuiltinDerivedObligation(data) => { ObligationCauseCode::BuiltinDerivedObligation(data) => {
let parent_trait_ref = self.resolve_vars_if_possible(data.parent_trait_pred); let parent_trait_ref = self.resolve_vars_if_possible(data.parent_trait_pred);
match self.get_parent_trait_ref(&data.parent_code) { match self.get_parent_trait_ref(data.parent_code()) {
Some(t) => Some(t), Some(t) => Some(t),
None => { None => {
let ty = parent_trait_ref.skip_binder().self_ty(); let ty = parent_trait_ref.skip_binder().self_ty();

View file

@ -1683,7 +1683,7 @@ impl<'a, 'tcx> InferCtxtExt<'tcx> for InferCtxt<'a, 'tcx> {
_ => {} _ => {}
} }
next_code = Some(cause.derived.parent_code.as_ref()); next_code = Some(cause.derived.parent_code());
} }
ObligationCauseCode::DerivedObligation(derived_obligation) ObligationCauseCode::DerivedObligation(derived_obligation)
| ObligationCauseCode::BuiltinDerivedObligation(derived_obligation) => { | ObligationCauseCode::BuiltinDerivedObligation(derived_obligation) => {
@ -1715,7 +1715,7 @@ impl<'a, 'tcx> InferCtxtExt<'tcx> for InferCtxt<'a, 'tcx> {
_ => {} _ => {}
} }
next_code = Some(derived_obligation.parent_code.as_ref()); next_code = Some(derived_obligation.parent_code());
} }
_ => break, _ => break,
} }
@ -2365,8 +2365,7 @@ impl<'a, 'tcx> InferCtxtExt<'tcx> for InferCtxt<'a, 'tcx> {
let is_upvar_tys_infer_tuple = if !matches!(ty.kind(), ty::Tuple(..)) { let is_upvar_tys_infer_tuple = if !matches!(ty.kind(), ty::Tuple(..)) {
false false
} else { } else {
if let ObligationCauseCode::BuiltinDerivedObligation(ref data) = if let ObligationCauseCode::BuiltinDerivedObligation(data) = data.parent_code()
*data.parent_code
{ {
let parent_trait_ref = let parent_trait_ref =
self.resolve_vars_if_possible(data.parent_trait_pred); self.resolve_vars_if_possible(data.parent_trait_pred);
@ -2393,14 +2392,14 @@ impl<'a, 'tcx> InferCtxtExt<'tcx> for InferCtxt<'a, 'tcx> {
obligated_types.push(ty); obligated_types.push(ty);
let parent_predicate = parent_trait_ref.to_predicate(tcx); let parent_predicate = parent_trait_ref.to_predicate(tcx);
if !self.is_recursive_obligation(obligated_types, &data.parent_code) { if !self.is_recursive_obligation(obligated_types, data.parent_code()) {
// #74711: avoid a stack overflow // #74711: avoid a stack overflow
ensure_sufficient_stack(|| { ensure_sufficient_stack(|| {
self.note_obligation_cause_code( self.note_obligation_cause_code(
err, err,
&parent_predicate, &parent_predicate,
param_env, param_env,
&data.parent_code, data.parent_code(),
obligated_types, obligated_types,
seen_requirements, seen_requirements,
) )
@ -2462,7 +2461,7 @@ impl<'a, 'tcx> InferCtxtExt<'tcx> for InferCtxt<'a, 'tcx> {
// We don't want to point at the ADT saying "required because it appears within // We don't want to point at the ADT saying "required because it appears within
// the type `X`", like we would otherwise do in test `supertrait-auto-trait.rs`. // the type `X`", like we would otherwise do in test `supertrait-auto-trait.rs`.
while let ObligationCauseCode::BuiltinDerivedObligation(derived) = while let ObligationCauseCode::BuiltinDerivedObligation(derived) =
&*data.parent_code data.parent_code()
{ {
let child_trait_ref = let child_trait_ref =
self.resolve_vars_if_possible(derived.parent_trait_pred); self.resolve_vars_if_possible(derived.parent_trait_pred);
@ -2475,7 +2474,7 @@ impl<'a, 'tcx> InferCtxtExt<'tcx> for InferCtxt<'a, 'tcx> {
parent_trait_pred = child_trait_ref; parent_trait_pred = child_trait_ref;
} }
} }
while let ObligationCauseCode::ImplDerivedObligation(child) = &*data.parent_code { while let ObligationCauseCode::ImplDerivedObligation(child) = data.parent_code() {
// Skip redundant recursive obligation notes. See `ui/issue-20413.rs`. // Skip redundant recursive obligation notes. See `ui/issue-20413.rs`.
let child_trait_pred = let child_trait_pred =
self.resolve_vars_if_possible(child.derived.parent_trait_pred); self.resolve_vars_if_possible(child.derived.parent_trait_pred);
@ -2506,7 +2505,7 @@ impl<'a, 'tcx> InferCtxtExt<'tcx> for InferCtxt<'a, 'tcx> {
err, err,
&parent_predicate, &parent_predicate,
param_env, param_env,
&data.parent_code, data.parent_code(),
obligated_types, obligated_types,
seen_requirements, seen_requirements,
) )
@ -2521,7 +2520,7 @@ impl<'a, 'tcx> InferCtxtExt<'tcx> for InferCtxt<'a, 'tcx> {
err, err,
&parent_predicate, &parent_predicate,
param_env, param_env,
&data.parent_code, data.parent_code(),
obligated_types, obligated_types,
seen_requirements, seen_requirements,
) )

View file

@ -1606,9 +1606,9 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
let mut result_code = code; let mut result_code = code;
loop { loop {
let parent = match code { let parent = match code {
ObligationCauseCode::ImplDerivedObligation(c) => &c.derived.parent_code, ObligationCauseCode::ImplDerivedObligation(c) => c.derived.parent_code(),
ObligationCauseCode::BuiltinDerivedObligation(c) ObligationCauseCode::BuiltinDerivedObligation(c)
| ObligationCauseCode::DerivedObligation(c) => &c.parent_code, | ObligationCauseCode::DerivedObligation(c) => c.parent_code(),
_ => break result_code, _ => break result_code,
}; };
(result_code, code) = (code, parent); (result_code, code) = (code, parent);