summaryrefslogtreecommitdiffstats
path: root/tests/ui/layout
diff options
context:
space:
mode:
authorDaniel Baumann <daniel.baumann@progress-linux.org>2024-05-18 02:49:50 +0000
committerDaniel Baumann <daniel.baumann@progress-linux.org>2024-05-18 02:49:50 +0000
commit9835e2ae736235810b4ea1c162ca5e65c547e770 (patch)
tree3fcebf40ed70e581d776a8a4c65923e8ec20e026 /tests/ui/layout
parentReleasing progress-linux version 1.70.0+dfsg2-1~progress7.99u1. (diff)
downloadrustc-9835e2ae736235810b4ea1c162ca5e65c547e770.tar.xz
rustc-9835e2ae736235810b4ea1c162ca5e65c547e770.zip
Merging upstream version 1.71.1+dfsg1.
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'tests/ui/layout')
-rw-r--r--tests/ui/layout/debug.rs48
-rw-r--r--tests/ui/layout/debug.stderr220
-rw-r--r--tests/ui/layout/issue-112048-unsizing-field-order.rs25
-rw-r--r--tests/ui/layout/issue-112048-unsizing-niche.rs30
-rw-r--r--tests/ui/layout/issue-96158-scalarpair-payload-might-be-uninit.stderr40
5 files changed, 336 insertions, 27 deletions
diff --git a/tests/ui/layout/debug.rs b/tests/ui/layout/debug.rs
index a282e7123..46171880a 100644
--- a/tests/ui/layout/debug.rs
+++ b/tests/ui/layout/debug.rs
@@ -1,8 +1,9 @@
// normalize-stderr-test "pref: Align\([1-8] bytes\)" -> "pref: $$PREF_ALIGN"
-#![feature(never_type, rustc_attrs, type_alias_impl_trait)]
+#![feature(never_type, rustc_attrs, type_alias_impl_trait, repr_simd)]
#![crate_type = "lib"]
#[rustc_layout(debug)]
+#[derive(Copy, Clone)]
enum E { Foo, Bar(!, i32, i32) } //~ ERROR: layout_of
#[rustc_layout(debug)]
@@ -17,6 +18,51 @@ type Test = Result<i32, i32>; //~ ERROR: layout_of
#[rustc_layout(debug)]
type T = impl std::fmt::Debug; //~ ERROR: layout_of
+#[rustc_layout(debug)]
+pub union V { //~ ERROR: layout_of
+ a: [u16; 0],
+ b: u8,
+}
+
+#[rustc_layout(debug)]
+pub union W { //~ ERROR: layout_of
+ b: u8,
+ a: [u16; 0],
+}
+
+#[rustc_layout(debug)]
+pub union Y { //~ ERROR: layout_of
+ b: [u8; 0],
+ a: [u16; 0],
+}
+
+#[rustc_layout(debug)]
+#[repr(packed(1))]
+union P1 { x: u32 } //~ ERROR: layout_of
+
+#[rustc_layout(debug)]
+#[repr(packed(1))]
+union P2 { x: (u32, u32) } //~ ERROR: layout_of
+
+#[repr(simd)]
+#[derive(Copy, Clone)]
+struct F32x4(f32, f32, f32, f32);
+
+#[rustc_layout(debug)]
+#[repr(packed(1))]
+union P3 { x: F32x4 } //~ ERROR: layout_of
+
+#[rustc_layout(debug)]
+#[repr(packed(1))]
+union P4 { x: E } //~ ERROR: layout_of
+
+#[rustc_layout(debug)]
+#[repr(packed(1))]
+union P5 { zst: [u16; 0], byte: u8 } //~ ERROR: layout_of
+
+#[rustc_layout(debug)]
+type X = std::mem::MaybeUninit<u8>; //~ ERROR: layout_of
+
fn f() -> T {
0i32
}
diff --git a/tests/ui/layout/debug.stderr b/tests/ui/layout/debug.stderr
index c5e1c41d1..b9fa1b299 100644
--- a/tests/ui/layout/debug.stderr
+++ b/tests/ui/layout/debug.stderr
@@ -81,7 +81,7 @@ error: layout_of(E) = Layout {
],
},
}
- --> $DIR/debug.rs:6:1
+ --> $DIR/debug.rs:7:1
|
LL | enum E { Foo, Bar(!, i32, i32) }
| ^^^^^^
@@ -125,7 +125,7 @@ error: layout_of(S) = Layout {
index: 0,
},
}
- --> $DIR/debug.rs:9:1
+ --> $DIR/debug.rs:10:1
|
LL | struct S { f1: i32, f2: (), f3: i32 }
| ^^^^^^^^
@@ -147,7 +147,7 @@ error: layout_of(U) = Layout {
index: 0,
},
}
- --> $DIR/debug.rs:12:1
+ --> $DIR/debug.rs:13:1
|
LL | union U { f1: (i32, i32), f3: i32 }
| ^^^^^^^
@@ -276,7 +276,7 @@ error: layout_of(std::result::Result<i32, i32>) = Layout {
],
},
}
- --> $DIR/debug.rs:15:1
+ --> $DIR/debug.rs:16:1
|
LL | type Test = Result<i32, i32>;
| ^^^^^^^^^
@@ -302,10 +302,218 @@ error: layout_of(i32) = Layout {
index: 0,
},
}
- --> $DIR/debug.rs:18:1
+ --> $DIR/debug.rs:19:1
|
LL | type T = impl std::fmt::Debug;
| ^^^^^^
-error: aborting due to 5 previous errors
+error: layout_of(V) = Layout {
+ size: Size(2 bytes),
+ align: AbiAndPrefAlign {
+ abi: Align(2 bytes),
+ pref: $PREF_ALIGN,
+ },
+ abi: Aggregate {
+ sized: true,
+ },
+ fields: Union(
+ 2,
+ ),
+ largest_niche: None,
+ variants: Single {
+ index: 0,
+ },
+ }
+ --> $DIR/debug.rs:22:1
+ |
+LL | pub union V {
+ | ^^^^^^^^^^^
+
+error: layout_of(W) = Layout {
+ size: Size(2 bytes),
+ align: AbiAndPrefAlign {
+ abi: Align(2 bytes),
+ pref: $PREF_ALIGN,
+ },
+ abi: Aggregate {
+ sized: true,
+ },
+ fields: Union(
+ 2,
+ ),
+ largest_niche: None,
+ variants: Single {
+ index: 0,
+ },
+ }
+ --> $DIR/debug.rs:28:1
+ |
+LL | pub union W {
+ | ^^^^^^^^^^^
+
+error: layout_of(Y) = Layout {
+ size: Size(0 bytes),
+ align: AbiAndPrefAlign {
+ abi: Align(2 bytes),
+ pref: $PREF_ALIGN,
+ },
+ abi: Aggregate {
+ sized: true,
+ },
+ fields: Union(
+ 2,
+ ),
+ largest_niche: None,
+ variants: Single {
+ index: 0,
+ },
+ }
+ --> $DIR/debug.rs:34:1
+ |
+LL | pub union Y {
+ | ^^^^^^^^^^^
+
+error: layout_of(P1) = Layout {
+ size: Size(4 bytes),
+ align: AbiAndPrefAlign {
+ abi: Align(1 bytes),
+ pref: $PREF_ALIGN,
+ },
+ abi: Aggregate {
+ sized: true,
+ },
+ fields: Union(
+ 1,
+ ),
+ largest_niche: None,
+ variants: Single {
+ index: 0,
+ },
+ }
+ --> $DIR/debug.rs:41:1
+ |
+LL | union P1 { x: u32 }
+ | ^^^^^^^^
+
+error: layout_of(P2) = Layout {
+ size: Size(8 bytes),
+ align: AbiAndPrefAlign {
+ abi: Align(1 bytes),
+ pref: $PREF_ALIGN,
+ },
+ abi: Aggregate {
+ sized: true,
+ },
+ fields: Union(
+ 1,
+ ),
+ largest_niche: None,
+ variants: Single {
+ index: 0,
+ },
+ }
+ --> $DIR/debug.rs:45:1
+ |
+LL | union P2 { x: (u32, u32) }
+ | ^^^^^^^^
+
+error: layout_of(P3) = Layout {
+ size: Size(16 bytes),
+ align: AbiAndPrefAlign {
+ abi: Align(1 bytes),
+ pref: $PREF_ALIGN,
+ },
+ abi: Aggregate {
+ sized: true,
+ },
+ fields: Union(
+ 1,
+ ),
+ largest_niche: None,
+ variants: Single {
+ index: 0,
+ },
+ }
+ --> $DIR/debug.rs:53:1
+ |
+LL | union P3 { x: F32x4 }
+ | ^^^^^^^^
+
+error: layout_of(P4) = Layout {
+ size: Size(12 bytes),
+ align: AbiAndPrefAlign {
+ abi: Align(1 bytes),
+ pref: $PREF_ALIGN,
+ },
+ abi: Aggregate {
+ sized: true,
+ },
+ fields: Union(
+ 1,
+ ),
+ largest_niche: None,
+ variants: Single {
+ index: 0,
+ },
+ }
+ --> $DIR/debug.rs:57:1
+ |
+LL | union P4 { x: E }
+ | ^^^^^^^^
+
+error: layout_of(P5) = Layout {
+ size: Size(1 bytes),
+ align: AbiAndPrefAlign {
+ abi: Align(1 bytes),
+ pref: $PREF_ALIGN,
+ },
+ abi: Scalar(
+ Union {
+ value: Int(
+ I8,
+ false,
+ ),
+ },
+ ),
+ fields: Union(
+ 2,
+ ),
+ largest_niche: None,
+ variants: Single {
+ index: 0,
+ },
+ }
+ --> $DIR/debug.rs:61:1
+ |
+LL | union P5 { zst: [u16; 0], byte: u8 }
+ | ^^^^^^^^
+
+error: layout_of(std::mem::MaybeUninit<u8>) = Layout {
+ size: Size(1 bytes),
+ align: AbiAndPrefAlign {
+ abi: Align(1 bytes),
+ pref: $PREF_ALIGN,
+ },
+ abi: Scalar(
+ Union {
+ value: Int(
+ I8,
+ false,
+ ),
+ },
+ ),
+ fields: Union(
+ 2,
+ ),
+ largest_niche: None,
+ variants: Single {
+ index: 0,
+ },
+ }
+ --> $DIR/debug.rs:64:1
+ |
+LL | type X = std::mem::MaybeUninit<u8>;
+ | ^^^^^^
+
+error: aborting due to 14 previous errors
diff --git a/tests/ui/layout/issue-112048-unsizing-field-order.rs b/tests/ui/layout/issue-112048-unsizing-field-order.rs
new file mode 100644
index 000000000..ebc4b9e98
--- /dev/null
+++ b/tests/ui/layout/issue-112048-unsizing-field-order.rs
@@ -0,0 +1,25 @@
+// run-pass
+
+// Check that unsizing doesn't reorder fields.
+
+#![allow(dead_code)]
+
+use std::fmt::Debug;
+
+#[derive(Debug)]
+struct GcNode<T: ?Sized> {
+ gets_swapped_with_next: usize,
+ next: Option<&'static GcNode<dyn Debug>>,
+ tail: T,
+}
+
+fn main() {
+ let node: Box<GcNode<dyn Debug>> = Box::new(GcNode {
+ gets_swapped_with_next: 42,
+ next: None,
+ tail: Box::new(1),
+ });
+
+ assert_eq!(node.gets_swapped_with_next, 42);
+ assert!(node.next.is_none());
+}
diff --git a/tests/ui/layout/issue-112048-unsizing-niche.rs b/tests/ui/layout/issue-112048-unsizing-niche.rs
new file mode 100644
index 000000000..23588ba36
--- /dev/null
+++ b/tests/ui/layout/issue-112048-unsizing-niche.rs
@@ -0,0 +1,30 @@
+// run-pass
+
+// Check that unsizing does not change which field is considered for niche layout.
+
+#![feature(offset_of)]
+#![allow(dead_code)]
+
+#[derive(Clone)]
+struct WideptrField<T: ?Sized> {
+ first: usize,
+ second: usize,
+ niche: NicheAtEnd,
+ tail: T,
+}
+
+#[derive(Clone)]
+#[repr(C)]
+struct NicheAtEnd {
+ arr: [u8; 7],
+ b: bool,
+}
+
+type Tail = [bool; 8];
+
+fn main() {
+ assert_eq!(
+ core::mem::offset_of!(WideptrField<Tail>, niche),
+ core::mem::offset_of!(WideptrField<dyn Send>, niche)
+ );
+}
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 20d4c418e..8c7c91535 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
@@ -370,23 +370,23 @@ error: layout_of(NicheFirst) = Layout {
pref: $PREF_ALIGN,
},
abi: ScalarPair(
- Union {
+ Initialized {
value: Int(
I8,
false,
),
+ valid_range: 0..=4,
},
- Initialized {
+ Union {
value: Int(
I8,
false,
),
- valid_range: 0..=4,
},
),
fields: Arbitrary {
offsets: [
- Size(1 bytes),
+ Size(0 bytes),
],
memory_index: [
0,
@@ -394,7 +394,7 @@ error: layout_of(NicheFirst) = Layout {
},
largest_niche: Some(
Niche {
- offset: Size(1 bytes),
+ offset: Size(0 bytes),
value: Int(
I8,
false,
@@ -429,29 +429,29 @@ error: layout_of(NicheFirst) = Layout {
I8,
false,
),
- valid_range: 0..=255,
+ valid_range: 0..=2,
},
Initialized {
value: Int(
I8,
false,
),
- valid_range: 0..=2,
+ valid_range: 0..=255,
},
),
fields: Arbitrary {
offsets: [
- Size(1 bytes),
Size(0 bytes),
+ Size(1 bytes),
],
memory_index: [
- 1,
0,
+ 1,
],
},
largest_niche: Some(
Niche {
- offset: Size(1 bytes),
+ offset: Size(0 bytes),
value: Int(
I8,
false,
@@ -514,23 +514,23 @@ error: layout_of(NicheSecond) = Layout {
pref: $PREF_ALIGN,
},
abi: ScalarPair(
- Union {
+ Initialized {
value: Int(
I8,
false,
),
+ valid_range: 0..=4,
},
- Initialized {
+ Union {
value: Int(
I8,
false,
),
- valid_range: 0..=4,
},
),
fields: Arbitrary {
offsets: [
- Size(1 bytes),
+ Size(0 bytes),
],
memory_index: [
0,
@@ -538,7 +538,7 @@ error: layout_of(NicheSecond) = Layout {
},
largest_niche: Some(
Niche {
- offset: Size(1 bytes),
+ offset: Size(0 bytes),
value: Int(
I8,
false,
@@ -573,29 +573,29 @@ error: layout_of(NicheSecond) = Layout {
I8,
false,
),
- valid_range: 0..=255,
+ valid_range: 0..=2,
},
Initialized {
value: Int(
I8,
false,
),
- valid_range: 0..=2,
+ valid_range: 0..=255,
},
),
fields: Arbitrary {
offsets: [
- Size(0 bytes),
Size(1 bytes),
+ Size(0 bytes),
],
memory_index: [
- 0,
1,
+ 0,
],
},
largest_niche: Some(
Niche {
- offset: Size(1 bytes),
+ offset: Size(0 bytes),
value: Int(
I8,
false,