mirror of
https://github.com/rust-lang/rust.git
synced 2024-11-27 09:14:20 +00:00
790309b102
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` |
||
---|---|---|
.. | ||
2229_closure_analysis | ||
binder | ||
closure-expected-type | ||
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 | ||
closure-bounds-static-cant-capture-borrowed.rs | ||
closure-bounds-static-cant-capture-borrowed.stderr | ||
closure-bounds-subtype.rs | ||
closure-bounds-subtype.stderr | ||
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 | ||
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 | ||
issue-11873.stderr | ||
issue-23012-supertrait-signature-inference.rs | ||
issue-25439.rs | ||
issue-25439.stderr | ||
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 |