Skip to content

Commit

Permalink
Only assert for child/parent projection compatibility AFTER checking …
Browse files Browse the repository at this point in the history
…that theyre coming from the same place
  • Loading branch information
compiler-errors committed Apr 10, 2024
1 parent b14d8b2 commit 69b690f
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 69b690f

Please sign in to comment.