Skip to content

Commit 1c2154b

Browse files
Explicitly don't normalize in new solver
1 parent dc2ffa4 commit 1c2154b

File tree

4 files changed

+41
-20
lines changed

4 files changed

+41
-20
lines changed

compiler/rustc_hir_analysis/src/check/compare_impl_item.rs

+16-4
Original file line numberDiff line numberDiff line change
@@ -221,7 +221,10 @@ fn compare_method_predicate_entailment<'tcx>(
221221
// The key step here is to update the caller_bounds's predicates to be
222222
// the new hybrid bounds we computed.
223223
let normalize_cause = traits::ObligationCause::misc(impl_m_span, impl_m_def_id);
224-
let param_env = ty::ParamEnv::new(tcx.mk_clauses(&hybrid_preds.predicates), Reveal::UserFacing);
224+
let param_env = ty::ParamEnv::new(
225+
tcx.mk_clauses_from_iter(util::elaborate(tcx, hybrid_preds.predicates)),
226+
Reveal::UserFacing,
227+
);
225228
let param_env = traits::normalize_param_env_or_error(tcx, param_env, normalize_cause);
226229

227230
let infcx = &tcx.infer_ctxt().build();
@@ -485,7 +488,10 @@ pub(super) fn collect_return_position_impl_trait_in_trait_tys<'tcx>(
485488
.into_iter()
486489
.chain(tcx.predicates_of(trait_m.def_id).instantiate_own(tcx, trait_to_placeholder_args))
487490
.map(|(clause, _)| clause);
488-
let param_env = ty::ParamEnv::new(tcx.mk_clauses_from_iter(hybrid_preds), Reveal::UserFacing);
491+
let param_env = ty::ParamEnv::new(
492+
tcx.mk_clauses_from_iter(util::elaborate(tcx, hybrid_preds)),
493+
Reveal::UserFacing,
494+
);
489495
let param_env = traits::normalize_param_env_or_error(
490496
tcx,
491497
param_env,
@@ -1776,7 +1782,10 @@ fn compare_const_predicate_entailment<'tcx>(
17761782
.map(|(predicate, _)| predicate),
17771783
);
17781784

1779-
let param_env = ty::ParamEnv::new(tcx.mk_clauses(&hybrid_preds.predicates), Reveal::UserFacing);
1785+
let param_env = ty::ParamEnv::new(
1786+
tcx.mk_clauses_from_iter(util::elaborate(tcx, hybrid_preds.predicates)),
1787+
Reveal::UserFacing,
1788+
);
17801789
let param_env = traits::normalize_param_env_or_error(
17811790
tcx,
17821791
param_env,
@@ -1915,7 +1924,10 @@ fn compare_type_predicate_entailment<'tcx>(
19151924

19161925
let impl_ty_span = tcx.def_span(impl_ty_def_id);
19171926
let normalize_cause = ObligationCause::misc(impl_ty_span, impl_ty_def_id);
1918-
let param_env = ty::ParamEnv::new(tcx.mk_clauses(&hybrid_preds.predicates), Reveal::UserFacing);
1927+
let param_env = ty::ParamEnv::new(
1928+
tcx.mk_clauses_from_iter(util::elaborate(tcx, hybrid_preds.predicates)),
1929+
Reveal::UserFacing,
1930+
);
19191931
let param_env = traits::normalize_param_env_or_error(tcx, param_env, normalize_cause);
19201932
let infcx = tcx.infer_ctxt().build();
19211933
let ocx = ObligationCtxt::new(&infcx);

compiler/rustc_hir_analysis/src/check/compare_impl_item/refine.rs

+4-1
Original file line numberDiff line numberDiff line change
@@ -124,7 +124,10 @@ pub(super) fn check_refining_return_position_impl_trait_in_trait<'tcx>(
124124
.into_iter()
125125
.chain(tcx.predicates_of(trait_m.def_id).instantiate_own(tcx, trait_m_to_impl_m_args))
126126
.map(|(clause, _)| clause);
127-
let param_env = ty::ParamEnv::new(tcx.mk_clauses_from_iter(hybrid_preds), Reveal::UserFacing);
127+
let param_env = ty::ParamEnv::new(
128+
tcx.mk_clauses_from_iter(elaborate(tcx, hybrid_preds)),
129+
Reveal::UserFacing,
130+
);
128131
let param_env = normalize_param_env_or_error(tcx, param_env, ObligationCause::dummy());
129132

130133
let ref infcx = tcx.infer_ctxt().build();

compiler/rustc_trait_selection/src/traits/mod.rs

+17-13
Original file line numberDiff line numberDiff line change
@@ -207,6 +207,10 @@ pub fn normalize_param_env_or_error<'tcx>(
207207
unnormalized_env: ty::ParamEnv<'tcx>,
208208
cause: ObligationCause<'tcx>,
209209
) -> ty::ParamEnv<'tcx> {
210+
if tcx.next_trait_solver_globally() {
211+
return unnormalized_env;
212+
}
213+
210214
// I'm not wild about reporting errors here; I'd prefer to
211215
// have the errors get reported at a defined place (e.g.,
212216
// during typeck). Instead I have all parameter
@@ -221,9 +225,10 @@ pub fn normalize_param_env_or_error<'tcx>(
221225
// parameter environments once for every fn as it goes,
222226
// and errors will get reported then; so outside of type inference we
223227
// can be sure that no errors should occur.
224-
let mut predicates: Vec<_> = util::elaborate(
225-
tcx,
226-
unnormalized_env.caller_bounds().into_iter().map(|predicate| {
228+
let mut predicates: Vec<_> = unnormalized_env
229+
.caller_bounds()
230+
.into_iter()
231+
.map(|predicate| {
227232
if tcx.features().generic_const_exprs {
228233
return predicate;
229234
}
@@ -280,13 +285,13 @@ pub fn normalize_param_env_or_error<'tcx>(
280285
//
281286
// FIXME(-Znext-solver): remove this hack since we have deferred projection equality
282287
predicate.fold_with(&mut ConstNormalizer(tcx))
283-
}),
284-
)
285-
.collect();
288+
})
289+
.collect();
286290

