about summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--tests/ui/abi/compatibility.rs44
-rw-r--r--tests/ui/abi/transparent.rs79
2 files changed, 42 insertions, 81 deletions
diff --git a/tests/ui/abi/compatibility.rs b/tests/ui/abi/compatibility.rs
index 064d765368e..cb82e7b6ee2 100644
--- a/tests/ui/abi/compatibility.rs
+++ b/tests/ui/abi/compatibility.rs
@@ -1,6 +1,7 @@
 // check-pass
-#![feature(rustc_attrs)]
+#![feature(rustc_attrs, transparent_unions)]
 #![allow(unused, improper_ctypes_definitions)]
+use std::marker::PhantomData;
 use std::num::NonZeroI32;
 use std::ptr::NonNull;
 
@@ -27,7 +28,7 @@ struct ReprC2Int<T>(i32, T);
 #[repr(C)]
 struct ReprC2Float<T>(f32, T);
 #[repr(C)]
-struct ReprC4<T>(T, T, T, T);
+struct ReprC4<T>(T, Vec<i32>, Zst, T);
 #[repr(C)]
 struct ReprC4Mixed<T>(T, f32, i32, T);
 #[repr(C)]
@@ -73,6 +74,45 @@ test_abi_compatible!(zst_unit, Zst, ());
 test_abi_compatible!(zst_array, Zst, [u8; 0]);
 test_abi_compatible!(nonzero_int, NonZeroI32, i32);
 
+// `repr(transparent)` compatibility.
+#[repr(transparent)]
+struct Wrapper1<T>(T);
+#[repr(transparent)]
+struct Wrapper2<T>((), Zst, T);
+#[repr(transparent)]
+struct Wrapper3<T>(T, [u8; 0], PhantomData<u64>);
+#[repr(transparent)]
+union WrapperUnion<T: Copy> {
+    nothing: (),
+    something: T,
+}
+
+macro_rules! test_transparent {
+    ($name:ident, $t:ty) => {
+        mod $name {
+            use super::*;
+            test_abi_compatible!(wrap1, $t, Wrapper1<$t>);
+            test_abi_compatible!(wrap2, $t, Wrapper2<$t>);
+            test_abi_compatible!(wrap3, $t, Wrapper3<$t>);
+            test_abi_compatible!(wrap4, $t, WrapperUnion<$t>);
+        }
+    };
+}
+
+test_transparent!(simple, i32);
+test_transparent!(reference, &'static i32);
+test_transparent!(zst, Zst);
+test_transparent!(unit, ());
+test_transparent!(pair, (i32, f32)); // mixing in some floats since they often get special treatment
+test_transparent!(triple, (i8, i16, f32)); // chosen to fit into 64bit
+test_transparent!(tuple, (i32, f32, i64, f64));
+test_transparent!(empty_array, [u32; 0]);
+test_transparent!(empty_1zst_array, [u8; 0]);
+test_transparent!(small_array, [i32; 2]); // chosen to fit into 64bit
+test_transparent!(large_array, [i32; 16]);
+test_transparent!(enum_, Option<i32>);
+test_transparent!(enum_niched, Option<&'static i32>);
+
 // RFC 3391 <https://rust-lang.github.io/rfcs/3391-result_ffi_guarantees.html>.
 macro_rules! test_nonnull {
     ($name:ident, $t:ty) => {
diff --git a/tests/ui/abi/transparent.rs b/tests/ui/abi/transparent.rs
deleted file mode 100644
index 90bdc129a4a..00000000000
--- a/tests/ui/abi/transparent.rs
+++ /dev/null
@@ -1,79 +0,0 @@
-// check-pass
-#![feature(rustc_attrs)]
-#![allow(unused, improper_ctypes_definitions)]
-
-use std::marker::PhantomData;
-
-macro_rules! assert_abi_compatible {
-    ($name:ident, $t1:ty, $t2:ty) => {
-        mod $name {
-            use super::*;
-            // Test argument and return value, `Rust` and `C` ABIs.
-            #[rustc_abi(assert_eq)]
-            type TestRust = (fn($t1) -> $t1, fn($t2) -> $t2);
-            #[rustc_abi(assert_eq)]
-            type TestC = (extern "C" fn($t1) -> $t1, extern "C" fn($t2) -> $t2);
-        }
-    }
-}
-
-#[derive(Copy, Clone)]
-struct Zst;
-
-// Check that various `transparent` wrappers result in equal ABIs.
-#[repr(transparent)]
-struct Wrapper1<T>(T);
-#[repr(transparent)]
-struct Wrapper2<T>((), Zst, T);
-#[repr(transparent)]
-struct Wrapper3<T>(T, [u8; 0], PhantomData<u64>);
-
-#[repr(C)]
-struct ReprCStruct<T>(T, f32, i32, T);
-#[repr(C)]
-enum ReprCEnum<T> {
-    Variant1,
-    Variant2(T),
-}
-#[repr(C)]
-union ReprCUnion<T: Copy> {
-    nothing: (),
-    something: T,
-}
-
-macro_rules! test_transparent {
-    ($name:ident, $t:ty) => {
-        mod $name {
-            use super::*;
-            assert_abi_compatible!(wrap1, $t, Wrapper1<$t>);
-            assert_abi_compatible!(wrap2, $t, Wrapper2<$t>);
-            assert_abi_compatible!(wrap3, $t, Wrapper3<$t>);
-            // Also try adding some surrounding `repr(C)` types.
-            assert_abi_compatible!(repr_c_struct_wrap1, ReprCStruct<$t>, ReprCStruct<Wrapper1<$t>>);
-            assert_abi_compatible!(repr_c_enum_wrap1, ReprCEnum<$t>, ReprCEnum<Wrapper1<$t>>);
-            assert_abi_compatible!(repr_c_union_wrap1, ReprCUnion<$t>, ReprCUnion<Wrapper1<$t>>);
-            assert_abi_compatible!(repr_c_struct_wrap2, ReprCStruct<$t>, ReprCStruct<Wrapper2<$t>>);
-            assert_abi_compatible!(repr_c_enum_wrap2, ReprCEnum<$t>, ReprCEnum<Wrapper2<$t>>);
-            assert_abi_compatible!(repr_c_union_wrap2, ReprCUnion<$t>, ReprCUnion<Wrapper2<$t>>);
-            assert_abi_compatible!(repr_c_struct_wrap3, ReprCStruct<$t>, ReprCStruct<Wrapper3<$t>>);
-            assert_abi_compatible!(repr_c_enum_wrap3, ReprCEnum<$t>, ReprCEnum<Wrapper3<$t>>);
-            assert_abi_compatible!(repr_c_union_wrap3, ReprCUnion<$t>, ReprCUnion<Wrapper3<$t>>);
-        }
-    }
-}
-
-test_transparent!(simple, i32);
-test_transparent!(reference, &'static i32);
-test_transparent!(zst, Zst);
-test_transparent!(unit, ());
-test_transparent!(pair, (i32, f32));
-test_transparent!(triple, (i8, i16, f32)); // chosen to fit into 64bit
-test_transparent!(tuple, (i32, f32, i64, f64));
-test_transparent!(empty_array, [u32; 0]);
-test_transparent!(empty_1zst_array, [u8; 0]);
-test_transparent!(small_array, [i32; 2]); // chosen to fit into 64bit
-test_transparent!(large_array, [i32; 16]);
-test_transparent!(enum_, Option<i32>);
-test_transparent!(enum_niched, Option<&'static i32>);
-
-fn main() {}