rust/tests/ui/closures
bors 790309b102 Auto merge of #115315 - RalfJung:field-capture-packed-alignment, r=oli-obk
closure field capturing: don't depend on alignment of packed fields

This fixes the closure field capture part of https://github.com/rust-lang/rust/issues/115305: field capturing always stops at projections into packed structs, no matter the alignment of the field. This means changing a private field type from `u8` to `u64` can never change how closures capture fields, which is probably what we want.

Here's an example where, before this PR, changing the type of a private field in a repr(Rust) struct can change the output of a program:

```rust
#![allow(dead_code)]

mod m {
    // before patch
    #[derive(Default)]
    pub struct S1(u8);
    // after patch
    #[derive(Default)]
    pub struct S2(u64);
}

struct NoisyDrop;
impl Drop for NoisyDrop {
    fn drop(&mut self) {
        eprintln!("dropped!");
    }
}

#[repr(packed)]
struct MyType {
    field: m::S1, // output changes when this becomes S2
    other_field: NoisyDrop,
    third_field: Vec<()>,
}

fn test(r: MyType) {
    let c = || {
        let _val = std::ptr::addr_of!(r.field);
        let _val = r.third_field;
    };
    drop(c);
    eprintln!("before dropping");
}

fn main() {
    test(MyType {
        field: Default::default(),
        other_field: NoisyDrop,
        third_field: Vec::new(),
    });
}
```

Of course this is a breaking change for the same reason that doing field capturing in the first place was a breaking change. Packed fields are relatively rare and depending on drop order is relatively rare, so I don't expect this to have much impact, but it's hard to be sure and even a crater run will only tell us so much.

