From 842c087427b1bd6d70da9ba3b1e7a7e013b786b0 Mon Sep 17 00:00:00 2001 From: Flakebi Date: Mon, 29 Dec 2025 21:55:30 +0100 Subject: [PATCH 01/25] Fix requires_lto targets needing lto set in cargo Targets that set `requires_lto = true` were not actually using lto when compiling with cargo by default. They needed an extra `lto = true` in `Cargo.toml` to work. Fix this by letting lto take precedence over the `embed_bitcode` flag when lto is required by a target. If both these flags would be supplied by the user, an error is generated. However, this did not happen when lto was requested by the target instead of the user. --- compiler/rustc_codegen_ssa/src/back/write.rs | 2 +- .../src/platform-support/amdgcn-amd-amdhsa.md | 5 ---- tests/run-make-cargo/amdgpu-lto/Cargo.toml | 8 ++++++ tests/run-make-cargo/amdgpu-lto/lib.rs | 15 ++++++++++ tests/run-make-cargo/amdgpu-lto/rmake.rs | 28 +++++++++++++++++++ 5 files changed, 52 insertions(+), 6 deletions(-) create mode 100644 tests/run-make-cargo/amdgpu-lto/Cargo.toml create mode 100644 tests/run-make-cargo/amdgpu-lto/lib.rs create mode 100644 tests/run-make-cargo/amdgpu-lto/rmake.rs diff --git a/compiler/rustc_codegen_ssa/src/back/write.rs b/compiler/rustc_codegen_ssa/src/back/write.rs index 3e36bd8552b18..8409c927d1564 100644 --- a/compiler/rustc_codegen_ssa/src/back/write.rs +++ b/compiler/rustc_codegen_ssa/src/back/write.rs @@ -156,7 +156,7 @@ impl ModuleConfig { // `#![no_builtins]` is assumed to not participate in LTO and // instead goes on to generate object code. EmitObj::Bitcode - } else if need_bitcode_in_object(tcx) { + } else if need_bitcode_in_object(tcx) || sess.target.requires_lto { EmitObj::ObjectCode(BitcodeSection::Full) } else { EmitObj::ObjectCode(BitcodeSection::None) diff --git a/src/doc/rustc/src/platform-support/amdgcn-amd-amdhsa.md b/src/doc/rustc/src/platform-support/amdgcn-amd-amdhsa.md index dbdb96283a5fa..8934e7085b8d7 100644 --- a/src/doc/rustc/src/platform-support/amdgcn-amd-amdhsa.md +++ b/src/doc/rustc/src/platform-support/amdgcn-amd-amdhsa.md @@ -59,11 +59,6 @@ Build the library as `cdylib`: # Cargo.toml [lib] crate-type = ["cdylib"] - -[profile.dev] -lto = true # LTO must be explicitly enabled for now -[profile.release] -lto = true ``` The target-cpu must be from the list [supported by LLVM] (or printed with `rustc --target amdgcn-amd-amdhsa --print target-cpus`). diff --git a/tests/run-make-cargo/amdgpu-lto/Cargo.toml b/tests/run-make-cargo/amdgpu-lto/Cargo.toml new file mode 100644 index 0000000000000..b2607b747fd7f --- /dev/null +++ b/tests/run-make-cargo/amdgpu-lto/Cargo.toml @@ -0,0 +1,8 @@ +[package] +name = "amdgpu_lto" +version = "0.1.0" +edition = "2024" + +[lib] +path = "lib.rs" +crate-type = ["cdylib"] diff --git a/tests/run-make-cargo/amdgpu-lto/lib.rs b/tests/run-make-cargo/amdgpu-lto/lib.rs new file mode 100644 index 0000000000000..d17cf5a8316ca --- /dev/null +++ b/tests/run-make-cargo/amdgpu-lto/lib.rs @@ -0,0 +1,15 @@ +#![feature(abi_gpu_kernel)] +#![no_std] + +#[panic_handler] +fn panic_handler(_info: &core::panic::PanicInfo) -> ! { + loop {} +} + +#[unsafe(no_mangle)] +fn foo(a: i32, b: i32) -> i32 { + a + b +} + +#[unsafe(no_mangle)] +extern "gpu-kernel" fn kernel() {} diff --git a/tests/run-make-cargo/amdgpu-lto/rmake.rs b/tests/run-make-cargo/amdgpu-lto/rmake.rs new file mode 100644 index 0000000000000..cb3dc81f34d15 --- /dev/null +++ b/tests/run-make-cargo/amdgpu-lto/rmake.rs @@ -0,0 +1,28 @@ +// Check that compiling for the amdgpu target which needs LTO works with a default +// cargo configuration. + +//@ needs-llvm-components: amdgpu +//@ needs-rust-lld + +#![deny(warnings)] + +use run_make_support::{cargo, path}; + +fn main() { + let target_dir = path("target"); + + cargo() + .args(&[ + "build", + "--release", + "--lib", + "--manifest-path", + "Cargo.toml", + "-Zbuild-std=core", + "--target", + "amdgcn-amd-amdhsa", + ]) + .env("RUSTFLAGS", "-Ctarget-cpu=gfx900") + .env("CARGO_TARGET_DIR", &target_dir) + .run(); +} From d1d2efd88bca58aa0f22a87e29222f956755d11d Mon Sep 17 00:00:00 2001 From: Moulins Date: Wed, 17 Dec 2025 21:33:34 +0100 Subject: [PATCH 02/25] Introduce `VariantLayout` struct For now, this is a 1-to-1 copy of `LayoutData`, but this will change. --- compiler/rustc_abi/src/layout.rs | 6 +-- compiler/rustc_abi/src/layout/coroutine.rs | 4 +- compiler/rustc_abi/src/layout/simple.rs | 21 ++++++++++ compiler/rustc_abi/src/lib.rs | 39 ++++++++++++++++++- compiler/rustc_middle/src/ty/layout.rs | 4 +- src/librustdoc/html/render/type_layout.rs | 2 +- .../enum-discriminant/wrapping_niche.stderr | 12 +++--- tests/ui/layout/debug.stderr | 8 ++-- tests/ui/layout/hexagon-enum.stderr | 10 ++--- ...-scalarpair-payload-might-be-uninit.stderr | 24 ++++++------ .../issue-96185-overaligned-enum.stderr | 8 ++-- tests/ui/layout/thumb-enum.stderr | 10 ++--- .../layout/zero-sized-array-enum-niche.stderr | 18 ++++----- ...-variants.aarch64-unknown-linux-gnu.stderr | 10 ++--- ...-c-dead-variants.armebv7r-none-eabi.stderr | 10 ++--- ...-dead-variants.i686-pc-windows-msvc.stderr | 10 ++--- ...d-variants.x86_64-unknown-linux-gnu.stderr | 10 ++--- tests/ui/repr/repr-c-int-dead-variants.stderr | 10 ++--- tests/ui/type/pattern_types/non_null.stderr | 4 +- .../type/pattern_types/range_patterns.stderr | 8 ++-- 20 files changed, 143 insertions(+), 85 deletions(-) diff --git a/compiler/rustc_abi/src/layout.rs b/compiler/rustc_abi/src/layout.rs index cca1d499088f4..b111ff22c9706 100644 --- a/compiler/rustc_abi/src/layout.rs +++ b/compiler/rustc_abi/src/layout.rs @@ -11,7 +11,7 @@ use tracing::{debug, trace}; use crate::{ AbiAlign, Align, BackendRepr, FieldsShape, HasDataLayout, IndexSlice, IndexVec, Integer, LayoutData, Niche, NonZeroUsize, NumScalableVectors, Primitive, ReprOptions, Scalar, Size, - StructKind, TagEncoding, TargetDataLayout, Variants, WrappingRange, + StructKind, TagEncoding, TargetDataLayout, VariantLayout, Variants, WrappingRange, }; mod coroutine; @@ -660,7 +660,7 @@ impl LayoutCalculator { max_repr_align = max_repr_align.max(st.max_repr_align); unadjusted_abi_align = unadjusted_abi_align.max(st.unadjusted_abi_align); - Some(st) + Some(VariantLayout::from_layout(st)) }) .collect::>>()?; @@ -900,7 +900,7 @@ impl LayoutCalculator { align = align.max(st.align.abi); max_repr_align = max_repr_align.max(st.max_repr_align); unadjusted_abi_align = unadjusted_abi_align.max(st.unadjusted_abi_align); - Ok(st) + Ok(VariantLayout::from_layout(st)) }) .collect::, _>>()?; diff --git a/compiler/rustc_abi/src/layout/coroutine.rs b/compiler/rustc_abi/src/layout/coroutine.rs index 815cf1e28a08c..812ed1f4274fd 100644 --- a/compiler/rustc_abi/src/layout/coroutine.rs +++ b/compiler/rustc_abi/src/layout/coroutine.rs @@ -27,7 +27,7 @@ use tracing::{debug, trace}; use crate::{ BackendRepr, FieldsShape, HasDataLayout, Integer, LayoutData, Primitive, ReprOptions, Scalar, - StructKind, TagEncoding, Variants, WrappingRange, + StructKind, TagEncoding, VariantLayout, Variants, WrappingRange, }; /// Overlap eligibility and variant assignment for each CoroutineSavedLocal. @@ -281,7 +281,7 @@ pub(super) fn layout< size = size.max(variant.size); align = align.max(variant.align); - Ok(variant) + Ok(VariantLayout::from_layout(variant)) }) .collect::, _>>()?; diff --git a/compiler/rustc_abi/src/layout/simple.rs b/compiler/rustc_abi/src/layout/simple.rs index 3784611b157be..cb584d7cf5788 100644 --- a/compiler/rustc_abi/src/layout/simple.rs +++ b/compiler/rustc_abi/src/layout/simple.rs @@ -146,4 +146,25 @@ impl LayoutData { randomization_seed: Hash64::ZERO, } } + + /// Returns a layout for an inhabited variant. + pub fn for_variant(parent: &Self, index: VariantIdx) -> Self { + let layout = match &parent.variants { + Variants::Multiple { variants, .. } => &variants[index], + _ => panic!("Expected multi-variant layout in `Layout::for_variant`"), + }; + + Self { + fields: layout.fields.clone(), + variants: layout.variants.clone(), + backend_repr: layout.backend_repr, + largest_niche: layout.largest_niche, + uninhabited: layout.uninhabited, + align: layout.align, + size: layout.size, + max_repr_align: layout.max_repr_align, + unadjusted_abi_align: layout.unadjusted_abi_align, + randomization_seed: layout.randomization_seed, + } + } } diff --git a/compiler/rustc_abi/src/lib.rs b/compiler/rustc_abi/src/lib.rs index f148b776852aa..40a70f9fa87ec 100644 --- a/compiler/rustc_abi/src/lib.rs +++ b/compiler/rustc_abi/src/lib.rs @@ -1894,7 +1894,7 @@ pub enum Variants { tag: Scalar, tag_encoding: TagEncoding, tag_field: FieldIdx, - variants: IndexVec>, + variants: IndexVec>, }, } @@ -2250,3 +2250,40 @@ pub enum AbiFromStrErr { /// no "-unwind" variant can be used here NoExplicitUnwind, } + +// NOTE: This struct is generic over the FieldIdx and VariantIdx for rust-analyzer usage. +#[derive(PartialEq, Eq, Hash, Clone, Debug)] +#[cfg_attr(feature = "nightly", derive(HashStable_Generic))] +pub struct VariantLayout { + pub size: Size, + pub align: AbiAlign, + pub backend_repr: BackendRepr, + pub fields: FieldsShape, + largest_niche: Option, + uninhabited: bool, + pub variants: Variants, + max_repr_align: Option, + unadjusted_abi_align: Align, + randomization_seed: Hash64, +} + +impl VariantLayout { + pub fn from_layout(layout: LayoutData) -> Self { + Self { + size: layout.size, + align: layout.align, + backend_repr: layout.backend_repr, + fields: layout.fields, + largest_niche: layout.largest_niche, + uninhabited: layout.uninhabited, + variants: layout.variants, + max_repr_align: layout.max_repr_align, + unadjusted_abi_align: layout.unadjusted_abi_align, + randomization_seed: layout.randomization_seed, + } + } + + pub fn is_uninhabited(&self) -> bool { + self.uninhabited + } +} diff --git a/compiler/rustc_middle/src/ty/layout.rs b/compiler/rustc_middle/src/ty/layout.rs index 46682abc823d8..64b1604eca38e 100644 --- a/compiler/rustc_middle/src/ty/layout.rs +++ b/compiler/rustc_middle/src/ty/layout.rs @@ -757,8 +757,8 @@ where tcx.mk_layout(LayoutData::uninhabited_variant(cx, variant_index, fields)) } - Variants::Multiple { ref variants, .. } => { - cx.tcx().mk_layout(variants[variant_index].clone()) + Variants::Multiple { .. } => { + cx.tcx().mk_layout(LayoutData::for_variant(&this, variant_index)) } }; diff --git a/src/librustdoc/html/render/type_layout.rs b/src/librustdoc/html/render/type_layout.rs index 5d5b8d5df685b..0bfe1fa977876 100644 --- a/src/librustdoc/html/render/type_layout.rs +++ b/src/librustdoc/html/render/type_layout.rs @@ -54,7 +54,7 @@ pub(crate) fn document_type_layout(cx: &Context<'_>, ty_def_id: DefId) -> impl f span_bug!(tcx.def_span(ty_def_id), "not an adt") }; let name = adt.variant(variant_idx).name; - let is_unsized = variant_layout.is_unsized(); + let is_unsized = variant_layout.backend_repr.is_unsized(); let is_uninhabited = variant_layout.is_uninhabited(); let size = variant_layout.size.bytes() - tag_size; let type_layout_size = TypeLayoutSize { is_unsized, is_uninhabited, size }; diff --git a/tests/ui/enum-discriminant/wrapping_niche.stderr b/tests/ui/enum-discriminant/wrapping_niche.stderr index 9b97ad4aeac7e..b130d022ea922 100644 --- a/tests/ui/enum-discriminant/wrapping_niche.stderr +++ b/tests/ui/enum-discriminant/wrapping_niche.stderr @@ -42,7 +42,7 @@ error: layout_of(UnsignedAroundZero) = Layout { tag_encoding: Direct, tag_field: 0, variants: [ - Layout { + VariantLayout { size: Size(2 bytes), align: AbiAlign { abi: Align(2 bytes), @@ -63,7 +63,7 @@ error: layout_of(UnsignedAroundZero) = Layout { unadjusted_abi_align: Align(2 bytes), randomization_seed: 9885373149222004003, }, - Layout { + VariantLayout { size: Size(2 bytes), align: AbiAlign { abi: Align(2 bytes), @@ -84,7 +84,7 @@ error: layout_of(UnsignedAroundZero) = Layout { unadjusted_abi_align: Align(2 bytes), randomization_seed: 9885373149222004003, }, - Layout { + VariantLayout { size: Size(2 bytes), align: AbiAlign { abi: Align(2 bytes), @@ -160,7 +160,7 @@ error: layout_of(SignedAroundZero) = Layout { tag_encoding: Direct, tag_field: 0, variants: [ - Layout { + VariantLayout { size: Size(2 bytes), align: AbiAlign { abi: Align(2 bytes), @@ -181,7 +181,7 @@ error: layout_of(SignedAroundZero) = Layout { unadjusted_abi_align: Align(2 bytes), randomization_seed: 2684536712112553499, }, - Layout { + VariantLayout { size: Size(2 bytes), align: AbiAlign { abi: Align(2 bytes), @@ -202,7 +202,7 @@ error: layout_of(SignedAroundZero) = Layout { unadjusted_abi_align: Align(2 bytes), randomization_seed: 2684536712112553499, }, - Layout { + VariantLayout { size: Size(2 bytes), align: AbiAlign { abi: Align(2 bytes), diff --git a/tests/ui/layout/debug.stderr b/tests/ui/layout/debug.stderr index c92f876fa5a13..7092b0d0e79a8 100644 --- a/tests/ui/layout/debug.stderr +++ b/tests/ui/layout/debug.stderr @@ -58,7 +58,7 @@ error: layout_of(E) = Layout { tag_encoding: Direct, tag_field: 0, variants: [ - Layout { + VariantLayout { size: Size(4 bytes), align: AbiAlign { abi: Align(1 bytes), @@ -79,7 +79,7 @@ error: layout_of(E) = Layout { unadjusted_abi_align: Align(1 bytes), randomization_seed: $SEED, }, - Layout { + VariantLayout { size: Size(12 bytes), align: AbiAlign { abi: Align(4 bytes), @@ -242,7 +242,7 @@ error: layout_of(Result) = Layout { tag_encoding: Direct, tag_field: 0, variants: [ - Layout { + VariantLayout { size: Size(8 bytes), align: AbiAlign { abi: Align(4 bytes), @@ -280,7 +280,7 @@ error: layout_of(Result) = Layout { unadjusted_abi_align: Align(4 bytes), randomization_seed: $SEED, }, - Layout { + VariantLayout { size: Size(8 bytes), align: AbiAlign { abi: Align(4 bytes), diff --git a/tests/ui/layout/hexagon-enum.stderr b/tests/ui/layout/hexagon-enum.stderr index 20e0a8642a66f..e2f888a9dd860 100644 --- a/tests/ui/layout/hexagon-enum.stderr +++ b/tests/ui/layout/hexagon-enum.stderr @@ -42,7 +42,7 @@ error: layout_of(A) = Layout { tag_encoding: Direct, tag_field: 0, variants: [ - Layout { + VariantLayout { size: Size(1 bytes), align: AbiAlign { abi: Align(1 bytes), @@ -118,7 +118,7 @@ error: layout_of(B) = Layout { tag_encoding: Direct, tag_field: 0, variants: [ - Layout { + VariantLayout { size: Size(1 bytes), align: AbiAlign { abi: Align(1 bytes), @@ -194,7 +194,7 @@ error: layout_of(C) = Layout { tag_encoding: Direct, tag_field: 0, variants: [ - Layout { + VariantLayout { size: Size(2 bytes), align: AbiAlign { abi: Align(2 bytes), @@ -270,7 +270,7 @@ error: layout_of(P) = Layout { tag_encoding: Direct, tag_field: 0, variants: [ - Layout { + VariantLayout { size: Size(4 bytes), align: AbiAlign { abi: Align(4 bytes), @@ -346,7 +346,7 @@ error: layout_of(T) = Layout { tag_encoding: Direct, tag_field: 0, variants: [ - Layout { + VariantLayout { size: Size(4 bytes), align: AbiAlign { abi: Align(4 bytes), diff --git a/tests/ui/layout/issue-96158-scalarpair-payload-might-be-uninit.stderr b/tests/ui/layout/issue-96158-scalarpair-payload-might-be-uninit.stderr index 61cfcbdc07f75..bcb38889bded8 100644 --- a/tests/ui/layout/issue-96158-scalarpair-payload-might-be-uninit.stderr +++ b/tests/ui/layout/issue-96158-scalarpair-payload-might-be-uninit.stderr @@ -48,7 +48,7 @@ error: layout_of(MissingPayloadField) = Layout { tag_encoding: Direct, tag_field: 0, variants: [ - Layout { + VariantLayout { size: Size(2 bytes), align: AbiAlign { abi: Align(1 bytes), @@ -85,7 +85,7 @@ error: layout_of(MissingPayloadField) = Layout { unadjusted_abi_align: Align(1 bytes), randomization_seed: $SEED, }, - Layout { + VariantLayout { size: Size(1 bytes), align: AbiAlign { abi: Align(1 bytes), @@ -168,7 +168,7 @@ error: layout_of(CommonPayloadField) = Layout { tag_encoding: Direct, tag_field: 0, variants: [ - Layout { + VariantLayout { size: Size(2 bytes), align: AbiAlign { abi: Align(1 bytes), @@ -206,7 +206,7 @@ error: layout_of(CommonPayloadField) = Layout { unadjusted_abi_align: Align(1 bytes), randomization_seed: $SEED, }, - Layout { + VariantLayout { size: Size(2 bytes), align: AbiAlign { abi: Align(1 bytes), @@ -305,7 +305,7 @@ error: layout_of(CommonPayloadFieldIsMaybeUninit) = Layout { tag_encoding: Direct, tag_field: 0, variants: [ - Layout { + VariantLayout { size: Size(2 bytes), align: AbiAlign { abi: Align(1 bytes), @@ -342,7 +342,7 @@ error: layout_of(CommonPayloadFieldIsMaybeUninit) = Layout { unadjusted_abi_align: Align(1 bytes), randomization_seed: $SEED, }, - Layout { + VariantLayout { size: Size(2 bytes), align: AbiAlign { abi: Align(1 bytes), @@ -444,7 +444,7 @@ error: layout_of(NicheFirst) = Layout { }, tag_field: 0, variants: [ - Layout { + VariantLayout { size: Size(2 bytes), align: AbiAlign { abi: Align(1 bytes), @@ -493,7 +493,7 @@ error: layout_of(NicheFirst) = Layout { unadjusted_abi_align: Align(1 bytes), randomization_seed: $SEED, }, - Layout { + VariantLayout { size: Size(0 bytes), align: AbiAlign { abi: Align(1 bytes), @@ -514,7 +514,7 @@ error: layout_of(NicheFirst) = Layout { unadjusted_abi_align: Align(1 bytes), randomization_seed: $SEED, }, - Layout { + VariantLayout { size: Size(0 bytes), align: AbiAlign { abi: Align(1 bytes), @@ -600,7 +600,7 @@ error: layout_of(NicheSecond) = Layout { }, tag_field: 0, variants: [ - Layout { + VariantLayout { size: Size(2 bytes), align: AbiAlign { abi: Align(1 bytes), @@ -649,7 +649,7 @@ error: layout_of(NicheSecond) = Layout { unadjusted_abi_align: Align(1 bytes), randomization_seed: $SEED, }, - Layout { + VariantLayout { size: Size(0 bytes), align: AbiAlign { abi: Align(1 bytes), @@ -670,7 +670,7 @@ error: layout_of(NicheSecond) = Layout { unadjusted_abi_align: Align(1 bytes), randomization_seed: $SEED, }, - Layout { + VariantLayout { size: Size(0 bytes), align: AbiAlign { abi: Align(1 bytes), diff --git a/tests/ui/layout/issue-96185-overaligned-enum.stderr b/tests/ui/layout/issue-96185-overaligned-enum.stderr index 64e2f42c042f1..20607303599ec 100644 --- a/tests/ui/layout/issue-96185-overaligned-enum.stderr +++ b/tests/ui/layout/issue-96185-overaligned-enum.stderr @@ -36,7 +36,7 @@ error: layout_of(Aligned1) = Layout { tag_encoding: Direct, tag_field: 0, variants: [ - Layout { + VariantLayout { size: Size(8 bytes), align: AbiAlign { abi: Align(8 bytes), @@ -59,7 +59,7 @@ error: layout_of(Aligned1) = Layout { unadjusted_abi_align: Align(1 bytes), randomization_seed: $SEED, }, - Layout { + VariantLayout { size: Size(8 bytes), align: AbiAlign { abi: Align(8 bytes), @@ -139,7 +139,7 @@ error: layout_of(Aligned2) = Layout { tag_encoding: Direct, tag_field: 0, variants: [ - Layout { + VariantLayout { size: Size(1 bytes), align: AbiAlign { abi: Align(1 bytes), @@ -162,7 +162,7 @@ error: layout_of(Aligned2) = Layout { unadjusted_abi_align: Align(1 bytes), randomization_seed: $SEED, }, - Layout { + VariantLayout { size: Size(1 bytes), align: AbiAlign { abi: Align(1 bytes), diff --git a/tests/ui/layout/thumb-enum.stderr b/tests/ui/layout/thumb-enum.stderr index a6e603652123b..07be46db6ed85 100644 --- a/tests/ui/layout/thumb-enum.stderr +++ b/tests/ui/layout/thumb-enum.stderr @@ -42,7 +42,7 @@ error: layout_of(A) = Layout { tag_encoding: Direct, tag_field: 0, variants: [ - Layout { + VariantLayout { size: Size(1 bytes), align: AbiAlign { abi: Align(1 bytes), @@ -118,7 +118,7 @@ error: layout_of(B) = Layout { tag_encoding: Direct, tag_field: 0, variants: [ - Layout { + VariantLayout { size: Size(1 bytes), align: AbiAlign { abi: Align(1 bytes), @@ -194,7 +194,7 @@ error: layout_of(C) = Layout { tag_encoding: Direct, tag_field: 0, variants: [ - Layout { + VariantLayout { size: Size(2 bytes), align: AbiAlign { abi: Align(2 bytes), @@ -270,7 +270,7 @@ error: layout_of(P) = Layout { tag_encoding: Direct, tag_field: 0, variants: [ - Layout { + VariantLayout { size: Size(4 bytes), align: AbiAlign { abi: Align(4 bytes), @@ -346,7 +346,7 @@ error: layout_of(T) = Layout { tag_encoding: Direct, tag_field: 0, variants: [ - Layout { + VariantLayout { size: Size(4 bytes), align: AbiAlign { abi: Align(4 bytes), diff --git a/tests/ui/layout/zero-sized-array-enum-niche.stderr b/tests/ui/layout/zero-sized-array-enum-niche.stderr index 23f9092778085..94462d737d3cd 100644 --- a/tests/ui/layout/zero-sized-array-enum-niche.stderr +++ b/tests/ui/layout/zero-sized-array-enum-niche.stderr @@ -36,7 +36,7 @@ error: layout_of(Result<[u32; 0], bool>) = Layout { tag_encoding: Direct, tag_field: 0, variants: [ - Layout { + VariantLayout { size: Size(4 bytes), align: AbiAlign { abi: Align(4 bytes), @@ -61,7 +61,7 @@ error: layout_of(Result<[u32; 0], bool>) = Layout { unadjusted_abi_align: Align(4 bytes), randomization_seed: $SEED, }, - Layout { + VariantLayout { size: Size(2 bytes), align: AbiAlign { abi: Align(1 bytes), @@ -144,7 +144,7 @@ error: layout_of(MultipleAlignments) = Layout { tag_encoding: Direct, tag_field: 0, variants: [ - Layout { + VariantLayout { size: Size(2 bytes), align: AbiAlign { abi: Align(2 bytes), @@ -169,7 +169,7 @@ error: layout_of(MultipleAlignments) = Layout { unadjusted_abi_align: Align(2 bytes), randomization_seed: $SEED, }, - Layout { + VariantLayout { size: Size(4 bytes), align: AbiAlign { abi: Align(4 bytes), @@ -194,7 +194,7 @@ error: layout_of(MultipleAlignments) = Layout { unadjusted_abi_align: Align(4 bytes), randomization_seed: $SEED, }, - Layout { + VariantLayout { size: Size(2 bytes), align: AbiAlign { abi: Align(1 bytes), @@ -277,7 +277,7 @@ error: layout_of(Result<[u32; 0], Packed>>) = Layout { tag_encoding: Direct, tag_field: 0, variants: [ - Layout { + VariantLayout { size: Size(4 bytes), align: AbiAlign { abi: Align(4 bytes), @@ -302,7 +302,7 @@ error: layout_of(Result<[u32; 0], Packed>>) = Layout { unadjusted_abi_align: Align(4 bytes), randomization_seed: $SEED, }, - Layout { + VariantLayout { size: Size(3 bytes), align: AbiAlign { abi: Align(1 bytes), @@ -389,7 +389,7 @@ error: layout_of(Result<[u32; 0], Packed>) = Layout { }, tag_field: 0, variants: [ - Layout { + VariantLayout { size: Size(0 bytes), align: AbiAlign { abi: Align(4 bytes), @@ -414,7 +414,7 @@ error: layout_of(Result<[u32; 0], Packed>) = Layout { unadjusted_abi_align: Align(4 bytes), randomization_seed: $SEED, }, - Layout { + VariantLayout { size: Size(2 bytes), align: AbiAlign { abi: Align(1 bytes), diff --git a/tests/ui/repr/repr-c-dead-variants.aarch64-unknown-linux-gnu.stderr b/tests/ui/repr/repr-c-dead-variants.aarch64-unknown-linux-gnu.stderr index 62f6ec92d493c..5e764a7c77e91 100644 --- a/tests/ui/repr/repr-c-dead-variants.aarch64-unknown-linux-gnu.stderr +++ b/tests/ui/repr/repr-c-dead-variants.aarch64-unknown-linux-gnu.stderr @@ -42,7 +42,7 @@ error: layout_of(Univariant) = Layout { tag_encoding: Direct, tag_field: 0, variants: [ - Layout { + VariantLayout { size: Size(4 bytes), align: AbiAlign { abi: Align(4 bytes), @@ -134,7 +134,7 @@ error: layout_of(TwoVariants) = Layout { tag_encoding: Direct, tag_field: 0, variants: [ - Layout { + VariantLayout { size: Size(8 bytes), align: AbiAlign { abi: Align(4 bytes), @@ -171,7 +171,7 @@ error: layout_of(TwoVariants) = Layout { unadjusted_abi_align: Align(4 bytes), randomization_seed: $SEED, }, - Layout { + VariantLayout { size: Size(8 bytes), align: AbiAlign { abi: Align(4 bytes), @@ -257,7 +257,7 @@ error: layout_of(DeadBranchHasOtherField) = Layout { tag_encoding: Direct, tag_field: 0, variants: [ - Layout { + VariantLayout { size: Size(16 bytes), align: AbiAlign { abi: Align(8 bytes), @@ -286,7 +286,7 @@ error: layout_of(DeadBranchHasOtherField) = Layout { unadjusted_abi_align: Align(8 bytes), randomization_seed: $SEED, }, - Layout { + VariantLayout { size: Size(16 bytes), align: AbiAlign { abi: Align(8 bytes), diff --git a/tests/ui/repr/repr-c-dead-variants.armebv7r-none-eabi.stderr b/tests/ui/repr/repr-c-dead-variants.armebv7r-none-eabi.stderr index 3e0efad974cd2..05bbb6004545f 100644 --- a/tests/ui/repr/repr-c-dead-variants.armebv7r-none-eabi.stderr +++ b/tests/ui/repr/repr-c-dead-variants.armebv7r-none-eabi.stderr @@ -42,7 +42,7 @@ error: layout_of(Univariant) = Layout { tag_encoding: Direct, tag_field: 0, variants: [ - Layout { + VariantLayout { size: Size(1 bytes), align: AbiAlign { abi: Align(1 bytes), @@ -134,7 +134,7 @@ error: layout_of(TwoVariants) = Layout { tag_encoding: Direct, tag_field: 0, variants: [ - Layout { + VariantLayout { size: Size(2 bytes), align: AbiAlign { abi: Align(1 bytes), @@ -171,7 +171,7 @@ error: layout_of(TwoVariants) = Layout { unadjusted_abi_align: Align(1 bytes), randomization_seed: $SEED, }, - Layout { + VariantLayout { size: Size(2 bytes), align: AbiAlign { abi: Align(1 bytes), @@ -257,7 +257,7 @@ error: layout_of(DeadBranchHasOtherField) = Layout { tag_encoding: Direct, tag_field: 0, variants: [ - Layout { + VariantLayout { size: Size(16 bytes), align: AbiAlign { abi: Align(8 bytes), @@ -286,7 +286,7 @@ error: layout_of(DeadBranchHasOtherField) = Layout { unadjusted_abi_align: Align(8 bytes), randomization_seed: $SEED, }, - Layout { + VariantLayout { size: Size(16 bytes), align: AbiAlign { abi: Align(8 bytes), diff --git a/tests/ui/repr/repr-c-dead-variants.i686-pc-windows-msvc.stderr b/tests/ui/repr/repr-c-dead-variants.i686-pc-windows-msvc.stderr index 62f6ec92d493c..5e764a7c77e91 100644 --- a/tests/ui/repr/repr-c-dead-variants.i686-pc-windows-msvc.stderr +++ b/tests/ui/repr/repr-c-dead-variants.i686-pc-windows-msvc.stderr @@ -42,7 +42,7 @@ error: layout_of(Univariant) = Layout { tag_encoding: Direct, tag_field: 0, variants: [ - Layout { + VariantLayout { size: Size(4 bytes), align: AbiAlign { abi: Align(4 bytes), @@ -134,7 +134,7 @@ error: layout_of(TwoVariants) = Layout { tag_encoding: Direct, tag_field: 0, variants: [ - Layout { + VariantLayout { size: Size(8 bytes), align: AbiAlign { abi: Align(4 bytes), @@ -171,7 +171,7 @@ error: layout_of(TwoVariants) = Layout { unadjusted_abi_align: Align(4 bytes), randomization_seed: $SEED, }, - Layout { + VariantLayout { size: Size(8 bytes), align: AbiAlign { abi: Align(4 bytes), @@ -257,7 +257,7 @@ error: layout_of(DeadBranchHasOtherField) = Layout { tag_encoding: Direct, tag_field: 0, variants: [ - Layout { + VariantLayout { size: Size(16 bytes), align: AbiAlign { abi: Align(8 bytes), @@ -286,7 +286,7 @@ error: layout_of(DeadBranchHasOtherField) = Layout { unadjusted_abi_align: Align(8 bytes), randomization_seed: $SEED, }, - Layout { + VariantLayout { size: Size(16 bytes), align: AbiAlign { abi: Align(8 bytes), diff --git a/tests/ui/repr/repr-c-dead-variants.x86_64-unknown-linux-gnu.stderr b/tests/ui/repr/repr-c-dead-variants.x86_64-unknown-linux-gnu.stderr index 62f6ec92d493c..5e764a7c77e91 100644 --- a/tests/ui/repr/repr-c-dead-variants.x86_64-unknown-linux-gnu.stderr +++ b/tests/ui/repr/repr-c-dead-variants.x86_64-unknown-linux-gnu.stderr @@ -42,7 +42,7 @@ error: layout_of(Univariant) = Layout { tag_encoding: Direct, tag_field: 0, variants: [ - Layout { + VariantLayout { size: Size(4 bytes), align: AbiAlign { abi: Align(4 bytes), @@ -134,7 +134,7 @@ error: layout_of(TwoVariants) = Layout { tag_encoding: Direct, tag_field: 0, variants: [ - Layout { + VariantLayout { size: Size(8 bytes), align: AbiAlign { abi: Align(4 bytes), @@ -171,7 +171,7 @@ error: layout_of(TwoVariants) = Layout { unadjusted_abi_align: Align(4 bytes), randomization_seed: $SEED, }, - Layout { + VariantLayout { size: Size(8 bytes), align: AbiAlign { abi: Align(4 bytes), @@ -257,7 +257,7 @@ error: layout_of(DeadBranchHasOtherField) = Layout { tag_encoding: Direct, tag_field: 0, variants: [ - Layout { + VariantLayout { size: Size(16 bytes), align: AbiAlign { abi: Align(8 bytes), @@ -286,7 +286,7 @@ error: layout_of(DeadBranchHasOtherField) = Layout { unadjusted_abi_align: Align(8 bytes), randomization_seed: $SEED, }, - Layout { + VariantLayout { size: Size(16 bytes), align: AbiAlign { abi: Align(8 bytes), diff --git a/tests/ui/repr/repr-c-int-dead-variants.stderr b/tests/ui/repr/repr-c-int-dead-variants.stderr index b25e4a9b7b6f5..12155358ad517 100644 --- a/tests/ui/repr/repr-c-int-dead-variants.stderr +++ b/tests/ui/repr/repr-c-int-dead-variants.stderr @@ -42,7 +42,7 @@ error: layout_of(UnivariantU8) = Layout { tag_encoding: Direct, tag_field: 0, variants: [ - Layout { + VariantLayout { size: Size(1 bytes), align: AbiAlign { abi: Align(1 bytes), @@ -134,7 +134,7 @@ error: layout_of(TwoVariantsU8) = Layout { tag_encoding: Direct, tag_field: 0, variants: [ - Layout { + VariantLayout { size: Size(2 bytes), align: AbiAlign { abi: Align(1 bytes), @@ -171,7 +171,7 @@ error: layout_of(TwoVariantsU8) = Layout { unadjusted_abi_align: Align(1 bytes), randomization_seed: $SEED, }, - Layout { + VariantLayout { size: Size(2 bytes), align: AbiAlign { abi: Align(1 bytes), @@ -257,7 +257,7 @@ error: layout_of(DeadBranchHasOtherFieldU8) = Layout { tag_encoding: Direct, tag_field: 0, variants: [ - Layout { + VariantLayout { size: Size(16 bytes), align: AbiAlign { abi: Align(8 bytes), @@ -286,7 +286,7 @@ error: layout_of(DeadBranchHasOtherFieldU8) = Layout { unadjusted_abi_align: Align(8 bytes), randomization_seed: $SEED, }, - Layout { + VariantLayout { size: Size(16 bytes), align: AbiAlign { abi: Align(8 bytes), diff --git a/tests/ui/type/pattern_types/non_null.stderr b/tests/ui/type/pattern_types/non_null.stderr index 0847af2d086fa..d1f1fc4b322fe 100644 --- a/tests/ui/type/pattern_types/non_null.stderr +++ b/tests/ui/type/pattern_types/non_null.stderr @@ -86,7 +86,7 @@ error: layout_of(Option<(*const ()) is !null>) = Layout { }, tag_field: 0, variants: [ - Layout { + VariantLayout { size: Size(0 bytes), align: AbiAlign { abi: Align(1 bytes), @@ -107,7 +107,7 @@ error: layout_of(Option<(*const ()) is !null>) = Layout { unadjusted_abi_align: Align(1 bytes), randomization_seed: $SEED, }, - Layout { + VariantLayout { size: Size(8 bytes), align: AbiAlign { abi: Align(8 bytes), diff --git a/tests/ui/type/pattern_types/range_patterns.stderr b/tests/ui/type/pattern_types/range_patterns.stderr index 6c9acac7eb7b8..fe38f70d008aa 100644 --- a/tests/ui/type/pattern_types/range_patterns.stderr +++ b/tests/ui/type/pattern_types/range_patterns.stderr @@ -127,7 +127,7 @@ error: layout_of(Option<(u32) is 1..>) = Layout { }, tag_field: 0, variants: [ - Layout { + VariantLayout { size: Size(0 bytes), align: AbiAlign { abi: Align(1 bytes), @@ -148,7 +148,7 @@ error: layout_of(Option<(u32) is 1..>) = Layout { unadjusted_abi_align: Align(1 bytes), randomization_seed: $SEED, }, - Layout { + VariantLayout { size: Size(4 bytes), align: AbiAlign { abi: Align(4 bytes), @@ -238,7 +238,7 @@ error: layout_of(Option>) = Layout { }, tag_field: 0, variants: [ - Layout { + VariantLayout { size: Size(0 bytes), align: AbiAlign { abi: Align(1 bytes), @@ -259,7 +259,7 @@ error: layout_of(Option>) = Layout { unadjusted_abi_align: Align(1 bytes), randomization_seed: $SEED, }, - Layout { + VariantLayout { size: Size(4 bytes), align: AbiAlign { abi: Align(4 bytes), From dcc9f81f74fe71d8b7017ae7f9a4e471f850d66b Mon Sep 17 00:00:00 2001 From: Moulins Date: Wed, 17 Dec 2025 22:37:23 +0100 Subject: [PATCH 03/25] Remove redundant `VariantLayout.variants` field It was always set to `Variants::Single`. --- compiler/rustc_abi/src/layout.rs | 14 ++++---- compiler/rustc_abi/src/layout/coroutine.rs | 1 - compiler/rustc_abi/src/layout/simple.rs | 2 +- compiler/rustc_abi/src/lib.rs | 10 +++--- .../rustc_ty_utils/src/layout/invariant.rs | 2 -- .../enum-discriminant/wrapping_niche.stderr | 18 ---------- tests/ui/layout/debug.stderr | 12 ------- tests/ui/layout/hexagon-enum.stderr | 15 -------- ...-scalarpair-payload-might-be-uninit.stderr | 36 ------------------- .../issue-96185-overaligned-enum.stderr | 12 ------- tests/ui/layout/thumb-enum.stderr | 15 -------- .../layout/zero-sized-array-enum-niche.stderr | 27 -------------- ...-variants.aarch64-unknown-linux-gnu.stderr | 15 -------- ...-c-dead-variants.armebv7r-none-eabi.stderr | 15 -------- ...-dead-variants.i686-pc-windows-msvc.stderr | 15 -------- ...d-variants.x86_64-unknown-linux-gnu.stderr | 15 -------- tests/ui/repr/repr-c-int-dead-variants.stderr | 15 -------- tests/ui/type/pattern_types/non_null.stderr | 6 ---- .../type/pattern_types/range_patterns.stderr | 12 ------- 19 files changed, 11 insertions(+), 246 deletions(-) diff --git a/compiler/rustc_abi/src/layout.rs b/compiler/rustc_abi/src/layout.rs index b111ff22c9706..18852c305b748 100644 --- a/compiler/rustc_abi/src/layout.rs +++ b/compiler/rustc_abi/src/layout.rs @@ -651,10 +651,9 @@ impl LayoutCalculator { let mut unadjusted_abi_align = align; let mut variant_layouts = variants - .iter_enumerated() - .map(|(j, v)| { - let mut st = self.univariant(v, repr, StructKind::AlwaysSized).ok()?; - st.variants = Variants::Single { index: j }; + .iter() + .map(|v| { + let st = self.univariant(v, repr, StructKind::AlwaysSized).ok()?; align = align.max(st.align.abi); max_repr_align = max_repr_align.max(st.max_repr_align); @@ -879,14 +878,13 @@ impl LayoutCalculator { // Create the set of structs that represent each variant. let mut layout_variants = variants - .iter_enumerated() - .map(|(i, field_layouts)| { - let mut st = self.univariant( + .iter() + .map(|field_layouts| { + let st = self.univariant( field_layouts, repr, StructKind::Prefixed(min_ity.size(), prefix_align), )?; - st.variants = Variants::Single { index: i }; // Find the first field we can't move later // to make room for a larger discriminant. for field_idx in st.fields.index_by_increasing_offset() { diff --git a/compiler/rustc_abi/src/layout/coroutine.rs b/compiler/rustc_abi/src/layout/coroutine.rs index 812ed1f4274fd..fd68d06c93829 100644 --- a/compiler/rustc_abi/src/layout/coroutine.rs +++ b/compiler/rustc_abi/src/layout/coroutine.rs @@ -230,7 +230,6 @@ pub(super) fn layout< &ReprOptions::default(), StructKind::Prefixed(prefix_size, prefix_align.abi), )?; - variant.variants = Variants::Single { index }; let FieldsShape::Arbitrary { offsets, in_memory_order } = variant.fields else { unreachable!(); diff --git a/compiler/rustc_abi/src/layout/simple.rs b/compiler/rustc_abi/src/layout/simple.rs index cb584d7cf5788..7c714b6a880df 100644 --- a/compiler/rustc_abi/src/layout/simple.rs +++ b/compiler/rustc_abi/src/layout/simple.rs @@ -156,7 +156,7 @@ impl LayoutData { Self { fields: layout.fields.clone(), - variants: layout.variants.clone(), + variants: Variants::Single { index }, backend_repr: layout.backend_repr, largest_niche: layout.largest_niche, uninhabited: layout.uninhabited, diff --git a/compiler/rustc_abi/src/lib.rs b/compiler/rustc_abi/src/lib.rs index 40a70f9fa87ec..5339c0cf8e873 100644 --- a/compiler/rustc_abi/src/lib.rs +++ b/compiler/rustc_abi/src/lib.rs @@ -1894,7 +1894,7 @@ pub enum Variants { tag: Scalar, tag_encoding: TagEncoding, tag_field: FieldIdx, - variants: IndexVec>, + variants: IndexVec>, }, } @@ -2254,21 +2254,20 @@ pub enum AbiFromStrErr { // NOTE: This struct is generic over the FieldIdx and VariantIdx for rust-analyzer usage. #[derive(PartialEq, Eq, Hash, Clone, Debug)] #[cfg_attr(feature = "nightly", derive(HashStable_Generic))] -pub struct VariantLayout { +pub struct VariantLayout { pub size: Size, pub align: AbiAlign, pub backend_repr: BackendRepr, pub fields: FieldsShape, largest_niche: Option, uninhabited: bool, - pub variants: Variants, max_repr_align: Option, unadjusted_abi_align: Align, randomization_seed: Hash64, } -impl VariantLayout { - pub fn from_layout(layout: LayoutData) -> Self { +impl VariantLayout { + pub fn from_layout(layout: LayoutData) -> Self { Self { size: layout.size, align: layout.align, @@ -2276,7 +2275,6 @@ impl VariantLayout { fields: layout.fields, largest_niche: layout.largest_niche, uninhabited: layout.uninhabited, - variants: layout.variants, max_repr_align: layout.max_repr_align, unadjusted_abi_align: layout.unadjusted_abi_align, randomization_seed: layout.randomization_seed, diff --git a/compiler/rustc_ty_utils/src/layout/invariant.rs b/compiler/rustc_ty_utils/src/layout/invariant.rs index 03ac1674dbd50..fc09d8664f713 100644 --- a/compiler/rustc_ty_utils/src/layout/invariant.rs +++ b/compiler/rustc_ty_utils/src/layout/invariant.rs @@ -294,8 +294,6 @@ pub(super) fn layout_sanity_check<'tcx>(cx: &LayoutCx<'tcx>, layout: &TyAndLayou } } for variant in variants.iter() { - // No nested "multiple". - assert_matches!(variant.variants, Variants::Single { .. }); // Variants should have the same or a smaller size as the full thing, // and same for alignment. if variant.size > layout.size { diff --git a/tests/ui/enum-discriminant/wrapping_niche.stderr b/tests/ui/enum-discriminant/wrapping_niche.stderr index b130d022ea922..568922c224584 100644 --- a/tests/ui/enum-discriminant/wrapping_niche.stderr +++ b/tests/ui/enum-discriminant/wrapping_niche.stderr @@ -56,9 +56,6 @@ error: layout_of(UnsignedAroundZero) = Layout { }, largest_niche: None, uninhabited: false, - variants: Single { - index: 0, - }, max_repr_align: None, unadjusted_abi_align: Align(2 bytes), randomization_seed: 9885373149222004003, @@ -77,9 +74,6 @@ error: layout_of(UnsignedAroundZero) = Layout { }, largest_niche: None, uninhabited: false, - variants: Single { - index: 1, - }, max_repr_align: None, unadjusted_abi_align: Align(2 bytes), randomization_seed: 9885373149222004003, @@ -98,9 +92,6 @@ error: layout_of(UnsignedAroundZero) = Layout { }, largest_niche: None, uninhabited: false, - variants: Single { - index: 2, - }, max_repr_align: None, unadjusted_abi_align: Align(2 bytes), randomization_seed: 9885373149222004003, @@ -174,9 +165,6 @@ error: layout_of(SignedAroundZero) = Layout { }, largest_niche: None, uninhabited: false, - variants: Single { - index: 0, - }, max_repr_align: None, unadjusted_abi_align: Align(2 bytes), randomization_seed: 2684536712112553499, @@ -195,9 +183,6 @@ error: layout_of(SignedAroundZero) = Layout { }, largest_niche: None, uninhabited: false, - variants: Single { - index: 1, - }, max_repr_align: None, unadjusted_abi_align: Align(2 bytes), randomization_seed: 2684536712112553499, @@ -216,9 +201,6 @@ error: layout_of(SignedAroundZero) = Layout { }, largest_niche: None, uninhabited: false, - variants: Single { - index: 2, - }, max_repr_align: None, unadjusted_abi_align: Align(2 bytes), randomization_seed: 2684536712112553499, diff --git a/tests/ui/layout/debug.stderr b/tests/ui/layout/debug.stderr index 7092b0d0e79a8..1b08a25c7969e 100644 --- a/tests/ui/layout/debug.stderr +++ b/tests/ui/layout/debug.stderr @@ -72,9 +72,6 @@ error: layout_of(E) = Layout { }, largest_niche: None, uninhabited: false, - variants: Single { - index: 0, - }, max_repr_align: None, unadjusted_abi_align: Align(1 bytes), randomization_seed: $SEED, @@ -101,9 +98,6 @@ error: layout_of(E) = Layout { }, largest_niche: None, uninhabited: true, - variants: Single { - index: 1, - }, max_repr_align: None, unadjusted_abi_align: Align(4 bytes), randomization_seed: $SEED, @@ -273,9 +267,6 @@ error: layout_of(Result) = Layout { }, largest_niche: None, uninhabited: false, - variants: Single { - index: 0, - }, max_repr_align: None, unadjusted_abi_align: Align(4 bytes), randomization_seed: $SEED, @@ -311,9 +302,6 @@ error: layout_of(Result) = Layout { }, largest_niche: None, uninhabited: false, - variants: Single { - index: 1, - }, max_repr_align: None, unadjusted_abi_align: Align(4 bytes), randomization_seed: $SEED, diff --git a/tests/ui/layout/hexagon-enum.stderr b/tests/ui/layout/hexagon-enum.stderr index e2f888a9dd860..ce68514f30277 100644 --- a/tests/ui/layout/hexagon-enum.stderr +++ b/tests/ui/layout/hexagon-enum.stderr @@ -56,9 +56,6 @@ error: layout_of(A) = Layout { }, largest_niche: None, uninhabited: false, - variants: Single { - index: 0, - }, max_repr_align: None, unadjusted_abi_align: Align(1 bytes), randomization_seed: $SEED, @@ -132,9 +129,6 @@ error: layout_of(B) = Layout { }, largest_niche: None, uninhabited: false, - variants: Single { - index: 0, - }, max_repr_align: None, unadjusted_abi_align: Align(1 bytes), randomization_seed: $SEED, @@ -208,9 +202,6 @@ error: layout_of(C) = Layout { }, largest_niche: None, uninhabited: false, - variants: Single { - index: 0, - }, max_repr_align: None, unadjusted_abi_align: Align(2 bytes), randomization_seed: $SEED, @@ -284,9 +275,6 @@ error: layout_of(P) = Layout { }, largest_niche: None, uninhabited: false, - variants: Single { - index: 0, - }, max_repr_align: None, unadjusted_abi_align: Align(4 bytes), randomization_seed: $SEED, @@ -360,9 +348,6 @@ error: layout_of(T) = Layout { }, largest_niche: None, uninhabited: false, - variants: Single { - index: 0, - }, max_repr_align: None, unadjusted_abi_align: Align(4 bytes), randomization_seed: $SEED, diff --git a/tests/ui/layout/issue-96158-scalarpair-payload-might-be-uninit.stderr b/tests/ui/layout/issue-96158-scalarpair-payload-might-be-uninit.stderr index bcb38889bded8..9f78cfd792365 100644 --- a/tests/ui/layout/issue-96158-scalarpair-payload-might-be-uninit.stderr +++ b/tests/ui/layout/issue-96158-scalarpair-payload-might-be-uninit.stderr @@ -78,9 +78,6 @@ error: layout_of(MissingPayloadField) = Layout { }, largest_niche: None, uninhabited: false, - variants: Single { - index: 0, - }, max_repr_align: None, unadjusted_abi_align: Align(1 bytes), randomization_seed: $SEED, @@ -99,9 +96,6 @@ error: layout_of(MissingPayloadField) = Layout { }, largest_niche: None, uninhabited: false, - variants: Single { - index: 1, - }, max_repr_align: None, unadjusted_abi_align: Align(1 bytes), randomization_seed: $SEED, @@ -199,9 +193,6 @@ error: layout_of(CommonPayloadField) = Layout { }, largest_niche: None, uninhabited: false, - variants: Single { - index: 0, - }, max_repr_align: None, unadjusted_abi_align: Align(1 bytes), randomization_seed: $SEED, @@ -237,9 +228,6 @@ error: layout_of(CommonPayloadField) = Layout { }, largest_niche: None, uninhabited: false, - variants: Single { - index: 1, - }, max_repr_align: None, unadjusted_abi_align: Align(1 bytes), randomization_seed: $SEED, @@ -335,9 +323,6 @@ error: layout_of(CommonPayloadFieldIsMaybeUninit) = Layout { }, largest_niche: None, uninhabited: false, - variants: Single { - index: 0, - }, max_repr_align: None, unadjusted_abi_align: Align(1 bytes), randomization_seed: $SEED, @@ -372,9 +357,6 @@ error: layout_of(CommonPayloadFieldIsMaybeUninit) = Layout { }, largest_niche: None, uninhabited: false, - variants: Single { - index: 1, - }, max_repr_align: None, unadjusted_abi_align: Align(1 bytes), randomization_seed: $SEED, @@ -486,9 +468,6 @@ error: layout_of(NicheFirst) = Layout { }, ), uninhabited: false, - variants: Single { - index: 0, - }, max_repr_align: None, unadjusted_abi_align: Align(1 bytes), randomization_seed: $SEED, @@ -507,9 +486,6 @@ error: layout_of(NicheFirst) = Layout { }, largest_niche: None, uninhabited: false, - variants: Single { - index: 1, - }, max_repr_align: None, unadjusted_abi_align: Align(1 bytes), randomization_seed: $SEED, @@ -528,9 +504,6 @@ error: layout_of(NicheFirst) = Layout { }, largest_niche: None, uninhabited: false, - variants: Single { - index: 2, - }, max_repr_align: None, unadjusted_abi_align: Align(1 bytes), randomization_seed: $SEED, @@ -642,9 +615,6 @@ error: layout_of(NicheSecond) = Layout { }, ), uninhabited: false, - variants: Single { - index: 0, - }, max_repr_align: None, unadjusted_abi_align: Align(1 bytes), randomization_seed: $SEED, @@ -663,9 +633,6 @@ error: layout_of(NicheSecond) = Layout { }, largest_niche: None, uninhabited: false, - variants: Single { - index: 1, - }, max_repr_align: None, unadjusted_abi_align: Align(1 bytes), randomization_seed: $SEED, @@ -684,9 +651,6 @@ error: layout_of(NicheSecond) = Layout { }, largest_niche: None, uninhabited: false, - variants: Single { - index: 2, - }, max_repr_align: None, unadjusted_abi_align: Align(1 bytes), randomization_seed: $SEED, diff --git a/tests/ui/layout/issue-96185-overaligned-enum.stderr b/tests/ui/layout/issue-96185-overaligned-enum.stderr index 20607303599ec..cc5818e78c71b 100644 --- a/tests/ui/layout/issue-96185-overaligned-enum.stderr +++ b/tests/ui/layout/issue-96185-overaligned-enum.stderr @@ -50,9 +50,6 @@ error: layout_of(Aligned1) = Layout { }, largest_niche: None, uninhabited: false, - variants: Single { - index: 0, - }, max_repr_align: Some( Align(8 bytes), ), @@ -73,9 +70,6 @@ error: layout_of(Aligned1) = Layout { }, largest_niche: None, uninhabited: false, - variants: Single { - index: 1, - }, max_repr_align: Some( Align(8 bytes), ), @@ -153,9 +147,6 @@ error: layout_of(Aligned2) = Layout { }, largest_niche: None, uninhabited: false, - variants: Single { - index: 0, - }, max_repr_align: Some( Align(1 bytes), ), @@ -176,9 +167,6 @@ error: layout_of(Aligned2) = Layout { }, largest_niche: None, uninhabited: false, - variants: Single { - index: 1, - }, max_repr_align: Some( Align(1 bytes), ), diff --git a/tests/ui/layout/thumb-enum.stderr b/tests/ui/layout/thumb-enum.stderr index 07be46db6ed85..3c5f906d67aa8 100644 --- a/tests/ui/layout/thumb-enum.stderr +++ b/tests/ui/layout/thumb-enum.stderr @@ -56,9 +56,6 @@ error: layout_of(A) = Layout { }, largest_niche: None, uninhabited: false, - variants: Single { - index: 0, - }, max_repr_align: None, unadjusted_abi_align: Align(1 bytes), randomization_seed: $SEED, @@ -132,9 +129,6 @@ error: layout_of(B) = Layout { }, largest_niche: None, uninhabited: false, - variants: Single { - index: 0, - }, max_repr_align: None, unadjusted_abi_align: Align(1 bytes), randomization_seed: $SEED, @@ -208,9 +202,6 @@ error: layout_of(C) = Layout { }, largest_niche: None, uninhabited: false, - variants: Single { - index: 0, - }, max_repr_align: None, unadjusted_abi_align: Align(2 bytes), randomization_seed: $SEED, @@ -284,9 +275,6 @@ error: layout_of(P) = Layout { }, largest_niche: None, uninhabited: false, - variants: Single { - index: 0, - }, max_repr_align: None, unadjusted_abi_align: Align(4 bytes), randomization_seed: $SEED, @@ -360,9 +348,6 @@ error: layout_of(T) = Layout { }, largest_niche: None, uninhabited: false, - variants: Single { - index: 0, - }, max_repr_align: None, unadjusted_abi_align: Align(4 bytes), randomization_seed: $SEED, diff --git a/tests/ui/layout/zero-sized-array-enum-niche.stderr b/tests/ui/layout/zero-sized-array-enum-niche.stderr index 94462d737d3cd..ddceaeb7bd4ef 100644 --- a/tests/ui/layout/zero-sized-array-enum-niche.stderr +++ b/tests/ui/layout/zero-sized-array-enum-niche.stderr @@ -54,9 +54,6 @@ error: layout_of(Result<[u32; 0], bool>) = Layout { }, largest_niche: None, uninhabited: false, - variants: Single { - index: 0, - }, max_repr_align: None, unadjusted_abi_align: Align(4 bytes), randomization_seed: $SEED, @@ -88,9 +85,6 @@ error: layout_of(Result<[u32; 0], bool>) = Layout { }, ), uninhabited: false, - variants: Single { - index: 1, - }, max_repr_align: None, unadjusted_abi_align: Align(1 bytes), randomization_seed: $SEED, @@ -162,9 +156,6 @@ error: layout_of(MultipleAlignments) = Layout { }, largest_niche: None, uninhabited: false, - variants: Single { - index: 0, - }, max_repr_align: None, unadjusted_abi_align: Align(2 bytes), randomization_seed: $SEED, @@ -187,9 +178,6 @@ error: layout_of(MultipleAlignments) = Layout { }, largest_niche: None, uninhabited: false, - variants: Single { - index: 1, - }, max_repr_align: None, unadjusted_abi_align: Align(4 bytes), randomization_seed: $SEED, @@ -221,9 +209,6 @@ error: layout_of(MultipleAlignments) = Layout { }, ), uninhabited: false, - variants: Single { - index: 2, - }, max_repr_align: None, unadjusted_abi_align: Align(1 bytes), randomization_seed: $SEED, @@ -295,9 +280,6 @@ error: layout_of(Result<[u32; 0], Packed>>) = Layout { }, largest_niche: None, uninhabited: false, - variants: Single { - index: 0, - }, max_repr_align: None, unadjusted_abi_align: Align(4 bytes), randomization_seed: $SEED, @@ -329,9 +311,6 @@ error: layout_of(Result<[u32; 0], Packed>>) = Layout { }, ), uninhabited: false, - variants: Single { - index: 1, - }, max_repr_align: None, unadjusted_abi_align: Align(1 bytes), randomization_seed: $SEED, @@ -407,9 +386,6 @@ error: layout_of(Result<[u32; 0], Packed>) = Layout { }, largest_niche: None, uninhabited: false, - variants: Single { - index: 0, - }, max_repr_align: None, unadjusted_abi_align: Align(4 bytes), randomization_seed: $SEED, @@ -441,9 +417,6 @@ error: layout_of(Result<[u32; 0], Packed>) = Layout { }, ), uninhabited: false, - variants: Single { - index: 1, - }, max_repr_align: None, unadjusted_abi_align: Align(1 bytes), randomization_seed: $SEED, diff --git a/tests/ui/repr/repr-c-dead-variants.aarch64-unknown-linux-gnu.stderr b/tests/ui/repr/repr-c-dead-variants.aarch64-unknown-linux-gnu.stderr index 5e764a7c77e91..e8a99c7226af5 100644 --- a/tests/ui/repr/repr-c-dead-variants.aarch64-unknown-linux-gnu.stderr +++ b/tests/ui/repr/repr-c-dead-variants.aarch64-unknown-linux-gnu.stderr @@ -66,9 +66,6 @@ error: layout_of(Univariant) = Layout { }, largest_niche: None, uninhabited: true, - variants: Single { - index: 0, - }, max_repr_align: None, unadjusted_abi_align: Align(4 bytes), randomization_seed: $SEED, @@ -164,9 +161,6 @@ error: layout_of(TwoVariants) = Layout { }, largest_niche: None, uninhabited: true, - variants: Single { - index: 0, - }, max_repr_align: None, unadjusted_abi_align: Align(4 bytes), randomization_seed: $SEED, @@ -201,9 +195,6 @@ error: layout_of(TwoVariants) = Layout { }, largest_niche: None, uninhabited: false, - variants: Single { - index: 1, - }, max_repr_align: None, unadjusted_abi_align: Align(4 bytes), randomization_seed: $SEED, @@ -277,9 +268,6 @@ error: layout_of(DeadBranchHasOtherField) = Layout { }, largest_niche: None, uninhabited: true, - variants: Single { - index: 0, - }, max_repr_align: Some( Align(8 bytes), ), @@ -304,9 +292,6 @@ error: layout_of(DeadBranchHasOtherField) = Layout { }, largest_niche: None, uninhabited: false, - variants: Single { - index: 1, - }, max_repr_align: None, unadjusted_abi_align: Align(8 bytes), randomization_seed: $SEED, diff --git a/tests/ui/repr/repr-c-dead-variants.armebv7r-none-eabi.stderr b/tests/ui/repr/repr-c-dead-variants.armebv7r-none-eabi.stderr index 05bbb6004545f..30e0b7923bbd0 100644 --- a/tests/ui/repr/repr-c-dead-variants.armebv7r-none-eabi.stderr +++ b/tests/ui/repr/repr-c-dead-variants.armebv7r-none-eabi.stderr @@ -66,9 +66,6 @@ error: layout_of(Univariant) = Layout { }, largest_niche: None, uninhabited: true, - variants: Single { - index: 0, - }, max_repr_align: None, unadjusted_abi_align: Align(1 bytes), randomization_seed: $SEED, @@ -164,9 +161,6 @@ error: layout_of(TwoVariants) = Layout { }, largest_niche: None, uninhabited: true, - variants: Single { - index: 0, - }, max_repr_align: None, unadjusted_abi_align: Align(1 bytes), randomization_seed: $SEED, @@ -201,9 +195,6 @@ error: layout_of(TwoVariants) = Layout { }, largest_niche: None, uninhabited: false, - variants: Single { - index: 1, - }, max_repr_align: None, unadjusted_abi_align: Align(1 bytes), randomization_seed: $SEED, @@ -277,9 +268,6 @@ error: layout_of(DeadBranchHasOtherField) = Layout { }, largest_niche: None, uninhabited: true, - variants: Single { - index: 0, - }, max_repr_align: Some( Align(8 bytes), ), @@ -304,9 +292,6 @@ error: layout_of(DeadBranchHasOtherField) = Layout { }, largest_niche: None, uninhabited: false, - variants: Single { - index: 1, - }, max_repr_align: None, unadjusted_abi_align: Align(8 bytes), randomization_seed: $SEED, diff --git a/tests/ui/repr/repr-c-dead-variants.i686-pc-windows-msvc.stderr b/tests/ui/repr/repr-c-dead-variants.i686-pc-windows-msvc.stderr index 5e764a7c77e91..e8a99c7226af5 100644 --- a/tests/ui/repr/repr-c-dead-variants.i686-pc-windows-msvc.stderr +++ b/tests/ui/repr/repr-c-dead-variants.i686-pc-windows-msvc.stderr @@ -66,9 +66,6 @@ error: layout_of(Univariant) = Layout { }, largest_niche: None, uninhabited: true, - variants: Single { - index: 0, - }, max_repr_align: None, unadjusted_abi_align: Align(4 bytes), randomization_seed: $SEED, @@ -164,9 +161,6 @@ error: layout_of(TwoVariants) = Layout { }, largest_niche: None, uninhabited: true, - variants: Single { - index: 0, - }, max_repr_align: None, unadjusted_abi_align: Align(4 bytes), randomization_seed: $SEED, @@ -201,9 +195,6 @@ error: layout_of(TwoVariants) = Layout { }, largest_niche: None, uninhabited: false, - variants: Single { - index: 1, - }, max_repr_align: None, unadjusted_abi_align: Align(4 bytes), randomization_seed: $SEED, @@ -277,9 +268,6 @@ error: layout_of(DeadBranchHasOtherField) = Layout { }, largest_niche: None, uninhabited: true, - variants: Single { - index: 0, - }, max_repr_align: Some( Align(8 bytes), ), @@ -304,9 +292,6 @@ error: layout_of(DeadBranchHasOtherField) = Layout { }, largest_niche: None, uninhabited: false, - variants: Single { - index: 1, - }, max_repr_align: None, unadjusted_abi_align: Align(8 bytes), randomization_seed: $SEED, diff --git a/tests/ui/repr/repr-c-dead-variants.x86_64-unknown-linux-gnu.stderr b/tests/ui/repr/repr-c-dead-variants.x86_64-unknown-linux-gnu.stderr index 5e764a7c77e91..e8a99c7226af5 100644 --- a/tests/ui/repr/repr-c-dead-variants.x86_64-unknown-linux-gnu.stderr +++ b/tests/ui/repr/repr-c-dead-variants.x86_64-unknown-linux-gnu.stderr @@ -66,9 +66,6 @@ error: layout_of(Univariant) = Layout { }, largest_niche: None, uninhabited: true, - variants: Single { - index: 0, - }, max_repr_align: None, unadjusted_abi_align: Align(4 bytes), randomization_seed: $SEED, @@ -164,9 +161,6 @@ error: layout_of(TwoVariants) = Layout { }, largest_niche: None, uninhabited: true, - variants: Single { - index: 0, - }, max_repr_align: None, unadjusted_abi_align: Align(4 bytes), randomization_seed: $SEED, @@ -201,9 +195,6 @@ error: layout_of(TwoVariants) = Layout { }, largest_niche: None, uninhabited: false, - variants: Single { - index: 1, - }, max_repr_align: None, unadjusted_abi_align: Align(4 bytes), randomization_seed: $SEED, @@ -277,9 +268,6 @@ error: layout_of(DeadBranchHasOtherField) = Layout { }, largest_niche: None, uninhabited: true, - variants: Single { - index: 0, - }, max_repr_align: Some( Align(8 bytes), ), @@ -304,9 +292,6 @@ error: layout_of(DeadBranchHasOtherField) = Layout { }, largest_niche: None, uninhabited: false, - variants: Single { - index: 1, - }, max_repr_align: None, unadjusted_abi_align: Align(8 bytes), randomization_seed: $SEED, diff --git a/tests/ui/repr/repr-c-int-dead-variants.stderr b/tests/ui/repr/repr-c-int-dead-variants.stderr index 12155358ad517..73a2898b67608 100644 --- a/tests/ui/repr/repr-c-int-dead-variants.stderr +++ b/tests/ui/repr/repr-c-int-dead-variants.stderr @@ -66,9 +66,6 @@ error: layout_of(UnivariantU8) = Layout { }, largest_niche: None, uninhabited: true, - variants: Single { - index: 0, - }, max_repr_align: None, unadjusted_abi_align: Align(1 bytes), randomization_seed: $SEED, @@ -164,9 +161,6 @@ error: layout_of(TwoVariantsU8) = Layout { }, largest_niche: None, uninhabited: true, - variants: Single { - index: 0, - }, max_repr_align: None, unadjusted_abi_align: Align(1 bytes), randomization_seed: $SEED, @@ -201,9 +195,6 @@ error: layout_of(TwoVariantsU8) = Layout { }, largest_niche: None, uninhabited: false, - variants: Single { - index: 1, - }, max_repr_align: None, unadjusted_abi_align: Align(1 bytes), randomization_seed: $SEED, @@ -277,9 +268,6 @@ error: layout_of(DeadBranchHasOtherFieldU8) = Layout { }, largest_niche: None, uninhabited: true, - variants: Single { - index: 0, - }, max_repr_align: Some( Align(8 bytes), ), @@ -304,9 +292,6 @@ error: layout_of(DeadBranchHasOtherFieldU8) = Layout { }, largest_niche: None, uninhabited: false, - variants: Single { - index: 1, - }, max_repr_align: None, unadjusted_abi_align: Align(8 bytes), randomization_seed: $SEED, diff --git a/tests/ui/type/pattern_types/non_null.stderr b/tests/ui/type/pattern_types/non_null.stderr index d1f1fc4b322fe..8480992d4878f 100644 --- a/tests/ui/type/pattern_types/non_null.stderr +++ b/tests/ui/type/pattern_types/non_null.stderr @@ -100,9 +100,6 @@ error: layout_of(Option<(*const ()) is !null>) = Layout { }, largest_niche: None, uninhabited: false, - variants: Single { - index: 0, - }, max_repr_align: None, unadjusted_abi_align: Align(1 bytes), randomization_seed: $SEED, @@ -142,9 +139,6 @@ error: layout_of(Option<(*const ()) is !null>) = Layout { }, ), uninhabited: false, - variants: Single { - index: 1, - }, max_repr_align: None, unadjusted_abi_align: Align(8 bytes), randomization_seed: $SEED, diff --git a/tests/ui/type/pattern_types/range_patterns.stderr b/tests/ui/type/pattern_types/range_patterns.stderr index fe38f70d008aa..bbded0607e058 100644 --- a/tests/ui/type/pattern_types/range_patterns.stderr +++ b/tests/ui/type/pattern_types/range_patterns.stderr @@ -141,9 +141,6 @@ error: layout_of(Option<(u32) is 1..>) = Layout { }, largest_niche: None, uninhabited: false, - variants: Single { - index: 0, - }, max_repr_align: None, unadjusted_abi_align: Align(1 bytes), randomization_seed: $SEED, @@ -181,9 +178,6 @@ error: layout_of(Option<(u32) is 1..>) = Layout { }, ), uninhabited: false, - variants: Single { - index: 1, - }, max_repr_align: None, unadjusted_abi_align: Align(4 bytes), randomization_seed: $SEED, @@ -252,9 +246,6 @@ error: layout_of(Option>) = Layout { }, largest_niche: None, uninhabited: false, - variants: Single { - index: 0, - }, max_repr_align: None, unadjusted_abi_align: Align(1 bytes), randomization_seed: $SEED, @@ -292,9 +283,6 @@ error: layout_of(Option>) = Layout { }, ), uninhabited: false, - variants: Single { - index: 1, - }, max_repr_align: None, unadjusted_abi_align: Align(4 bytes), randomization_seed: $SEED, From 82a3a13473a23a9f4ad1bff701ee2cd4046bdb93 Mon Sep 17 00:00:00 2001 From: Moulins Date: Wed, 17 Dec 2025 23:18:27 +0100 Subject: [PATCH 04/25] Store `FieldsShape::Arbitrary` fields directly in `VariantLayout` Enum variants always have `Arbitrary` layout, so the enum isn't needed. --- compiler/rustc_abi/src/layout.rs | 43 ++---- compiler/rustc_abi/src/layout/simple.rs | 5 +- compiler/rustc_abi/src/lib.rs | 14 +- .../src/unstable/convert/stable/abi.rs | 7 +- .../rustc_ty_utils/src/layout/invariant.rs | 5 +- .../enum-discriminant/wrapping_niche.stderr | 36 ++--- tests/ui/layout/debug.stderr | 56 ++++---- tests/ui/layout/hexagon-enum.stderr | 30 ++-- ...-scalarpair-payload-might-be-uninit.stderr | 136 ++++++++---------- .../issue-96185-overaligned-enum.stderr | 24 ++-- tests/ui/layout/thumb-enum.stderr | 30 ++-- .../layout/zero-sized-array-enum-niche.stderr | 126 +++++++--------- ...-variants.aarch64-unknown-linux-gnu.stderr | 74 +++++----- ...-c-dead-variants.armebv7r-none-eabi.stderr | 74 +++++----- ...-dead-variants.i686-pc-windows-msvc.stderr | 74 +++++----- ...d-variants.x86_64-unknown-linux-gnu.stderr | 74 +++++----- tests/ui/repr/repr-c-int-dead-variants.stderr | 74 +++++----- tests/ui/type/pattern_types/non_null.stderr | 20 ++- .../type/pattern_types/range_patterns.stderr | 40 +++--- 19 files changed, 390 insertions(+), 552 deletions(-) diff --git a/compiler/rustc_abi/src/layout.rs b/compiler/rustc_abi/src/layout.rs index 18852c305b748..6bdaf0bb5c655 100644 --- a/compiler/rustc_abi/src/layout.rs +++ b/compiler/rustc_abi/src/layout.rs @@ -705,15 +705,8 @@ impl LayoutCalculator { } // It'll fit, but we need to make some adjustments. - match layout.fields { - FieldsShape::Arbitrary { ref mut offsets, .. } => { - for offset in offsets.iter_mut() { - *offset += this_offset; - } - } - FieldsShape::Primitive | FieldsShape::Array { .. } | FieldsShape::Union(..) => { - panic!("Layout of fields should be Arbitrary for variants") - } + for offset in layout.field_offsets.iter_mut() { + *offset += this_offset; } // It can't be a Scalar or ScalarPair because the offset isn't 0. @@ -953,23 +946,16 @@ impl LayoutCalculator { let old_ity_size = min_ity.size(); let new_ity_size = ity.size(); for variant in &mut layout_variants { - match variant.fields { - FieldsShape::Arbitrary { ref mut offsets, .. } => { - for i in offsets { - if *i <= old_ity_size { - assert_eq!(*i, old_ity_size); - *i = new_ity_size; - } - } - // We might be making the struct larger. - if variant.size <= old_ity_size { - variant.size = new_ity_size; - } - } - FieldsShape::Primitive | FieldsShape::Array { .. } | FieldsShape::Union(..) => { - panic!("encountered a non-arbitrary layout during enum layout") + for i in &mut variant.field_offsets { + if *i <= old_ity_size { + assert_eq!(*i, old_ity_size); + *i = new_ity_size; } } + // We might be making the struct larger. + if variant.size <= old_ity_size { + variant.size = new_ity_size; + } } } @@ -994,12 +980,10 @@ impl LayoutCalculator { let mut common_prim = None; let mut common_prim_initialized_in_all_variants = true; for (field_layouts, layout_variant) in iter::zip(variants, &layout_variants) { - let FieldsShape::Arbitrary { ref offsets, .. } = layout_variant.fields else { - panic!("encountered a non-arbitrary layout during enum layout"); - }; // We skip *all* ZST here and later check if we are good in terms of alignment. // This lets us handle some cases involving aligned ZST. - let mut fields = iter::zip(field_layouts, offsets).filter(|p| !p.0.is_zst()); + let mut fields = iter::zip(field_layouts, &layout_variant.field_offsets) + .filter(|p| !p.0.is_zst()); let (field, offset) = match (fields.next(), fields.next()) { (None, None) => { common_prim_initialized_in_all_variants = false; @@ -1094,8 +1078,7 @@ impl LayoutCalculator { for variant in &mut layout_variants { // We only do this for variants with fields; the others are not accessed anyway. // Also do not overwrite any already existing "clever" ABIs. - if variant.fields.count() > 0 - && matches!(variant.backend_repr, BackendRepr::Memory { .. }) + if matches!(variant.backend_repr, BackendRepr::Memory { .. } if variant.has_fields()) { variant.backend_repr = abi; // Also need to bump up the size and alignment, so that the entire value fits diff --git a/compiler/rustc_abi/src/layout/simple.rs b/compiler/rustc_abi/src/layout/simple.rs index 7c714b6a880df..1ce22a0293346 100644 --- a/compiler/rustc_abi/src/layout/simple.rs +++ b/compiler/rustc_abi/src/layout/simple.rs @@ -155,7 +155,10 @@ impl LayoutData { }; Self { - fields: layout.fields.clone(), + fields: FieldsShape::Arbitrary { + offsets: layout.field_offsets.clone(), + in_memory_order: layout.fields_in_memory_order.clone(), + }, variants: Variants::Single { index }, backend_repr: layout.backend_repr, largest_niche: layout.largest_niche, diff --git a/compiler/rustc_abi/src/lib.rs b/compiler/rustc_abi/src/lib.rs index 5339c0cf8e873..973041c0d77d1 100644 --- a/compiler/rustc_abi/src/lib.rs +++ b/compiler/rustc_abi/src/lib.rs @@ -2258,7 +2258,8 @@ pub struct VariantLayout { pub size: Size, pub align: AbiAlign, pub backend_repr: BackendRepr, - pub fields: FieldsShape, + pub field_offsets: IndexVec, + fields_in_memory_order: IndexVec, largest_niche: Option, uninhabited: bool, max_repr_align: Option, @@ -2268,11 +2269,16 @@ pub struct VariantLayout { impl VariantLayout { pub fn from_layout(layout: LayoutData) -> Self { + let FieldsShape::Arbitrary { offsets, in_memory_order } = layout.fields else { + panic!("Layout of fields should be Arbitrary for variants"); + }; + Self { size: layout.size, align: layout.align, backend_repr: layout.backend_repr, - fields: layout.fields, + field_offsets: offsets, + fields_in_memory_order: in_memory_order, largest_niche: layout.largest_niche, uninhabited: layout.uninhabited, max_repr_align: layout.max_repr_align, @@ -2284,4 +2290,8 @@ impl VariantLayout { pub fn is_uninhabited(&self) -> bool { self.uninhabited } + + pub fn has_fields(&self) -> bool { + self.field_offsets.len() > 0 + } } diff --git a/compiler/rustc_public/src/unstable/convert/stable/abi.rs b/compiler/rustc_public/src/unstable/convert/stable/abi.rs index d8c4cee7abbe4..970a31d02d789 100644 --- a/compiler/rustc_public/src/unstable/convert/stable/abi.rs +++ b/compiler/rustc_public/src/unstable/convert/stable/abi.rs @@ -216,11 +216,8 @@ impl<'tcx> Stable<'tcx> for rustc_abi::Variants VariantFields { - offsets: offsets.iter().as_slice().stable(tables, cx), - }, - _ => panic!("variant layout should be Arbitrary"), + .map(|v| VariantFields { + offsets: v.field_offsets.iter().as_slice().stable(tables, cx), }) .collect(), } diff --git a/compiler/rustc_ty_utils/src/layout/invariant.rs b/compiler/rustc_ty_utils/src/layout/invariant.rs index fc09d8664f713..98e6ca351964e 100644 --- a/compiler/rustc_ty_utils/src/layout/invariant.rs +++ b/compiler/rustc_ty_utils/src/layout/invariant.rs @@ -311,10 +311,7 @@ pub(super) fn layout_sanity_check<'tcx>(cx: &LayoutCx<'tcx>, layout: &TyAndLayou ) } // Skip empty variants. - if variant.size == Size::ZERO - || variant.fields.count() == 0 - || variant.is_uninhabited() - { + if variant.size == Size::ZERO || !variant.has_fields() || variant.is_uninhabited() { // These are never actually accessed anyway, so we can skip the coherence check // for them. They also fail that check, since they may have // a different ABI even when the main type is diff --git a/tests/ui/enum-discriminant/wrapping_niche.stderr b/tests/ui/enum-discriminant/wrapping_niche.stderr index 568922c224584..b3b0a560b28ab 100644 --- a/tests/ui/enum-discriminant/wrapping_niche.stderr +++ b/tests/ui/enum-discriminant/wrapping_niche.stderr @@ -50,10 +50,8 @@ error: layout_of(UnsignedAroundZero) = Layout { backend_repr: Memory { sized: true, }, - fields: Arbitrary { - offsets: [], - in_memory_order: [], - }, + field_offsets: [], + fields_in_memory_order: [], largest_niche: None, uninhabited: false, max_repr_align: None, @@ -68,10 +66,8 @@ error: layout_of(UnsignedAroundZero) = Layout { backend_repr: Memory { sized: true, }, - fields: Arbitrary { - offsets: [], - in_memory_order: [], - }, + field_offsets: [], + fields_in_memory_order: [], largest_niche: None, uninhabited: false, max_repr_align: None, @@ -86,10 +82,8 @@ error: layout_of(UnsignedAroundZero) = Layout { backend_repr: Memory { sized: true, }, - fields: Arbitrary { - offsets: [], - in_memory_order: [], - }, + field_offsets: [], + fields_in_memory_order: [], largest_niche: None, uninhabited: false, max_repr_align: None, @@ -159,10 +153,8 @@ error: layout_of(SignedAroundZero) = Layout { backend_repr: Memory { sized: true, }, - fields: Arbitrary { - offsets: [], - in_memory_order: [], - }, + field_offsets: [], + fields_in_memory_order: [], largest_niche: None, uninhabited: false, max_repr_align: None, @@ -177,10 +169,8 @@ error: layout_of(SignedAroundZero) = Layout { backend_repr: Memory { sized: true, }, - fields: Arbitrary { - offsets: [], - in_memory_order: [], - }, + field_offsets: [], + fields_in_memory_order: [], largest_niche: None, uninhabited: false, max_repr_align: None, @@ -195,10 +185,8 @@ error: layout_of(SignedAroundZero) = Layout { backend_repr: Memory { sized: true, }, - fields: Arbitrary { - offsets: [], - in_memory_order: [], - }, + field_offsets: [], + fields_in_memory_order: [], largest_niche: None, uninhabited: false, max_repr_align: None, diff --git a/tests/ui/layout/debug.stderr b/tests/ui/layout/debug.stderr index 1b08a25c7969e..b80a797f05af1 100644 --- a/tests/ui/layout/debug.stderr +++ b/tests/ui/layout/debug.stderr @@ -66,10 +66,8 @@ error: layout_of(E) = Layout { backend_repr: Memory { sized: true, }, - fields: Arbitrary { - offsets: [], - in_memory_order: [], - }, + field_offsets: [], + fields_in_memory_order: [], largest_niche: None, uninhabited: false, max_repr_align: None, @@ -84,18 +82,16 @@ error: layout_of(E) = Layout { backend_repr: Memory { sized: true, }, - fields: Arbitrary { - offsets: [ - Size(4 bytes), - Size(4 bytes), - Size(8 bytes), - ], - in_memory_order: [ - 0, - 1, - 2, - ], - }, + field_offsets: [ + Size(4 bytes), + Size(4 bytes), + Size(8 bytes), + ], + fields_in_memory_order: [ + 0, + 1, + 2, + ], largest_niche: None, uninhabited: true, max_repr_align: None, @@ -257,14 +253,12 @@ error: layout_of(Result) = Layout { valid_range: 0..=4294967295, }, ), - fields: Arbitrary { - offsets: [ - Size(4 bytes), - ], - in_memory_order: [ - 0, - ], - }, + field_offsets: [ + Size(4 bytes), + ], + fields_in_memory_order: [ + 0, + ], largest_niche: None, uninhabited: false, max_repr_align: None, @@ -292,14 +286,12 @@ error: layout_of(Result) = Layout { valid_range: 0..=4294967295, }, ), - fields: Arbitrary { - offsets: [ - Size(4 bytes), - ], - in_memory_order: [ - 0, - ], - }, + field_offsets: [ + Size(4 bytes), + ], + fields_in_memory_order: [ + 0, + ], largest_niche: None, uninhabited: false, max_repr_align: None, diff --git a/tests/ui/layout/hexagon-enum.stderr b/tests/ui/layout/hexagon-enum.stderr index ce68514f30277..e00848b1b0154 100644 --- a/tests/ui/layout/hexagon-enum.stderr +++ b/tests/ui/layout/hexagon-enum.stderr @@ -50,10 +50,8 @@ error: layout_of(A) = Layout { backend_repr: Memory { sized: true, }, - fields: Arbitrary { - offsets: [], - in_memory_order: [], - }, + field_offsets: [], + fields_in_memory_order: [], largest_niche: None, uninhabited: false, max_repr_align: None, @@ -123,10 +121,8 @@ error: layout_of(B) = Layout { backend_repr: Memory { sized: true, }, - fields: Arbitrary { - offsets: [], - in_memory_order: [], - }, + field_offsets: [], + fields_in_memory_order: [], largest_niche: None, uninhabited: false, max_repr_align: None, @@ -196,10 +192,8 @@ error: layout_of(C) = Layout { backend_repr: Memory { sized: true, }, - fields: Arbitrary { - offsets: [], - in_memory_order: [], - }, + field_offsets: [], + fields_in_memory_order: [], largest_niche: None, uninhabited: false, max_repr_align: None, @@ -269,10 +263,8 @@ error: layout_of(P) = Layout { backend_repr: Memory { sized: true, }, - fields: Arbitrary { - offsets: [], - in_memory_order: [], - }, + field_offsets: [], + fields_in_memory_order: [], largest_niche: None, uninhabited: false, max_repr_align: None, @@ -342,10 +334,8 @@ error: layout_of(T) = Layout { backend_repr: Memory { sized: true, }, - fields: Arbitrary { - offsets: [], - in_memory_order: [], - }, + field_offsets: [], + fields_in_memory_order: [], largest_niche: None, uninhabited: false, max_repr_align: None, diff --git a/tests/ui/layout/issue-96158-scalarpair-payload-might-be-uninit.stderr b/tests/ui/layout/issue-96158-scalarpair-payload-might-be-uninit.stderr index 9f78cfd792365..c9d7551a3d954 100644 --- a/tests/ui/layout/issue-96158-scalarpair-payload-might-be-uninit.stderr +++ b/tests/ui/layout/issue-96158-scalarpair-payload-might-be-uninit.stderr @@ -68,14 +68,12 @@ error: layout_of(MissingPayloadField) = Layout { ), }, ), - fields: Arbitrary { - offsets: [ - Size(1 bytes), - ], - in_memory_order: [ - 0, - ], - }, + field_offsets: [ + Size(1 bytes), + ], + fields_in_memory_order: [ + 0, + ], largest_niche: None, uninhabited: false, max_repr_align: None, @@ -90,10 +88,8 @@ error: layout_of(MissingPayloadField) = Layout { backend_repr: Memory { sized: true, }, - fields: Arbitrary { - offsets: [], - in_memory_order: [], - }, + field_offsets: [], + fields_in_memory_order: [], largest_niche: None, uninhabited: false, max_repr_align: None, @@ -183,14 +179,12 @@ error: layout_of(CommonPayloadField) = Layout { valid_range: 0..=255, }, ), - fields: Arbitrary { - offsets: [ - Size(1 bytes), - ], - in_memory_order: [ - 0, - ], - }, + field_offsets: [ + Size(1 bytes), + ], + fields_in_memory_order: [ + 0, + ], largest_niche: None, uninhabited: false, max_repr_align: None, @@ -218,14 +212,12 @@ error: layout_of(CommonPayloadField) = Layout { valid_range: 0..=255, }, ), - fields: Arbitrary { - offsets: [ - Size(1 bytes), - ], - in_memory_order: [ - 0, - ], - }, + field_offsets: [ + Size(1 bytes), + ], + fields_in_memory_order: [ + 0, + ], largest_niche: None, uninhabited: false, max_repr_align: None, @@ -313,14 +305,12 @@ error: layout_of(CommonPayloadFieldIsMaybeUninit) = Layout { ), }, ), - fields: Arbitrary { - offsets: [ - Size(1 bytes), - ], - in_memory_order: [ - 0, - ], - }, + field_offsets: [ + Size(1 bytes), + ], + fields_in_memory_order: [ + 0, + ], largest_niche: None, uninhabited: false, max_repr_align: None, @@ -347,14 +337,12 @@ error: layout_of(CommonPayloadFieldIsMaybeUninit) = Layout { ), }, ), - fields: Arbitrary { - offsets: [ - Size(1 bytes), - ], - in_memory_order: [ - 0, - ], - }, + field_offsets: [ + Size(1 bytes), + ], + fields_in_memory_order: [ + 0, + ], largest_niche: None, uninhabited: false, max_repr_align: None, @@ -447,16 +435,14 @@ error: layout_of(NicheFirst) = Layout { valid_range: 0..=255, }, ), - fields: Arbitrary { - offsets: [ - Size(0 bytes), - Size(1 bytes), - ], - in_memory_order: [ - 0, - 1, - ], - }, + field_offsets: [ + Size(0 bytes), + Size(1 bytes), + ], + fields_in_memory_order: [ + 0, + 1, + ], largest_niche: Some( Niche { offset: Size(0 bytes), @@ -480,10 +466,8 @@ error: layout_of(NicheFirst) = Layout { backend_repr: Memory { sized: true, }, - fields: Arbitrary { - offsets: [], - in_memory_order: [], - }, + field_offsets: [], + fields_in_memory_order: [], largest_niche: None, uninhabited: false, max_repr_align: None, @@ -498,10 +482,8 @@ error: layout_of(NicheFirst) = Layout { backend_repr: Memory { sized: true, }, - fields: Arbitrary { - offsets: [], - in_memory_order: [], - }, + field_offsets: [], + fields_in_memory_order: [], largest_niche: None, uninhabited: false, max_repr_align: None, @@ -594,16 +576,14 @@ error: layout_of(NicheSecond) = Layout { valid_range: 0..=255, }, ), - fields: Arbitrary { - offsets: [ - Size(1 bytes), - Size(0 bytes), - ], - in_memory_order: [ - 1, - 0, - ], - }, + field_offsets: [ + Size(1 bytes), + Size(0 bytes), + ], + fields_in_memory_order: [ + 1, + 0, + ], largest_niche: Some( Niche { offset: Size(0 bytes), @@ -627,10 +607,8 @@ error: layout_of(NicheSecond) = Layout { backend_repr: Memory { sized: true, }, - fields: Arbitrary { - offsets: [], - in_memory_order: [], - }, + field_offsets: [], + fields_in_memory_order: [], largest_niche: None, uninhabited: false, max_repr_align: None, @@ -645,10 +623,8 @@ error: layout_of(NicheSecond) = Layout { backend_repr: Memory { sized: true, }, - fields: Arbitrary { - offsets: [], - in_memory_order: [], - }, + field_offsets: [], + fields_in_memory_order: [], largest_niche: None, uninhabited: false, max_repr_align: None, diff --git a/tests/ui/layout/issue-96185-overaligned-enum.stderr b/tests/ui/layout/issue-96185-overaligned-enum.stderr index cc5818e78c71b..7e88d4c6fcc9e 100644 --- a/tests/ui/layout/issue-96185-overaligned-enum.stderr +++ b/tests/ui/layout/issue-96185-overaligned-enum.stderr @@ -44,10 +44,8 @@ error: layout_of(Aligned1) = Layout { backend_repr: Memory { sized: true, }, - fields: Arbitrary { - offsets: [], - in_memory_order: [], - }, + field_offsets: [], + fields_in_memory_order: [], largest_niche: None, uninhabited: false, max_repr_align: Some( @@ -64,10 +62,8 @@ error: layout_of(Aligned1) = Layout { backend_repr: Memory { sized: true, }, - fields: Arbitrary { - offsets: [], - in_memory_order: [], - }, + field_offsets: [], + fields_in_memory_order: [], largest_niche: None, uninhabited: false, max_repr_align: Some( @@ -141,10 +137,8 @@ error: layout_of(Aligned2) = Layout { backend_repr: Memory { sized: true, }, - fields: Arbitrary { - offsets: [], - in_memory_order: [], - }, + field_offsets: [], + fields_in_memory_order: [], largest_niche: None, uninhabited: false, max_repr_align: Some( @@ -161,10 +155,8 @@ error: layout_of(Aligned2) = Layout { backend_repr: Memory { sized: true, }, - fields: Arbitrary { - offsets: [], - in_memory_order: [], - }, + field_offsets: [], + fields_in_memory_order: [], largest_niche: None, uninhabited: false, max_repr_align: Some( diff --git a/tests/ui/layout/thumb-enum.stderr b/tests/ui/layout/thumb-enum.stderr index 3c5f906d67aa8..053ea65a48b79 100644 --- a/tests/ui/layout/thumb-enum.stderr +++ b/tests/ui/layout/thumb-enum.stderr @@ -50,10 +50,8 @@ error: layout_of(A) = Layout { backend_repr: Memory { sized: true, }, - fields: Arbitrary { - offsets: [], - in_memory_order: [], - }, + field_offsets: [], + fields_in_memory_order: [], largest_niche: None, uninhabited: false, max_repr_align: None, @@ -123,10 +121,8 @@ error: layout_of(B) = Layout { backend_repr: Memory { sized: true, }, - fields: Arbitrary { - offsets: [], - in_memory_order: [], - }, + field_offsets: [], + fields_in_memory_order: [], largest_niche: None, uninhabited: false, max_repr_align: None, @@ -196,10 +192,8 @@ error: layout_of(C) = Layout { backend_repr: Memory { sized: true, }, - fields: Arbitrary { - offsets: [], - in_memory_order: [], - }, + field_offsets: [], + fields_in_memory_order: [], largest_niche: None, uninhabited: false, max_repr_align: None, @@ -269,10 +263,8 @@ error: layout_of(P) = Layout { backend_repr: Memory { sized: true, }, - fields: Arbitrary { - offsets: [], - in_memory_order: [], - }, + field_offsets: [], + fields_in_memory_order: [], largest_niche: None, uninhabited: false, max_repr_align: None, @@ -342,10 +334,8 @@ error: layout_of(T) = Layout { backend_repr: Memory { sized: true, }, - fields: Arbitrary { - offsets: [], - in_memory_order: [], - }, + field_offsets: [], + fields_in_memory_order: [], largest_niche: None, uninhabited: false, max_repr_align: None, diff --git a/tests/ui/layout/zero-sized-array-enum-niche.stderr b/tests/ui/layout/zero-sized-array-enum-niche.stderr index ddceaeb7bd4ef..e4ab23e3564d7 100644 --- a/tests/ui/layout/zero-sized-array-enum-niche.stderr +++ b/tests/ui/layout/zero-sized-array-enum-niche.stderr @@ -44,14 +44,12 @@ error: layout_of(Result<[u32; 0], bool>) = Layout { backend_repr: Memory { sized: true, }, - fields: Arbitrary { - offsets: [ - Size(4 bytes), - ], - in_memory_order: [ - 0, - ], - }, + field_offsets: [ + Size(4 bytes), + ], + fields_in_memory_order: [ + 0, + ], largest_niche: None, uninhabited: false, max_repr_align: None, @@ -66,14 +64,12 @@ error: layout_of(Result<[u32; 0], bool>) = Layout { backend_repr: Memory { sized: true, }, - fields: Arbitrary { - offsets: [ - Size(1 bytes), - ], - in_memory_order: [ - 0, - ], - }, + field_offsets: [ + Size(1 bytes), + ], + fields_in_memory_order: [ + 0, + ], largest_niche: Some( Niche { offset: Size(1 bytes), @@ -146,14 +142,12 @@ error: layout_of(MultipleAlignments) = Layout { backend_repr: Memory { sized: true, }, - fields: Arbitrary { - offsets: [ - Size(2 bytes), - ], - in_memory_order: [ - 0, - ], - }, + field_offsets: [ + Size(2 bytes), + ], + fields_in_memory_order: [ + 0, + ], largest_niche: None, uninhabited: false, max_repr_align: None, @@ -168,14 +162,12 @@ error: layout_of(MultipleAlignments) = Layout { backend_repr: Memory { sized: true, }, - fields: Arbitrary { - offsets: [ - Size(4 bytes), - ], - in_memory_order: [ - 0, - ], - }, + field_offsets: [ + Size(4 bytes), + ], + fields_in_memory_order: [ + 0, + ], largest_niche: None, uninhabited: false, max_repr_align: None, @@ -190,14 +182,12 @@ error: layout_of(MultipleAlignments) = Layout { backend_repr: Memory { sized: true, }, - fields: Arbitrary { - offsets: [ - Size(1 bytes), - ], - in_memory_order: [ - 0, - ], - }, + field_offsets: [ + Size(1 bytes), + ], + fields_in_memory_order: [ + 0, + ], largest_niche: Some( Niche { offset: Size(1 bytes), @@ -270,14 +260,12 @@ error: layout_of(Result<[u32; 0], Packed>>) = Layout { backend_repr: Memory { sized: true, }, - fields: Arbitrary { - offsets: [ - Size(4 bytes), - ], - in_memory_order: [ - 0, - ], - }, + field_offsets: [ + Size(4 bytes), + ], + fields_in_memory_order: [ + 0, + ], largest_niche: None, uninhabited: false, max_repr_align: None, @@ -292,14 +280,12 @@ error: layout_of(Result<[u32; 0], Packed>>) = Layout { backend_repr: Memory { sized: true, }, - fields: Arbitrary { - offsets: [ - Size(1 bytes), - ], - in_memory_order: [ - 0, - ], - }, + field_offsets: [ + Size(1 bytes), + ], + fields_in_memory_order: [ + 0, + ], largest_niche: Some( Niche { offset: Size(1 bytes), @@ -376,14 +362,12 @@ error: layout_of(Result<[u32; 0], Packed>) = Layout { backend_repr: Memory { sized: true, }, - fields: Arbitrary { - offsets: [ - Size(0 bytes), - ], - in_memory_order: [ - 0, - ], - }, + field_offsets: [ + Size(0 bytes), + ], + fields_in_memory_order: [ + 0, + ], largest_niche: None, uninhabited: false, max_repr_align: None, @@ -398,14 +382,12 @@ error: layout_of(Result<[u32; 0], Packed>) = Layout { backend_repr: Memory { sized: true, }, - fields: Arbitrary { - offsets: [ - Size(0 bytes), - ], - in_memory_order: [ - 0, - ], - }, + field_offsets: [ + Size(0 bytes), + ], + fields_in_memory_order: [ + 0, + ], largest_niche: Some( Niche { offset: Size(0 bytes), diff --git a/tests/ui/repr/repr-c-dead-variants.aarch64-unknown-linux-gnu.stderr b/tests/ui/repr/repr-c-dead-variants.aarch64-unknown-linux-gnu.stderr index e8a99c7226af5..46a1eee98c772 100644 --- a/tests/ui/repr/repr-c-dead-variants.aarch64-unknown-linux-gnu.stderr +++ b/tests/ui/repr/repr-c-dead-variants.aarch64-unknown-linux-gnu.stderr @@ -56,14 +56,12 @@ error: layout_of(Univariant) = Layout { valid_range: 0..=0, }, ), - fields: Arbitrary { - offsets: [ - Size(4 bytes), - ], - in_memory_order: [ - 0, - ], - }, + field_offsets: [ + Size(4 bytes), + ], + fields_in_memory_order: [ + 0, + ], largest_niche: None, uninhabited: true, max_repr_align: None, @@ -151,14 +149,12 @@ error: layout_of(TwoVariants) = Layout { ), }, ), - fields: Arbitrary { - offsets: [ - Size(4 bytes), - ], - in_memory_order: [ - 0, - ], - }, + field_offsets: [ + Size(4 bytes), + ], + fields_in_memory_order: [ + 0, + ], largest_niche: None, uninhabited: true, max_repr_align: None, @@ -185,14 +181,12 @@ error: layout_of(TwoVariants) = Layout { ), }, ), - fields: Arbitrary { - offsets: [ - Size(4 bytes), - ], - in_memory_order: [ - 0, - ], - }, + field_offsets: [ + Size(4 bytes), + ], + fields_in_memory_order: [ + 0, + ], largest_niche: None, uninhabited: false, max_repr_align: None, @@ -256,16 +250,14 @@ error: layout_of(DeadBranchHasOtherField) = Layout { backend_repr: Memory { sized: true, }, - fields: Arbitrary { - offsets: [ - Size(8 bytes), - Size(8 bytes), - ], - in_memory_order: [ - 0, - 1, - ], - }, + field_offsets: [ + Size(8 bytes), + Size(8 bytes), + ], + fields_in_memory_order: [ + 0, + 1, + ], largest_niche: None, uninhabited: true, max_repr_align: Some( @@ -282,14 +274,12 @@ error: layout_of(DeadBranchHasOtherField) = Layout { backend_repr: Memory { sized: true, }, - fields: Arbitrary { - offsets: [ - Size(8 bytes), - ], - in_memory_order: [ - 0, - ], - }, + field_offsets: [ + Size(8 bytes), + ], + fields_in_memory_order: [ + 0, + ], largest_niche: None, uninhabited: false, max_repr_align: None, diff --git a/tests/ui/repr/repr-c-dead-variants.armebv7r-none-eabi.stderr b/tests/ui/repr/repr-c-dead-variants.armebv7r-none-eabi.stderr index 30e0b7923bbd0..35c0d22f23254 100644 --- a/tests/ui/repr/repr-c-dead-variants.armebv7r-none-eabi.stderr +++ b/tests/ui/repr/repr-c-dead-variants.armebv7r-none-eabi.stderr @@ -56,14 +56,12 @@ error: layout_of(Univariant) = Layout { valid_range: 0..=0, }, ), - fields: Arbitrary { - offsets: [ - Size(1 bytes), - ], - in_memory_order: [ - 0, - ], - }, + field_offsets: [ + Size(1 bytes), + ], + fields_in_memory_order: [ + 0, + ], largest_niche: None, uninhabited: true, max_repr_align: None, @@ -151,14 +149,12 @@ error: layout_of(TwoVariants) = Layout { ), }, ), - fields: Arbitrary { - offsets: [ - Size(1 bytes), - ], - in_memory_order: [ - 0, - ], - }, + field_offsets: [ + Size(1 bytes), + ], + fields_in_memory_order: [ + 0, + ], largest_niche: None, uninhabited: true, max_repr_align: None, @@ -185,14 +181,12 @@ error: layout_of(TwoVariants) = Layout { ), }, ), - fields: Arbitrary { - offsets: [ - Size(1 bytes), - ], - in_memory_order: [ - 0, - ], - }, + field_offsets: [ + Size(1 bytes), + ], + fields_in_memory_order: [ + 0, + ], largest_niche: None, uninhabited: false, max_repr_align: None, @@ -256,16 +250,14 @@ error: layout_of(DeadBranchHasOtherField) = Layout { backend_repr: Memory { sized: true, }, - fields: Arbitrary { - offsets: [ - Size(8 bytes), - Size(8 bytes), - ], - in_memory_order: [ - 0, - 1, - ], - }, + field_offsets: [ + Size(8 bytes), + Size(8 bytes), + ], + fields_in_memory_order: [ + 0, + 1, + ], largest_niche: None, uninhabited: true, max_repr_align: Some( @@ -282,14 +274,12 @@ error: layout_of(DeadBranchHasOtherField) = Layout { backend_repr: Memory { sized: true, }, - fields: Arbitrary { - offsets: [ - Size(8 bytes), - ], - in_memory_order: [ - 0, - ], - }, + field_offsets: [ + Size(8 bytes), + ], + fields_in_memory_order: [ + 0, + ], largest_niche: None, uninhabited: false, max_repr_align: None, diff --git a/tests/ui/repr/repr-c-dead-variants.i686-pc-windows-msvc.stderr b/tests/ui/repr/repr-c-dead-variants.i686-pc-windows-msvc.stderr index e8a99c7226af5..46a1eee98c772 100644 --- a/tests/ui/repr/repr-c-dead-variants.i686-pc-windows-msvc.stderr +++ b/tests/ui/repr/repr-c-dead-variants.i686-pc-windows-msvc.stderr @@ -56,14 +56,12 @@ error: layout_of(Univariant) = Layout { valid_range: 0..=0, }, ), - fields: Arbitrary { - offsets: [ - Size(4 bytes), - ], - in_memory_order: [ - 0, - ], - }, + field_offsets: [ + Size(4 bytes), + ], + fields_in_memory_order: [ + 0, + ], largest_niche: None, uninhabited: true, max_repr_align: None, @@ -151,14 +149,12 @@ error: layout_of(TwoVariants) = Layout { ), }, ), - fields: Arbitrary { - offsets: [ - Size(4 bytes), - ], - in_memory_order: [ - 0, - ], - }, + field_offsets: [ + Size(4 bytes), + ], + fields_in_memory_order: [ + 0, + ], largest_niche: None, uninhabited: true, max_repr_align: None, @@ -185,14 +181,12 @@ error: layout_of(TwoVariants) = Layout { ), }, ), - fields: Arbitrary { - offsets: [ - Size(4 bytes), - ], - in_memory_order: [ - 0, - ], - }, + field_offsets: [ + Size(4 bytes), + ], + fields_in_memory_order: [ + 0, + ], largest_niche: None, uninhabited: false, max_repr_align: None, @@ -256,16 +250,14 @@ error: layout_of(DeadBranchHasOtherField) = Layout { backend_repr: Memory { sized: true, }, - fields: Arbitrary { - offsets: [ - Size(8 bytes), - Size(8 bytes), - ], - in_memory_order: [ - 0, - 1, - ], - }, + field_offsets: [ + Size(8 bytes), + Size(8 bytes), + ], + fields_in_memory_order: [ + 0, + 1, + ], largest_niche: None, uninhabited: true, max_repr_align: Some( @@ -282,14 +274,12 @@ error: layout_of(DeadBranchHasOtherField) = Layout { backend_repr: Memory { sized: true, }, - fields: Arbitrary { - offsets: [ - Size(8 bytes), - ], - in_memory_order: [ - 0, - ], - }, + field_offsets: [ + Size(8 bytes), + ], + fields_in_memory_order: [ + 0, + ], largest_niche: None, uninhabited: false, max_repr_align: None, diff --git a/tests/ui/repr/repr-c-dead-variants.x86_64-unknown-linux-gnu.stderr b/tests/ui/repr/repr-c-dead-variants.x86_64-unknown-linux-gnu.stderr index e8a99c7226af5..46a1eee98c772 100644 --- a/tests/ui/repr/repr-c-dead-variants.x86_64-unknown-linux-gnu.stderr +++ b/tests/ui/repr/repr-c-dead-variants.x86_64-unknown-linux-gnu.stderr @@ -56,14 +56,12 @@ error: layout_of(Univariant) = Layout { valid_range: 0..=0, }, ), - fields: Arbitrary { - offsets: [ - Size(4 bytes), - ], - in_memory_order: [ - 0, - ], - }, + field_offsets: [ + Size(4 bytes), + ], + fields_in_memory_order: [ + 0, + ], largest_niche: None, uninhabited: true, max_repr_align: None, @@ -151,14 +149,12 @@ error: layout_of(TwoVariants) = Layout { ), }, ), - fields: Arbitrary { - offsets: [ - Size(4 bytes), - ], - in_memory_order: [ - 0, - ], - }, + field_offsets: [ + Size(4 bytes), + ], + fields_in_memory_order: [ + 0, + ], largest_niche: None, uninhabited: true, max_repr_align: None, @@ -185,14 +181,12 @@ error: layout_of(TwoVariants) = Layout { ), }, ), - fields: Arbitrary { - offsets: [ - Size(4 bytes), - ], - in_memory_order: [ - 0, - ], - }, + field_offsets: [ + Size(4 bytes), + ], + fields_in_memory_order: [ + 0, + ], largest_niche: None, uninhabited: false, max_repr_align: None, @@ -256,16 +250,14 @@ error: layout_of(DeadBranchHasOtherField) = Layout { backend_repr: Memory { sized: true, }, - fields: Arbitrary { - offsets: [ - Size(8 bytes), - Size(8 bytes), - ], - in_memory_order: [ - 0, - 1, - ], - }, + field_offsets: [ + Size(8 bytes), + Size(8 bytes), + ], + fields_in_memory_order: [ + 0, + 1, + ], largest_niche: None, uninhabited: true, max_repr_align: Some( @@ -282,14 +274,12 @@ error: layout_of(DeadBranchHasOtherField) = Layout { backend_repr: Memory { sized: true, }, - fields: Arbitrary { - offsets: [ - Size(8 bytes), - ], - in_memory_order: [ - 0, - ], - }, + field_offsets: [ + Size(8 bytes), + ], + fields_in_memory_order: [ + 0, + ], largest_niche: None, uninhabited: false, max_repr_align: None, diff --git a/tests/ui/repr/repr-c-int-dead-variants.stderr b/tests/ui/repr/repr-c-int-dead-variants.stderr index 73a2898b67608..0f0099bb18cc8 100644 --- a/tests/ui/repr/repr-c-int-dead-variants.stderr +++ b/tests/ui/repr/repr-c-int-dead-variants.stderr @@ -56,14 +56,12 @@ error: layout_of(UnivariantU8) = Layout { valid_range: 0..=0, }, ), - fields: Arbitrary { - offsets: [ - Size(1 bytes), - ], - in_memory_order: [ - 0, - ], - }, + field_offsets: [ + Size(1 bytes), + ], + fields_in_memory_order: [ + 0, + ], largest_niche: None, uninhabited: true, max_repr_align: None, @@ -151,14 +149,12 @@ error: layout_of(TwoVariantsU8) = Layout { ), }, ), - fields: Arbitrary { - offsets: [ - Size(1 bytes), - ], - in_memory_order: [ - 0, - ], - }, + field_offsets: [ + Size(1 bytes), + ], + fields_in_memory_order: [ + 0, + ], largest_niche: None, uninhabited: true, max_repr_align: None, @@ -185,14 +181,12 @@ error: layout_of(TwoVariantsU8) = Layout { ), }, ), - fields: Arbitrary { - offsets: [ - Size(1 bytes), - ], - in_memory_order: [ - 0, - ], - }, + field_offsets: [ + Size(1 bytes), + ], + fields_in_memory_order: [ + 0, + ], largest_niche: None, uninhabited: false, max_repr_align: None, @@ -256,16 +250,14 @@ error: layout_of(DeadBranchHasOtherFieldU8) = Layout { backend_repr: Memory { sized: true, }, - fields: Arbitrary { - offsets: [ - Size(8 bytes), - Size(8 bytes), - ], - in_memory_order: [ - 0, - 1, - ], - }, + field_offsets: [ + Size(8 bytes), + Size(8 bytes), + ], + fields_in_memory_order: [ + 0, + 1, + ], largest_niche: None, uninhabited: true, max_repr_align: Some( @@ -282,14 +274,12 @@ error: layout_of(DeadBranchHasOtherFieldU8) = Layout { backend_repr: Memory { sized: true, }, - fields: Arbitrary { - offsets: [ - Size(8 bytes), - ], - in_memory_order: [ - 0, - ], - }, + field_offsets: [ + Size(8 bytes), + ], + fields_in_memory_order: [ + 0, + ], largest_niche: None, uninhabited: false, max_repr_align: None, diff --git a/tests/ui/type/pattern_types/non_null.stderr b/tests/ui/type/pattern_types/non_null.stderr index 8480992d4878f..fb8ec33f63202 100644 --- a/tests/ui/type/pattern_types/non_null.stderr +++ b/tests/ui/type/pattern_types/non_null.stderr @@ -94,10 +94,8 @@ error: layout_of(Option<(*const ()) is !null>) = Layout { backend_repr: Memory { sized: true, }, - fields: Arbitrary { - offsets: [], - in_memory_order: [], - }, + field_offsets: [], + fields_in_memory_order: [], largest_niche: None, uninhabited: false, max_repr_align: None, @@ -119,14 +117,12 @@ error: layout_of(Option<(*const ()) is !null>) = Layout { valid_range: 1..=18446744073709551615, }, ), - fields: Arbitrary { - offsets: [ - Size(0 bytes), - ], - in_memory_order: [ - 0, - ], - }, + field_offsets: [ + Size(0 bytes), + ], + fields_in_memory_order: [ + 0, + ], largest_niche: Some( Niche { offset: Size(0 bytes), diff --git a/tests/ui/type/pattern_types/range_patterns.stderr b/tests/ui/type/pattern_types/range_patterns.stderr index bbded0607e058..0dcbca1703a47 100644 --- a/tests/ui/type/pattern_types/range_patterns.stderr +++ b/tests/ui/type/pattern_types/range_patterns.stderr @@ -135,10 +135,8 @@ error: layout_of(Option<(u32) is 1..>) = Layout { backend_repr: Memory { sized: true, }, - fields: Arbitrary { - offsets: [], - in_memory_order: [], - }, + field_offsets: [], + fields_in_memory_order: [], largest_niche: None, uninhabited: false, max_repr_align: None, @@ -159,14 +157,12 @@ error: layout_of(Option<(u32) is 1..>) = Layout { valid_range: 1..=4294967295, }, ), - fields: Arbitrary { - offsets: [ - Size(0 bytes), - ], - in_memory_order: [ - 0, - ], - }, + field_offsets: [ + Size(0 bytes), + ], + fields_in_memory_order: [ + 0, + ], largest_niche: Some( Niche { offset: Size(0 bytes), @@ -240,10 +236,8 @@ error: layout_of(Option>) = Layout { backend_repr: Memory { sized: true, }, - fields: Arbitrary { - offsets: [], - in_memory_order: [], - }, + field_offsets: [], + fields_in_memory_order: [], largest_niche: None, uninhabited: false, max_repr_align: None, @@ -264,14 +258,12 @@ error: layout_of(Option>) = Layout { valid_range: 1..=4294967295, }, ), - fields: Arbitrary { - offsets: [ - Size(0 bytes), - ], - in_memory_order: [ - 0, - ], - }, + field_offsets: [ + Size(0 bytes), + ], + fields_in_memory_order: [ + 0, + ], largest_niche: Some( Niche { offset: Size(0 bytes), From 8f0df41278b21bcf04514070fce07e8dbe18dcb6 Mon Sep 17 00:00:00 2001 From: Moulins Date: Thu, 18 Dec 2025 19:07:38 +0100 Subject: [PATCH 05/25] Remove unused `VariantLayout.randomization_seed` field This field is only used during layout calculations, so re-synthetized `LayoutData`s for enum variants can use a dummy value instead. --- compiler/rustc_abi/src/layout.rs | 14 ++++---------- compiler/rustc_abi/src/layout/simple.rs | 2 +- compiler/rustc_abi/src/lib.rs | 2 -- tests/ui/enum-discriminant/wrapping_niche.stderr | 6 ------ tests/ui/layout/debug.stderr | 4 ---- tests/ui/layout/hexagon-enum.stderr | 5 ----- ...96158-scalarpair-payload-might-be-uninit.stderr | 12 ------------ .../ui/layout/issue-96185-overaligned-enum.stderr | 4 ---- tests/ui/layout/thumb-enum.stderr | 5 ----- tests/ui/layout/zero-sized-array-enum-niche.stderr | 9 --------- ...-dead-variants.aarch64-unknown-linux-gnu.stderr | 5 ----- .../repr-c-dead-variants.armebv7r-none-eabi.stderr | 5 ----- ...epr-c-dead-variants.i686-pc-windows-msvc.stderr | 5 ----- ...c-dead-variants.x86_64-unknown-linux-gnu.stderr | 5 ----- tests/ui/repr/repr-c-int-dead-variants.stderr | 5 ----- tests/ui/type/pattern_types/non_null.stderr | 2 -- tests/ui/type/pattern_types/range_patterns.stderr | 4 ---- 17 files changed, 5 insertions(+), 89 deletions(-) diff --git a/compiler/rustc_abi/src/layout.rs b/compiler/rustc_abi/src/layout.rs index 6bdaf0bb5c655..d21a20d4b87bc 100644 --- a/compiler/rustc_abi/src/layout.rs +++ b/compiler/rustc_abi/src/layout.rs @@ -649,6 +649,7 @@ impl LayoutCalculator { let mut align = dl.aggregate_align; let mut max_repr_align = repr.align; let mut unadjusted_abi_align = align; + let mut combined_seed = repr.field_shuffle_seed; let mut variant_layouts = variants .iter() @@ -658,6 +659,7 @@ impl LayoutCalculator { align = align.max(st.align.abi); max_repr_align = max_repr_align.max(st.max_repr_align); unadjusted_abi_align = unadjusted_abi_align.max(st.unadjusted_abi_align); + combined_seed = combined_seed.wrapping_add(st.randomization_seed); Some(VariantLayout::from_layout(st)) }) @@ -751,11 +753,6 @@ impl LayoutCalculator { BackendRepr::Memory { sized: true } }; - let combined_seed = variant_layouts - .iter() - .map(|v| v.randomization_seed) - .fold(repr.field_shuffle_seed, |acc, seed| acc.wrapping_add(seed)); - let layout = LayoutData { variants: Variants::Multiple { tag: niche_scalar, @@ -848,6 +845,7 @@ impl LayoutCalculator { let mut align = dl.aggregate_align; let mut max_repr_align = repr.align; let mut unadjusted_abi_align = align; + let mut combined_seed = repr.field_shuffle_seed; let mut size = Size::ZERO; @@ -891,6 +889,7 @@ impl LayoutCalculator { align = align.max(st.align.abi); max_repr_align = max_repr_align.max(st.max_repr_align); unadjusted_abi_align = unadjusted_abi_align.max(st.unadjusted_abi_align); + combined_seed = combined_seed.wrapping_add(st.randomization_seed); Ok(VariantLayout::from_layout(st)) }) .collect::, _>>()?; @@ -1091,11 +1090,6 @@ impl LayoutCalculator { let largest_niche = Niche::from_scalar(dl, Size::ZERO, tag); - let combined_seed = layout_variants - .iter() - .map(|v| v.randomization_seed) - .fold(repr.field_shuffle_seed, |acc, seed| acc.wrapping_add(seed)); - let tagged_layout = LayoutData { variants: Variants::Multiple { tag, diff --git a/compiler/rustc_abi/src/layout/simple.rs b/compiler/rustc_abi/src/layout/simple.rs index 1ce22a0293346..9b13540ca15a5 100644 --- a/compiler/rustc_abi/src/layout/simple.rs +++ b/compiler/rustc_abi/src/layout/simple.rs @@ -167,7 +167,7 @@ impl LayoutData { size: layout.size, max_repr_align: layout.max_repr_align, unadjusted_abi_align: layout.unadjusted_abi_align, - randomization_seed: layout.randomization_seed, + randomization_seed: Hash64::ZERO, } } } diff --git a/compiler/rustc_abi/src/lib.rs b/compiler/rustc_abi/src/lib.rs index 973041c0d77d1..f0fae2d42ecfb 100644 --- a/compiler/rustc_abi/src/lib.rs +++ b/compiler/rustc_abi/src/lib.rs @@ -2264,7 +2264,6 @@ pub struct VariantLayout { uninhabited: bool, max_repr_align: Option, unadjusted_abi_align: Align, - randomization_seed: Hash64, } impl VariantLayout { @@ -2283,7 +2282,6 @@ impl VariantLayout { uninhabited: layout.uninhabited, max_repr_align: layout.max_repr_align, unadjusted_abi_align: layout.unadjusted_abi_align, - randomization_seed: layout.randomization_seed, } } diff --git a/tests/ui/enum-discriminant/wrapping_niche.stderr b/tests/ui/enum-discriminant/wrapping_niche.stderr index b3b0a560b28ab..bd42f79c38b39 100644 --- a/tests/ui/enum-discriminant/wrapping_niche.stderr +++ b/tests/ui/enum-discriminant/wrapping_niche.stderr @@ -56,7 +56,6 @@ error: layout_of(UnsignedAroundZero) = Layout { uninhabited: false, max_repr_align: None, unadjusted_abi_align: Align(2 bytes), - randomization_seed: 9885373149222004003, }, VariantLayout { size: Size(2 bytes), @@ -72,7 +71,6 @@ error: layout_of(UnsignedAroundZero) = Layout { uninhabited: false, max_repr_align: None, unadjusted_abi_align: Align(2 bytes), - randomization_seed: 9885373149222004003, }, VariantLayout { size: Size(2 bytes), @@ -88,7 +86,6 @@ error: layout_of(UnsignedAroundZero) = Layout { uninhabited: false, max_repr_align: None, unadjusted_abi_align: Align(2 bytes), - randomization_seed: 9885373149222004003, }, ], }, @@ -159,7 +156,6 @@ error: layout_of(SignedAroundZero) = Layout { uninhabited: false, max_repr_align: None, unadjusted_abi_align: Align(2 bytes), - randomization_seed: 2684536712112553499, }, VariantLayout { size: Size(2 bytes), @@ -175,7 +171,6 @@ error: layout_of(SignedAroundZero) = Layout { uninhabited: false, max_repr_align: None, unadjusted_abi_align: Align(2 bytes), - randomization_seed: 2684536712112553499, }, VariantLayout { size: Size(2 bytes), @@ -191,7 +186,6 @@ error: layout_of(SignedAroundZero) = Layout { uninhabited: false, max_repr_align: None, unadjusted_abi_align: Align(2 bytes), - randomization_seed: 2684536712112553499, }, ], }, diff --git a/tests/ui/layout/debug.stderr b/tests/ui/layout/debug.stderr index b80a797f05af1..c218d933d6862 100644 --- a/tests/ui/layout/debug.stderr +++ b/tests/ui/layout/debug.stderr @@ -72,7 +72,6 @@ error: layout_of(E) = Layout { uninhabited: false, max_repr_align: None, unadjusted_abi_align: Align(1 bytes), - randomization_seed: $SEED, }, VariantLayout { size: Size(12 bytes), @@ -96,7 +95,6 @@ error: layout_of(E) = Layout { uninhabited: true, max_repr_align: None, unadjusted_abi_align: Align(4 bytes), - randomization_seed: $SEED, }, ], }, @@ -263,7 +261,6 @@ error: layout_of(Result) = Layout { uninhabited: false, max_repr_align: None, unadjusted_abi_align: Align(4 bytes), - randomization_seed: $SEED, }, VariantLayout { size: Size(8 bytes), @@ -296,7 +293,6 @@ error: layout_of(Result) = Layout { uninhabited: false, max_repr_align: None, unadjusted_abi_align: Align(4 bytes), - randomization_seed: $SEED, }, ], }, diff --git a/tests/ui/layout/hexagon-enum.stderr b/tests/ui/layout/hexagon-enum.stderr index e00848b1b0154..73431de7016eb 100644 --- a/tests/ui/layout/hexagon-enum.stderr +++ b/tests/ui/layout/hexagon-enum.stderr @@ -56,7 +56,6 @@ error: layout_of(A) = Layout { uninhabited: false, max_repr_align: None, unadjusted_abi_align: Align(1 bytes), - randomization_seed: $SEED, }, ], }, @@ -127,7 +126,6 @@ error: layout_of(B) = Layout { uninhabited: false, max_repr_align: None, unadjusted_abi_align: Align(1 bytes), - randomization_seed: $SEED, }, ], }, @@ -198,7 +196,6 @@ error: layout_of(C) = Layout { uninhabited: false, max_repr_align: None, unadjusted_abi_align: Align(2 bytes), - randomization_seed: $SEED, }, ], }, @@ -269,7 +266,6 @@ error: layout_of(P) = Layout { uninhabited: false, max_repr_align: None, unadjusted_abi_align: Align(4 bytes), - randomization_seed: $SEED, }, ], }, @@ -340,7 +336,6 @@ error: layout_of(T) = Layout { uninhabited: false, max_repr_align: None, unadjusted_abi_align: Align(4 bytes), - randomization_seed: $SEED, }, ], }, diff --git a/tests/ui/layout/issue-96158-scalarpair-payload-might-be-uninit.stderr b/tests/ui/layout/issue-96158-scalarpair-payload-might-be-uninit.stderr index c9d7551a3d954..20f9e69ff51d4 100644 --- a/tests/ui/layout/issue-96158-scalarpair-payload-might-be-uninit.stderr +++ b/tests/ui/layout/issue-96158-scalarpair-payload-might-be-uninit.stderr @@ -78,7 +78,6 @@ error: layout_of(MissingPayloadField) = Layout { uninhabited: false, max_repr_align: None, unadjusted_abi_align: Align(1 bytes), - randomization_seed: $SEED, }, VariantLayout { size: Size(1 bytes), @@ -94,7 +93,6 @@ error: layout_of(MissingPayloadField) = Layout { uninhabited: false, max_repr_align: None, unadjusted_abi_align: Align(1 bytes), - randomization_seed: $SEED, }, ], }, @@ -189,7 +187,6 @@ error: layout_of(CommonPayloadField) = Layout { uninhabited: false, max_repr_align: None, unadjusted_abi_align: Align(1 bytes), - randomization_seed: $SEED, }, VariantLayout { size: Size(2 bytes), @@ -222,7 +219,6 @@ error: layout_of(CommonPayloadField) = Layout { uninhabited: false, max_repr_align: None, unadjusted_abi_align: Align(1 bytes), - randomization_seed: $SEED, }, ], }, @@ -315,7 +311,6 @@ error: layout_of(CommonPayloadFieldIsMaybeUninit) = Layout { uninhabited: false, max_repr_align: None, unadjusted_abi_align: Align(1 bytes), - randomization_seed: $SEED, }, VariantLayout { size: Size(2 bytes), @@ -347,7 +342,6 @@ error: layout_of(CommonPayloadFieldIsMaybeUninit) = Layout { uninhabited: false, max_repr_align: None, unadjusted_abi_align: Align(1 bytes), - randomization_seed: $SEED, }, ], }, @@ -456,7 +450,6 @@ error: layout_of(NicheFirst) = Layout { uninhabited: false, max_repr_align: None, unadjusted_abi_align: Align(1 bytes), - randomization_seed: $SEED, }, VariantLayout { size: Size(0 bytes), @@ -472,7 +465,6 @@ error: layout_of(NicheFirst) = Layout { uninhabited: false, max_repr_align: None, unadjusted_abi_align: Align(1 bytes), - randomization_seed: $SEED, }, VariantLayout { size: Size(0 bytes), @@ -488,7 +480,6 @@ error: layout_of(NicheFirst) = Layout { uninhabited: false, max_repr_align: None, unadjusted_abi_align: Align(1 bytes), - randomization_seed: $SEED, }, ], }, @@ -597,7 +588,6 @@ error: layout_of(NicheSecond) = Layout { uninhabited: false, max_repr_align: None, unadjusted_abi_align: Align(1 bytes), - randomization_seed: $SEED, }, VariantLayout { size: Size(0 bytes), @@ -613,7 +603,6 @@ error: layout_of(NicheSecond) = Layout { uninhabited: false, max_repr_align: None, unadjusted_abi_align: Align(1 bytes), - randomization_seed: $SEED, }, VariantLayout { size: Size(0 bytes), @@ -629,7 +618,6 @@ error: layout_of(NicheSecond) = Layout { uninhabited: false, max_repr_align: None, unadjusted_abi_align: Align(1 bytes), - randomization_seed: $SEED, }, ], }, diff --git a/tests/ui/layout/issue-96185-overaligned-enum.stderr b/tests/ui/layout/issue-96185-overaligned-enum.stderr index 7e88d4c6fcc9e..80efc35cf6384 100644 --- a/tests/ui/layout/issue-96185-overaligned-enum.stderr +++ b/tests/ui/layout/issue-96185-overaligned-enum.stderr @@ -52,7 +52,6 @@ error: layout_of(Aligned1) = Layout { Align(8 bytes), ), unadjusted_abi_align: Align(1 bytes), - randomization_seed: $SEED, }, VariantLayout { size: Size(8 bytes), @@ -70,7 +69,6 @@ error: layout_of(Aligned1) = Layout { Align(8 bytes), ), unadjusted_abi_align: Align(1 bytes), - randomization_seed: $SEED, }, ], }, @@ -145,7 +143,6 @@ error: layout_of(Aligned2) = Layout { Align(1 bytes), ), unadjusted_abi_align: Align(1 bytes), - randomization_seed: $SEED, }, VariantLayout { size: Size(1 bytes), @@ -163,7 +160,6 @@ error: layout_of(Aligned2) = Layout { Align(1 bytes), ), unadjusted_abi_align: Align(1 bytes), - randomization_seed: $SEED, }, ], }, diff --git a/tests/ui/layout/thumb-enum.stderr b/tests/ui/layout/thumb-enum.stderr index 053ea65a48b79..d2d4af352a093 100644 --- a/tests/ui/layout/thumb-enum.stderr +++ b/tests/ui/layout/thumb-enum.stderr @@ -56,7 +56,6 @@ error: layout_of(A) = Layout { uninhabited: false, max_repr_align: None, unadjusted_abi_align: Align(1 bytes), - randomization_seed: $SEED, }, ], }, @@ -127,7 +126,6 @@ error: layout_of(B) = Layout { uninhabited: false, max_repr_align: None, unadjusted_abi_align: Align(1 bytes), - randomization_seed: $SEED, }, ], }, @@ -198,7 +196,6 @@ error: layout_of(C) = Layout { uninhabited: false, max_repr_align: None, unadjusted_abi_align: Align(2 bytes), - randomization_seed: $SEED, }, ], }, @@ -269,7 +266,6 @@ error: layout_of(P) = Layout { uninhabited: false, max_repr_align: None, unadjusted_abi_align: Align(4 bytes), - randomization_seed: $SEED, }, ], }, @@ -340,7 +336,6 @@ error: layout_of(T) = Layout { uninhabited: false, max_repr_align: None, unadjusted_abi_align: Align(4 bytes), - randomization_seed: $SEED, }, ], }, diff --git a/tests/ui/layout/zero-sized-array-enum-niche.stderr b/tests/ui/layout/zero-sized-array-enum-niche.stderr index e4ab23e3564d7..b1a2183699488 100644 --- a/tests/ui/layout/zero-sized-array-enum-niche.stderr +++ b/tests/ui/layout/zero-sized-array-enum-niche.stderr @@ -54,7 +54,6 @@ error: layout_of(Result<[u32; 0], bool>) = Layout { uninhabited: false, max_repr_align: None, unadjusted_abi_align: Align(4 bytes), - randomization_seed: $SEED, }, VariantLayout { size: Size(2 bytes), @@ -83,7 +82,6 @@ error: layout_of(Result<[u32; 0], bool>) = Layout { uninhabited: false, max_repr_align: None, unadjusted_abi_align: Align(1 bytes), - randomization_seed: $SEED, }, ], }, @@ -152,7 +150,6 @@ error: layout_of(MultipleAlignments) = Layout { uninhabited: false, max_repr_align: None, unadjusted_abi_align: Align(2 bytes), - randomization_seed: $SEED, }, VariantLayout { size: Size(4 bytes), @@ -172,7 +169,6 @@ error: layout_of(MultipleAlignments) = Layout { uninhabited: false, max_repr_align: None, unadjusted_abi_align: Align(4 bytes), - randomization_seed: $SEED, }, VariantLayout { size: Size(2 bytes), @@ -201,7 +197,6 @@ error: layout_of(MultipleAlignments) = Layout { uninhabited: false, max_repr_align: None, unadjusted_abi_align: Align(1 bytes), - randomization_seed: $SEED, }, ], }, @@ -270,7 +265,6 @@ error: layout_of(Result<[u32; 0], Packed>>) = Layout { uninhabited: false, max_repr_align: None, unadjusted_abi_align: Align(4 bytes), - randomization_seed: $SEED, }, VariantLayout { size: Size(3 bytes), @@ -299,7 +293,6 @@ error: layout_of(Result<[u32; 0], Packed>>) = Layout { uninhabited: false, max_repr_align: None, unadjusted_abi_align: Align(1 bytes), - randomization_seed: $SEED, }, ], }, @@ -372,7 +365,6 @@ error: layout_of(Result<[u32; 0], Packed>) = Layout { uninhabited: false, max_repr_align: None, unadjusted_abi_align: Align(4 bytes), - randomization_seed: $SEED, }, VariantLayout { size: Size(2 bytes), @@ -401,7 +393,6 @@ error: layout_of(Result<[u32; 0], Packed>) = Layout { uninhabited: false, max_repr_align: None, unadjusted_abi_align: Align(1 bytes), - randomization_seed: $SEED, }, ], }, diff --git a/tests/ui/repr/repr-c-dead-variants.aarch64-unknown-linux-gnu.stderr b/tests/ui/repr/repr-c-dead-variants.aarch64-unknown-linux-gnu.stderr index 46a1eee98c772..6917390e9bb91 100644 --- a/tests/ui/repr/repr-c-dead-variants.aarch64-unknown-linux-gnu.stderr +++ b/tests/ui/repr/repr-c-dead-variants.aarch64-unknown-linux-gnu.stderr @@ -66,7 +66,6 @@ error: layout_of(Univariant) = Layout { uninhabited: true, max_repr_align: None, unadjusted_abi_align: Align(4 bytes), - randomization_seed: $SEED, }, ], }, @@ -159,7 +158,6 @@ error: layout_of(TwoVariants) = Layout { uninhabited: true, max_repr_align: None, unadjusted_abi_align: Align(4 bytes), - randomization_seed: $SEED, }, VariantLayout { size: Size(8 bytes), @@ -191,7 +189,6 @@ error: layout_of(TwoVariants) = Layout { uninhabited: false, max_repr_align: None, unadjusted_abi_align: Align(4 bytes), - randomization_seed: $SEED, }, ], }, @@ -264,7 +261,6 @@ error: layout_of(DeadBranchHasOtherField) = Layout { Align(8 bytes), ), unadjusted_abi_align: Align(8 bytes), - randomization_seed: $SEED, }, VariantLayout { size: Size(16 bytes), @@ -284,7 +280,6 @@ error: layout_of(DeadBranchHasOtherField) = Layout { uninhabited: false, max_repr_align: None, unadjusted_abi_align: Align(8 bytes), - randomization_seed: $SEED, }, ], }, diff --git a/tests/ui/repr/repr-c-dead-variants.armebv7r-none-eabi.stderr b/tests/ui/repr/repr-c-dead-variants.armebv7r-none-eabi.stderr index 35c0d22f23254..1ad3b8b22f7cc 100644 --- a/tests/ui/repr/repr-c-dead-variants.armebv7r-none-eabi.stderr +++ b/tests/ui/repr/repr-c-dead-variants.armebv7r-none-eabi.stderr @@ -66,7 +66,6 @@ error: layout_of(Univariant) = Layout { uninhabited: true, max_repr_align: None, unadjusted_abi_align: Align(1 bytes), - randomization_seed: $SEED, }, ], }, @@ -159,7 +158,6 @@ error: layout_of(TwoVariants) = Layout { uninhabited: true, max_repr_align: None, unadjusted_abi_align: Align(1 bytes), - randomization_seed: $SEED, }, VariantLayout { size: Size(2 bytes), @@ -191,7 +189,6 @@ error: layout_of(TwoVariants) = Layout { uninhabited: false, max_repr_align: None, unadjusted_abi_align: Align(1 bytes), - randomization_seed: $SEED, }, ], }, @@ -264,7 +261,6 @@ error: layout_of(DeadBranchHasOtherField) = Layout { Align(8 bytes), ), unadjusted_abi_align: Align(8 bytes), - randomization_seed: $SEED, }, VariantLayout { size: Size(16 bytes), @@ -284,7 +280,6 @@ error: layout_of(DeadBranchHasOtherField) = Layout { uninhabited: false, max_repr_align: None, unadjusted_abi_align: Align(8 bytes), - randomization_seed: $SEED, }, ], }, diff --git a/tests/ui/repr/repr-c-dead-variants.i686-pc-windows-msvc.stderr b/tests/ui/repr/repr-c-dead-variants.i686-pc-windows-msvc.stderr index 46a1eee98c772..6917390e9bb91 100644 --- a/tests/ui/repr/repr-c-dead-variants.i686-pc-windows-msvc.stderr +++ b/tests/ui/repr/repr-c-dead-variants.i686-pc-windows-msvc.stderr @@ -66,7 +66,6 @@ error: layout_of(Univariant) = Layout { uninhabited: true, max_repr_align: None, unadjusted_abi_align: Align(4 bytes), - randomization_seed: $SEED, }, ], }, @@ -159,7 +158,6 @@ error: layout_of(TwoVariants) = Layout { uninhabited: true, max_repr_align: None, unadjusted_abi_align: Align(4 bytes), - randomization_seed: $SEED, }, VariantLayout { size: Size(8 bytes), @@ -191,7 +189,6 @@ error: layout_of(TwoVariants) = Layout { uninhabited: false, max_repr_align: None, unadjusted_abi_align: Align(4 bytes), - randomization_seed: $SEED, }, ], }, @@ -264,7 +261,6 @@ error: layout_of(DeadBranchHasOtherField) = Layout { Align(8 bytes), ), unadjusted_abi_align: Align(8 bytes), - randomization_seed: $SEED, }, VariantLayout { size: Size(16 bytes), @@ -284,7 +280,6 @@ error: layout_of(DeadBranchHasOtherField) = Layout { uninhabited: false, max_repr_align: None, unadjusted_abi_align: Align(8 bytes), - randomization_seed: $SEED, }, ], }, diff --git a/tests/ui/repr/repr-c-dead-variants.x86_64-unknown-linux-gnu.stderr b/tests/ui/repr/repr-c-dead-variants.x86_64-unknown-linux-gnu.stderr index 46a1eee98c772..6917390e9bb91 100644 --- a/tests/ui/repr/repr-c-dead-variants.x86_64-unknown-linux-gnu.stderr +++ b/tests/ui/repr/repr-c-dead-variants.x86_64-unknown-linux-gnu.stderr @@ -66,7 +66,6 @@ error: layout_of(Univariant) = Layout { uninhabited: true, max_repr_align: None, unadjusted_abi_align: Align(4 bytes), - randomization_seed: $SEED, }, ], }, @@ -159,7 +158,6 @@ error: layout_of(TwoVariants) = Layout { uninhabited: true, max_repr_align: None, unadjusted_abi_align: Align(4 bytes), - randomization_seed: $SEED, }, VariantLayout { size: Size(8 bytes), @@ -191,7 +189,6 @@ error: layout_of(TwoVariants) = Layout { uninhabited: false, max_repr_align: None, unadjusted_abi_align: Align(4 bytes), - randomization_seed: $SEED, }, ], }, @@ -264,7 +261,6 @@ error: layout_of(DeadBranchHasOtherField) = Layout { Align(8 bytes), ), unadjusted_abi_align: Align(8 bytes), - randomization_seed: $SEED, }, VariantLayout { size: Size(16 bytes), @@ -284,7 +280,6 @@ error: layout_of(DeadBranchHasOtherField) = Layout { uninhabited: false, max_repr_align: None, unadjusted_abi_align: Align(8 bytes), - randomization_seed: $SEED, }, ], }, diff --git a/tests/ui/repr/repr-c-int-dead-variants.stderr b/tests/ui/repr/repr-c-int-dead-variants.stderr index 0f0099bb18cc8..857002c379caa 100644 --- a/tests/ui/repr/repr-c-int-dead-variants.stderr +++ b/tests/ui/repr/repr-c-int-dead-variants.stderr @@ -66,7 +66,6 @@ error: layout_of(UnivariantU8) = Layout { uninhabited: true, max_repr_align: None, unadjusted_abi_align: Align(1 bytes), - randomization_seed: $SEED, }, ], }, @@ -159,7 +158,6 @@ error: layout_of(TwoVariantsU8) = Layout { uninhabited: true, max_repr_align: None, unadjusted_abi_align: Align(1 bytes), - randomization_seed: $SEED, }, VariantLayout { size: Size(2 bytes), @@ -191,7 +189,6 @@ error: layout_of(TwoVariantsU8) = Layout { uninhabited: false, max_repr_align: None, unadjusted_abi_align: Align(1 bytes), - randomization_seed: $SEED, }, ], }, @@ -264,7 +261,6 @@ error: layout_of(DeadBranchHasOtherFieldU8) = Layout { Align(8 bytes), ), unadjusted_abi_align: Align(8 bytes), - randomization_seed: $SEED, }, VariantLayout { size: Size(16 bytes), @@ -284,7 +280,6 @@ error: layout_of(DeadBranchHasOtherFieldU8) = Layout { uninhabited: false, max_repr_align: None, unadjusted_abi_align: Align(8 bytes), - randomization_seed: $SEED, }, ], }, diff --git a/tests/ui/type/pattern_types/non_null.stderr b/tests/ui/type/pattern_types/non_null.stderr index fb8ec33f63202..38f449c282e12 100644 --- a/tests/ui/type/pattern_types/non_null.stderr +++ b/tests/ui/type/pattern_types/non_null.stderr @@ -100,7 +100,6 @@ error: layout_of(Option<(*const ()) is !null>) = Layout { uninhabited: false, max_repr_align: None, unadjusted_abi_align: Align(1 bytes), - randomization_seed: $SEED, }, VariantLayout { size: Size(8 bytes), @@ -137,7 +136,6 @@ error: layout_of(Option<(*const ()) is !null>) = Layout { uninhabited: false, max_repr_align: None, unadjusted_abi_align: Align(8 bytes), - randomization_seed: $SEED, }, ], }, diff --git a/tests/ui/type/pattern_types/range_patterns.stderr b/tests/ui/type/pattern_types/range_patterns.stderr index 0dcbca1703a47..da9bd3e6db17f 100644 --- a/tests/ui/type/pattern_types/range_patterns.stderr +++ b/tests/ui/type/pattern_types/range_patterns.stderr @@ -141,7 +141,6 @@ error: layout_of(Option<(u32) is 1..>) = Layout { uninhabited: false, max_repr_align: None, unadjusted_abi_align: Align(1 bytes), - randomization_seed: $SEED, }, VariantLayout { size: Size(4 bytes), @@ -176,7 +175,6 @@ error: layout_of(Option<(u32) is 1..>) = Layout { uninhabited: false, max_repr_align: None, unadjusted_abi_align: Align(4 bytes), - randomization_seed: $SEED, }, ], }, @@ -242,7 +240,6 @@ error: layout_of(Option>) = Layout { uninhabited: false, max_repr_align: None, unadjusted_abi_align: Align(1 bytes), - randomization_seed: $SEED, }, VariantLayout { size: Size(4 bytes), @@ -277,7 +274,6 @@ error: layout_of(Option>) = Layout { uninhabited: false, max_repr_align: None, unadjusted_abi_align: Align(4 bytes), - randomization_seed: $SEED, }, ], }, From db81f4e7abec08f72cf19b16404a81fae6f78fe0 Mon Sep 17 00:00:00 2001 From: Moulins Date: Wed, 14 Jan 2026 00:20:50 +0100 Subject: [PATCH 06/25] Remove per-variant alignment in `VariantLayout` Reusing the alignment of the enclosing enum in `LayoutData::for_variant` doesn't appear to cause any issues. --- compiler/rustc_abi/src/layout.rs | 15 +++-- compiler/rustc_abi/src/layout/simple.rs | 6 +- compiler/rustc_abi/src/lib.rs | 6 -- .../rustc_ty_utils/src/layout/invariant.rs | 10 +--- .../enum-discriminant/wrapping_niche.stderr | 30 ---------- tests/ui/layout/debug.stderr | 20 ------- tests/ui/layout/hexagon-enum.stderr | 25 -------- ...-scalarpair-payload-might-be-uninit.stderr | 60 ------------------- .../issue-96185-overaligned-enum.stderr | 28 --------- tests/ui/layout/thumb-enum.stderr | 25 -------- .../layout/zero-sized-array-enum-niche.stderr | 45 -------------- ...-variants.aarch64-unknown-linux-gnu.stderr | 27 --------- ...-c-dead-variants.armebv7r-none-eabi.stderr | 27 --------- ...-dead-variants.i686-pc-windows-msvc.stderr | 27 --------- ...d-variants.x86_64-unknown-linux-gnu.stderr | 27 --------- tests/ui/repr/repr-c-int-dead-variants.stderr | 27 --------- tests/ui/type/pattern_types/non_null.stderr | 10 ---- .../type/pattern_types/range_patterns.stderr | 20 ------- 18 files changed, 14 insertions(+), 421 deletions(-) diff --git a/compiler/rustc_abi/src/layout.rs b/compiler/rustc_abi/src/layout.rs index d21a20d4b87bc..f0b92155d0be1 100644 --- a/compiler/rustc_abi/src/layout.rs +++ b/compiler/rustc_abi/src/layout.rs @@ -638,6 +638,10 @@ impl LayoutCalculator { } let calculate_niche_filling_layout = || -> Option> { + struct VariantLayoutInfo { + align_abi: Align, + } + if repr.inhibit_enum_layout_opt() { return None; } @@ -651,11 +655,14 @@ impl LayoutCalculator { let mut unadjusted_abi_align = align; let mut combined_seed = repr.field_shuffle_seed; + let mut variants_info = IndexVec::::with_capacity(variants.len()); let mut variant_layouts = variants .iter() .map(|v| { let st = self.univariant(v, repr, StructKind::AlwaysSized).ok()?; + variants_info.push(VariantLayoutInfo { align_abi: st.align.abi }); + align = align.max(st.align.abi); max_repr_align = max_repr_align.max(st.max_repr_align); unadjusted_abi_align = unadjusted_abi_align.max(st.unadjusted_abi_align); @@ -699,7 +706,7 @@ impl LayoutCalculator { } // Determine if it'll fit after the niche. - let this_align = layout.align.abi; + let this_align = variants_info[i].align_abi; let this_offset = (niche_offset + niche_size).align_to(this_align); if this_offset + layout.size > size { @@ -730,7 +737,7 @@ impl LayoutCalculator { .iter_enumerated() .all(|(i, layout)| i == largest_variant_index || layout.size == Size::ZERO); let same_size = size == variant_layouts[largest_variant_index].size; - let same_align = align == variant_layouts[largest_variant_index].align.abi; + let same_align = align == variants_info[largest_variant_index].align_abi; let uninhabited = variant_layouts.iter().all(|v| v.is_uninhabited()); let abi = if same_size && same_align && others_zst { @@ -1080,10 +1087,8 @@ impl LayoutCalculator { if matches!(variant.backend_repr, BackendRepr::Memory { .. } if variant.has_fields()) { variant.backend_repr = abi; - // Also need to bump up the size and alignment, so that the entire value fits - // in here. + // Also need to bump up the size, so that the entire value fits in here. variant.size = cmp::max(variant.size, size); - variant.align.abi = cmp::max(variant.align.abi, align); } } } diff --git a/compiler/rustc_abi/src/layout/simple.rs b/compiler/rustc_abi/src/layout/simple.rs index 9b13540ca15a5..48530cbf69c77 100644 --- a/compiler/rustc_abi/src/layout/simple.rs +++ b/compiler/rustc_abi/src/layout/simple.rs @@ -163,10 +163,10 @@ impl LayoutData { backend_repr: layout.backend_repr, largest_niche: layout.largest_niche, uninhabited: layout.uninhabited, - align: layout.align, size: layout.size, - max_repr_align: layout.max_repr_align, - unadjusted_abi_align: layout.unadjusted_abi_align, + align: parent.align, + max_repr_align: parent.max_repr_align, + unadjusted_abi_align: parent.unadjusted_abi_align, randomization_seed: Hash64::ZERO, } } diff --git a/compiler/rustc_abi/src/lib.rs b/compiler/rustc_abi/src/lib.rs index f0fae2d42ecfb..3d4c85018ce29 100644 --- a/compiler/rustc_abi/src/lib.rs +++ b/compiler/rustc_abi/src/lib.rs @@ -2256,14 +2256,11 @@ pub enum AbiFromStrErr { #[cfg_attr(feature = "nightly", derive(HashStable_Generic))] pub struct VariantLayout { pub size: Size, - pub align: AbiAlign, pub backend_repr: BackendRepr, pub field_offsets: IndexVec, fields_in_memory_order: IndexVec, largest_niche: Option, uninhabited: bool, - max_repr_align: Option, - unadjusted_abi_align: Align, } impl VariantLayout { @@ -2274,14 +2271,11 @@ impl VariantLayout { Self { size: layout.size, - align: layout.align, backend_repr: layout.backend_repr, field_offsets: offsets, fields_in_memory_order: in_memory_order, largest_niche: layout.largest_niche, uninhabited: layout.uninhabited, - max_repr_align: layout.max_repr_align, - unadjusted_abi_align: layout.unadjusted_abi_align, } } diff --git a/compiler/rustc_ty_utils/src/layout/invariant.rs b/compiler/rustc_ty_utils/src/layout/invariant.rs index 98e6ca351964e..7e15c16303ddd 100644 --- a/compiler/rustc_ty_utils/src/layout/invariant.rs +++ b/compiler/rustc_ty_utils/src/layout/invariant.rs @@ -294,8 +294,7 @@ pub(super) fn layout_sanity_check<'tcx>(cx: &LayoutCx<'tcx>, layout: &TyAndLayou } } for variant in variants.iter() { - // Variants should have the same or a smaller size as the full thing, - // and same for alignment. + // Variants should have the same or a smaller size as the full thing. if variant.size > layout.size { bug!( "Type with size {} bytes has variant with size {} bytes: {layout:#?}", @@ -303,13 +302,6 @@ pub(super) fn layout_sanity_check<'tcx>(cx: &LayoutCx<'tcx>, layout: &TyAndLayou variant.size.bytes(), ) } - if variant.align.abi > layout.align.abi { - bug!( - "Type with alignment {} bytes has variant with alignment {} bytes: {layout:#?}", - layout.align.bytes(), - variant.align.bytes(), - ) - } // Skip empty variants. if variant.size == Size::ZERO || !variant.has_fields() || variant.is_uninhabited() { // These are never actually accessed anyway, so we can skip the coherence check diff --git a/tests/ui/enum-discriminant/wrapping_niche.stderr b/tests/ui/enum-discriminant/wrapping_niche.stderr index bd42f79c38b39..b24948fb39ddf 100644 --- a/tests/ui/enum-discriminant/wrapping_niche.stderr +++ b/tests/ui/enum-discriminant/wrapping_niche.stderr @@ -44,9 +44,6 @@ error: layout_of(UnsignedAroundZero) = Layout { variants: [ VariantLayout { size: Size(2 bytes), - align: AbiAlign { - abi: Align(2 bytes), - }, backend_repr: Memory { sized: true, }, @@ -54,14 +51,9 @@ error: layout_of(UnsignedAroundZero) = Layout { fields_in_memory_order: [], largest_niche: None, uninhabited: false, - max_repr_align: None, - unadjusted_abi_align: Align(2 bytes), }, VariantLayout { size: Size(2 bytes), - align: AbiAlign { - abi: Align(2 bytes), - }, backend_repr: Memory { sized: true, }, @@ -69,14 +61,9 @@ error: layout_of(UnsignedAroundZero) = Layout { fields_in_memory_order: [], largest_niche: None, uninhabited: false, - max_repr_align: None, - unadjusted_abi_align: Align(2 bytes), }, VariantLayout { size: Size(2 bytes), - align: AbiAlign { - abi: Align(2 bytes), - }, backend_repr: Memory { sized: true, }, @@ -84,8 +71,6 @@ error: layout_of(UnsignedAroundZero) = Layout { fields_in_memory_order: [], largest_niche: None, uninhabited: false, - max_repr_align: None, - unadjusted_abi_align: Align(2 bytes), }, ], }, @@ -144,9 +129,6 @@ error: layout_of(SignedAroundZero) = Layout { variants: [ VariantLayout { size: Size(2 bytes), - align: AbiAlign { - abi: Align(2 bytes), - }, backend_repr: Memory { sized: true, }, @@ -154,14 +136,9 @@ error: layout_of(SignedAroundZero) = Layout { fields_in_memory_order: [], largest_niche: None, uninhabited: false, - max_repr_align: None, - unadjusted_abi_align: Align(2 bytes), }, VariantLayout { size: Size(2 bytes), - align: AbiAlign { - abi: Align(2 bytes), - }, backend_repr: Memory { sized: true, }, @@ -169,14 +146,9 @@ error: layout_of(SignedAroundZero) = Layout { fields_in_memory_order: [], largest_niche: None, uninhabited: false, - max_repr_align: None, - unadjusted_abi_align: Align(2 bytes), }, VariantLayout { size: Size(2 bytes), - align: AbiAlign { - abi: Align(2 bytes), - }, backend_repr: Memory { sized: true, }, @@ -184,8 +156,6 @@ error: layout_of(SignedAroundZero) = Layout { fields_in_memory_order: [], largest_niche: None, uninhabited: false, - max_repr_align: None, - unadjusted_abi_align: Align(2 bytes), }, ], }, diff --git a/tests/ui/layout/debug.stderr b/tests/ui/layout/debug.stderr index c218d933d6862..1c9c02c657e3e 100644 --- a/tests/ui/layout/debug.stderr +++ b/tests/ui/layout/debug.stderr @@ -60,9 +60,6 @@ error: layout_of(E) = Layout { variants: [ VariantLayout { size: Size(4 bytes), - align: AbiAlign { - abi: Align(1 bytes), - }, backend_repr: Memory { sized: true, }, @@ -70,14 +67,9 @@ error: layout_of(E) = Layout { fields_in_memory_order: [], largest_niche: None, uninhabited: false, - max_repr_align: None, - unadjusted_abi_align: Align(1 bytes), }, VariantLayout { size: Size(12 bytes), - align: AbiAlign { - abi: Align(4 bytes), - }, backend_repr: Memory { sized: true, }, @@ -93,8 +85,6 @@ error: layout_of(E) = Layout { ], largest_niche: None, uninhabited: true, - max_repr_align: None, - unadjusted_abi_align: Align(4 bytes), }, ], }, @@ -232,9 +222,6 @@ error: layout_of(Result) = Layout { variants: [ VariantLayout { size: Size(8 bytes), - align: AbiAlign { - abi: Align(4 bytes), - }, backend_repr: ScalarPair( Initialized { value: Int( @@ -259,14 +246,9 @@ error: layout_of(Result) = Layout { ], largest_niche: None, uninhabited: false, - max_repr_align: None, - unadjusted_abi_align: Align(4 bytes), }, VariantLayout { size: Size(8 bytes), - align: AbiAlign { - abi: Align(4 bytes), - }, backend_repr: ScalarPair( Initialized { value: Int( @@ -291,8 +273,6 @@ error: layout_of(Result) = Layout { ], largest_niche: None, uninhabited: false, - max_repr_align: None, - unadjusted_abi_align: Align(4 bytes), }, ], }, diff --git a/tests/ui/layout/hexagon-enum.stderr b/tests/ui/layout/hexagon-enum.stderr index 73431de7016eb..993ff476b6b6c 100644 --- a/tests/ui/layout/hexagon-enum.stderr +++ b/tests/ui/layout/hexagon-enum.stderr @@ -44,9 +44,6 @@ error: layout_of(A) = Layout { variants: [ VariantLayout { size: Size(1 bytes), - align: AbiAlign { - abi: Align(1 bytes), - }, backend_repr: Memory { sized: true, }, @@ -54,8 +51,6 @@ error: layout_of(A) = Layout { fields_in_memory_order: [], largest_niche: None, uninhabited: false, - max_repr_align: None, - unadjusted_abi_align: Align(1 bytes), }, ], }, @@ -114,9 +109,6 @@ error: layout_of(B) = Layout { variants: [ VariantLayout { size: Size(1 bytes), - align: AbiAlign { - abi: Align(1 bytes), - }, backend_repr: Memory { sized: true, }, @@ -124,8 +116,6 @@ error: layout_of(B) = Layout { fields_in_memory_order: [], largest_niche: None, uninhabited: false, - max_repr_align: None, - unadjusted_abi_align: Align(1 bytes), }, ], }, @@ -184,9 +174,6 @@ error: layout_of(C) = Layout { variants: [ VariantLayout { size: Size(2 bytes), - align: AbiAlign { - abi: Align(2 bytes), - }, backend_repr: Memory { sized: true, }, @@ -194,8 +181,6 @@ error: layout_of(C) = Layout { fields_in_memory_order: [], largest_niche: None, uninhabited: false, - max_repr_align: None, - unadjusted_abi_align: Align(2 bytes), }, ], }, @@ -254,9 +239,6 @@ error: layout_of(P) = Layout { variants: [ VariantLayout { size: Size(4 bytes), - align: AbiAlign { - abi: Align(4 bytes), - }, backend_repr: Memory { sized: true, }, @@ -264,8 +246,6 @@ error: layout_of(P) = Layout { fields_in_memory_order: [], largest_niche: None, uninhabited: false, - max_repr_align: None, - unadjusted_abi_align: Align(4 bytes), }, ], }, @@ -324,9 +304,6 @@ error: layout_of(T) = Layout { variants: [ VariantLayout { size: Size(4 bytes), - align: AbiAlign { - abi: Align(4 bytes), - }, backend_repr: Memory { sized: true, }, @@ -334,8 +311,6 @@ error: layout_of(T) = Layout { fields_in_memory_order: [], largest_niche: None, uninhabited: false, - max_repr_align: None, - unadjusted_abi_align: Align(4 bytes), }, ], }, diff --git a/tests/ui/layout/issue-96158-scalarpair-payload-might-be-uninit.stderr b/tests/ui/layout/issue-96158-scalarpair-payload-might-be-uninit.stderr index 20f9e69ff51d4..7e6294f894c3e 100644 --- a/tests/ui/layout/issue-96158-scalarpair-payload-might-be-uninit.stderr +++ b/tests/ui/layout/issue-96158-scalarpair-payload-might-be-uninit.stderr @@ -50,9 +50,6 @@ error: layout_of(MissingPayloadField) = Layout { variants: [ VariantLayout { size: Size(2 bytes), - align: AbiAlign { - abi: Align(1 bytes), - }, backend_repr: ScalarPair( Initialized { value: Int( @@ -76,14 +73,9 @@ error: layout_of(MissingPayloadField) = Layout { ], largest_niche: None, uninhabited: false, - max_repr_align: None, - unadjusted_abi_align: Align(1 bytes), }, VariantLayout { size: Size(1 bytes), - align: AbiAlign { - abi: Align(1 bytes), - }, backend_repr: Memory { sized: true, }, @@ -91,8 +83,6 @@ error: layout_of(MissingPayloadField) = Layout { fields_in_memory_order: [], largest_niche: None, uninhabited: false, - max_repr_align: None, - unadjusted_abi_align: Align(1 bytes), }, ], }, @@ -158,9 +148,6 @@ error: layout_of(CommonPayloadField) = Layout { variants: [ VariantLayout { size: Size(2 bytes), - align: AbiAlign { - abi: Align(1 bytes), - }, backend_repr: ScalarPair( Initialized { value: Int( @@ -185,14 +172,9 @@ error: layout_of(CommonPayloadField) = Layout { ], largest_niche: None, uninhabited: false, - max_repr_align: None, - unadjusted_abi_align: Align(1 bytes), }, VariantLayout { size: Size(2 bytes), - align: AbiAlign { - abi: Align(1 bytes), - }, backend_repr: ScalarPair( Initialized { value: Int( @@ -217,8 +199,6 @@ error: layout_of(CommonPayloadField) = Layout { ], largest_niche: None, uninhabited: false, - max_repr_align: None, - unadjusted_abi_align: Align(1 bytes), }, ], }, @@ -283,9 +263,6 @@ error: layout_of(CommonPayloadFieldIsMaybeUninit) = Layout { variants: [ VariantLayout { size: Size(2 bytes), - align: AbiAlign { - abi: Align(1 bytes), - }, backend_repr: ScalarPair( Initialized { value: Int( @@ -309,14 +286,9 @@ error: layout_of(CommonPayloadFieldIsMaybeUninit) = Layout { ], largest_niche: None, uninhabited: false, - max_repr_align: None, - unadjusted_abi_align: Align(1 bytes), }, VariantLayout { size: Size(2 bytes), - align: AbiAlign { - abi: Align(1 bytes), - }, backend_repr: ScalarPair( Initialized { value: Int( @@ -340,8 +312,6 @@ error: layout_of(CommonPayloadFieldIsMaybeUninit) = Layout { ], largest_niche: None, uninhabited: false, - max_repr_align: None, - unadjusted_abi_align: Align(1 bytes), }, ], }, @@ -410,9 +380,6 @@ error: layout_of(NicheFirst) = Layout { variants: [ VariantLayout { size: Size(2 bytes), - align: AbiAlign { - abi: Align(1 bytes), - }, backend_repr: ScalarPair( Initialized { value: Int( @@ -448,14 +415,9 @@ error: layout_of(NicheFirst) = Layout { }, ), uninhabited: false, - max_repr_align: None, - unadjusted_abi_align: Align(1 bytes), }, VariantLayout { size: Size(0 bytes), - align: AbiAlign { - abi: Align(1 bytes), - }, backend_repr: Memory { sized: true, }, @@ -463,14 +425,9 @@ error: layout_of(NicheFirst) = Layout { fields_in_memory_order: [], largest_niche: None, uninhabited: false, - max_repr_align: None, - unadjusted_abi_align: Align(1 bytes), }, VariantLayout { size: Size(0 bytes), - align: AbiAlign { - abi: Align(1 bytes), - }, backend_repr: Memory { sized: true, }, @@ -478,8 +435,6 @@ error: layout_of(NicheFirst) = Layout { fields_in_memory_order: [], largest_niche: None, uninhabited: false, - max_repr_align: None, - unadjusted_abi_align: Align(1 bytes), }, ], }, @@ -548,9 +503,6 @@ error: layout_of(NicheSecond) = Layout { variants: [ VariantLayout { size: Size(2 bytes), - align: AbiAlign { - abi: Align(1 bytes), - }, backend_repr: ScalarPair( Initialized { value: Int( @@ -586,14 +538,9 @@ error: layout_of(NicheSecond) = Layout { }, ), uninhabited: false, - max_repr_align: None, - unadjusted_abi_align: Align(1 bytes), }, VariantLayout { size: Size(0 bytes), - align: AbiAlign { - abi: Align(1 bytes), - }, backend_repr: Memory { sized: true, }, @@ -601,14 +548,9 @@ error: layout_of(NicheSecond) = Layout { fields_in_memory_order: [], largest_niche: None, uninhabited: false, - max_repr_align: None, - unadjusted_abi_align: Align(1 bytes), }, VariantLayout { size: Size(0 bytes), - align: AbiAlign { - abi: Align(1 bytes), - }, backend_repr: Memory { sized: true, }, @@ -616,8 +558,6 @@ error: layout_of(NicheSecond) = Layout { fields_in_memory_order: [], largest_niche: None, uninhabited: false, - max_repr_align: None, - unadjusted_abi_align: Align(1 bytes), }, ], }, diff --git a/tests/ui/layout/issue-96185-overaligned-enum.stderr b/tests/ui/layout/issue-96185-overaligned-enum.stderr index 80efc35cf6384..8937af2f5d494 100644 --- a/tests/ui/layout/issue-96185-overaligned-enum.stderr +++ b/tests/ui/layout/issue-96185-overaligned-enum.stderr @@ -38,9 +38,6 @@ error: layout_of(Aligned1) = Layout { variants: [ VariantLayout { size: Size(8 bytes), - align: AbiAlign { - abi: Align(8 bytes), - }, backend_repr: Memory { sized: true, }, @@ -48,16 +45,9 @@ error: layout_of(Aligned1) = Layout { fields_in_memory_order: [], largest_niche: None, uninhabited: false, - max_repr_align: Some( - Align(8 bytes), - ), - unadjusted_abi_align: Align(1 bytes), }, VariantLayout { size: Size(8 bytes), - align: AbiAlign { - abi: Align(8 bytes), - }, backend_repr: Memory { sized: true, }, @@ -65,10 +55,6 @@ error: layout_of(Aligned1) = Layout { fields_in_memory_order: [], largest_niche: None, uninhabited: false, - max_repr_align: Some( - Align(8 bytes), - ), - unadjusted_abi_align: Align(1 bytes), }, ], }, @@ -129,9 +115,6 @@ error: layout_of(Aligned2) = Layout { variants: [ VariantLayout { size: Size(1 bytes), - align: AbiAlign { - abi: Align(1 bytes), - }, backend_repr: Memory { sized: true, }, @@ -139,16 +122,9 @@ error: layout_of(Aligned2) = Layout { fields_in_memory_order: [], largest_niche: None, uninhabited: false, - max_repr_align: Some( - Align(1 bytes), - ), - unadjusted_abi_align: Align(1 bytes), }, VariantLayout { size: Size(1 bytes), - align: AbiAlign { - abi: Align(1 bytes), - }, backend_repr: Memory { sized: true, }, @@ -156,10 +132,6 @@ error: layout_of(Aligned2) = Layout { fields_in_memory_order: [], largest_niche: None, uninhabited: false, - max_repr_align: Some( - Align(1 bytes), - ), - unadjusted_abi_align: Align(1 bytes), }, ], }, diff --git a/tests/ui/layout/thumb-enum.stderr b/tests/ui/layout/thumb-enum.stderr index d2d4af352a093..200002490d5c5 100644 --- a/tests/ui/layout/thumb-enum.stderr +++ b/tests/ui/layout/thumb-enum.stderr @@ -44,9 +44,6 @@ error: layout_of(A) = Layout { variants: [ VariantLayout { size: Size(1 bytes), - align: AbiAlign { - abi: Align(1 bytes), - }, backend_repr: Memory { sized: true, }, @@ -54,8 +51,6 @@ error: layout_of(A) = Layout { fields_in_memory_order: [], largest_niche: None, uninhabited: false, - max_repr_align: None, - unadjusted_abi_align: Align(1 bytes), }, ], }, @@ -114,9 +109,6 @@ error: layout_of(B) = Layout { variants: [ VariantLayout { size: Size(1 bytes), - align: AbiAlign { - abi: Align(1 bytes), - }, backend_repr: Memory { sized: true, }, @@ -124,8 +116,6 @@ error: layout_of(B) = Layout { fields_in_memory_order: [], largest_niche: None, uninhabited: false, - max_repr_align: None, - unadjusted_abi_align: Align(1 bytes), }, ], }, @@ -184,9 +174,6 @@ error: layout_of(C) = Layout { variants: [ VariantLayout { size: Size(2 bytes), - align: AbiAlign { - abi: Align(2 bytes), - }, backend_repr: Memory { sized: true, }, @@ -194,8 +181,6 @@ error: layout_of(C) = Layout { fields_in_memory_order: [], largest_niche: None, uninhabited: false, - max_repr_align: None, - unadjusted_abi_align: Align(2 bytes), }, ], }, @@ -254,9 +239,6 @@ error: layout_of(P) = Layout { variants: [ VariantLayout { size: Size(4 bytes), - align: AbiAlign { - abi: Align(4 bytes), - }, backend_repr: Memory { sized: true, }, @@ -264,8 +246,6 @@ error: layout_of(P) = Layout { fields_in_memory_order: [], largest_niche: None, uninhabited: false, - max_repr_align: None, - unadjusted_abi_align: Align(4 bytes), }, ], }, @@ -324,9 +304,6 @@ error: layout_of(T) = Layout { variants: [ VariantLayout { size: Size(4 bytes), - align: AbiAlign { - abi: Align(4 bytes), - }, backend_repr: Memory { sized: true, }, @@ -334,8 +311,6 @@ error: layout_of(T) = Layout { fields_in_memory_order: [], largest_niche: None, uninhabited: false, - max_repr_align: None, - unadjusted_abi_align: Align(4 bytes), }, ], }, diff --git a/tests/ui/layout/zero-sized-array-enum-niche.stderr b/tests/ui/layout/zero-sized-array-enum-niche.stderr index b1a2183699488..b40e357c1a114 100644 --- a/tests/ui/layout/zero-sized-array-enum-niche.stderr +++ b/tests/ui/layout/zero-sized-array-enum-niche.stderr @@ -38,9 +38,6 @@ error: layout_of(Result<[u32; 0], bool>) = Layout { variants: [ VariantLayout { size: Size(4 bytes), - align: AbiAlign { - abi: Align(4 bytes), - }, backend_repr: Memory { sized: true, }, @@ -52,14 +49,9 @@ error: layout_of(Result<[u32; 0], bool>) = Layout { ], largest_niche: None, uninhabited: false, - max_repr_align: None, - unadjusted_abi_align: Align(4 bytes), }, VariantLayout { size: Size(2 bytes), - align: AbiAlign { - abi: Align(1 bytes), - }, backend_repr: Memory { sized: true, }, @@ -80,8 +72,6 @@ error: layout_of(Result<[u32; 0], bool>) = Layout { }, ), uninhabited: false, - max_repr_align: None, - unadjusted_abi_align: Align(1 bytes), }, ], }, @@ -134,9 +124,6 @@ error: layout_of(MultipleAlignments) = Layout { variants: [ VariantLayout { size: Size(2 bytes), - align: AbiAlign { - abi: Align(2 bytes), - }, backend_repr: Memory { sized: true, }, @@ -148,14 +135,9 @@ error: layout_of(MultipleAlignments) = Layout { ], largest_niche: None, uninhabited: false, - max_repr_align: None, - unadjusted_abi_align: Align(2 bytes), }, VariantLayout { size: Size(4 bytes), - align: AbiAlign { - abi: Align(4 bytes), - }, backend_repr: Memory { sized: true, }, @@ -167,14 +149,9 @@ error: layout_of(MultipleAlignments) = Layout { ], largest_niche: None, uninhabited: false, - max_repr_align: None, - unadjusted_abi_align: Align(4 bytes), }, VariantLayout { size: Size(2 bytes), - align: AbiAlign { - abi: Align(1 bytes), - }, backend_repr: Memory { sized: true, }, @@ -195,8 +172,6 @@ error: layout_of(MultipleAlignments) = Layout { }, ), uninhabited: false, - max_repr_align: None, - unadjusted_abi_align: Align(1 bytes), }, ], }, @@ -249,9 +224,6 @@ error: layout_of(Result<[u32; 0], Packed>>) = Layout { variants: [ VariantLayout { size: Size(4 bytes), - align: AbiAlign { - abi: Align(4 bytes), - }, backend_repr: Memory { sized: true, }, @@ -263,14 +235,9 @@ error: layout_of(Result<[u32; 0], Packed>>) = Layout { ], largest_niche: None, uninhabited: false, - max_repr_align: None, - unadjusted_abi_align: Align(4 bytes), }, VariantLayout { size: Size(3 bytes), - align: AbiAlign { - abi: Align(1 bytes), - }, backend_repr: Memory { sized: true, }, @@ -291,8 +258,6 @@ error: layout_of(Result<[u32; 0], Packed>>) = Layout { }, ), uninhabited: false, - max_repr_align: None, - unadjusted_abi_align: Align(1 bytes), }, ], }, @@ -349,9 +314,6 @@ error: layout_of(Result<[u32; 0], Packed>) = Layout { variants: [ VariantLayout { size: Size(0 bytes), - align: AbiAlign { - abi: Align(4 bytes), - }, backend_repr: Memory { sized: true, }, @@ -363,14 +325,9 @@ error: layout_of(Result<[u32; 0], Packed>) = Layout { ], largest_niche: None, uninhabited: false, - max_repr_align: None, - unadjusted_abi_align: Align(4 bytes), }, VariantLayout { size: Size(2 bytes), - align: AbiAlign { - abi: Align(1 bytes), - }, backend_repr: Memory { sized: true, }, @@ -391,8 +348,6 @@ error: layout_of(Result<[u32; 0], Packed>) = Layout { }, ), uninhabited: false, - max_repr_align: None, - unadjusted_abi_align: Align(1 bytes), }, ], }, diff --git a/tests/ui/repr/repr-c-dead-variants.aarch64-unknown-linux-gnu.stderr b/tests/ui/repr/repr-c-dead-variants.aarch64-unknown-linux-gnu.stderr index 6917390e9bb91..28fafa7800305 100644 --- a/tests/ui/repr/repr-c-dead-variants.aarch64-unknown-linux-gnu.stderr +++ b/tests/ui/repr/repr-c-dead-variants.aarch64-unknown-linux-gnu.stderr @@ -44,9 +44,6 @@ error: layout_of(Univariant) = Layout { variants: [ VariantLayout { size: Size(4 bytes), - align: AbiAlign { - abi: Align(4 bytes), - }, backend_repr: Scalar( Initialized { value: Int( @@ -64,8 +61,6 @@ error: layout_of(Univariant) = Layout { ], largest_niche: None, uninhabited: true, - max_repr_align: None, - unadjusted_abi_align: Align(4 bytes), }, ], }, @@ -130,9 +125,6 @@ error: layout_of(TwoVariants) = Layout { variants: [ VariantLayout { size: Size(8 bytes), - align: AbiAlign { - abi: Align(4 bytes), - }, backend_repr: ScalarPair( Initialized { value: Int( @@ -156,14 +148,9 @@ error: layout_of(TwoVariants) = Layout { ], largest_niche: None, uninhabited: true, - max_repr_align: None, - unadjusted_abi_align: Align(4 bytes), }, VariantLayout { size: Size(8 bytes), - align: AbiAlign { - abi: Align(4 bytes), - }, backend_repr: ScalarPair( Initialized { value: Int( @@ -187,8 +174,6 @@ error: layout_of(TwoVariants) = Layout { ], largest_niche: None, uninhabited: false, - max_repr_align: None, - unadjusted_abi_align: Align(4 bytes), }, ], }, @@ -241,9 +226,6 @@ error: layout_of(DeadBranchHasOtherField) = Layout { variants: [ VariantLayout { size: Size(16 bytes), - align: AbiAlign { - abi: Align(8 bytes), - }, backend_repr: Memory { sized: true, }, @@ -257,16 +239,9 @@ error: layout_of(DeadBranchHasOtherField) = Layout { ], largest_niche: None, uninhabited: true, - max_repr_align: Some( - Align(8 bytes), - ), - unadjusted_abi_align: Align(8 bytes), }, VariantLayout { size: Size(16 bytes), - align: AbiAlign { - abi: Align(8 bytes), - }, backend_repr: Memory { sized: true, }, @@ -278,8 +253,6 @@ error: layout_of(DeadBranchHasOtherField) = Layout { ], largest_niche: None, uninhabited: false, - max_repr_align: None, - unadjusted_abi_align: Align(8 bytes), }, ], }, diff --git a/tests/ui/repr/repr-c-dead-variants.armebv7r-none-eabi.stderr b/tests/ui/repr/repr-c-dead-variants.armebv7r-none-eabi.stderr index 1ad3b8b22f7cc..45193552b507f 100644 --- a/tests/ui/repr/repr-c-dead-variants.armebv7r-none-eabi.stderr +++ b/tests/ui/repr/repr-c-dead-variants.armebv7r-none-eabi.stderr @@ -44,9 +44,6 @@ error: layout_of(Univariant) = Layout { variants: [ VariantLayout { size: Size(1 bytes), - align: AbiAlign { - abi: Align(1 bytes), - }, backend_repr: Scalar( Initialized { value: Int( @@ -64,8 +61,6 @@ error: layout_of(Univariant) = Layout { ], largest_niche: None, uninhabited: true, - max_repr_align: None, - unadjusted_abi_align: Align(1 bytes), }, ], }, @@ -130,9 +125,6 @@ error: layout_of(TwoVariants) = Layout { variants: [ VariantLayout { size: Size(2 bytes), - align: AbiAlign { - abi: Align(1 bytes), - }, backend_repr: ScalarPair( Initialized { value: Int( @@ -156,14 +148,9 @@ error: layout_of(TwoVariants) = Layout { ], largest_niche: None, uninhabited: true, - max_repr_align: None, - unadjusted_abi_align: Align(1 bytes), }, VariantLayout { size: Size(2 bytes), - align: AbiAlign { - abi: Align(1 bytes), - }, backend_repr: ScalarPair( Initialized { value: Int( @@ -187,8 +174,6 @@ error: layout_of(TwoVariants) = Layout { ], largest_niche: None, uninhabited: false, - max_repr_align: None, - unadjusted_abi_align: Align(1 bytes), }, ], }, @@ -241,9 +226,6 @@ error: layout_of(DeadBranchHasOtherField) = Layout { variants: [ VariantLayout { size: Size(16 bytes), - align: AbiAlign { - abi: Align(8 bytes), - }, backend_repr: Memory { sized: true, }, @@ -257,16 +239,9 @@ error: layout_of(DeadBranchHasOtherField) = Layout { ], largest_niche: None, uninhabited: true, - max_repr_align: Some( - Align(8 bytes), - ), - unadjusted_abi_align: Align(8 bytes), }, VariantLayout { size: Size(16 bytes), - align: AbiAlign { - abi: Align(8 bytes), - }, backend_repr: Memory { sized: true, }, @@ -278,8 +253,6 @@ error: layout_of(DeadBranchHasOtherField) = Layout { ], largest_niche: None, uninhabited: false, - max_repr_align: None, - unadjusted_abi_align: Align(8 bytes), }, ], }, diff --git a/tests/ui/repr/repr-c-dead-variants.i686-pc-windows-msvc.stderr b/tests/ui/repr/repr-c-dead-variants.i686-pc-windows-msvc.stderr index 6917390e9bb91..28fafa7800305 100644 --- a/tests/ui/repr/repr-c-dead-variants.i686-pc-windows-msvc.stderr +++ b/tests/ui/repr/repr-c-dead-variants.i686-pc-windows-msvc.stderr @@ -44,9 +44,6 @@ error: layout_of(Univariant) = Layout { variants: [ VariantLayout { size: Size(4 bytes), - align: AbiAlign { - abi: Align(4 bytes), - }, backend_repr: Scalar( Initialized { value: Int( @@ -64,8 +61,6 @@ error: layout_of(Univariant) = Layout { ], largest_niche: None, uninhabited: true, - max_repr_align: None, - unadjusted_abi_align: Align(4 bytes), }, ], }, @@ -130,9 +125,6 @@ error: layout_of(TwoVariants) = Layout { variants: [ VariantLayout { size: Size(8 bytes), - align: AbiAlign { - abi: Align(4 bytes), - }, backend_repr: ScalarPair( Initialized { value: Int( @@ -156,14 +148,9 @@ error: layout_of(TwoVariants) = Layout { ], largest_niche: None, uninhabited: true, - max_repr_align: None, - unadjusted_abi_align: Align(4 bytes), }, VariantLayout { size: Size(8 bytes), - align: AbiAlign { - abi: Align(4 bytes), - }, backend_repr: ScalarPair( Initialized { value: Int( @@ -187,8 +174,6 @@ error: layout_of(TwoVariants) = Layout { ], largest_niche: None, uninhabited: false, - max_repr_align: None, - unadjusted_abi_align: Align(4 bytes), }, ], }, @@ -241,9 +226,6 @@ error: layout_of(DeadBranchHasOtherField) = Layout { variants: [ VariantLayout { size: Size(16 bytes), - align: AbiAlign { - abi: Align(8 bytes), - }, backend_repr: Memory { sized: true, }, @@ -257,16 +239,9 @@ error: layout_of(DeadBranchHasOtherField) = Layout { ], largest_niche: None, uninhabited: true, - max_repr_align: Some( - Align(8 bytes), - ), - unadjusted_abi_align: Align(8 bytes), }, VariantLayout { size: Size(16 bytes), - align: AbiAlign { - abi: Align(8 bytes), - }, backend_repr: Memory { sized: true, }, @@ -278,8 +253,6 @@ error: layout_of(DeadBranchHasOtherField) = Layout { ], largest_niche: None, uninhabited: false, - max_repr_align: None, - unadjusted_abi_align: Align(8 bytes), }, ], }, diff --git a/tests/ui/repr/repr-c-dead-variants.x86_64-unknown-linux-gnu.stderr b/tests/ui/repr/repr-c-dead-variants.x86_64-unknown-linux-gnu.stderr index 6917390e9bb91..28fafa7800305 100644 --- a/tests/ui/repr/repr-c-dead-variants.x86_64-unknown-linux-gnu.stderr +++ b/tests/ui/repr/repr-c-dead-variants.x86_64-unknown-linux-gnu.stderr @@ -44,9 +44,6 @@ error: layout_of(Univariant) = Layout { variants: [ VariantLayout { size: Size(4 bytes), - align: AbiAlign { - abi: Align(4 bytes), - }, backend_repr: Scalar( Initialized { value: Int( @@ -64,8 +61,6 @@ error: layout_of(Univariant) = Layout { ], largest_niche: None, uninhabited: true, - max_repr_align: None, - unadjusted_abi_align: Align(4 bytes), }, ], }, @@ -130,9 +125,6 @@ error: layout_of(TwoVariants) = Layout { variants: [ VariantLayout { size: Size(8 bytes), - align: AbiAlign { - abi: Align(4 bytes), - }, backend_repr: ScalarPair( Initialized { value: Int( @@ -156,14 +148,9 @@ error: layout_of(TwoVariants) = Layout { ], largest_niche: None, uninhabited: true, - max_repr_align: None, - unadjusted_abi_align: Align(4 bytes), }, VariantLayout { size: Size(8 bytes), - align: AbiAlign { - abi: Align(4 bytes), - }, backend_repr: ScalarPair( Initialized { value: Int( @@ -187,8 +174,6 @@ error: layout_of(TwoVariants) = Layout { ], largest_niche: None, uninhabited: false, - max_repr_align: None, - unadjusted_abi_align: Align(4 bytes), }, ], }, @@ -241,9 +226,6 @@ error: layout_of(DeadBranchHasOtherField) = Layout { variants: [ VariantLayout { size: Size(16 bytes), - align: AbiAlign { - abi: Align(8 bytes), - }, backend_repr: Memory { sized: true, }, @@ -257,16 +239,9 @@ error: layout_of(DeadBranchHasOtherField) = Layout { ], largest_niche: None, uninhabited: true, - max_repr_align: Some( - Align(8 bytes), - ), - unadjusted_abi_align: Align(8 bytes), }, VariantLayout { size: Size(16 bytes), - align: AbiAlign { - abi: Align(8 bytes), - }, backend_repr: Memory { sized: true, }, @@ -278,8 +253,6 @@ error: layout_of(DeadBranchHasOtherField) = Layout { ], largest_niche: None, uninhabited: false, - max_repr_align: None, - unadjusted_abi_align: Align(8 bytes), }, ], }, diff --git a/tests/ui/repr/repr-c-int-dead-variants.stderr b/tests/ui/repr/repr-c-int-dead-variants.stderr index 857002c379caa..c2f7fec38c81f 100644 --- a/tests/ui/repr/repr-c-int-dead-variants.stderr +++ b/tests/ui/repr/repr-c-int-dead-variants.stderr @@ -44,9 +44,6 @@ error: layout_of(UnivariantU8) = Layout { variants: [ VariantLayout { size: Size(1 bytes), - align: AbiAlign { - abi: Align(1 bytes), - }, backend_repr: Scalar( Initialized { value: Int( @@ -64,8 +61,6 @@ error: layout_of(UnivariantU8) = Layout { ], largest_niche: None, uninhabited: true, - max_repr_align: None, - unadjusted_abi_align: Align(1 bytes), }, ], }, @@ -130,9 +125,6 @@ error: layout_of(TwoVariantsU8) = Layout { variants: [ VariantLayout { size: Size(2 bytes), - align: AbiAlign { - abi: Align(1 bytes), - }, backend_repr: ScalarPair( Initialized { value: Int( @@ -156,14 +148,9 @@ error: layout_of(TwoVariantsU8) = Layout { ], largest_niche: None, uninhabited: true, - max_repr_align: None, - unadjusted_abi_align: Align(1 bytes), }, VariantLayout { size: Size(2 bytes), - align: AbiAlign { - abi: Align(1 bytes), - }, backend_repr: ScalarPair( Initialized { value: Int( @@ -187,8 +174,6 @@ error: layout_of(TwoVariantsU8) = Layout { ], largest_niche: None, uninhabited: false, - max_repr_align: None, - unadjusted_abi_align: Align(1 bytes), }, ], }, @@ -241,9 +226,6 @@ error: layout_of(DeadBranchHasOtherFieldU8) = Layout { variants: [ VariantLayout { size: Size(16 bytes), - align: AbiAlign { - abi: Align(8 bytes), - }, backend_repr: Memory { sized: true, }, @@ -257,16 +239,9 @@ error: layout_of(DeadBranchHasOtherFieldU8) = Layout { ], largest_niche: None, uninhabited: true, - max_repr_align: Some( - Align(8 bytes), - ), - unadjusted_abi_align: Align(8 bytes), }, VariantLayout { size: Size(16 bytes), - align: AbiAlign { - abi: Align(8 bytes), - }, backend_repr: Memory { sized: true, }, @@ -278,8 +253,6 @@ error: layout_of(DeadBranchHasOtherFieldU8) = Layout { ], largest_niche: None, uninhabited: false, - max_repr_align: None, - unadjusted_abi_align: Align(8 bytes), }, ], }, diff --git a/tests/ui/type/pattern_types/non_null.stderr b/tests/ui/type/pattern_types/non_null.stderr index 38f449c282e12..e22d6cc9af10a 100644 --- a/tests/ui/type/pattern_types/non_null.stderr +++ b/tests/ui/type/pattern_types/non_null.stderr @@ -88,9 +88,6 @@ error: layout_of(Option<(*const ()) is !null>) = Layout { variants: [ VariantLayout { size: Size(0 bytes), - align: AbiAlign { - abi: Align(1 bytes), - }, backend_repr: Memory { sized: true, }, @@ -98,14 +95,9 @@ error: layout_of(Option<(*const ()) is !null>) = Layout { fields_in_memory_order: [], largest_niche: None, uninhabited: false, - max_repr_align: None, - unadjusted_abi_align: Align(1 bytes), }, VariantLayout { size: Size(8 bytes), - align: AbiAlign { - abi: Align(8 bytes), - }, backend_repr: Scalar( Initialized { value: Pointer( @@ -134,8 +126,6 @@ error: layout_of(Option<(*const ()) is !null>) = Layout { }, ), uninhabited: false, - max_repr_align: None, - unadjusted_abi_align: Align(8 bytes), }, ], }, diff --git a/tests/ui/type/pattern_types/range_patterns.stderr b/tests/ui/type/pattern_types/range_patterns.stderr index da9bd3e6db17f..1efa04bc26e21 100644 --- a/tests/ui/type/pattern_types/range_patterns.stderr +++ b/tests/ui/type/pattern_types/range_patterns.stderr @@ -129,9 +129,6 @@ error: layout_of(Option<(u32) is 1..>) = Layout { variants: [ VariantLayout { size: Size(0 bytes), - align: AbiAlign { - abi: Align(1 bytes), - }, backend_repr: Memory { sized: true, }, @@ -139,14 +136,9 @@ error: layout_of(Option<(u32) is 1..>) = Layout { fields_in_memory_order: [], largest_niche: None, uninhabited: false, - max_repr_align: None, - unadjusted_abi_align: Align(1 bytes), }, VariantLayout { size: Size(4 bytes), - align: AbiAlign { - abi: Align(4 bytes), - }, backend_repr: Scalar( Initialized { value: Int( @@ -173,8 +165,6 @@ error: layout_of(Option<(u32) is 1..>) = Layout { }, ), uninhabited: false, - max_repr_align: None, - unadjusted_abi_align: Align(4 bytes), }, ], }, @@ -228,9 +218,6 @@ error: layout_of(Option>) = Layout { variants: [ VariantLayout { size: Size(0 bytes), - align: AbiAlign { - abi: Align(1 bytes), - }, backend_repr: Memory { sized: true, }, @@ -238,14 +225,9 @@ error: layout_of(Option>) = Layout { fields_in_memory_order: [], largest_niche: None, uninhabited: false, - max_repr_align: None, - unadjusted_abi_align: Align(1 bytes), }, VariantLayout { size: Size(4 bytes), - align: AbiAlign { - abi: Align(4 bytes), - }, backend_repr: Scalar( Initialized { value: Int( @@ -272,8 +254,6 @@ error: layout_of(Option>) = Layout { }, ), uninhabited: false, - max_repr_align: None, - unadjusted_abi_align: Align(4 bytes), }, ], }, From 7c7738908d9246687f830fa3df35426d70ebc5c2 Mon Sep 17 00:00:00 2001 From: Moulins Date: Wed, 14 Jan 2026 03:20:51 +0100 Subject: [PATCH 07/25] Remove `VariantLayout::largest_niche` field The only place inspecting the niches of a variant layout is `compiler/rustc_codegen_llvm/src/debuginfo/metadata/enums/mod.rs`, which can be rewritten to use the niches of the enclosing enum instead. --- compiler/rustc_abi/src/layout.rs | 25 ++++++----- compiler/rustc_abi/src/layout/simple.rs | 2 +- compiler/rustc_abi/src/lib.rs | 2 - .../src/debuginfo/metadata/enums/mod.rs | 34 +++++++++++--- .../enum-discriminant/wrapping_niche.stderr | 6 --- tests/ui/layout/debug.stderr | 4 -- tests/ui/layout/hexagon-enum.stderr | 5 --- ...-scalarpair-payload-might-be-uninit.stderr | 30 ------------- .../issue-96185-overaligned-enum.stderr | 4 -- tests/ui/layout/thumb-enum.stderr | 5 --- .../layout/zero-sized-array-enum-niche.stderr | 45 ------------------- ...-variants.aarch64-unknown-linux-gnu.stderr | 5 --- ...-c-dead-variants.armebv7r-none-eabi.stderr | 5 --- ...-dead-variants.i686-pc-windows-msvc.stderr | 5 --- ...d-variants.x86_64-unknown-linux-gnu.stderr | 5 --- tests/ui/repr/repr-c-int-dead-variants.stderr | 5 --- tests/ui/type/pattern_types/non_null.stderr | 12 ----- .../type/pattern_types/range_patterns.stderr | 22 --------- 18 files changed, 42 insertions(+), 179 deletions(-) diff --git a/compiler/rustc_abi/src/layout.rs b/compiler/rustc_abi/src/layout.rs index f0b92155d0be1..95a6210095180 100644 --- a/compiler/rustc_abi/src/layout.rs +++ b/compiler/rustc_abi/src/layout.rs @@ -655,14 +655,24 @@ impl LayoutCalculator { let mut unadjusted_abi_align = align; let mut combined_seed = repr.field_shuffle_seed; + let mut largest_variant_size = Size::ZERO; + let mut largest_variant_index = VariantIdx::new(0); + let mut largest_variant_niche = None; + let mut variants_info = IndexVec::::with_capacity(variants.len()); let mut variant_layouts = variants - .iter() - .map(|v| { + .iter_enumerated() + .map(|(i, v)| { let st = self.univariant(v, repr, StructKind::AlwaysSized).ok()?; variants_info.push(VariantLayoutInfo { align_abi: st.align.abi }); + if st.size > largest_variant_size { + largest_variant_index = i; + largest_variant_size = st.size; + largest_variant_niche = st.largest_niche; + } + align = align.max(st.align.abi); max_repr_align = max_repr_align.max(st.max_repr_align); unadjusted_abi_align = unadjusted_abi_align.max(st.unadjusted_abi_align); @@ -672,11 +682,6 @@ impl LayoutCalculator { }) .collect::>>()?; - let largest_variant_index = variant_layouts - .iter_enumerated() - .max_by_key(|(_i, layout)| layout.size.bytes()) - .map(|(i, _layout)| i)?; - let all_indices = variants.indices(); let needs_disc = |index: VariantIdx| index != largest_variant_index && !absent(&variants[index]); @@ -687,19 +692,17 @@ impl LayoutCalculator { (niche_variants.end().index() as u128 - niche_variants.start().index() as u128) + 1; // Use the largest niche in the largest variant. - let niche = variant_layouts[largest_variant_index].largest_niche?; + let niche = largest_variant_niche?; let (niche_start, niche_scalar) = niche.reserve(dl, count)?; let niche_offset = niche.offset; let niche_size = niche.value.size(dl); - let size = variant_layouts[largest_variant_index].size.align_to(align); + let size = largest_variant_size.align_to(align); let all_variants_fit = variant_layouts.iter_enumerated_mut().all(|(i, layout)| { if i == largest_variant_index { return true; } - layout.largest_niche = None; - if layout.size <= niche_offset { // This variant will fit before the niche. return true; diff --git a/compiler/rustc_abi/src/layout/simple.rs b/compiler/rustc_abi/src/layout/simple.rs index 48530cbf69c77..1f2cecb025bce 100644 --- a/compiler/rustc_abi/src/layout/simple.rs +++ b/compiler/rustc_abi/src/layout/simple.rs @@ -161,7 +161,7 @@ impl LayoutData { }, variants: Variants::Single { index }, backend_repr: layout.backend_repr, - largest_niche: layout.largest_niche, + largest_niche: None, uninhabited: layout.uninhabited, size: layout.size, align: parent.align, diff --git a/compiler/rustc_abi/src/lib.rs b/compiler/rustc_abi/src/lib.rs index 3d4c85018ce29..6fc966997e30f 100644 --- a/compiler/rustc_abi/src/lib.rs +++ b/compiler/rustc_abi/src/lib.rs @@ -2259,7 +2259,6 @@ pub struct VariantLayout { pub backend_repr: BackendRepr, pub field_offsets: IndexVec, fields_in_memory_order: IndexVec, - largest_niche: Option, uninhabited: bool, } @@ -2274,7 +2273,6 @@ impl VariantLayout { backend_repr: layout.backend_repr, field_offsets: offsets, fields_in_memory_order: in_memory_order, - largest_niche: layout.largest_niche, uninhabited: layout.uninhabited, } } diff --git a/compiler/rustc_codegen_llvm/src/debuginfo/metadata/enums/mod.rs b/compiler/rustc_codegen_llvm/src/debuginfo/metadata/enums/mod.rs index 556158c286a84..11794bb38e453 100644 --- a/compiler/rustc_codegen_llvm/src/debuginfo/metadata/enums/mod.rs +++ b/compiler/rustc_codegen_llvm/src/debuginfo/metadata/enums/mod.rs @@ -1,6 +1,6 @@ use std::borrow::Cow; -use rustc_abi::{FieldIdx, TagEncoding, VariantIdx, Variants}; +use rustc_abi::{FieldIdx, TagEncoding, VariantIdx, Variants, WrappingRange}; use rustc_codegen_ssa::debuginfo::type_names::{compute_debuginfo_type_name, cpp_like_debuginfo}; use rustc_codegen_ssa::debuginfo::{tag_base_type, wants_c_like_enum_debuginfo}; use rustc_codegen_ssa::traits::MiscCodegenMethods; @@ -399,16 +399,36 @@ fn compute_discriminant_value<'ll, 'tcx>( ), &Variants::Multiple { tag_encoding: TagEncoding::Niche { ref niche_variants, niche_start, untagged_variant }, + tag_field, tag, .. } => { if variant_index == untagged_variant { - let valid_range = enum_type_and_layout - .for_variant(cx, variant_index) - .largest_niche - .as_ref() - .unwrap() - .valid_range; + let niche_end = niche_start + .wrapping_sub(niche_variants.start().as_u32() as u128) + .wrapping_add(niche_variants.end().as_u32() as u128); + + // Remove discriminant values of the other variants from the largest niche. This assumes + // that the largest niche, when it exists, always corresponds to the enum discriminant. + let mut valid_range = WrappingRange { + start: niche_end.wrapping_add(1), + end: niche_start.wrapping_sub(1), + }; + if let Some(niche) = &enum_type_and_layout.largest_niche { + assert_eq!(enum_type_and_layout.fields.offset(tag_field.into()), niche.offset); + + if niche.valid_range.start == niche_start { + valid_range.end = niche.valid_range.end; + } else if niche.valid_range.end == niche_end { + valid_range.start = niche.valid_range.start; + } else { + bug!( + "largest niche (range: {:?}) doesn't match with niched tag encoding (range: {:?})", + niche.valid_range, + &WrappingRange { start: niche_start, end: niche_end }, + ) + } + } let min = valid_range.start.min(valid_range.end); let min = tag.size(cx).truncate(min); diff --git a/tests/ui/enum-discriminant/wrapping_niche.stderr b/tests/ui/enum-discriminant/wrapping_niche.stderr index b24948fb39ddf..8302f8baedb1e 100644 --- a/tests/ui/enum-discriminant/wrapping_niche.stderr +++ b/tests/ui/enum-discriminant/wrapping_niche.stderr @@ -49,7 +49,6 @@ error: layout_of(UnsignedAroundZero) = Layout { }, field_offsets: [], fields_in_memory_order: [], - largest_niche: None, uninhabited: false, }, VariantLayout { @@ -59,7 +58,6 @@ error: layout_of(UnsignedAroundZero) = Layout { }, field_offsets: [], fields_in_memory_order: [], - largest_niche: None, uninhabited: false, }, VariantLayout { @@ -69,7 +67,6 @@ error: layout_of(UnsignedAroundZero) = Layout { }, field_offsets: [], fields_in_memory_order: [], - largest_niche: None, uninhabited: false, }, ], @@ -134,7 +131,6 @@ error: layout_of(SignedAroundZero) = Layout { }, field_offsets: [], fields_in_memory_order: [], - largest_niche: None, uninhabited: false, }, VariantLayout { @@ -144,7 +140,6 @@ error: layout_of(SignedAroundZero) = Layout { }, field_offsets: [], fields_in_memory_order: [], - largest_niche: None, uninhabited: false, }, VariantLayout { @@ -154,7 +149,6 @@ error: layout_of(SignedAroundZero) = Layout { }, field_offsets: [], fields_in_memory_order: [], - largest_niche: None, uninhabited: false, }, ], diff --git a/tests/ui/layout/debug.stderr b/tests/ui/layout/debug.stderr index 1c9c02c657e3e..242a750700788 100644 --- a/tests/ui/layout/debug.stderr +++ b/tests/ui/layout/debug.stderr @@ -65,7 +65,6 @@ error: layout_of(E) = Layout { }, field_offsets: [], fields_in_memory_order: [], - largest_niche: None, uninhabited: false, }, VariantLayout { @@ -83,7 +82,6 @@ error: layout_of(E) = Layout { 1, 2, ], - largest_niche: None, uninhabited: true, }, ], @@ -244,7 +242,6 @@ error: layout_of(Result) = Layout { fields_in_memory_order: [ 0, ], - largest_niche: None, uninhabited: false, }, VariantLayout { @@ -271,7 +268,6 @@ error: layout_of(Result) = Layout { fields_in_memory_order: [ 0, ], - largest_niche: None, uninhabited: false, }, ], diff --git a/tests/ui/layout/hexagon-enum.stderr b/tests/ui/layout/hexagon-enum.stderr index 993ff476b6b6c..bead8e03213a5 100644 --- a/tests/ui/layout/hexagon-enum.stderr +++ b/tests/ui/layout/hexagon-enum.stderr @@ -49,7 +49,6 @@ error: layout_of(A) = Layout { }, field_offsets: [], fields_in_memory_order: [], - largest_niche: None, uninhabited: false, }, ], @@ -114,7 +113,6 @@ error: layout_of(B) = Layout { }, field_offsets: [], fields_in_memory_order: [], - largest_niche: None, uninhabited: false, }, ], @@ -179,7 +177,6 @@ error: layout_of(C) = Layout { }, field_offsets: [], fields_in_memory_order: [], - largest_niche: None, uninhabited: false, }, ], @@ -244,7 +241,6 @@ error: layout_of(P) = Layout { }, field_offsets: [], fields_in_memory_order: [], - largest_niche: None, uninhabited: false, }, ], @@ -309,7 +305,6 @@ error: layout_of(T) = Layout { }, field_offsets: [], fields_in_memory_order: [], - largest_niche: None, uninhabited: false, }, ], diff --git a/tests/ui/layout/issue-96158-scalarpair-payload-might-be-uninit.stderr b/tests/ui/layout/issue-96158-scalarpair-payload-might-be-uninit.stderr index 7e6294f894c3e..cae9a5d14a12d 100644 --- a/tests/ui/layout/issue-96158-scalarpair-payload-might-be-uninit.stderr +++ b/tests/ui/layout/issue-96158-scalarpair-payload-might-be-uninit.stderr @@ -71,7 +71,6 @@ error: layout_of(MissingPayloadField) = Layout { fields_in_memory_order: [ 0, ], - largest_niche: None, uninhabited: false, }, VariantLayout { @@ -81,7 +80,6 @@ error: layout_of(MissingPayloadField) = Layout { }, field_offsets: [], fields_in_memory_order: [], - largest_niche: None, uninhabited: false, }, ], @@ -170,7 +168,6 @@ error: layout_of(CommonPayloadField) = Layout { fields_in_memory_order: [ 0, ], - largest_niche: None, uninhabited: false, }, VariantLayout { @@ -197,7 +194,6 @@ error: layout_of(CommonPayloadField) = Layout { fields_in_memory_order: [ 0, ], - largest_niche: None, uninhabited: false, }, ], @@ -284,7 +280,6 @@ error: layout_of(CommonPayloadFieldIsMaybeUninit) = Layout { fields_in_memory_order: [ 0, ], - largest_niche: None, uninhabited: false, }, VariantLayout { @@ -310,7 +305,6 @@ error: layout_of(CommonPayloadFieldIsMaybeUninit) = Layout { fields_in_memory_order: [ 0, ], - largest_niche: None, uninhabited: false, }, ], @@ -404,16 +398,6 @@ error: layout_of(NicheFirst) = Layout { 0, 1, ], - largest_niche: Some( - Niche { - offset: Size(0 bytes), - value: Int( - I8, - false, - ), - valid_range: 0..=2, - }, - ), uninhabited: false, }, VariantLayout { @@ -423,7 +407,6 @@ error: layout_of(NicheFirst) = Layout { }, field_offsets: [], fields_in_memory_order: [], - largest_niche: None, uninhabited: false, }, VariantLayout { @@ -433,7 +416,6 @@ error: layout_of(NicheFirst) = Layout { }, field_offsets: [], fields_in_memory_order: [], - largest_niche: None, uninhabited: false, }, ], @@ -527,16 +509,6 @@ error: layout_of(NicheSecond) = Layout { 1, 0, ], - largest_niche: Some( - Niche { - offset: Size(0 bytes), - value: Int( - I8, - false, - ), - valid_range: 0..=2, - }, - ), uninhabited: false, }, VariantLayout { @@ -546,7 +518,6 @@ error: layout_of(NicheSecond) = Layout { }, field_offsets: [], fields_in_memory_order: [], - largest_niche: None, uninhabited: false, }, VariantLayout { @@ -556,7 +527,6 @@ error: layout_of(NicheSecond) = Layout { }, field_offsets: [], fields_in_memory_order: [], - largest_niche: None, uninhabited: false, }, ], diff --git a/tests/ui/layout/issue-96185-overaligned-enum.stderr b/tests/ui/layout/issue-96185-overaligned-enum.stderr index 8937af2f5d494..1df67b906a186 100644 --- a/tests/ui/layout/issue-96185-overaligned-enum.stderr +++ b/tests/ui/layout/issue-96185-overaligned-enum.stderr @@ -43,7 +43,6 @@ error: layout_of(Aligned1) = Layout { }, field_offsets: [], fields_in_memory_order: [], - largest_niche: None, uninhabited: false, }, VariantLayout { @@ -53,7 +52,6 @@ error: layout_of(Aligned1) = Layout { }, field_offsets: [], fields_in_memory_order: [], - largest_niche: None, uninhabited: false, }, ], @@ -120,7 +118,6 @@ error: layout_of(Aligned2) = Layout { }, field_offsets: [], fields_in_memory_order: [], - largest_niche: None, uninhabited: false, }, VariantLayout { @@ -130,7 +127,6 @@ error: layout_of(Aligned2) = Layout { }, field_offsets: [], fields_in_memory_order: [], - largest_niche: None, uninhabited: false, }, ], diff --git a/tests/ui/layout/thumb-enum.stderr b/tests/ui/layout/thumb-enum.stderr index 200002490d5c5..b14e3adef8337 100644 --- a/tests/ui/layout/thumb-enum.stderr +++ b/tests/ui/layout/thumb-enum.stderr @@ -49,7 +49,6 @@ error: layout_of(A) = Layout { }, field_offsets: [], fields_in_memory_order: [], - largest_niche: None, uninhabited: false, }, ], @@ -114,7 +113,6 @@ error: layout_of(B) = Layout { }, field_offsets: [], fields_in_memory_order: [], - largest_niche: None, uninhabited: false, }, ], @@ -179,7 +177,6 @@ error: layout_of(C) = Layout { }, field_offsets: [], fields_in_memory_order: [], - largest_niche: None, uninhabited: false, }, ], @@ -244,7 +241,6 @@ error: layout_of(P) = Layout { }, field_offsets: [], fields_in_memory_order: [], - largest_niche: None, uninhabited: false, }, ], @@ -309,7 +305,6 @@ error: layout_of(T) = Layout { }, field_offsets: [], fields_in_memory_order: [], - largest_niche: None, uninhabited: false, }, ], diff --git a/tests/ui/layout/zero-sized-array-enum-niche.stderr b/tests/ui/layout/zero-sized-array-enum-niche.stderr index b40e357c1a114..62341b83446c1 100644 --- a/tests/ui/layout/zero-sized-array-enum-niche.stderr +++ b/tests/ui/layout/zero-sized-array-enum-niche.stderr @@ -47,7 +47,6 @@ error: layout_of(Result<[u32; 0], bool>) = Layout { fields_in_memory_order: [ 0, ], - largest_niche: None, uninhabited: false, }, VariantLayout { @@ -61,16 +60,6 @@ error: layout_of(Result<[u32; 0], bool>) = Layout { fields_in_memory_order: [ 0, ], - largest_niche: Some( - Niche { - offset: Size(1 bytes), - value: Int( - I8, - false, - ), - valid_range: 0..=1, - }, - ), uninhabited: false, }, ], @@ -133,7 +122,6 @@ error: layout_of(MultipleAlignments) = Layout { fields_in_memory_order: [ 0, ], - largest_niche: None, uninhabited: false, }, VariantLayout { @@ -147,7 +135,6 @@ error: layout_of(MultipleAlignments) = Layout { fields_in_memory_order: [ 0, ], - largest_niche: None, uninhabited: false, }, VariantLayout { @@ -161,16 +148,6 @@ error: layout_of(MultipleAlignments) = Layout { fields_in_memory_order: [ 0, ], - largest_niche: Some( - Niche { - offset: Size(1 bytes), - value: Int( - I8, - false, - ), - valid_range: 0..=1, - }, - ), uninhabited: false, }, ], @@ -233,7 +210,6 @@ error: layout_of(Result<[u32; 0], Packed>>) = Layout { fields_in_memory_order: [ 0, ], - largest_niche: None, uninhabited: false, }, VariantLayout { @@ -247,16 +223,6 @@ error: layout_of(Result<[u32; 0], Packed>>) = Layout { fields_in_memory_order: [ 0, ], - largest_niche: Some( - Niche { - offset: Size(1 bytes), - value: Int( - I16, - false, - ), - valid_range: 1..=65535, - }, - ), uninhabited: false, }, ], @@ -323,7 +289,6 @@ error: layout_of(Result<[u32; 0], Packed>) = Layout { fields_in_memory_order: [ 0, ], - largest_niche: None, uninhabited: false, }, VariantLayout { @@ -337,16 +302,6 @@ error: layout_of(Result<[u32; 0], Packed>) = Layout { fields_in_memory_order: [ 0, ], - largest_niche: Some( - Niche { - offset: Size(0 bytes), - value: Int( - I16, - false, - ), - valid_range: 0..=0, - }, - ), uninhabited: false, }, ], diff --git a/tests/ui/repr/repr-c-dead-variants.aarch64-unknown-linux-gnu.stderr b/tests/ui/repr/repr-c-dead-variants.aarch64-unknown-linux-gnu.stderr index 28fafa7800305..cf6a520db5dd2 100644 --- a/tests/ui/repr/repr-c-dead-variants.aarch64-unknown-linux-gnu.stderr +++ b/tests/ui/repr/repr-c-dead-variants.aarch64-unknown-linux-gnu.stderr @@ -59,7 +59,6 @@ error: layout_of(Univariant) = Layout { fields_in_memory_order: [ 0, ], - largest_niche: None, uninhabited: true, }, ], @@ -146,7 +145,6 @@ error: layout_of(TwoVariants) = Layout { fields_in_memory_order: [ 0, ], - largest_niche: None, uninhabited: true, }, VariantLayout { @@ -172,7 +170,6 @@ error: layout_of(TwoVariants) = Layout { fields_in_memory_order: [ 0, ], - largest_niche: None, uninhabited: false, }, ], @@ -237,7 +234,6 @@ error: layout_of(DeadBranchHasOtherField) = Layout { 0, 1, ], - largest_niche: None, uninhabited: true, }, VariantLayout { @@ -251,7 +247,6 @@ error: layout_of(DeadBranchHasOtherField) = Layout { fields_in_memory_order: [ 0, ], - largest_niche: None, uninhabited: false, }, ], diff --git a/tests/ui/repr/repr-c-dead-variants.armebv7r-none-eabi.stderr b/tests/ui/repr/repr-c-dead-variants.armebv7r-none-eabi.stderr index 45193552b507f..b52916ca1ed0c 100644 --- a/tests/ui/repr/repr-c-dead-variants.armebv7r-none-eabi.stderr +++ b/tests/ui/repr/repr-c-dead-variants.armebv7r-none-eabi.stderr @@ -59,7 +59,6 @@ error: layout_of(Univariant) = Layout { fields_in_memory_order: [ 0, ], - largest_niche: None, uninhabited: true, }, ], @@ -146,7 +145,6 @@ error: layout_of(TwoVariants) = Layout { fields_in_memory_order: [ 0, ], - largest_niche: None, uninhabited: true, }, VariantLayout { @@ -172,7 +170,6 @@ error: layout_of(TwoVariants) = Layout { fields_in_memory_order: [ 0, ], - largest_niche: None, uninhabited: false, }, ], @@ -237,7 +234,6 @@ error: layout_of(DeadBranchHasOtherField) = Layout { 0, 1, ], - largest_niche: None, uninhabited: true, }, VariantLayout { @@ -251,7 +247,6 @@ error: layout_of(DeadBranchHasOtherField) = Layout { fields_in_memory_order: [ 0, ], - largest_niche: None, uninhabited: false, }, ], diff --git a/tests/ui/repr/repr-c-dead-variants.i686-pc-windows-msvc.stderr b/tests/ui/repr/repr-c-dead-variants.i686-pc-windows-msvc.stderr index 28fafa7800305..cf6a520db5dd2 100644 --- a/tests/ui/repr/repr-c-dead-variants.i686-pc-windows-msvc.stderr +++ b/tests/ui/repr/repr-c-dead-variants.i686-pc-windows-msvc.stderr @@ -59,7 +59,6 @@ error: layout_of(Univariant) = Layout { fields_in_memory_order: [ 0, ], - largest_niche: None, uninhabited: true, }, ], @@ -146,7 +145,6 @@ error: layout_of(TwoVariants) = Layout { fields_in_memory_order: [ 0, ], - largest_niche: None, uninhabited: true, }, VariantLayout { @@ -172,7 +170,6 @@ error: layout_of(TwoVariants) = Layout { fields_in_memory_order: [ 0, ], - largest_niche: None, uninhabited: false, }, ], @@ -237,7 +234,6 @@ error: layout_of(DeadBranchHasOtherField) = Layout { 0, 1, ], - largest_niche: None, uninhabited: true, }, VariantLayout { @@ -251,7 +247,6 @@ error: layout_of(DeadBranchHasOtherField) = Layout { fields_in_memory_order: [ 0, ], - largest_niche: None, uninhabited: false, }, ], diff --git a/tests/ui/repr/repr-c-dead-variants.x86_64-unknown-linux-gnu.stderr b/tests/ui/repr/repr-c-dead-variants.x86_64-unknown-linux-gnu.stderr index 28fafa7800305..cf6a520db5dd2 100644 --- a/tests/ui/repr/repr-c-dead-variants.x86_64-unknown-linux-gnu.stderr +++ b/tests/ui/repr/repr-c-dead-variants.x86_64-unknown-linux-gnu.stderr @@ -59,7 +59,6 @@ error: layout_of(Univariant) = Layout { fields_in_memory_order: [ 0, ], - largest_niche: None, uninhabited: true, }, ], @@ -146,7 +145,6 @@ error: layout_of(TwoVariants) = Layout { fields_in_memory_order: [ 0, ], - largest_niche: None, uninhabited: true, }, VariantLayout { @@ -172,7 +170,6 @@ error: layout_of(TwoVariants) = Layout { fields_in_memory_order: [ 0, ], - largest_niche: None, uninhabited: false, }, ], @@ -237,7 +234,6 @@ error: layout_of(DeadBranchHasOtherField) = Layout { 0, 1, ], - largest_niche: None, uninhabited: true, }, VariantLayout { @@ -251,7 +247,6 @@ error: layout_of(DeadBranchHasOtherField) = Layout { fields_in_memory_order: [ 0, ], - largest_niche: None, uninhabited: false, }, ], diff --git a/tests/ui/repr/repr-c-int-dead-variants.stderr b/tests/ui/repr/repr-c-int-dead-variants.stderr index c2f7fec38c81f..b1a157ce664ab 100644 --- a/tests/ui/repr/repr-c-int-dead-variants.stderr +++ b/tests/ui/repr/repr-c-int-dead-variants.stderr @@ -59,7 +59,6 @@ error: layout_of(UnivariantU8) = Layout { fields_in_memory_order: [ 0, ], - largest_niche: None, uninhabited: true, }, ], @@ -146,7 +145,6 @@ error: layout_of(TwoVariantsU8) = Layout { fields_in_memory_order: [ 0, ], - largest_niche: None, uninhabited: true, }, VariantLayout { @@ -172,7 +170,6 @@ error: layout_of(TwoVariantsU8) = Layout { fields_in_memory_order: [ 0, ], - largest_niche: None, uninhabited: false, }, ], @@ -237,7 +234,6 @@ error: layout_of(DeadBranchHasOtherFieldU8) = Layout { 0, 1, ], - largest_niche: None, uninhabited: true, }, VariantLayout { @@ -251,7 +247,6 @@ error: layout_of(DeadBranchHasOtherFieldU8) = Layout { fields_in_memory_order: [ 0, ], - largest_niche: None, uninhabited: false, }, ], diff --git a/tests/ui/type/pattern_types/non_null.stderr b/tests/ui/type/pattern_types/non_null.stderr index e22d6cc9af10a..a9182e6ba9f5d 100644 --- a/tests/ui/type/pattern_types/non_null.stderr +++ b/tests/ui/type/pattern_types/non_null.stderr @@ -93,7 +93,6 @@ error: layout_of(Option<(*const ()) is !null>) = Layout { }, field_offsets: [], fields_in_memory_order: [], - largest_niche: None, uninhabited: false, }, VariantLayout { @@ -114,17 +113,6 @@ error: layout_of(Option<(*const ()) is !null>) = Layout { fields_in_memory_order: [ 0, ], - largest_niche: Some( - Niche { - offset: Size(0 bytes), - value: Pointer( - AddressSpace( - 0, - ), - ), - valid_range: 1..=18446744073709551615, - }, - ), uninhabited: false, }, ], diff --git a/tests/ui/type/pattern_types/range_patterns.stderr b/tests/ui/type/pattern_types/range_patterns.stderr index 1efa04bc26e21..a0d532888ecfa 100644 --- a/tests/ui/type/pattern_types/range_patterns.stderr +++ b/tests/ui/type/pattern_types/range_patterns.stderr @@ -134,7 +134,6 @@ error: layout_of(Option<(u32) is 1..>) = Layout { }, field_offsets: [], fields_in_memory_order: [], - largest_niche: None, uninhabited: false, }, VariantLayout { @@ -154,16 +153,6 @@ error: layout_of(Option<(u32) is 1..>) = Layout { fields_in_memory_order: [ 0, ], - largest_niche: Some( - Niche { - offset: Size(0 bytes), - value: Int( - I32, - false, - ), - valid_range: 1..=4294967295, - }, - ), uninhabited: false, }, ], @@ -223,7 +212,6 @@ error: layout_of(Option>) = Layout { }, field_offsets: [], fields_in_memory_order: [], - largest_niche: None, uninhabited: false, }, VariantLayout { @@ -243,16 +231,6 @@ error: layout_of(Option>) = Layout { fields_in_memory_order: [ 0, ], - largest_niche: Some( - Niche { - offset: Size(0 bytes), - value: Int( - I32, - false, - ), - valid_range: 1..=4294967295, - }, - ), uninhabited: false, }, ], From 2c79213bc5c0c0e071fa73c144efaf563f469234 Mon Sep 17 00:00:00 2001 From: Benno Lossin Date: Tue, 21 Apr 2026 09:20:02 +0200 Subject: [PATCH 08/25] field representing types: remove explicit `Send` and `Sync` impls Commit cb37ee2c87be ("make field representing types invariant over the base type") made the auto-trait impl work even if `T: !Send` or `T: !Sync` thus we can remove these explicit unsafe impls while FRTs still implement `Send` and `Sync`. --- library/core/src/field.rs | 12 ------------ 1 file changed, 12 deletions(-) diff --git a/library/core/src/field.rs b/library/core/src/field.rs index 0e537e2f92fcf..4c479546a977f 100644 --- a/library/core/src/field.rs +++ b/library/core/src/field.rs @@ -14,18 +14,6 @@ pub struct FieldRepresentingType T>, } -// SAFETY: `FieldRepresentingType` doesn't contain any `T` -unsafe impl Send - for FieldRepresentingType -{ -} - -// SAFETY: `FieldRepresentingType` doesn't contain any `T` -unsafe impl Sync - for FieldRepresentingType -{ -} - impl Copy for FieldRepresentingType { From 59f18c21b08eccd2429a4496d26f0e83b959c09c Mon Sep 17 00:00:00 2001 From: Benno Lossin Date: Tue, 21 Apr 2026 09:22:28 +0200 Subject: [PATCH 09/25] field representing types: implement Debug through reflection Using the reflection experiment, we can print the actual names of the field that an FRT is referring to. In case this breaks, there is an alternative implementation in the note comment. --- library/core/src/field.rs | 48 ++++++++++++++++++++++++++++++++++++++- 1 file changed, 47 insertions(+), 1 deletion(-) diff --git a/library/core/src/field.rs b/library/core/src/field.rs index 4c479546a977f..dfab5a836db3f 100644 --- a/library/core/src/field.rs +++ b/library/core/src/field.rs @@ -1,11 +1,11 @@ //! Field Reflection +use crate::fmt; use crate::marker::PhantomData; /// Field Representing Type #[unstable(feature = "field_representing_type_raw", issue = "none")] #[lang = "field_representing_type"] -#[expect(missing_debug_implementations)] #[fundamental] pub struct FieldRepresentingType { // We want this type to be invariant over `T`, because otherwise `field_of!(Struct<'short>, @@ -14,6 +14,52 @@ pub struct FieldRepresentingType T>, } +impl fmt::Debug + for FieldRepresentingType +{ + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + enum Member { + Name(&'static str), + Index(u32), + } + impl fmt::Display for Member { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + match self { + Self::Name(name) => fmt::Display::fmt(name, f), + Self::Index(idx) => fmt::Display::fmt(idx, f), + } + } + } + let (variant, field) = const { + use crate::mem::type_info::{Type, TypeKind}; + match Type::of::().kind { + TypeKind::Struct(struct_) => { + (None, Member::Name(struct_.fields[FIELD as usize].name)) + } + TypeKind::Tuple(_) => (None, Member::Index(FIELD)), + TypeKind::Enum(enum_) => { + let variant = &enum_.variants[VARIANT as usize]; + (Some(variant.name), Member::Name(variant.fields[FIELD as usize].name)) + } + TypeKind::Union(union) => (None, Member::Name(union.fields[FIELD as usize].name)), + _ => unreachable!(), + } + }; + let type_name = const { crate::any::type_name::() }; + match variant { + Some(variant) => write!(f, "field_of!({type_name}, {variant}.{field})"), + None => write!(f, "field_of!({type_name}, {field})"), + } + // NOTE: if there are changes in the reflection work and the above no + // longer compiles, then the following debug impl could also work in + // the meantime: + // ```rust + // let type_name = const { type_name::() }; + // write!(f, "field_of!({type_name}, {VARIANT}.{FIELD})") + // ``` + } +} + impl Copy for FieldRepresentingType { From f3719b1686fdf28f7c2e198525cf7487152b4134 Mon Sep 17 00:00:00 2001 From: Benno Lossin Date: Tue, 21 Apr 2026 09:27:12 +0200 Subject: [PATCH 10/25] field representing types: implement Default --- library/core/src/field.rs | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/library/core/src/field.rs b/library/core/src/field.rs index dfab5a836db3f..0af1d9902c425 100644 --- a/library/core/src/field.rs +++ b/library/core/src/field.rs @@ -73,6 +73,14 @@ impl Clone } } +impl Default + for FieldRepresentingType +{ + fn default() -> Self { + Self { _phantom: PhantomData::default() } + } +} + /// Expands to the field representing type of the given field. /// /// The container type may be a tuple, `struct`, `union` or `enum`. In the case of an enum, the From 104914e614ee0f90fa6ac5f25dbb7512ffcc1651 Mon Sep 17 00:00:00 2001 From: Benno Lossin Date: Tue, 21 Apr 2026 09:28:14 +0200 Subject: [PATCH 11/25] field representing types: implement Hash, Eq & Ord --- library/core/src/field.rs | 38 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 38 insertions(+) diff --git a/library/core/src/field.rs b/library/core/src/field.rs index 0af1d9902c425..2289ce3889557 100644 --- a/library/core/src/field.rs +++ b/library/core/src/field.rs @@ -1,6 +1,7 @@ //! Field Reflection use crate::fmt; +use crate::hash::{Hash, Hasher}; use crate::marker::PhantomData; /// Field Representing Type @@ -81,6 +82,43 @@ impl Default } } +impl Hash + for FieldRepresentingType +{ + fn hash(&self, state: &mut H) { + self._phantom.hash(state); + } +} + +impl PartialEq + for FieldRepresentingType +{ + fn eq(&self, other: &Self) -> bool { + self._phantom == other._phantom + } +} + +impl Eq + for FieldRepresentingType +{ +} + +impl PartialOrd + for FieldRepresentingType +{ + fn partial_cmp(&self, other: &Self) -> Option { + self._phantom.partial_cmp(&other._phantom) + } +} + +impl Ord + for FieldRepresentingType +{ + fn cmp(&self, other: &Self) -> crate::cmp::Ordering { + self._phantom.cmp(&other._phantom) + } +} + /// Expands to the field representing type of the given field. /// /// The container type may be a tuple, `struct`, `union` or `enum`. In the case of an enum, the From ca700edee3aaf5d9f8a63ed41585c32c8a0ac990 Mon Sep 17 00:00:00 2001 From: Benno Lossin Date: Tue, 21 Apr 2026 09:29:10 +0200 Subject: [PATCH 12/25] field representing types: test all implemented traits --- tests/ui/field_representing_types/traits.rs | 36 +++++++++++++++++++-- 1 file changed, 33 insertions(+), 3 deletions(-) diff --git a/tests/ui/field_representing_types/traits.rs b/tests/ui/field_representing_types/traits.rs index 6b5bb15f9ee9a..bc31376e60ea2 100644 --- a/tests/ui/field_representing_types/traits.rs +++ b/tests/ui/field_representing_types/traits.rs @@ -1,13 +1,17 @@ //@ revisions: old next //@ [next] compile-flags: -Znext-solver //@ run-pass -#![feature(field_projections, freeze)] +#![feature(field_projections, freeze, unsafe_unpin)] #![expect(incomplete_features, dead_code)] use std::field::field_of; -use std::marker::{Freeze, Unpin}; +use std::fmt::Debug; +use std::hash::Hash; +use std::marker::{Freeze, Unpin, UnsafeUnpin}; +use std::panic::{RefUnwindSafe, UnwindSafe}; struct Struct { field: u32, + tail: [u32], } union Union { @@ -19,11 +23,37 @@ enum Enum { Variant2(u32), } -fn assert_traits() {} +type Tuple = ((), usize, String, dyn Debug); + +fn assert_traits< + T: Sized + + Freeze + + RefUnwindSafe + + Send + + Sync + + Unpin + + UnsafeUnpin + + UnwindSafe + + Copy + + Debug + + Default + + Eq + + Hash + + Ord, +>() { +} fn main() { assert_traits::(); + assert_traits::(); + assert_traits::(); + assert_traits::(); assert_traits::(); + + assert_traits::(); + assert_traits::(); + assert_traits::(); + assert_traits::(); } From a041a7609740acc81c8437cb13d95b7320c44bc4 Mon Sep 17 00:00:00 2001 From: Benno Lossin Date: Tue, 21 Apr 2026 09:10:24 +0200 Subject: [PATCH 13/25] field representing types: add test for unsized types --- .../not-field-if-unsized.next.stderr | 27 +++++++++++++++++++ .../not-field-if-unsized.old.stderr | 27 +++++++++++++++++++ .../not-field-if-unsized.rs | 23 ++++++++++++++++ 3 files changed, 77 insertions(+) create mode 100644 tests/ui/field_representing_types/not-field-if-unsized.next.stderr create mode 100644 tests/ui/field_representing_types/not-field-if-unsized.old.stderr create mode 100644 tests/ui/field_representing_types/not-field-if-unsized.rs diff --git a/tests/ui/field_representing_types/not-field-if-unsized.next.stderr b/tests/ui/field_representing_types/not-field-if-unsized.next.stderr new file mode 100644 index 0000000000000..e3cee80907720 --- /dev/null +++ b/tests/ui/field_representing_types/not-field-if-unsized.next.stderr @@ -0,0 +1,27 @@ +error[E0277]: the trait bound `field_of!(MyStruct, 0): std::field::Field` is not satisfied + --> $DIR/not-field-if-unsized.rs:17:20 + | +LL | assert_field::(); + | ^^^^^^^^^^^^^^^^^^^^^^ the nightly-only, unstable trait `std::field::Field` is not implemented for `field_of!(MyStruct, 0)` + | +note: required by a bound in `assert_field` + --> $DIR/not-field-if-unsized.rs:12:20 + | +LL | fn assert_field() {} + | ^^^^^ required by this bound in `assert_field` + +error[E0277]: the trait bound `field_of!(MyStruct, 1): std::field::Field` is not satisfied + --> $DIR/not-field-if-unsized.rs:21:20 + | +LL | assert_field::(); + | ^^^^^^^^^^^^^^^^^^^^^^ the nightly-only, unstable trait `std::field::Field` is not implemented for `field_of!(MyStruct, 1)` + | +note: required by a bound in `assert_field` + --> $DIR/not-field-if-unsized.rs:12:20 + | +LL | fn assert_field() {} + | ^^^^^ required by this bound in `assert_field` + +error: aborting due to 2 previous errors + +For more information about this error, try `rustc --explain E0277`. diff --git a/tests/ui/field_representing_types/not-field-if-unsized.old.stderr b/tests/ui/field_representing_types/not-field-if-unsized.old.stderr new file mode 100644 index 0000000000000..e3cee80907720 --- /dev/null +++ b/tests/ui/field_representing_types/not-field-if-unsized.old.stderr @@ -0,0 +1,27 @@ +error[E0277]: the trait bound `field_of!(MyStruct, 0): std::field::Field` is not satisfied + --> $DIR/not-field-if-unsized.rs:17:20 + | +LL | assert_field::(); + | ^^^^^^^^^^^^^^^^^^^^^^ the nightly-only, unstable trait `std::field::Field` is not implemented for `field_of!(MyStruct, 0)` + | +note: required by a bound in `assert_field` + --> $DIR/not-field-if-unsized.rs:12:20 + | +LL | fn assert_field() {} + | ^^^^^ required by this bound in `assert_field` + +error[E0277]: the trait bound `field_of!(MyStruct, 1): std::field::Field` is not satisfied + --> $DIR/not-field-if-unsized.rs:21:20 + | +LL | assert_field::(); + | ^^^^^^^^^^^^^^^^^^^^^^ the nightly-only, unstable trait `std::field::Field` is not implemented for `field_of!(MyStruct, 1)` + | +note: required by a bound in `assert_field` + --> $DIR/not-field-if-unsized.rs:12:20 + | +LL | fn assert_field() {} + | ^^^^^ required by this bound in `assert_field` + +error: aborting due to 2 previous errors + +For more information about this error, try `rustc --explain E0277`. diff --git a/tests/ui/field_representing_types/not-field-if-unsized.rs b/tests/ui/field_representing_types/not-field-if-unsized.rs new file mode 100644 index 0000000000000..739fc91c29423 --- /dev/null +++ b/tests/ui/field_representing_types/not-field-if-unsized.rs @@ -0,0 +1,23 @@ +//@ revisions: old next +//@ [next] compile-flags: -Znext-solver +#![expect(incomplete_features)] +#![feature(field_projections)] + +use std::field::{Field, field_of}; + +pub trait Trait {} + +pub struct MyStruct(usize, dyn Trait); + +fn assert_field() {} + +fn main() { + // FIXME(FRTs): this requires relaxing the `Base: ?Sized` bound in the + // `Field` trait & compiler changes. + assert_field::(); + //~^ ERROR: the trait bound `field_of!(MyStruct, 0): std::field::Field` is not satisfied [E0277] + + // FIXME(FRTs): improve this error message, point to the `dyn Trait` span. + assert_field::(); + //~^ ERROR: the trait bound `field_of!(MyStruct, 1): std::field::Field` is not satisfied [E0277] +} From 4abc28f57013bd3a3d17c858fca660ca62daeb15 Mon Sep 17 00:00:00 2001 From: Brian Smith Date: Wed, 22 Apr 2026 10:51:13 -0700 Subject: [PATCH 14/25] `::read_buf`: Clarify local variable name. --- library/std/src/io/mod.rs | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/library/std/src/io/mod.rs b/library/std/src/io/mod.rs index 1166ba8baf430..54b1742c6f258 100644 --- a/library/std/src/io/mod.rs +++ b/library/std/src/io/mod.rs @@ -3084,7 +3084,6 @@ impl Read for Take { // SAFETY: no uninit data is written to ibuf let ibuf = unsafe { &mut buf.as_mut()[..limit] }; - let mut sliced_buf: BorrowedBuf<'_> = ibuf.into(); if is_init { @@ -3096,14 +3095,14 @@ impl Read for Take { let mut cursor = sliced_buf.unfilled(); let result = self.inner.read_buf(cursor.reborrow()); - let should_init = cursor.is_init(); + let did_init_up_to_limit = sliced_buf.is_init(); let filled = sliced_buf.len(); // cursor / sliced_buf / ibuf must drop here // Avoid accidentally quadratic behaviour by initializing the whole // cursor if only part of it was initialized. - if should_init { + if did_init_up_to_limit { // SAFETY: no uninit data is written let uninit = unsafe { &mut buf.as_mut()[limit..] }; uninit.write_filled(0); From 71076f2338a7912eed39d8584ab5e3d58145f78a Mon Sep 17 00:00:00 2001 From: Brian Smith Date: Wed, 22 Apr 2026 11:14:18 -0700 Subject: [PATCH 15/25] `::read_buf`: Eliminate unneeded local variables. Eliminate `cursor` and `ibuf` as named variables, as their presence makes things more confusing. --- library/std/src/io/mod.rs | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/library/std/src/io/mod.rs b/library/std/src/io/mod.rs index 54b1742c6f258..83b9667f9a573 100644 --- a/library/std/src/io/mod.rs +++ b/library/std/src/io/mod.rs @@ -3083,8 +3083,7 @@ impl Read for Take { let is_init = buf.is_init(); // SAFETY: no uninit data is written to ibuf - let ibuf = unsafe { &mut buf.as_mut()[..limit] }; - let mut sliced_buf: BorrowedBuf<'_> = ibuf.into(); + let mut sliced_buf = BorrowedBuf::from(unsafe { &mut buf.as_mut()[..limit] }); if is_init { // SAFETY: `sliced_buf` is a subslice of `buf`, so if `buf` was initialized then @@ -3092,13 +3091,12 @@ impl Read for Take { unsafe { sliced_buf.set_init() }; } - let mut cursor = sliced_buf.unfilled(); - let result = self.inner.read_buf(cursor.reborrow()); + let result = self.inner.read_buf(sliced_buf.unfilled()); let did_init_up_to_limit = sliced_buf.is_init(); let filled = sliced_buf.len(); - // cursor / sliced_buf / ibuf must drop here + // sliced_buf must drop here // Avoid accidentally quadratic behaviour by initializing the whole // cursor if only part of it was initialized. From c716ce5c2eaa741f6a3b7383a09f473df5ed5ad3 Mon Sep 17 00:00:00 2001 From: Brian Smith Date: Wed, 22 Apr 2026 11:05:35 -0700 Subject: [PATCH 16/25] `::read_buf`: Clarify safety comments and naming. --- library/std/src/io/mod.rs | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/library/std/src/io/mod.rs b/library/std/src/io/mod.rs index 83b9667f9a573..1812bf3ac9276 100644 --- a/library/std/src/io/mod.rs +++ b/library/std/src/io/mod.rs @@ -3101,11 +3101,13 @@ impl Read for Take { // Avoid accidentally quadratic behaviour by initializing the whole // cursor if only part of it was initialized. if did_init_up_to_limit { - // SAFETY: no uninit data is written - let uninit = unsafe { &mut buf.as_mut()[limit..] }; - uninit.write_filled(0); - // SAFETY: all bytes that were not initialized by `T::read_buf` - // have just been written to. + // SAFETY: No uninit data will be written. + let unfilled_before_advance = unsafe { buf.as_mut() }; + + unfilled_before_advance[limit..].write_filled(0); + + // SAFETY: `unfilled_before_advance[..limit]` was initialized by `T::read_buf`, and + // `unfilled_before_advance[limit..]` was just initialized. unsafe { buf.set_init() }; } From 3a0a14fd7c187e27eeba7dfe0f7467d18625e162 Mon Sep 17 00:00:00 2001 From: Brian Smith Date: Wed, 22 Apr 2026 11:15:27 -0700 Subject: [PATCH 17/25] `::read_buf`: Don't initialize `buf` if it was already initialized. --- library/std/src/io/mod.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/library/std/src/io/mod.rs b/library/std/src/io/mod.rs index 1812bf3ac9276..0a644caa5016b 100644 --- a/library/std/src/io/mod.rs +++ b/library/std/src/io/mod.rs @@ -3100,7 +3100,7 @@ impl Read for Take { // Avoid accidentally quadratic behaviour by initializing the whole // cursor if only part of it was initialized. - if did_init_up_to_limit { + if did_init_up_to_limit && !is_init { // SAFETY: No uninit data will be written. let unfilled_before_advance = unsafe { buf.as_mut() }; From 1a8d8ae5ec237c0600d657af906e0dfe5d7047b3 Mon Sep 17 00:00:00 2001 From: Kjetil Kjeka Date: Sun, 1 Feb 2026 11:05:42 +0100 Subject: [PATCH 18/25] NVPTX: Drop support for old hw and old ISAs --- compiler/rustc_codegen_llvm/src/llvm_util.rs | 3 ++ compiler/rustc_codegen_ssa/src/base.rs | 7 +++++ compiler/rustc_codegen_ssa/src/errors.rs | 6 ++++ .../rustc_codegen_ssa/src/target_features.rs | 14 +++++++++- compiler/rustc_target/src/spec/json.rs | 3 ++ compiler/rustc_target/src/spec/mod.rs | 5 ++++ .../src/spec/targets/nvptx64_nvidia_cuda.rs | 10 +++++-- compiler/rustc_target/src/target_features.rs | 28 ++----------------- .../platform-support/nvptx64-nvidia-cuda.md | 14 ++++++++-- tests/assembly-llvm/nvptx-arch-default.rs | 3 +- tests/assembly-llvm/nvptx-arch-emit-asm.rs | 3 +- tests/ui/check-cfg/target_feature.stderr | 24 ---------------- .../unsupported-target-cpu.nvptx-sm60.stderr | 4 +++ tests/ui/target-cpu/unsupported-target-cpu.rs | 14 ++++++++++ 14 files changed, 81 insertions(+), 57 deletions(-) create mode 100644 tests/ui/target-cpu/unsupported-target-cpu.nvptx-sm60.stderr create mode 100644 tests/ui/target-cpu/unsupported-target-cpu.rs diff --git a/compiler/rustc_codegen_llvm/src/llvm_util.rs b/compiler/rustc_codegen_llvm/src/llvm_util.rs index 180559d28d848..32694135705e8 100644 --- a/compiler/rustc_codegen_llvm/src/llvm_util.rs +++ b/compiler/rustc_codegen_llvm/src/llvm_util.rs @@ -510,6 +510,9 @@ fn print_target_cpus(sess: &Session, tm: &llvm::TargetMachine, out: &mut String) }; let mut cpus = cpu_names .lines() + .filter(|cpu_name| { + !sess.target.unsupported_cpus.contains(&std::borrow::Cow::Borrowed(*cpu_name)) + }) .map(|cpu_name| Cpu { cpu_name, remark: make_remark(cpu_name) }) .collect::>(); diff --git a/compiler/rustc_codegen_ssa/src/base.rs b/compiler/rustc_codegen_ssa/src/base.rs index 50c439593c306..14f4dca532737 100644 --- a/compiler/rustc_codegen_ssa/src/base.rs +++ b/compiler/rustc_codegen_ssa/src/base.rs @@ -696,6 +696,13 @@ pub fn codegen_crate( tcx.dcx().emit_fatal(errors::CpuRequired); } + if let Some(target_cpu) = &tcx.sess.opts.cg.target_cpu + && tcx.sess.target.unsupported_cpus.contains(&target_cpu.into()) + { + // The target cpu is explicitly listed as an unsupported cpu + tcx.dcx().emit_fatal(errors::CpuUnsupported { target_cpu: target_cpu.clone() }); + } + let cgu_name_builder = &mut CodegenUnitNameBuilder::new(tcx); // Run the monomorphization collector and partition the collected items into diff --git a/compiler/rustc_codegen_ssa/src/errors.rs b/compiler/rustc_codegen_ssa/src/errors.rs index f1112510af0f0..006b7f881ce23 100644 --- a/compiler/rustc_codegen_ssa/src/errors.rs +++ b/compiler/rustc_codegen_ssa/src/errors.rs @@ -540,6 +540,12 @@ pub(crate) struct InsufficientVSCodeProduct; #[diag("target requires explicitly specifying a cpu with `-C target-cpu`")] pub(crate) struct CpuRequired; +#[derive(Diagnostic)] +#[diag("target cpu `{$target_cpu}` is known but unsupported")] +pub(crate) struct CpuUnsupported { + pub target_cpu: String, +} + #[derive(Diagnostic)] #[diag("processing debug info with `dsymutil` failed: {$status}")] #[note("{$output}")] diff --git a/compiler/rustc_codegen_ssa/src/target_features.rs b/compiler/rustc_codegen_ssa/src/target_features.rs index 24f731c01996d..4b1b0866f2eb9 100644 --- a/compiler/rustc_codegen_ssa/src/target_features.rs +++ b/compiler/rustc_codegen_ssa/src/target_features.rs @@ -387,8 +387,20 @@ pub fn target_spec_to_backend_features<'a>( sess: &'a Session, mut extend_backend_features: impl FnMut(&'a str, /* enable */ bool), ) { - // Compute implied features let mut rust_features = vec![]; + + // This check handles SM versions that defaults (by LLVM) to unsupported (by Rust) PTX ISA versions. + // sm_70, sm_72 and sm_75 defaults to PTX ISA versions with major version 6, while sm_80 default to 7.0 + if sess.target.arch == Arch::Nvptx64 + && matches!( + sess.opts.cg.target_cpu.as_deref(), + None | Some("sm_70") | Some("sm_72") | Some("sm_75") + ) + { + rust_features.push((true, "ptx70")); + } + + // Compute implied features parse_rust_feature_list( sess, &sess.target.features, diff --git a/compiler/rustc_target/src/spec/json.rs b/compiler/rustc_target/src/spec/json.rs index 5507af0866758..8448c2ab51b3d 100644 --- a/compiler/rustc_target/src/spec/json.rs +++ b/compiler/rustc_target/src/spec/json.rs @@ -116,6 +116,7 @@ impl Target { forward!(asm_args); forward!(cpu); forward!(need_explicit_cpu); + forward!(unsupported_cpus); forward!(features); forward!(dynamic_linking); forward_opt!(direct_access_external_data); @@ -320,6 +321,7 @@ impl ToJson for Target { target_option_val!(asm_args); target_option_val!(cpu); target_option_val!(need_explicit_cpu); + target_option_val!(unsupported_cpus); target_option_val!(features); target_option_val!(dynamic_linking); target_option_val!(direct_access_external_data); @@ -543,6 +545,7 @@ struct TargetSpecJson { asm_args: Option]>>, cpu: Option>, need_explicit_cpu: Option, + unsupported_cpus: Option]>>, features: Option>, dynamic_linking: Option, direct_access_external_data: Option, diff --git a/compiler/rustc_target/src/spec/mod.rs b/compiler/rustc_target/src/spec/mod.rs index 768e43146a0c1..74cf01e77754e 100644 --- a/compiler/rustc_target/src/spec/mod.rs +++ b/compiler/rustc_target/src/spec/mod.rs @@ -2361,6 +2361,10 @@ pub struct TargetOptions { /// Whether a cpu needs to be explicitly set. /// Set to true if there is no default cpu. Defaults to false. pub need_explicit_cpu: bool, + /// A list of CPUs that are provided by LLVM but are considered unsupported by Rust. + /// These CPUs are omitted from `--print target-cpus` output and will cause an error + /// if used with `-Ctarget-cpu`. + pub unsupported_cpus: StaticCow<[StaticCow]>, /// Default (Rust) target features to enable for this target. These features /// overwrite `-Ctarget-cpu` but can be overwritten with `-Ctarget-features`. /// Corresponds to `llc -mattr=$llvm_features` where `$llvm_features` is the @@ -2818,6 +2822,7 @@ impl Default for TargetOptions { asm_args: cvs![], cpu: "generic".into(), need_explicit_cpu: false, + unsupported_cpus: cvs![], features: "".into(), direct_access_external_data: None, dynamic_linking: false, diff --git a/compiler/rustc_target/src/spec/targets/nvptx64_nvidia_cuda.rs b/compiler/rustc_target/src/spec/targets/nvptx64_nvidia_cuda.rs index 87c2693e9877f..d8a0bd50ee204 100644 --- a/compiler/rustc_target/src/spec/targets/nvptx64_nvidia_cuda.rs +++ b/compiler/rustc_target/src/spec/targets/nvptx64_nvidia_cuda.rs @@ -1,6 +1,6 @@ use crate::spec::{ Arch, LinkSelfContainedDefault, LinkerFlavor, MergeFunctions, Os, PanicStrategy, Target, - TargetMetadata, TargetOptions, + TargetMetadata, TargetOptions, cvs, }; pub(crate) fn target() -> Target { @@ -22,7 +22,13 @@ pub(crate) fn target() -> Target { linker_flavor: LinkerFlavor::Llbc, // With `ptx-linker` approach, it can be later overridden via link flags. - cpu: "sm_30".into(), + cpu: "sm_70".into(), + + // No longer supported architectures + unsupported_cpus: cvs!( + "sm_20", "sm_21", "sm_30", "sm_32", "sm_35", "sm_37", "sm_50", "sm_52", "sm_53", + "sm_60", "sm_61", "sm_62" + ), // FIXME: create tests for the atomics. max_atomic_width: Some(64), diff --git a/compiler/rustc_target/src/target_features.rs b/compiler/rustc_target/src/target_features.rs index 9040c4eb1e399..498806f8c1c51 100644 --- a/compiler/rustc_target/src/target_features.rs +++ b/compiler/rustc_target/src/target_features.rs @@ -536,19 +536,7 @@ const MIPS_FEATURES: &[(&str, Stability, ImpliedFeatures)] = &[ const NVPTX_FEATURES: &[(&str, Stability, ImpliedFeatures)] = &[ // tidy-alphabetical-start - ("sm_20", Unstable(sym::nvptx_target_feature), &[]), - ("sm_21", Unstable(sym::nvptx_target_feature), &["sm_20"]), - ("sm_30", Unstable(sym::nvptx_target_feature), &["sm_21"]), - ("sm_32", Unstable(sym::nvptx_target_feature), &["sm_30"]), - ("sm_35", Unstable(sym::nvptx_target_feature), &["sm_32"]), - ("sm_37", Unstable(sym::nvptx_target_feature), &["sm_35"]), - ("sm_50", Unstable(sym::nvptx_target_feature), &["sm_37"]), - ("sm_52", Unstable(sym::nvptx_target_feature), &["sm_50"]), - ("sm_53", Unstable(sym::nvptx_target_feature), &["sm_52"]), - ("sm_60", Unstable(sym::nvptx_target_feature), &["sm_53"]), - ("sm_61", Unstable(sym::nvptx_target_feature), &["sm_60"]), - ("sm_62", Unstable(sym::nvptx_target_feature), &["sm_61"]), - ("sm_70", Unstable(sym::nvptx_target_feature), &["sm_62"]), + ("sm_70", Unstable(sym::nvptx_target_feature), &[]), ("sm_72", Unstable(sym::nvptx_target_feature), &["sm_70"]), ("sm_75", Unstable(sym::nvptx_target_feature), &["sm_72"]), ("sm_80", Unstable(sym::nvptx_target_feature), &["sm_75"]), @@ -567,19 +555,7 @@ const NVPTX_FEATURES: &[(&str, Stability, ImpliedFeatures)] = &[ ("sm_120a", Unstable(sym::nvptx_target_feature), &["sm_120"]), // tidy-alphabetical-end // tidy-alphabetical-start - ("ptx32", Unstable(sym::nvptx_target_feature), &[]), - ("ptx40", Unstable(sym::nvptx_target_feature), &["ptx32"]), - ("ptx41", Unstable(sym::nvptx_target_feature), &["ptx40"]), - ("ptx42", Unstable(sym::nvptx_target_feature), &["ptx41"]), - ("ptx43", Unstable(sym::nvptx_target_feature), &["ptx42"]), - ("ptx50", Unstable(sym::nvptx_target_feature), &["ptx43"]), - ("ptx60", Unstable(sym::nvptx_target_feature), &["ptx50"]), - ("ptx61", Unstable(sym::nvptx_target_feature), &["ptx60"]), - ("ptx62", Unstable(sym::nvptx_target_feature), &["ptx61"]), - ("ptx63", Unstable(sym::nvptx_target_feature), &["ptx62"]), - ("ptx64", Unstable(sym::nvptx_target_feature), &["ptx63"]), - ("ptx65", Unstable(sym::nvptx_target_feature), &["ptx64"]), - ("ptx70", Unstable(sym::nvptx_target_feature), &["ptx65"]), + ("ptx70", Unstable(sym::nvptx_target_feature), &[]), ("ptx71", Unstable(sym::nvptx_target_feature), &["ptx70"]), ("ptx72", Unstable(sym::nvptx_target_feature), &["ptx71"]), ("ptx73", Unstable(sym::nvptx_target_feature), &["ptx72"]), diff --git a/src/doc/rustc/src/platform-support/nvptx64-nvidia-cuda.md b/src/doc/rustc/src/platform-support/nvptx64-nvidia-cuda.md index 2d9fc85dad33d..02510d9f3dee2 100644 --- a/src/doc/rustc/src/platform-support/nvptx64-nvidia-cuda.md +++ b/src/doc/rustc/src/platform-support/nvptx64-nvidia-cuda.md @@ -25,13 +25,23 @@ There are two options for using the core library: ### Target and features -It is generally necessary to specify the target, such as `-C target-cpu=sm_89`, because the default is very old. This implies two target features: `sm_89` and `ptx78` (and all preceding features within `sm_*` and `ptx*`). Rust will default to using the oldest PTX version that supports the target processor (see [this table](https://docs.nvidia.com/cuda/parallel-thread-execution/index.html#release-notes-ptx-release-history)), which maximizes driver compatibility. -One can use `-C target-feature=+ptx80` to choose a later PTX version without changing the target (the default in this case, `ptx78`, requires CUDA driver version 11.8, while `ptx80` would require driver version 12.0). +It is often beneficial to specify the target SM architecture, such as `-C target-cpu=sm_89`, because the default prioritizes broad compatibility rather than performance. Doing so also selects the PTX version as the *maximum* of (a) the oldest PTX version that supports the chosen target processor (see [this table](https://docs.nvidia.com/cuda/parallel-thread-execution/index.html#release-notes-ptx-release-history)) and (b) the oldest PTX version supported by the Rust toolchain, which maximizes driver compatibility. +One can use `-C target-feature=+ptx80` to choose a later PTX version without changing the target SM architecture (the default in this case, `ptx78`, requires CUDA driver version 11.8, while `ptx80` would require driver version 12.0). Later PTX versions may allow more efficient code generation. Although Rust follows LLVM in representing `ptx*` and `sm_*` as target features, they should be thought of as having crate granularity, set via (either via `-Ctarget-cpu` and optionally `-Ctarget-feature`). While the compiler accepts `#[target_feature(enable = "ptx80", enable = "sm_89")]`, it is not supported, may not behave as intended, and may become erroneous in the future. +## Minimum SM and PTX support by Rust version +Support for old hardware architectures and PTX ISA versions is periodically dropped. This table shows the minimum supported versions per Rust version. + +| Rust | SM minimum | PTX ISA minimum | +| ------------ | -------------- | --------------- | +| - 1.96 | 2.0 | 3.2 | +| 1.97 - TBD | 7.0 (Volta+) | 7.0 (CUDA 11+) | + +For a full overview of which GPUs support code built for a specific SM version, see the [CUDA GPU Compute Capability documentation](https://developer.nvidia.com/cuda/gpus). + ## Building Rust kernels A `no_std` crate containing one or more functions with `extern "ptx-kernel"` can be compiled to PTX using a command like the following. diff --git a/tests/assembly-llvm/nvptx-arch-default.rs b/tests/assembly-llvm/nvptx-arch-default.rs index 22b4a680e322c..e71304e453303 100644 --- a/tests/assembly-llvm/nvptx-arch-default.rs +++ b/tests/assembly-llvm/nvptx-arch-default.rs @@ -8,5 +8,6 @@ extern crate breakpoint_panic_handler; // Verify default target arch with ptx-linker. -// CHECK: .target sm_30 +// CHECK: .version 7.0 +// CHECK: .target sm_70 // CHECK: .address_size 64 diff --git a/tests/assembly-llvm/nvptx-arch-emit-asm.rs b/tests/assembly-llvm/nvptx-arch-emit-asm.rs index e47f8e78e3679..9266309c6202e 100644 --- a/tests/assembly-llvm/nvptx-arch-emit-asm.rs +++ b/tests/assembly-llvm/nvptx-arch-emit-asm.rs @@ -5,5 +5,6 @@ #![no_std] // Verify default arch without ptx-linker involved. -// CHECK: .target sm_30 +// CHECK: .version 7.0 +// CHECK: .target sm_70 // CHECK: .address_size 64 diff --git a/tests/ui/check-cfg/target_feature.stderr b/tests/ui/check-cfg/target_feature.stderr index b53419c512b08..981c173242408 100644 --- a/tests/ui/check-cfg/target_feature.stderr +++ b/tests/ui/check-cfg/target_feature.stderr @@ -229,18 +229,6 @@ LL | cfg!(target_feature = "_UNEXPECTED_VALUE"); `power9-altivec` `power9-vector` `prfchw` -`ptx32` -`ptx40` -`ptx41` -`ptx42` -`ptx43` -`ptx50` -`ptx60` -`ptx61` -`ptx62` -`ptx63` -`ptx64` -`ptx65` `ptx70` `ptx71` `ptx72` @@ -290,18 +278,6 @@ LL | cfg!(target_feature = "_UNEXPECTED_VALUE"); `sm_101a` `sm_120` `sm_120a` -`sm_20` -`sm_21` -`sm_30` -`sm_32` -`sm_35` -`sm_37` -`sm_50` -`sm_52` -`sm_53` -`sm_60` -`sm_61` -`sm_62` `sm_70` `sm_72` `sm_75` diff --git a/tests/ui/target-cpu/unsupported-target-cpu.nvptx-sm60.stderr b/tests/ui/target-cpu/unsupported-target-cpu.nvptx-sm60.stderr new file mode 100644 index 0000000000000..76092b8391f33 --- /dev/null +++ b/tests/ui/target-cpu/unsupported-target-cpu.nvptx-sm60.stderr @@ -0,0 +1,4 @@ +error: target cpu `sm_60` is known but unsupported + +error: aborting due to 1 previous error + diff --git a/tests/ui/target-cpu/unsupported-target-cpu.rs b/tests/ui/target-cpu/unsupported-target-cpu.rs new file mode 100644 index 0000000000000..dafbfbc015ec1 --- /dev/null +++ b/tests/ui/target-cpu/unsupported-target-cpu.rs @@ -0,0 +1,14 @@ +//! Check that certain target *respect* the unsupported-cpus in `-C target-cpu`. + +//@ revisions: nvptx-sm60 + +//@[nvptx-sm60] compile-flags: --target=nvptx64-nvidia-cuda --crate-type=rlib -Ctarget-cpu=sm_60 +//@[nvptx-sm60] needs-llvm-components: nvptx +//@[nvptx-sm60] build-fail +//@ ignore-backends: gcc + +#![feature(no_core)] +#![no_core] +#![crate_type = "rlib"] + +//[nvptx-sm60]~? ERROR target cpu `sm_60` is known but unsupported From 5e00484c38c2ce8084f081678afe47474dbe85ad Mon Sep 17 00:00:00 2001 From: yukang Date: Sat, 25 Apr 2026 16:27:05 +0800 Subject: [PATCH 19/25] Avoid misleading closure return type note --- compiler/rustc_hir_typeck/src/coercion.rs | 3 +++ .../closure-return-block-note-issue-155670.rs | 14 ++++++++++++++ .../closure-return-block-note-issue-155670.stderr | 9 +++++++++ 3 files changed, 26 insertions(+) create mode 100644 tests/ui/closures/closure-return-block-note-issue-155670.rs create mode 100644 tests/ui/closures/closure-return-block-note-issue-155670.stderr diff --git a/compiler/rustc_hir_typeck/src/coercion.rs b/compiler/rustc_hir_typeck/src/coercion.rs index e34628bad66b4..4dac314b91812 100644 --- a/compiler/rustc_hir_typeck/src/coercion.rs +++ b/compiler/rustc_hir_typeck/src/coercion.rs @@ -2009,6 +2009,9 @@ impl<'tcx> CoerceMany<'tcx> { // note in this case, since it would be incorrect. && let Some(fn_sig) = fcx.body_fn_sig() && fn_sig.output().is_ty_var() + && fcx.ret_coercion.as_ref().is_some_and(|ret_coercion| { + fcx.resolve_vars_if_possible(ret_coercion.borrow().expected_ty()) == expected + }) { err.span_note(sp, format!("return type inferred to be `{expected}` here")); } diff --git a/tests/ui/closures/closure-return-block-note-issue-155670.rs b/tests/ui/closures/closure-return-block-note-issue-155670.rs new file mode 100644 index 0000000000000..fccce9ee54ca2 --- /dev/null +++ b/tests/ui/closures/closure-return-block-note-issue-155670.rs @@ -0,0 +1,14 @@ +struct SmolStr; + +const _: fn() = || { + match Some(()) { + Some(()) => (), + None => return, + }; + let _: String = { + SmolStr + //~^ ERROR mismatched types + }; +}; + +fn main() {} diff --git a/tests/ui/closures/closure-return-block-note-issue-155670.stderr b/tests/ui/closures/closure-return-block-note-issue-155670.stderr new file mode 100644 index 0000000000000..f38d2f14200d4 --- /dev/null +++ b/tests/ui/closures/closure-return-block-note-issue-155670.stderr @@ -0,0 +1,9 @@ +error[E0308]: mismatched types + --> $DIR/closure-return-block-note-issue-155670.rs:9:9 + | +LL | SmolStr + | ^^^^^^^ expected `String`, found `SmolStr` + +error: aborting due to 1 previous error + +For more information about this error, try `rustc --explain E0308`. From 4fc64f4180b491e3e121abb707d6a01a3e0503c0 Mon Sep 17 00:00:00 2001 From: Usman Akinyemi Date: Thu, 23 Apr 2026 15:48:57 +0530 Subject: [PATCH 20/25] Add boxing suggestions for `impl Trait` return type mismatches Signed-off-by: Usman Akinyemi --- .../src/fn_ctxt/suggestions.rs | 12 ++++++- ...trait-in-return-position-impl-trait.stderr | 7 ++++ ...type-err-cause-on-impl-trait-return.stderr | 36 +++++++++++++++++++ 3 files changed, 54 insertions(+), 1 deletion(-) diff --git a/compiler/rustc_hir_typeck/src/fn_ctxt/suggestions.rs b/compiler/rustc_hir_typeck/src/fn_ctxt/suggestions.rs index 1f08dff18f3ed..68355903c38e9 100644 --- a/compiler/rustc_hir_typeck/src/fn_ctxt/suggestions.rs +++ b/compiler/rustc_hir_typeck/src/fn_ctxt/suggestions.rs @@ -32,7 +32,7 @@ use rustc_trait_selection::traits::query::evaluate_obligation::InferCtxtExt as _ use tracing::{debug, instrument}; use super::FnCtxt; -use crate::errors; +use crate::errors::{self, SuggestBoxingForReturnImplTrait}; use crate::fn_ctxt::rustc_span::BytePos; use crate::method::probe; use crate::method::probe::{IsSuggestion, Mode, ProbeScope}; @@ -963,6 +963,16 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> { ); } + let trait_def_id = trait_ref.trait_ref.path.res.def_id(); + if self.tcx.is_dyn_compatible(trait_def_id) { + err.subdiagnostic(SuggestBoxingForReturnImplTrait::ChangeReturnType { + start_sp: hir_ty.span.with_hi(hir_ty.span.lo() + BytePos(4)), + end_sp: hir_ty.span.shrink_to_hi(), + }); + + err.note("if you change the return type to expect trait objects, you'll need to wrap the returned values in `Box::new()`"); + } + self.try_suggest_return_impl_trait(err, expected, found, fn_id); self.try_note_caller_chooses_ty_for_ty_param(err, expected, found); return true; diff --git a/tests/ui/impl-trait/dyn-incompatible-trait-in-return-position-impl-trait.stderr b/tests/ui/impl-trait/dyn-incompatible-trait-in-return-position-impl-trait.stderr index 2447a5d8d4b80..6e417b02f5688 100644 --- a/tests/ui/impl-trait/dyn-incompatible-trait-in-return-position-impl-trait.stderr +++ b/tests/ui/impl-trait/dyn-incompatible-trait-in-return-position-impl-trait.stderr @@ -21,6 +21,13 @@ LL | return A; LL | } LL | B | ^ expected `A`, found `B` + | + = note: if you change the return type to expect trait objects, you'll need to wrap the returned values in `Box::new()` +help: you could change the return type to be a boxed trait object + | +LL - fn cat() -> impl DynCompatible { +LL + fn cat() -> Box { + | error: aborting due to 2 previous errors diff --git a/tests/ui/impl-trait/point-to-type-err-cause-on-impl-trait-return.stderr b/tests/ui/impl-trait/point-to-type-err-cause-on-impl-trait-return.stderr index 2a4c5ff4a5bed..a4d084c26e006 100644 --- a/tests/ui/impl-trait/point-to-type-err-cause-on-impl-trait-return.stderr +++ b/tests/ui/impl-trait/point-to-type-err-cause-on-impl-trait-return.stderr @@ -72,6 +72,12 @@ LL | } LL | 1u32 | ^^^^ expected `i32`, found `u32` | + = note: if you change the return type to expect trait objects, you'll need to wrap the returned values in `Box::new()` +help: you could change the return type to be a boxed trait object + | +LL - fn foo() -> impl std::fmt::Display { +LL + fn foo() -> Box { + | help: change the type of the numeric literal from `u32` to `i32` | LL - 1u32 @@ -90,6 +96,12 @@ LL | } else { LL | return 1u32; | ^^^^ expected `i32`, found `u32` | + = note: if you change the return type to expect trait objects, you'll need to wrap the returned values in `Box::new()` +help: you could change the return type to be a boxed trait object + | +LL - fn bar() -> impl std::fmt::Display { +LL + fn bar() -> Box { + | help: change the type of the numeric literal from `u32` to `i32` | LL - return 1u32; @@ -108,6 +120,12 @@ LL | } else { LL | 1u32 | ^^^^ expected `i32`, found `u32` | + = note: if you change the return type to expect trait objects, you'll need to wrap the returned values in `Box::new()` +help: you could change the return type to be a boxed trait object + | +LL - fn baz() -> impl std::fmt::Display { +LL + fn baz() -> Box { + | help: you can convert a `u32` to an `i32` and panic if the converted value doesn't fit | LL | }.try_into().unwrap() @@ -153,6 +171,12 @@ LL | 0 => return 0i32, LL | _ => 1u32, | ^^^^ expected `i32`, found `u32` | + = note: if you change the return type to expect trait objects, you'll need to wrap the returned values in `Box::new()` +help: you could change the return type to be a boxed trait object + | +LL - fn bat() -> impl std::fmt::Display { +LL + fn bat() -> Box { + | help: you can convert a `u32` to an `i32` and panic if the converted value doesn't fit | LL | }.try_into().unwrap() @@ -171,6 +195,12 @@ LL | | _ => 2u32, LL | | } | |_____^ expected `i32`, found `u32` | + = note: if you change the return type to expect trait objects, you'll need to wrap the returned values in `Box::new()` +help: you could change the return type to be a boxed trait object + | +LL - fn can() -> impl std::fmt::Display { +LL + fn can() -> Box { + | help: you can convert a `u32` to an `i32` and panic if the converted value doesn't fit | LL | }.try_into().unwrap() @@ -188,6 +218,12 @@ LL | return 0i32; LL | 1u32 | ^^^^ expected `i32`, found `u32` | + = note: if you change the return type to expect trait objects, you'll need to wrap the returned values in `Box::new()` +help: you could change the return type to be a boxed trait object + | +LL - fn cat() -> impl std::fmt::Display { +LL + fn cat() -> Box { + | help: you can convert a `u32` to an `i32` and panic if the converted value doesn't fit | LL | }.try_into().unwrap() From 163aedc8737747454e7b2ad16f62601c94260f34 Mon Sep 17 00:00:00 2001 From: Jonathan Brouwer Date: Sun, 26 Apr 2026 13:09:29 +0200 Subject: [PATCH 21/25] Convert attribute `FinalizeFn` to fn pointer --- compiler/rustc_attr_parsing/src/context.rs | 7 +++---- compiler/rustc_attr_parsing/src/interface.rs | 4 ++-- 2 files changed, 5 insertions(+), 6 deletions(-) diff --git a/compiler/rustc_attr_parsing/src/context.rs b/compiler/rustc_attr_parsing/src/context.rs index cebbabfcbf1be..4aa7ebffbd3cf 100644 --- a/compiler/rustc_attr_parsing/src/context.rs +++ b/compiler/rustc_attr_parsing/src/context.rs @@ -84,8 +84,7 @@ pub(super) struct GroupTypeInnerAccept { pub(crate) type AcceptFn = Box Fn(&mut AcceptContext<'_, 'sess, S>, &ArgParser) + Send + Sync>; -pub(crate) type FinalizeFn = - Box) -> Option>; +pub(crate) type FinalizeFn = fn(&mut FinalizeContext<'_, '_, S>) -> Option; macro_rules! attribute_parsers { ( @@ -131,10 +130,10 @@ macro_rules! attribute_parsers { }), safety: <$names as crate::attributes::AttributeParser<$stage>>::SAFETY, allowed_targets: <$names as crate::attributes::AttributeParser<$stage>>::ALLOWED_TARGETS, - finalizer: Box::new(|cx| { + finalizer: |cx| { let state = STATE_OBJECT.take(); state.finalize(cx) - }) + } }); } Entry::Occupied(_) => panic!("Attribute {path:?} has multiple accepters"), diff --git a/compiler/rustc_attr_parsing/src/interface.rs b/compiler/rustc_attr_parsing/src/interface.rs index 0dfa67951e629..d350bfee7f348 100644 --- a/compiler/rustc_attr_parsing/src/interface.rs +++ b/compiler/rustc_attr_parsing/src/interface.rs @@ -297,7 +297,7 @@ impl<'sess, S: Stage> AttributeParser<'sess, S> { let mut attr_paths: Vec> = Vec::new(); let mut early_parsed_state = EarlyParsedState::default(); - let mut finalizers: Vec<&FinalizeFn> = Vec::with_capacity(attrs.len()); + let mut finalizers: Vec> = Vec::with_capacity(attrs.len()); for attr in attrs { // If we're only looking for a single attribute, skip all the ones we don't care about. @@ -413,7 +413,7 @@ impl<'sess, S: Stage> AttributeParser<'sess, S> { }; (accept.accept_fn)(&mut cx, &args); - finalizers.push(&accept.finalizer); + finalizers.push(accept.finalizer); if !matches!(cx.stage.should_emit(), ShouldEmit::Nothing) { Self::check_target(&accept.allowed_targets, target, &mut cx); From a677828c48af2a7017b63615c0753911e3683d29 Mon Sep 17 00:00:00 2001 From: Usman Akinyemi Date: Sun, 26 Apr 2026 17:15:57 +0530 Subject: [PATCH 22/25] Add boxing suggestions for return expressions in `impl Trait` functions Signed-off-by: Usman Akinyemi --- .../src/fn_ctxt/suggestions.rs | 28 ++++++++++++- ...trait-in-return-position-impl-trait.stderr | 7 +++- ...type-err-cause-on-impl-trait-return.stderr | 42 ++++++++++++++++--- 3 files changed, 69 insertions(+), 8 deletions(-) diff --git a/compiler/rustc_hir_typeck/src/fn_ctxt/suggestions.rs b/compiler/rustc_hir_typeck/src/fn_ctxt/suggestions.rs index 68355903c38e9..afd5356d5a1e7 100644 --- a/compiler/rustc_hir_typeck/src/fn_ctxt/suggestions.rs +++ b/compiler/rustc_hir_typeck/src/fn_ctxt/suggestions.rs @@ -7,6 +7,7 @@ use rustc_ast::util::parser::ExprPrecedence; use rustc_data_structures::packed::Pu128; use rustc_errors::{Applicability, Diag, MultiSpan, listify, msg}; use rustc_hir::def::{CtorKind, CtorOf, DefKind, Res}; +use rustc_hir::intravisit::Visitor; use rustc_hir::lang_items::LangItem; use rustc_hir::{ self as hir, Arm, CoroutineDesugaring, CoroutineKind, CoroutineSource, Expr, ExprKind, @@ -26,6 +27,7 @@ use rustc_session::errors::ExprParenthesesNeeded; use rustc_span::{ExpnKind, Ident, MacroKind, Span, Spanned, Symbol, sym}; use rustc_trait_selection::error_reporting::InferCtxtErrorExt; use rustc_trait_selection::error_reporting::traits::DefIdOrName; +use rustc_trait_selection::error_reporting::traits::suggestions::ReturnsVisitor; use rustc_trait_selection::infer::InferCtxtExt; use rustc_trait_selection::traits; use rustc_trait_selection::traits::query::evaluate_obligation::InferCtxtExt as _; @@ -970,7 +972,31 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> { end_sp: hir_ty.span.shrink_to_hi(), }); - err.note("if you change the return type to expect trait objects, you'll need to wrap the returned values in `Box::new()`"); + let body = self.tcx.hir_body_owned_by(fn_id); + let mut visitor = ReturnsVisitor::default(); + visitor.visit_body(&body); + + if !visitor.returns.is_empty() { + let starts: Vec = visitor + .returns + .iter() + .filter(|expr| expr.span.can_be_used_for_suggestions()) + .map(|expr| expr.span.shrink_to_lo()) + .collect(); + let ends: Vec = visitor + .returns + .iter() + .filter(|expr| expr.span.can_be_used_for_suggestions()) + .map(|expr| expr.span.shrink_to_hi()) + .collect(); + + if !starts.is_empty() { + err.subdiagnostic(SuggestBoxingForReturnImplTrait::BoxReturnExpr { + starts, + ends, + }); + } + } } self.try_suggest_return_impl_trait(err, expected, found, fn_id); diff --git a/tests/ui/impl-trait/dyn-incompatible-trait-in-return-position-impl-trait.stderr b/tests/ui/impl-trait/dyn-incompatible-trait-in-return-position-impl-trait.stderr index 6e417b02f5688..bba17eb2494e2 100644 --- a/tests/ui/impl-trait/dyn-incompatible-trait-in-return-position-impl-trait.stderr +++ b/tests/ui/impl-trait/dyn-incompatible-trait-in-return-position-impl-trait.stderr @@ -22,12 +22,17 @@ LL | } LL | B | ^ expected `A`, found `B` | - = note: if you change the return type to expect trait objects, you'll need to wrap the returned values in `Box::new()` help: you could change the return type to be a boxed trait object | LL - fn cat() -> impl DynCompatible { LL + fn cat() -> Box { | +help: if you change the return type to expect trait objects, box the returned expressions + | +LL ~ return Box::new(A); +LL | } +LL ~ Box::new(B) + | error: aborting due to 2 previous errors diff --git a/tests/ui/impl-trait/point-to-type-err-cause-on-impl-trait-return.stderr b/tests/ui/impl-trait/point-to-type-err-cause-on-impl-trait-return.stderr index a4d084c26e006..13a78cb0fcf35 100644 --- a/tests/ui/impl-trait/point-to-type-err-cause-on-impl-trait-return.stderr +++ b/tests/ui/impl-trait/point-to-type-err-cause-on-impl-trait-return.stderr @@ -72,12 +72,17 @@ LL | } LL | 1u32 | ^^^^ expected `i32`, found `u32` | - = note: if you change the return type to expect trait objects, you'll need to wrap the returned values in `Box::new()` help: you could change the return type to be a boxed trait object | LL - fn foo() -> impl std::fmt::Display { LL + fn foo() -> Box { | +help: if you change the return type to expect trait objects, box the returned expressions + | +LL ~ return Box::new(0i32); +LL | } +LL ~ Box::new(1u32) + | help: change the type of the numeric literal from `u32` to `i32` | LL - 1u32 @@ -96,12 +101,17 @@ LL | } else { LL | return 1u32; | ^^^^ expected `i32`, found `u32` | - = note: if you change the return type to expect trait objects, you'll need to wrap the returned values in `Box::new()` help: you could change the return type to be a boxed trait object | LL - fn bar() -> impl std::fmt::Display { LL + fn bar() -> Box { | +help: if you change the return type to expect trait objects, box the returned expressions + | +LL ~ return Box::new(0i32); +LL | } else { +LL ~ return Box::new(1u32); + | help: change the type of the numeric literal from `u32` to `i32` | LL - return 1u32; @@ -120,12 +130,17 @@ LL | } else { LL | 1u32 | ^^^^ expected `i32`, found `u32` | - = note: if you change the return type to expect trait objects, you'll need to wrap the returned values in `Box::new()` help: you could change the return type to be a boxed trait object | LL - fn baz() -> impl std::fmt::Display { LL + fn baz() -> Box { | +help: if you change the return type to expect trait objects, box the returned expressions + | +LL ~ return Box::new(0i32); +LL | } else { +LL ~ Box::new(1u32) + | help: you can convert a `u32` to an `i32` and panic if the converted value doesn't fit | LL | }.try_into().unwrap() @@ -171,12 +186,16 @@ LL | 0 => return 0i32, LL | _ => 1u32, | ^^^^ expected `i32`, found `u32` | - = note: if you change the return type to expect trait objects, you'll need to wrap the returned values in `Box::new()` help: you could change the return type to be a boxed trait object | LL - fn bat() -> impl std::fmt::Display { LL + fn bat() -> Box { | +help: if you change the return type to expect trait objects, box the returned expressions + | +LL ~ 0 => return Box::new(0i32), +LL ~ _ => Box::new(1u32), + | help: you can convert a `u32` to an `i32` and panic if the converted value doesn't fit | LL | }.try_into().unwrap() @@ -195,12 +214,17 @@ LL | | _ => 2u32, LL | | } | |_____^ expected `i32`, found `u32` | - = note: if you change the return type to expect trait objects, you'll need to wrap the returned values in `Box::new()` help: you could change the return type to be a boxed trait object | LL - fn can() -> impl std::fmt::Display { LL + fn can() -> Box { | +help: if you change the return type to expect trait objects, box the returned expressions + | +LL ~ 0 => return Box::new(0i32), +LL ~ 1 => Box::new(1u32), +LL ~ _ => Box::new(2u32), + | help: you can convert a `u32` to an `i32` and panic if the converted value doesn't fit | LL | }.try_into().unwrap() @@ -218,12 +242,18 @@ LL | return 0i32; LL | 1u32 | ^^^^ expected `i32`, found `u32` | - = note: if you change the return type to expect trait objects, you'll need to wrap the returned values in `Box::new()` help: you could change the return type to be a boxed trait object | LL - fn cat() -> impl std::fmt::Display { LL + fn cat() -> Box { | +help: if you change the return type to expect trait objects, box the returned expressions + | +LL ~ return Box::new(0i32); +LL | } +LL | _ => { +LL ~ Box::new(1u32) + | help: you can convert a `u32` to an `i32` and panic if the converted value doesn't fit | LL | }.try_into().unwrap() From a7330f48978cd46f9d90e767c2c0cfdae1f7e4a2 Mon Sep 17 00:00:00 2001 From: Sasha Pourcelot Date: Sun, 26 Apr 2026 15:08:44 +0000 Subject: [PATCH 23/25] rustc_attr_parsing: use a `try {}` in `or_malformed` --- .../rustc_attr_parsing/src/attributes/diagnostic/mod.rs | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/compiler/rustc_attr_parsing/src/attributes/diagnostic/mod.rs b/compiler/rustc_attr_parsing/src/attributes/diagnostic/mod.rs index e56ed166592aa..b215f77c39adb 100644 --- a/compiler/rustc_attr_parsing/src/attributes/diagnostic/mod.rs +++ b/compiler/rustc_attr_parsing/src/attributes/diagnostic/mod.rs @@ -236,9 +236,11 @@ fn parse_directive_items<'p, S: Stage>( }} macro or_malformed($($code:tt)*) {{ - let Some(ret) = (||{ - Some($($code)*) - })() else { + let Some(ret) = ( + try { + $($code)* + } + ) else { malformed!() }; ret From d9e227e98ac123b9632b61c4c68afba9748ff584 Mon Sep 17 00:00:00 2001 From: jyn Date: Sun, 26 Apr 2026 16:18:45 +0000 Subject: [PATCH 24/25] Fix broken logic in `incremental_verify_ich_failed` --- compiler/rustc_middle/src/error.rs | 2 +- compiler/rustc_middle/src/verify_ich.rs | 8 +++++--- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/compiler/rustc_middle/src/error.rs b/compiler/rustc_middle/src/error.rs index 90af4d785945b..29ec97a6ca592 100644 --- a/compiler/rustc_middle/src/error.rs +++ b/compiler/rustc_middle/src/error.rs @@ -143,7 +143,7 @@ pub(crate) struct Reentrant; #[note( "an ideal reproduction consists of the code before and some patch that then triggers the bug when applied and compiled again" )] -#[note("as a workaround, you can run {$run_cmd} to allow your project to compile")] +#[note("as a workaround, you can {$run_cmd} to allow your project to compile")] pub(crate) struct IncrementCompilation { pub run_cmd: String, pub dep_node: String, diff --git a/compiler/rustc_middle/src/verify_ich.rs b/compiler/rustc_middle/src/verify_ich.rs index a1ab4d8cc4d00..5aa7a1d91f800 100644 --- a/compiler/rustc_middle/src/verify_ich.rs +++ b/compiler/rustc_middle/src/verify_ich.rs @@ -1,6 +1,8 @@ use std::cell::Cell; use rustc_data_structures::fingerprint::Fingerprint; +use rustc_hir::def_id::LOCAL_CRATE; +use rustc_session::utils::was_invoked_from_cargo; use tracing::instrument; use crate::dep_graph::{DepGraphData, SerializedDepNodeIndex}; @@ -66,10 +68,10 @@ fn incremental_verify_ich_failed<'tcx>( if old_in_panic { tcx.dcx().emit_err(crate::error::Reentrant); } else { - let run_cmd = if let Some(crate_name) = &tcx.sess.opts.crate_name { - format!("`cargo clean -p {crate_name}` or `cargo clean`") + let run_cmd = if was_invoked_from_cargo() { + format!("run `cargo clean -p {}` or `cargo clean`", tcx.crate_name(LOCAL_CRATE)) } else { - "`cargo clean`".to_string() + "clean your build cache".to_owned() }; let dep_node = tcx.dep_graph.data().unwrap().prev_node_of(prev_index); From 7151184b46b05a5c96c70d104095c79e6d89aee4 Mon Sep 17 00:00:00 2001 From: jyn Date: Sun, 26 Apr 2026 16:19:11 +0000 Subject: [PATCH 25/25] Add some debugging to `rustc_session` filename handling --- compiler/rustc_session/src/config.rs | 3 +++ 1 file changed, 3 insertions(+) diff --git a/compiler/rustc_session/src/config.rs b/compiler/rustc_session/src/config.rs index d84bfeb8fff86..cd9d573957f45 100644 --- a/compiler/rustc_session/src/config.rs +++ b/compiler/rustc_session/src/config.rs @@ -1205,6 +1205,7 @@ impl OutputFilenames { } pub fn interface_path(&self) -> PathBuf { + debug!("using crate_name={} for interface_path", self.crate_stem); self.out_directory.join(format!("lib{}.rs", self.crate_stem)) } @@ -1214,6 +1215,7 @@ impl OutputFilenames { let extension = flavor.extension(); match flavor { OutputType::Metadata => { + debug!("using crate_name={} for {extension}", self.crate_stem); self.out_directory.join(format!("lib{}.{}", self.crate_stem, extension)) } _ => self.with_directory_and_extension(&self.out_directory, extension), @@ -1288,6 +1290,7 @@ impl OutputFilenames { } pub fn with_directory_and_extension(&self, directory: &Path, extension: &str) -> PathBuf { + debug!("using filestem={} for {extension}", self.filestem); let mut path = directory.join(&self.filestem); path.set_extension(extension); path