about summary refs log tree commit diff
path: root/tests/ui/unsized-locals
diff options
context:
space:
mode:
authorbors <bors@rust-lang.org>2023-05-13 19:03:33 +0000
committerbors <bors@rust-lang.org>2023-05-13 19:03:33 +0000
commit2c41369acc445d04129db40ba998dd7a89fb0d2e (patch)
tree85fa46eb6a03f3a01b5b7d6ecd156b1090929ac0 /tests/ui/unsized-locals
parent1623978dc41701201ec4daf36b3f748d661e7194 (diff)
parent83a5a69a4c7bd60901bf7f7d96378ddea7ecb06c (diff)
downloadrust-2c41369acc445d04129db40ba998dd7a89fb0d2e.tar.gz
rust-2c41369acc445d04129db40ba998dd7a89fb0d2e.zip
Auto merge of #111374 - tmiasko:align-unsized-locals, r=cjgillot
Align unsized locals

Allocate an extra space for unsized locals and manually align the storage, since alloca doesn't support dynamic alignment.

Fixes #71416.
Fixes #71695.
Diffstat (limited to 'tests/ui/unsized-locals')
-rw-r--r--tests/ui/unsized-locals/align.rs30
1 files changed, 30 insertions, 0 deletions
diff --git a/tests/ui/unsized-locals/align.rs b/tests/ui/unsized-locals/align.rs
new file mode 100644
index 00000000000..01be8f3bb9c
--- /dev/null
+++ b/tests/ui/unsized-locals/align.rs
@@ -0,0 +1,30 @@
+// Test that unsized locals uphold alignment requirements.
+// Regression test for #71416.
+// run-pass
+#![feature(unsized_locals)]
+#![allow(incomplete_features)]
+use std::any::Any;
+
+#[repr(align(256))]
+#[allow(dead_code)]
+struct A {
+    v: u8
+}
+
+impl A {
+    fn f(&self) -> *const A {
+        assert_eq!(self as *const A as usize % 256, 0);
+        self
+    }
+}
+
+fn mk() -> Box<dyn Any> {
+    Box::new(A { v: 4 })
+}
+
+fn main() {
+    let x = *mk();
+    let dwncst = x.downcast_ref::<A>().unwrap();
+    let addr = dwncst.f();
+    assert_eq!(addr as usize % 256, 0);
+}