Skip to content

Commit 2d8b8f3

Browse files
committed
Revert "Auto merge of rust-lang#92306 - Aaron1011:opaque-type-op, r=oli-obk"
This reverts commit 1f0a968, reversing changes made to bf242bb.
1 parent 7a71b7a commit 2d8b8f3

File tree

14 files changed

+71
-231
lines changed

14 files changed

+71
-231
lines changed

compiler/rustc_borrowck/src/diagnostics/bound_region_errors.rs

+21-87
Original file line numberDiff line numberDiff line change
@@ -2,13 +2,9 @@ use rustc_errors::DiagnosticBuilder;
22
use rustc_infer::infer::canonical::Canonical;
33
use rustc_infer::infer::error_reporting::nice_region_error::NiceRegionError;
44
use rustc_infer::infer::region_constraints::Constraint;
5-
use rustc_infer::infer::region_constraints::RegionConstraintData;
6-
use rustc_infer::infer::RegionVariableOrigin;
75
use rustc_infer::infer::{InferCtxt, RegionResolutionError, SubregionOrigin, TyCtxtInferExt as _};
86
use rustc_infer::traits::{Normalized, ObligationCause, TraitEngine, TraitEngineExt};
97
use rustc_middle::ty::error::TypeError;
10-
use rustc_middle::ty::RegionVid;
11-
use rustc_middle::ty::UniverseIndex;
128
use rustc_middle::ty::{self, Ty, TyCtxt, TypeFoldable};
139
use rustc_span::Span;
1410
use rustc_trait_selection::traits::query::type_op;
@@ -82,15 +78,6 @@ crate trait ToUniverseInfo<'tcx> {
8278
fn to_universe_info(self, base_universe: ty::UniverseIndex) -> UniverseInfo<'tcx>;
8379
}
8480

85-
impl<'tcx> ToUniverseInfo<'tcx> for crate::type_check::InstantiateOpaqueType<'tcx> {
86-
fn to_universe_info(self, base_universe: ty::UniverseIndex) -> UniverseInfo<'tcx> {
87-
UniverseInfo(UniverseInfoInner::TypeOp(Rc::new(crate::type_check::InstantiateOpaqueType {
88-
base_universe: Some(base_universe),
89-
..self
90-
})))
91-
}
92-
}
93-
9481
impl<'tcx> ToUniverseInfo<'tcx>
9582
for Canonical<'tcx, ty::ParamEnvAnd<'tcx, type_op::prove_predicate::ProvePredicate<'tcx>>>
9683
{
@@ -131,12 +118,6 @@ impl<'tcx, F, G> ToUniverseInfo<'tcx> for Canonical<'tcx, type_op::custom::Custo
131118
}
132119
}
133120

134-
impl<'tcx> ToUniverseInfo<'tcx> for ! {
135-
fn to_universe_info(self, _base_universe: ty::UniverseIndex) -> UniverseInfo<'tcx> {
136-
self
137-
}
138-
}
139-
140121
#[allow(unused_lifetimes)]
141122
trait TypeOpInfo<'tcx> {
142123
/// Returns an error to be reported if rerunning the type op fails to
@@ -147,7 +128,7 @@ trait TypeOpInfo<'tcx> {
147128

