Skip to content

Commit

Permalink
Rollup merge of rust-lang#123701 - compiler-errors:only-assert-after-…
Browse files Browse the repository at this point in the history
…checking, r=WaffleLapkin

Only assert for child/parent projection compatibility AFTER checking that theyre coming from the same place

This assertion doesn't make sense until we check that these captures are actually equivalent.

Fixes rust-lang#123697

<sub>Some days I wonder how I even write code that works...</sub>
  • Loading branch information
GuillaumeGomez committed Apr 10, 2024
2 parents 3f7ae68 + 69b690f commit 1002c65
Show file tree
Hide file tree
Showing 2 changed files with 24 additions and 1 deletion.
9 changes: 8 additions & 1 deletion compiler/rustc_mir_transform/src/coroutine/by_move_body.rs
Original file line number Diff line number Diff line change
Expand Up @@ -154,6 +154,14 @@ impl<'tcx> MirPass<'tcx> for ByMoveBody {
}) {
let (child_field_idx, child_capture) = child_captures.next().unwrap();

// This analysis only makes sense if the parent capture is a
// prefix of the child capture.
assert!(
child_capture.place.projections.len() >= parent_capture.place.projections.len(),
"parent capture ({parent_capture:#?}) expected to be prefix of \
child capture ({child_capture:#?})"
);

// Store this set of additional projections (fields and derefs).
// We need to re-apply them later.
let child_precise_captures =
Expand Down Expand Up @@ -244,7 +252,6 @@ fn child_prefix_matches_parent_projections(
bug!("expected capture to be an upvar");
};

assert!(child_capture.place.projections.len() >= parent_capture.place.projections.len());
parent_base.var_path.hir_id == child_base.var_path.hir_id
&& std::iter::zip(&child_capture.place.projections, &parent_capture.place.projections)
.all(|(child, parent)| child.kind == parent.kind)
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
//@ check-pass
//@ edition: 2021
// issue: rust-lang/rust#123697

#![feature(async_closure)]

struct S { t: i32 }

fn test(s: &S, t: &i32) {
async || {
println!("{}", s.t);
println!("{}", t);
};
}

fn main() {}

0 comments on commit 1002c65

Please sign in to comment.