Rollup merge of #135985 - Zalathar:whats-upvar, r=lqd

Rename test to `unresolvable-upvar-issue-87987.rs` and add some notes

Extracted from #135756. I had to figure out what this test was trying to test, so I might as well write it down for future reference.
This commit is contained in:
Matthias Krüger 2025-01-25 08:03:35 +01:00 committed by GitHub
commit eb3e1c9ee1
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
4 changed files with 46 additions and 42 deletions

View File

@ -409,7 +409,6 @@ ui/closure_context/issue-26046-fn-once.rs
ui/closure_context/issue-42065.rs
ui/closures/2229_closure_analysis/issue-118144.rs
ui/closures/2229_closure_analysis/issue-87378.rs
ui/closures/2229_closure_analysis/issue-87987.rs
ui/closures/2229_closure_analysis/issue-88118-2.rs
ui/closures/2229_closure_analysis/issue-88476.rs
ui/closures/2229_closure_analysis/issue-89606.rs

View File

@ -1,27 +0,0 @@
//@ run-pass
//@ edition:2021
struct Props {
field_1: u32, //~ WARNING: fields `field_1` and `field_2` are never read
field_2: u32,
}
fn main() {
// Test 1
let props_2 = Props { field_1: 1, field_2: 1 };
let _ = || {
let _: Props = props_2;
};
// Test 2
let mut arr = [1, 3, 4, 5];
let mref = &mut arr;
let _c = || match arr {
[_, _, _, _] => println!("A"),
};
println!("{:#?}", mref);
}

View File

@ -1,14 +0,0 @@
warning: fields `field_1` and `field_2` are never read
--> $DIR/issue-87987.rs:5:5
|
LL | struct Props {
| ----- fields in this struct
LL | field_1: u32,
| ^^^^^^^
LL | field_2: u32,
| ^^^^^^^
|
= note: `#[warn(dead_code)]` on by default
warning: 1 warning emitted

View File

@ -0,0 +1,46 @@
//! When a closure syntactically captures a place, but doesn't actually capture
//! it, make sure MIR building doesn't ICE when handling that place.
//!
//! Under the Rust 2021 disjoint capture rules, this sort of non-capture can
//! occur when a place is only inspected by infallible non-binding patterns.
// FIXME(#135985): On its own, this test should probably just be check-pass.
// But there are few/no other tests that use non-binding array patterns and
// invoke the later parts of the compiler, so building/running has some value.
//@ run-pass
//@ edition:2021
#[expect(dead_code)]
struct Props {
field_1: u32,
field_2: u32,
}
fn main() {
// Test 1
let props_2 = Props { field_1: 1, field_2: 1 };
let _ = || {
let _: Props = props_2;
};
// Test 2
let mut arr = [1, 3, 4, 5];
let mref = &mut arr;
// These array patterns don't need to inspect the array, so the array
// isn't captured.
let _c = || match arr {
[_, _, _, _] => println!("C"),
};
let _d = || match arr {
[_, .., _] => println!("D"),
};
let _e = || match arr {
[_, ..] => println!("E"),
};
println!("{:#?}", mref);
}