148129
fn nice_error(
149130
&self,
150-
mbcx: &mut MirBorrowckCtxt<'_, 'tcx>,
131+
tcx: TyCtxt<'tcx>,
151132
cause: ObligationCause<'tcx>,
152133
placeholder_region: ty::Region<'tcx>,
153134
error_region: Option<ty::Region<'tcx>>,
@@ -194,7 +175,7 @@ trait TypeOpInfo<'tcx> {
194175
debug!(?placeholder_region);
195176

196177
let span = cause.span;
197-
let nice_error = self.nice_error(mbcx, cause, placeholder_region, error_region);
178+
let nice_error = self.nice_error(tcx, cause, placeholder_region, error_region);
198179

199180
if let Some(nice_error) = nice_error {
200181
nice_error.buffer(&mut mbcx.errors_buffer);
@@ -223,16 +204,16 @@ impl<'tcx> TypeOpInfo<'tcx> for PredicateQuery<'tcx> {
223204

224205
fn nice_error(
225206
&self,
226-
mbcx: &mut MirBorrowckCtxt<'_, 'tcx>,
207+
tcx: TyCtxt<'tcx>,
227208
cause: ObligationCause<'tcx>,
228209
placeholder_region: ty::Region<'tcx>,
229210
error_region: Option<ty::Region<'tcx>>,
230211
) -> Option<DiagnosticBuilder<'tcx>> {
231-
mbcx.infcx.tcx.infer_ctxt().enter_with_canonical(
212+
tcx.infer_ctxt().enter_with_canonical(
232213
cause.span,
233214
&self.canonical_query,
234215
|ref infcx, key, _| {
235-
let mut fulfill_cx = <dyn TraitEngine<'_>>::new(infcx.tcx);
216+
let mut fulfill_cx = <dyn TraitEngine<'_>>::new(tcx);
236217
type_op_prove_predicate_with_cause(infcx, &mut *fulfill_cx, key, cause);
237218
try_extract_error_from_fulfill_cx(
238219
fulfill_cx,
@@ -266,16 +247,16 @@ where
266247

267248
fn nice_error(
268249
&self,
269-
mbcx: &mut MirBorrowckCtxt<'_, 'tcx>,
250+
tcx: TyCtxt<'tcx>,
270251
cause: ObligationCause<'tcx>,
271252
placeholder_region: ty::Region<'tcx>,
272253
error_region: Option<ty::Region<'tcx>>,
273254
) -> Option<DiagnosticBuilder<'tcx>> {
274-
mbcx.infcx.tcx.infer_ctxt().enter_with_canonical(
255+
tcx.infer_ctxt().enter_with_canonical(
275256
cause.span,
276257
&self.canonical_query,
277258
|ref infcx, key, _| {
278-
let mut fulfill_cx = <dyn TraitEngine<'_>>::new(infcx.tcx);
259+
let mut fulfill_cx = <dyn TraitEngine<'_>>::new(tcx);
279260

280261
let mut selcx = SelectionContext::new(infcx);
281262

@@ -323,16 +304,16 @@ impl<'tcx> TypeOpInfo<'tcx> for AscribeUserTypeQuery<'tcx> {
323304

324305
fn nice_error(
325306
&self,
326-
mbcx: &mut MirBorrowckCtxt<'_, 'tcx>,
307+
tcx: TyCtxt<'tcx>,
327308
cause: ObligationCause<'tcx>,
328309
placeholder_region: ty::Region<'tcx>,
329310
error_region: Option<ty::Region<'tcx>>,
330311
) -> Option<DiagnosticBuilder<'tcx>> {
331-
mbcx.infcx.tcx.infer_ctxt().enter_with_canonical(
312+
tcx.infer_ctxt().enter_with_canonical(
332313
cause.span,
333314
&self.canonical_query,
334315
|ref infcx, key, _| {
335-
let mut fulfill_cx = <dyn TraitEngine<'_>>::new(infcx.tcx);
316+
let mut fulfill_cx = <dyn TraitEngine<'_>>::new(tcx);
336317
type_op_ascribe_user_type_with_span(infcx, &mut *fulfill_cx, key, Some(cause.span))
337318
.ok()?;
338319
try_extract_error_from_fulfill_cx(
@@ -346,90 +327,43 @@ impl<'tcx> TypeOpInfo<'tcx> for AscribeUserTypeQuery<'tcx> {
346327
}
347328
}
348329

349-
impl<'tcx> TypeOpInfo<'tcx> for crate::type_check::InstantiateOpaqueType<'tcx> {
350-
fn fallback_error(&self, tcx: TyCtxt<'tcx>, span: Span) -> DiagnosticBuilder<'tcx> {
351-
// FIXME: This error message isn't great, but it doesn't show up in the existing UI tests,
352-
// and is only the fallback when the nice error fails. Consider improving this some more.
353-
tcx.sess.struct_span_err(span, "higher-ranked lifetime error for opaque type!")
354-
}
355-
356-
fn base_universe(&self) -> ty::UniverseIndex {
357-
self.base_universe.unwrap()
358-
}
359-
360-
fn nice_error(
361-
&self,
362-
mbcx: &mut MirBorrowckCtxt<'_, 'tcx>,
363-
_cause: ObligationCause<'tcx>,
364-
placeholder_region: ty::Region<'tcx>,
365-
error_region: Option<ty::Region<'tcx>>,
366-
) -> Option<DiagnosticBuilder<'tcx>> {
367-
try_extract_error_from_region_constraints(
368-
mbcx.infcx,
369-
placeholder_region,
370-
error_region,
371-
self.region_constraints.as_ref().unwrap(),
372-
// We're using the original `InferCtxt` that we
373-
// started MIR borrowchecking with, so the region
374-
// constraints have already been taken. Use the data from
375-
// our `mbcx` instead.
376-
|vid| mbcx.regioncx.var_infos[vid].origin,
377-
|vid| mbcx.regioncx.var_infos[vid].universe,
378-
)
379-
}
380-
}
381-
382330
#[instrument(skip(fulfill_cx, infcx), level = "debug")]
383331
fn try_extract_error_from_fulfill_cx<'tcx>(
384332
mut fulfill_cx: Box<dyn TraitEngine<'tcx> + 'tcx>,
385333
infcx: &InferCtxt<'_, 'tcx>,
386334
placeholder_region: ty::Region<'tcx>,
387335
error_region: Option<ty::Region<'tcx>>,
388336
) -> Option<DiagnosticBuilder<'tcx>> {
337+
let tcx = infcx.tcx;
338+
389339
// We generally shouldn't have errors here because the query was
390340
// already run, but there's no point using `delay_span_bug`
391341
// when we're going to emit an error here anyway.
392342
let _errors = fulfill_cx.select_all_or_error(infcx);
393-
let region_constraints = infcx.with_region_constraints(|r| r.clone());
394-
try_extract_error_from_region_constraints(
395-
infcx,
396-
placeholder_region,
397-
error_region,
398-
&region_constraints,
399-
|vid| infcx.region_var_origin(vid),
400-
|vid| infcx.universe_of_region(infcx.tcx.mk_region(ty::ReVar(vid))),
401-
)
402-
}
403343

404-
fn try_extract_error_from_region_constraints<'tcx>(
405-
infcx: &InferCtxt<'_, 'tcx>,
406-
placeholder_region: ty::Region<'tcx>,
407-
error_region: Option<ty::Region<'tcx>>,
408-
region_constraints: &RegionConstraintData<'tcx>,
409-
mut region_var_origin: impl FnMut(RegionVid) -> RegionVariableOrigin,
410-
mut universe_of_region: impl FnMut(RegionVid) -> UniverseIndex,
411-
) -> Option<DiagnosticBuilder<'tcx>> {
412-
let (sub_region, cause) =
344+
let (sub_region, cause) = infcx.with_region_constraints(|region_constraints| {
345+
debug!("{:#?}", region_constraints);
413346
region_constraints.constraints.iter().find_map(|(constraint, cause)| {
414347
match *constraint {
415348
Constraint::RegSubReg(sub, sup) if sup == placeholder_region && sup != sub => {
416349
Some((sub, cause.clone()))
417350
}
418351
// FIXME: Should this check the universe of the var?
419352
Constraint::VarSubReg(vid, sup) if sup == placeholder_region => {
420-
Some((infcx.tcx.mk_region(ty::ReVar(vid)), cause.clone()))
353+
Some((tcx.mk_region(ty::ReVar(vid)), cause.clone()))
421354
}
422355
_ => None,
423356
}
424-
})?;
357+
})
358+
})?;
425359

426360
debug!(?sub_region, "cause = {:#?}", cause);
427361
let nice_error = match (error_region, sub_region) {
428362
(Some(error_region), &ty::ReVar(vid)) => NiceRegionError::new(
429363
infcx,
430364
RegionResolutionError::SubSupConflict(
431365
vid,
432-
region_var_origin(vid),
366+
infcx.region_var_origin(vid),
433367
cause.clone(),
434368
error_region,
435369
cause.clone(),
@@ -446,8 +380,8 @@ fn try_extract_error_from_region_constraints<'tcx>(
446380
infcx,
447381
RegionResolutionError::UpperBoundUniverseConflict(
448382
vid,
449-
region_var_origin(vid),
450-
universe_of_region(vid),
383+
infcx.region_var_origin(vid),
384+
infcx.universe_of_region(sub_region),
451385
cause.clone(),
452386
placeholder_region,
453387
),

compiler/rustc_borrowck/src/lib.rs

-1
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@
55
#![feature(crate_visibility_modifier)]
66
#![feature(let_else)]
77
#![feature(min_specialization)]
8-
#![feature(never_type)]
98
#![feature(stmt_expr_attributes)]
109
#![feature(trusted_step)]
1110
#![feature(try_blocks)]

compiler/rustc_borrowck/src/region_infer/mod.rs

+1-3
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,6 @@ mod reverse_sccs;
4444
pub mod values;
4545

4646
pub struct RegionInferenceContext<'tcx> {
47-
pub var_infos: VarInfos,
4847
/// Contains the definition for every region variable. Region
4948
/// variables are identified by their index (`RegionVid`). The
5049
/// definition contains information about where the region came
@@ -267,7 +266,7 @@ impl<'tcx> RegionInferenceContext<'tcx> {
267266
) -> Self {
268267
// Create a RegionDefinition for each inference variable.
269268
let definitions: IndexVec<_, _> = var_infos
270-
.iter()
269+
.into_iter()
271270
.map(|info| RegionDefinition::new(info.universe, info.origin))
272271
.collect();
273272

@@ -292,7 +291,6 @@ impl<'tcx> RegionInferenceContext<'tcx> {
292291
Rc::new(member_constraints_in.into_mapped(|r| constraint_sccs.scc(r)));
293292

294293
let mut result = Self {
295-
var_infos,
296294
definitions,
297295
liveness_constraints,
298296
constraints,

compiler/rustc_borrowck/src/type_check/canonical.rs

+5-4
Original file line numberDiff line numberDiff line change
@@ -33,11 +33,12 @@ impl<'a, 'tcx> TypeChecker<'a, 'tcx> {
3333
) -> Fallible<R>
3434
where
3535
Op: type_op::TypeOp<'tcx, Output = R>,
36-
Op::ErrorInfo: ToUniverseInfo<'tcx>,
36+
Canonical<'tcx, Op>: ToUniverseInfo<'tcx>,
3737
{
3838
let old_universe = self.infcx.universe();
3939

40-
let TypeOpOutput { output, constraints, error_info } = op.fully_perform(self.infcx)?;
40+
let TypeOpOutput { output, constraints, canonicalized_query } =
41+
op.fully_perform(self.infcx)?;
4142

4243
if let Some(data) = &constraints {
4344
self.push_region_constraints(locations, category, data);
@@ -46,8 +47,8 @@ impl<'a, 'tcx> TypeChecker<'a, 'tcx> {
4647
let universe = self.infcx.universe();
4748

4849
if old_universe != universe {
49-
let universe_info = match error_info {
50-
Some(error_info) => error_info.to_universe_info(old_universe),
50+
let universe_info = match canonicalized_query {
51+
Some(canonicalized_query) => canonicalized_query.to_universe_info(old_universe),
5152
None => UniverseInfo::other(),
5253
};
5354
for u in old_universe..universe {

compiler/rustc_borrowck/src/type_check/free_region_relations.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -268,7 +268,7 @@ impl<'tcx> UniversalRegionRelationsBuilder<'_, 'tcx> {
268268
TypeOpOutput {
269269
output: self.infcx.tcx.ty_error(),
270270
constraints: None,
271-
error_info: None,
271+
canonicalized_query: None,
272272
}
273273
});
274274
// Note: we need this in examples like

compiler/rustc_borrowck/src/type_check/mod.rs

+1-33
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,6 @@ use rustc_hir::lang_items::LangItem;
1717
use rustc_index::vec::{Idx, IndexVec};
1818
use rustc_infer::infer::canonical::QueryRegionConstraints;
1919
use rustc_infer::infer::outlives::env::RegionBoundPairs;
20-
use rustc_infer::infer::region_constraints::RegionConstraintData;
2120
use rustc_infer::infer::type_variable::{TypeVariableOrigin, TypeVariableOriginKind};
2221
use rustc_infer::infer::{
2322
InferCtxt, InferOk, LateBoundRegionConversionTime, NllRegionVariableOrigin,
@@ -40,11 +39,9 @@ use rustc_target::abi::VariantIdx;
4039
use rustc_trait_selection::infer::InferCtxtExt as _;
4140
use rustc_trait_selection::traits::error_reporting::InferCtxtExt as _;
4241
use rustc_trait_selection::traits::query::type_op;
43-
use rustc_trait_selection::traits::query::type_op::custom::scrape_region_constraints;
4442
use rustc_trait_selection::traits::query::type_op::custom::CustomTypeOp;
45-
use rustc_trait_selection::traits::query::type_op::{TypeOp, TypeOpOutput};
4643
use rustc_trait_selection::traits::query::Fallible;
47-
use rustc_trait_selection::traits::{self, ObligationCause, PredicateObligation};
44+
use rustc_trait_selection::traits::{self, ObligationCause};
4845

4946
use rustc_const_eval::transform::{
5047
check_consts::ConstCx, promote_consts::is_const_fn_in_array_repeat_expression,
@@ -2640,32 +2637,3 @@ impl NormalizeLocation for Location {
26402637
Locations::Single(self)
26412638
}
26422639
}
2643-
2644-
/// Runs `infcx.instantiate_opaque_types`. Unlike other `TypeOp`s,
2645-
/// this is not canonicalized - it directly affects the main `InferCtxt`
2646-
/// that we use during MIR borrowchecking.
2647-
#[derive(Debug)]
2648-
pub(super) struct InstantiateOpaqueType<'tcx> {
2649-
pub base_universe: Option<ty::UniverseIndex>,
2650-
pub region_constraints: Option<RegionConstraintData<'tcx>>,
2651-
pub obligation: PredicateObligation<'tcx>,
2652-
}
2653-
2654-
impl<'tcx> TypeOp<'tcx> for InstantiateOpaqueType<'tcx> {
2655-
type Output = ();
2656-
/// We use this type itself to store the information used
2657-
/// when reporting errors. Since this is not a query, we don't
2658-
/// re-run anything during error reporting - we just use the information
2659-
/// we saved to help extract an error from the already-existing region
2660-
/// constraints in our `InferCtxt`
2661-
type ErrorInfo = InstantiateOpaqueType<'tcx>;
2662-
2663-
fn fully_perform(mut self, infcx: &InferCtxt<'_, 'tcx>) -> Fallible<TypeOpOutput<'tcx, Self>> {
2664-
let (mut output, region_constraints) = scrape_region_constraints(infcx, || {
2665-
Ok(InferOk { value: (), obligations: vec![self.obligation.clone()] })
2666-
})?;
2667-
self.region_constraints = Some(region_constraints);
2668-
output.error_info = Some(self);
2669-
Ok(output)
2670-
}
2671-
}

0 commit comments

Comments
 (0)