Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Appearance settings
This repository was archived by the owner on May 28, 2025. It is now read-only.

Commit 1e9a398

Browse filesBrowse files
committed
Auto merge of rust-lang#133502 - lcnr:rust4, r=<try>
[DO NOT MERGE] bootstrap with `-Znext-solver=globally` A revival of rust-lang#124812. Current status: ~~`./x.py b --stage 2` passes 🎉~~ `try` builds succeed 🎉 🎉 🎉 [first perf run](rust-lang#133502 (comment)) 👻 ### in-flight changes - ce66d92 is a rebased version of rust-lang#125334, unsure whether I actually want to land this PR for now - rust-lang#135445 - https://github.com/lcnr/rust/tree/opaque-type-method-call support method calls on not-yet defined opaque types in their defining scope ☠️ r? `@ghost`
2 parents 73c0ae6 + eb842ab commit 1e9a398
Copy full SHA for 1e9a398

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.
Dismiss banner
Expand file treeCollapse file tree

43 files changed

+942
-436
lines changed

‎compiler/rustc_borrowck/src/diagnostics/region_errors.rs

Copy file name to clipboardExpand all lines: compiler/rustc_borrowck/src/diagnostics/region_errors.rs
+2Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -439,6 +439,8 @@ impl<'infcx, 'tcx> MirBorrowckCtxt<'_, 'infcx, 'tcx> {
439439
outlives_suggestion: &mut OutlivesSuggestionBuilder,
440440
) {
441441
debug!("report_region_error(fr={:?}, outlived_fr={:?})", fr, outlived_fr);
442+
assert!(self.regioncx.universal_regions().is_universal_region(fr));
443+
assert!(self.regioncx.universal_regions().is_universal_region(outlived_fr));
442444

443445
let (blame_constraint, path) = self.regioncx.best_blame_constraint(fr, fr_origin, |r| {
444446
self.regioncx.provides_universal_region(r, fr, outlived_fr)

‎compiler/rustc_borrowck/src/diagnostics/region_name.rs

Copy file name to clipboardExpand all lines: compiler/rustc_borrowck/src/diagnostics/region_name.rs
+6Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -265,6 +265,12 @@ impl<'tcx> MirBorrowckCtxt<'_, '_, 'tcx> {
265265
.or_else(|| self.give_name_if_anonymous_region_appears_in_impl_signature(fr))
266266
.or_else(|| {
267267
self.give_name_if_anonymous_region_appears_in_arg_position_impl_trait(fr)
268+
})
269+
.or_else(|| {
270+
Some(RegionName {
271+
name: self.synthesize_region_name(),
272+
source: RegionNameSource::Static,
273+
})
268274
});
269275

270276
if let Some(new_name) = new_name {

‎compiler/rustc_borrowck/src/nll.rs

Copy file name to clipboardExpand all lines: compiler/rustc_borrowck/src/nll.rs
+55-31Lines changed: 55 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,7 @@ use rustc_hir::def_id::LocalDefId;
1111
use rustc_index::IndexSlice;
1212
use rustc_middle::mir::pretty::{PrettyPrintMirOptions, dump_mir_with_options};
1313
use rustc_middle::mir::{
14-
Body, ClosureOutlivesSubject, ClosureRegionRequirements, PassWhere, Promoted, create_dump_file,
15-
dump_enabled, dump_mir,
14+
Body, ClosureRequirements, PassWhere, Promoted, create_dump_file, dump_enabled, dump_mir,
1615
};
1716
use rustc_middle::ty::print::with_no_trimmed_paths;
1817
use rustc_middle::ty::{self, OpaqueHiddenType, TyCtxt};
@@ -43,7 +42,7 @@ pub(crate) struct NllOutput<'tcx> {
4342
pub opaque_type_values: FxIndexMap<LocalDefId, OpaqueHiddenType<'tcx>>,
4443
pub polonius_input: Option<Box<PoloniusFacts>>,
4544
pub polonius_output: Option<Box<PoloniusOutput>>,
46-
pub opt_closure_req: Option<ClosureRegionRequirements<'tcx>>,
45+
pub opt_closure_req: Option<ClosureRequirements<'tcx>>,
4746
pub nll_errors: RegionErrors<'tcx>,
4847

4948
/// When using `-Zpolonius=next`: the localized typeck and liveness constraints.
@@ -171,22 +170,44 @@ pub(crate) fn compute_regions<'a, 'tcx>(
171170
});
172171

173172
// Solve the region constraints.
174-
let (closure_region_requirements, nll_errors) =
173+
let (closure_outlives_requirements, nll_errors) =
175174
regioncx.solve(infcx, body, polonius_output.clone());
176175

177176
if let Some(guar) = nll_errors.has_errors() {
178177
// Suppress unhelpful extra errors in `infer_opaque_types`.
179178
infcx.set_tainted_by_errors(guar);
180179
}
181180

182-
let remapped_opaque_tys = regioncx.infer_opaque_types(infcx, opaque_type_values);
181+
let (opaque_type_values, opt_closure_req) = if infcx.tcx.is_typeck_child(body.source.def_id()) {
182+
let opaque_types = regioncx.propagate_opaque_types(infcx, opaque_type_values);
183+
let num_external_vids = regioncx.universal_regions().num_global_and_external_regions();
184+
let closure_requirements = ClosureRequirements {
185+
num_external_vids,
186+
num_existential_external_regions: regioncx
187+
.universal_regions()
188+
.existential_external_regions
189+
.len(),
190+
outlives_requirements: closure_outlives_requirements.unwrap(),
191+
opaque_types,
192+
};
193+
if closure_requirements.outlives_requirements.is_empty()
194+
&& closure_requirements.opaque_types.is_empty()
195+
{
196+
(Default::default(), None)
197+
} else {
198+
(Default::default(), Some(closure_requirements))
199+
}
200+
} else {
201+
assert!(closure_outlives_requirements.is_none());
202+
(regioncx.infer_opaque_types(infcx, opaque_type_values), None)
203+
};
183204

184205
NllOutput {
185206
regioncx,
186-
opaque_type_values: remapped_opaque_tys,
207+
opaque_type_values,
187208
polonius_input: polonius_facts.map(Box::new),
188209
polonius_output,
189-
opt_closure_req: closure_region_requirements,
210+
opt_closure_req,
190211
nll_errors,
191212
localized_outlives_constraints,
192213
}
@@ -205,7 +226,7 @@ pub(super) fn dump_nll_mir<'tcx>(
205226
infcx: &BorrowckInferCtxt<'tcx>,
206227
body: &Body<'tcx>,
207228
regioncx: &RegionInferenceContext<'tcx>,
208-
closure_region_requirements: &Option<ClosureRegionRequirements<'tcx>>,
229+
closure_requirements: &Option<ClosureRequirements<'tcx>>,
209230
borrow_set: &BorrowSet<'tcx>,
210231
) {
211232
let tcx = infcx.tcx;
@@ -229,7 +250,7 @@ pub(super) fn dump_nll_mir<'tcx>(
229250
&0,
230251
body,
231252
|pass_where, out| {
232-
emit_nll_mir(tcx, regioncx, closure_region_requirements, borrow_set, pass_where, out)
253+
emit_nll_mir(tcx, regioncx, closure_requirements, borrow_set, pass_where, out)
233254
},
234255
options,
235256
);
@@ -251,7 +272,7 @@ pub(super) fn dump_nll_mir<'tcx>(
251272
pub(crate) fn emit_nll_mir<'tcx>(
252273
tcx: TyCtxt<'tcx>,
253274
regioncx: &RegionInferenceContext<'tcx>,
254-
closure_region_requirements: &Option<ClosureRegionRequirements<'tcx>>,
275+
closure_requirements: &Option<ClosureRequirements<'tcx>>,
255276
borrow_set: &BorrowSet<'tcx>,
256277
pass_where: PassWhere,
257278
out: &mut dyn io::Write,
@@ -262,9 +283,9 @@ pub(crate) fn emit_nll_mir<'tcx>(
262283
regioncx.dump_mir(tcx, out)?;
263284
writeln!(out, "|")?;
264285

265-
if let Some(closure_region_requirements) = closure_region_requirements {
286+
if let Some(closure_requirements) = closure_requirements {
266287
writeln!(out, "| Free Region Constraints")?;
267-
for_each_region_constraint(tcx, closure_region_requirements, &mut |msg| {
288+
for_each_region_constraint(tcx, closure_requirements, &mut |msg| {
268289
writeln!(out, "| {msg}")
269290
})?;
270291
writeln!(out, "|")?;
@@ -298,7 +319,7 @@ pub(super) fn dump_annotation<'tcx, 'infcx>(
298319
infcx: &'infcx BorrowckInferCtxt<'tcx>,
299320
body: &Body<'tcx>,
300321
regioncx: &RegionInferenceContext<'tcx>,
301-
closure_region_requirements: &Option<ClosureRegionRequirements<'tcx>>,
322+
closure_requirements: &Option<ClosureRequirements<'tcx>>,
302323
opaque_type_values: &FxIndexMap<LocalDefId, OpaqueHiddenType<'tcx>>,
303324
diagnostics_buffer: &mut BorrowckDiagnosticsBuffer<'infcx, 'tcx>,
304325
) {
@@ -316,19 +337,16 @@ pub(super) fn dump_annotation<'tcx, 'infcx>(
316337
// better.
317338

318339
let def_span = tcx.def_span(body.source.def_id());
319-
let mut err = if let Some(closure_region_requirements) = closure_region_requirements {
340+
let mut err = if let Some(closure_requirements) = closure_requirements {
320341
let mut err = infcx.dcx().struct_span_note(def_span, "external requirements");
321342

322343
regioncx.annotate(tcx, &mut err);
323344

324-
err.note(format!(
325-
"number of external vids: {}",
326-
closure_region_requirements.num_external_vids
327-
));
345+
err.note(format!("number of external vids: {}", closure_requirements.num_external_vids));
328346

329347
// Dump the region constraints we are imposing *between* those
330348
// newly created variables.
331-
for_each_region_constraint(tcx, closure_region_requirements, &mut |msg| {
349+
for_each_region_constraint(tcx, closure_requirements, &mut |msg| {
332350
err.note(msg);
333351
Ok(())
334352
})
@@ -351,20 +369,26 @@ pub(super) fn dump_annotation<'tcx, 'infcx>(
351369

352370
fn for_each_region_constraint<'tcx>(
353371
tcx: TyCtxt<'tcx>,
354-
closure_region_requirements: &ClosureRegionRequirements<'tcx>,
372+
closure_requirements: &ClosureRequirements<'tcx>,
355373
with_msg: &mut dyn FnMut(String) -> io::Result<()>,
356374
) -> io::Result<()> {
357-
for req in &closure_region_requirements.outlives_requirements {
358-
let subject = match req.subject {
359-
ClosureOutlivesSubject::Region(subject) => format!("{subject:?}"),
360-
ClosureOutlivesSubject::Ty(ty) => {
361-
with_no_trimmed_paths!(format!(
362-
"{}",
363-
ty.instantiate(tcx, |vid| ty::Region::new_var(tcx, vid))
364-
))
365-
}
366-
};
367-
with_msg(format!("where {}: {:?}", subject, req.outlived_free_region,))?;
375+
for req in &closure_requirements.outlives_requirements {
376+
let subject = with_no_trimmed_paths!(format!(
377+
"{:?}",
378+
req.subject.instantiate(tcx, |vid| ty::Region::new_var(tcx, vid))
379+
));
380+
// TODO
381+
with_msg(format!(
382+
"where {}: {:?}",
383+
subject,
384+
req.outlived_free_region.instantiate(tcx, |vid| ty::Region::new_var(tcx, vid))
385+
))?;
386+
}
387+
388+
for data in &closure_requirements.opaque_types {
389+
// TODO
390+
let (key, hidden_ty) = data.instantiate(tcx, |vid| ty::Region::new_var(tcx, vid));
391+
with_msg(format!("where {key:?} = {hidden_ty:?}"))?;
368392
}
369393
Ok(())
370394
}

‎compiler/rustc_borrowck/src/polonius/dump.rs

Copy file name to clipboardExpand all lines: compiler/rustc_borrowck/src/polonius/dump.rs
+5-5Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
use std::io;
22

33
use rustc_middle::mir::pretty::{PrettyPrintMirOptions, dump_mir_with_options};
4-
use rustc_middle::mir::{Body, ClosureRegionRequirements, PassWhere};
4+
use rustc_middle::mir::{Body, ClosureRequirements, PassWhere};
55
use rustc_middle::ty::TyCtxt;
66
use rustc_session::config::MirIncludeSpans;
77

@@ -19,7 +19,7 @@ pub(crate) fn dump_polonius_mir<'tcx>(
1919
regioncx: &RegionInferenceContext<'tcx>,
2020
borrow_set: &BorrowSet<'tcx>,
2121
localized_outlives_constraints: Option<LocalizedOutlivesConstraintSet>,
22-
closure_region_requirements: &Option<ClosureRegionRequirements<'tcx>>,
22+
closure_requirements: &Option<ClosureRequirements<'tcx>>,
2323
) {
2424
let tcx = infcx.tcx;
2525
if !tcx.sess.opts.unstable_opts.polonius.is_next_enabled() {
@@ -49,7 +49,7 @@ pub(crate) fn dump_polonius_mir<'tcx>(
4949
emit_polonius_mir(
5050
tcx,
5151
regioncx,
52-
closure_region_requirements,
52+
closure_requirements,
5353
borrow_set,
5454
&localized_outlives_constraints,
5555
pass_where,
@@ -64,7 +64,7 @@ pub(crate) fn dump_polonius_mir<'tcx>(
6464
fn emit_polonius_mir<'tcx>(
6565
tcx: TyCtxt<'tcx>,
6666
regioncx: &RegionInferenceContext<'tcx>,
67-
closure_region_requirements: &Option<ClosureRegionRequirements<'tcx>>,
67+
closure_requirements: &Option<ClosureRequirements<'tcx>>,
6868
borrow_set: &BorrowSet<'tcx>,
6969
localized_outlives_constraints: &LocalizedOutlivesConstraintSet,
7070
pass_where: PassWhere,
@@ -74,7 +74,7 @@ fn emit_polonius_mir<'tcx>(
7474
crate::nll::emit_nll_mir(
7575
tcx,
7676
regioncx,
77-
closure_region_requirements,
77+
closure_requirements,
7878
borrow_set,
7979
pass_where.clone(),
8080
out,

0 commit comments

Comments
0 (0)
Morty Proxy This is a proxified and sanitized view of the page, visit original site.