Skip to content

Commit c4e8a86

Browse files
Don't use outlives type op outside of MIR typeck
1 parent d7a2fdd commit c4e8a86

File tree

1 file changed

+23
-14
lines changed

1 file changed

+23
-14
lines changed

compiler/rustc_trait_selection/src/traits/outlives_bounds.rs

+23-14
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
11
use crate::infer::InferCtxt;
2-
use crate::traits::query::type_op::{self, TypeOp, TypeOpOutput};
32
use crate::traits::{ObligationCause, ObligationCtxt};
43
use rustc_data_structures::fx::FxIndexSet;
5-
use rustc_errors::ErrorGuaranteed;
64
use rustc_infer::infer::resolve::OpportunisticRegionResolver;
5+
use rustc_infer::infer::InferOk;
6+
use rustc_middle::infer::canonical::{OriginalQueryValues, QueryRegionConstraints};
77
use rustc_middle::ty::{self, ParamEnv, Ty, TypeFolder, TypeVisitableExt};
88
use rustc_span::def_id::LocalDefId;
99

@@ -68,20 +68,29 @@ impl<'a, 'tcx: 'a> InferCtxtExt<'a, 'tcx> for InferCtxt<'tcx> {
6868
return vec![];
6969
}
7070

71-
let span = self.tcx.def_span(body_id);
72-
let result: Result<_, ErrorGuaranteed> = param_env
73-
.and(type_op::implied_outlives_bounds::ImpliedOutlivesBounds { ty })
74-
.fully_perform(self, span);
75-
let result = match result {
76-
Ok(r) => r,
77-
Err(_) => {
78-
return vec![];
79-
}
71+
let mut canonical_var_values = OriginalQueryValues::default();
72+
let canonical_ty =
73+
self.canonicalize_query_keep_static(param_env.and(ty), &mut canonical_var_values);
74+
let Ok(canonical_result) = self.tcx.implied_outlives_bounds(canonical_ty) else {
75+
return vec![];
76+
};
77+
78+
let mut constraints = QueryRegionConstraints::default();
79+
let Ok(InferOk { value, obligations }) = self
80+
.instantiate_nll_query_response_and_region_obligations(
81+
&ObligationCause::dummy(),
82+
param_env,
83+
&canonical_var_values,
84+
canonical_result,
85+
&mut constraints,
86+
) else {
87+
return vec![];
8088
};
89+
assert_eq!(&obligations, &[]);
8190

82-
let TypeOpOutput { output, constraints, .. } = result;
91+
if !constraints.is_empty() {
92+
let span = self.tcx.def_span(body_id);
8393

84-
if let Some(constraints) = constraints {
8594
debug!(?constraints);
8695
if !constraints.member_constraints.is_empty() {
8796
span_bug!(span, "{:#?}", constraints.member_constraints);
@@ -108,7 +117,7 @@ impl<'a, 'tcx: 'a> InferCtxtExt<'a, 'tcx> for InferCtxt<'tcx> {
108117
}
109118
};
110119

111-
output
120+
value
112121
}
113122

114123
fn implied_bounds_tys(

0 commit comments

Comments
 (0)