287291
debug!("normalize_param_env_or_error: elaborated-predicates={:?}", predicates);
288292

289-
let elaborated_env = ty::ParamEnv::new(tcx.mk_clauses(&predicates), unnormalized_env.reveal());
293+
let reveal = unnormalized_env.reveal();
294+
let eager_evaluated_env = ty::ParamEnv::new(tcx.mk_clauses(&predicates), reveal);
290295

291296
// HACK: we are trying to normalize the param-env inside *itself*. The problem is that
292297
// normalization expects its param-env to be already normalized, which means we have
@@ -317,11 +322,11 @@ pub fn normalize_param_env_or_error<'tcx>(
317322
predicates, outlives_predicates
318323
);
319324
let Ok(non_outlives_predicates) =
320-
do_normalize_predicates(tcx, cause.clone(), elaborated_env, predicates)
325+
do_normalize_predicates(tcx, cause.clone(), eager_evaluated_env, predicates)
321326
else {
322327
// An unnormalized env is better than nothing.
323328
debug!("normalize_param_env_or_error: errored resolving non-outlives predicates");
324-
return elaborated_env;
329+
return eager_evaluated_env;
325330
};
326331

327332
debug!("normalize_param_env_or_error: non-outlives predicates={:?}", non_outlives_predicates);
@@ -330,21 +335,20 @@ pub fn normalize_param_env_or_error<'tcx>(
330335
// here. I believe they should not matter, because we are ignoring TypeOutlives param-env
331336
// predicates here anyway. Keeping them here anyway because it seems safer.
332337
let outlives_env = non_outlives_predicates.iter().chain(&outlives_predicates).cloned();
333-
let outlives_env =
334-
ty::ParamEnv::new(tcx.mk_clauses_from_iter(outlives_env), unnormalized_env.reveal());
338+
let outlives_env = ty::ParamEnv::new(tcx.mk_clauses_from_iter(outlives_env), reveal);
335339
let Ok(outlives_predicates) =
336340
do_normalize_predicates(tcx, cause, outlives_env, outlives_predicates)
337341
else {
338342
// An unnormalized env is better than nothing.
339343
debug!("normalize_param_env_or_error: errored resolving outlives predicates");
340-
return elaborated_env;
344+
return eager_evaluated_env;
341345
};
342346
debug!("normalize_param_env_or_error: outlives predicates={:?}", outlives_predicates);
343347

344348
let mut predicates = non_outlives_predicates;
345349
predicates.extend(outlives_predicates);
346350
debug!("normalize_param_env_or_error: final predicates={:?}", predicates);
347-
ty::ParamEnv::new(tcx.mk_clauses(&predicates), unnormalized_env.reveal())
351+
ty::ParamEnv::new(tcx.mk_clauses(&predicates), reveal)
348352
}
349353

350354
/// Normalize a type and process all resulting obligations, returning any errors.

compiler/rustc_ty_utils/src/ty.rs

+4-2
Original file line numberDiff line numberDiff line change
@@ -152,8 +152,10 @@ fn param_env(tcx: TyCtxt<'_>, def_id: DefId) -> ty::ParamEnv<'_> {
152152

153153
let local_did = def_id.as_local();
154154

155-
let unnormalized_env =
156-
ty::ParamEnv::new(tcx.mk_clauses(&predicates), traits::Reveal::UserFacing);
155+
let unnormalized_env = ty::ParamEnv::new(
156+
tcx.mk_clauses_from_iter(traits::elaborate(tcx, predicates)),
157+
traits::Reveal::UserFacing,
158+
);
157159

158160
let body_id = local_did.unwrap_or(CRATE_DEF_ID);
159161
let cause = traits::ObligationCause::misc(tcx.def_span(def_id), body_id);

0 commit comments

Comments
 (0)