Also see the [nomination comment](https://github.com/rust-lang/rust/pull/115315#issuecomment-1702807825).

Cc `@rust-lang/wg-rfc-2229` `@ehuss`
2023-09-16 05:29:23 +00:00
..
2229_closure_analysis Auto merge of #115315 - RalfJung:field-capture-packed-alignment, r=oli-obk 2023-09-16 05:29:23 +00:00
binder
closure-expected-type
print
add_semicolon_non_block_closure.rs
add_semicolon_non_block_closure.stderr
cannot-call-unsized-via-ptr-2.rs
cannot-call-unsized-via-ptr-2.stderr
cannot-call-unsized-via-ptr.rs
cannot-call-unsized-via-ptr.stderr
closure_cap_coerce_many_fail.rs
closure_cap_coerce_many_fail.stderr
closure_no_cap_coerce_many_check_pass.rs
closure_no_cap_coerce_many_run_pass.rs
closure_no_cap_coerce_many_unsafe_0.mir.stderr
closure_no_cap_coerce_many_unsafe_0.rs
closure_no_cap_coerce_many_unsafe_0.thir.stderr
closure_no_cap_coerce_many_unsafe_1.rs
closure_promotion.rs
closure-array-break-length.rs
closure-array-break-length.stderr
closure-bounds-cant-promote-superkind-in-struct.rs
closure-bounds-cant-promote-superkind-in-struct.stderr Revert "Suggest using Arc on !Send/!Sync types" 2023-08-28 03:16:48 -07:00
closure-bounds-static-cant-capture-borrowed.rs
closure-bounds-static-cant-capture-borrowed.stderr
closure-bounds-subtype.rs
closure-bounds-subtype.stderr Revert "Suggest using Arc on !Send/!Sync types" 2023-08-28 03:16:48 -07:00
closure-expected.rs
closure-expected.stderr
closure-immutable-outer-variable.fixed
closure-immutable-outer-variable.rs
closure-immutable-outer-variable.rs.fixed
closure-immutable-outer-variable.stderr
closure-move-sync.rs
closure-move-sync.stderr Revert "Suggest using Arc on !Send/!Sync types" 2023-08-28 03:16:48 -07:00
closure-no-fn-1.rs
closure-no-fn-1.stderr
closure-no-fn-2.rs
closure-no-fn-2.stderr
closure-no-fn-3.rs
closure-no-fn-3.stderr
closure-no-fn-4.rs
closure-no-fn-4.stderr
closure-no-fn-5.rs
closure-no-fn-5.stderr
closure-referencing-itself-issue-25954.rs
closure-referencing-itself-issue-25954.stderr
closure-reform-bad.rs
closure-reform-bad.stderr
closure-return-type-mismatch.rs
closure-return-type-mismatch.stderr
closure-return-type-must-be-sized.rs
closure-return-type-must-be-sized.stderr
closure-wrong-kind.rs
closure-wrong-kind.stderr
coerce-unsafe-closure-to-unsafe-fn-ptr.mir.stderr
coerce-unsafe-closure-to-unsafe-fn-ptr.rs
coerce-unsafe-closure-to-unsafe-fn-ptr.thir.stderr
coerce-unsafe-to-closure.rs
coerce-unsafe-to-closure.stderr
deeply-nested_closures.rs
diverging-closure.rs
issue-868.rs
issue-6801.rs
issue-6801.stderr
issue-10398.rs
issue-10398.stderr
issue-11873.rs Move tests 2023-08-28 17:47:37 -03:00
issue-11873.stderr Move tests 2023-08-28 17:47:37 -03:00
issue-23012-supertrait-signature-inference.rs
issue-25439.rs Move tests 2023-08-28 17:47:37 -03:00
issue-25439.stderr Move tests 2023-08-28 17:47:37 -03:00
issue-41366.rs
issue-42463.rs
issue-46742.rs
issue-48109.rs
issue-52437.rs
issue-52437.stderr
issue-67123.rs
issue-67123.stderr
issue-68025.rs
issue-72408-nested-closures-exponential.rs
issue-78720.rs
issue-78720.stderr
issue-80313-mutable-borrow-in-closure.rs
issue-80313-mutable-borrow-in-closure.stderr
issue-80313-mutable-borrow-in-move-closure.rs
issue-80313-mutable-borrow-in-move-closure.stderr
issue-80313-mutation-in-closure.rs
issue-80313-mutation-in-closure.stderr
issue-80313-mutation-in-move-closure.rs
issue-80313-mutation-in-move-closure.stderr
issue-81700-mut-borrow.rs
issue-81700-mut-borrow.stderr
issue-82438-mut-without-upvar.rs
issue-82438-mut-without-upvar.stderr
issue-84044-drop-non-mut.rs
issue-84044-drop-non-mut.stderr
issue-84128.rs
issue-84128.stderr
issue-87461.rs
issue-87461.stderr
issue-87814-1.rs
issue-87814-2.rs
issue-90871.rs
issue-90871.stderr
issue-97607.rs
issue-99565.rs
issue-99565.stderr
issue-101696.rs
issue-102089-multiple-opaque-cast.rs
issue-109188.rs
issue-109188.stderr
issue-111932.rs
issue-111932.stderr
issue-113087.rs
issue-113087.stderr
local-type-mix.rs
local-type-mix.stderr
multiple-fn-bounds.rs
multiple-fn-bounds.stderr
old-closure-arg-call-as.rs
old-closure-arg.rs
old-closure-explicit-types.rs
old-closure-expr-precedence.rs
old-closure-expr-precedence.stderr
old-closure-expression-remove-semicolon.fixed
old-closure-expression-remove-semicolon.rs
old-closure-expression-remove-semicolon.stderr
old-closure-fn-coerce.rs
old-closure-iter-1.rs
old-closure-iter-2.rs
once-move-out-on-heap.rs
self-supertrait-bounds.rs
semistatement-in-lambda.rs
static-closures-with-nonstatic-return.rs
supertrait-hint-cycle-2.rs
supertrait-hint-cycle-3.rs
supertrait-hint-cycle.rs
supertrait-hint-references-assoc-ty.rs
thir-unsafeck-issue-85871.rs