Skip to content

Commit a14aba5

Browse files
authored
Unrolled build for rust-lang#116030
Rollup merge of rust-lang#116030 - RalfJung:abi-compat-test, r=wesleywiser run abi/compatibility test against a whole bunch of targets
2 parents 56ada88 + ec18811 commit a14aba5

File tree

1 file changed

+173
-10
lines changed

1 file changed

+173
-10
lines changed

tests/ui/abi/compatibility.rs

+173-10
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,174 @@
11
// check-pass
2+
// revisions: host
3+
// revisions: arm
4+
//[arm] compile-flags: --target arm-unknown-linux-gnueabi
5+
//[arm] needs-llvm-components: arm
6+
// revisions: aarch64
7+
//[aarch64] compile-flags: --target aarch64-unknown-linux-gnu
8+
//[aarch64] needs-llvm-components: aarch64
9+
// revisions: s390x
10+
//[s390x] compile-flags: --target s390x-unknown-linux-gnu
11+
//[s390x] needs-llvm-components: systemz
12+
// revisions: mips
13+
//[mips] compile-flags: --target mips-unknown-linux-gnu
14+
//[mips] needs-llvm-components: mips
15+
// revisions: mips64
16+
//[mips64] compile-flags: --target mips64-unknown-linux-gnuabi64
17+
//[mips64] needs-llvm-components: mips
18+
// revisions: sparc
19+
//[sparc] compile-flags: --target sparc-unknown-linux-gnu
20+
//[sparc] needs-llvm-components: sparc
21+
// revisions: sparc64
22+
//[sparc64] compile-flags: --target sparc64-unknown-linux-gnu
23+
//[sparc64] needs-llvm-components: sparc
24+
// revisions: powerpc64
25+
//[powerpc64] compile-flags: --target powerpc64-unknown-linux-gnu
26+
//[powerpc64] needs-llvm-components: powerpc
27+
// revisions: riscv
28+
//[riscv] compile-flags: --target riscv64gc-unknown-linux-gnu
29+
//[riscv] needs-llvm-components: riscv
30+
// revisions: loongarch64
31+
//[loongarch64] compile-flags: --target loongarch64-unknown-linux-gnu
32+
//[loongarch64] needs-llvm-components: loongarch
33+
// revisions: wasm
34+
//[wasm] compile-flags: --target wasm32-unknown-unknown
35+
//[wasm] needs-llvm-components: webassembly
36+
// revisions: wasi
37+
//[wasi] compile-flags: --target wasm32-wasi
38+
//[wasi] needs-llvm-components: webassembly
39+
// revisions: nvptx64
40+
//[nvptx64] compile-flags: --target nvptx64-nvidia-cuda
41+
//[nvptx64] needs-llvm-components: nvptx
242
#![feature(rustc_attrs, unsized_fn_params, transparent_unions)]
43+
#![cfg_attr(not(host), feature(no_core, lang_items), no_std, no_core)]
344
#![allow(unused, improper_ctypes_definitions, internal_features)]
4-
use std::marker::PhantomData;
5-
use std::mem::ManuallyDrop;
6-
use std::num::NonZeroI32;
7-
use std::ptr::NonNull;
845

9-
// FIXME: a bunch of targets are broken in various ways.
46+
// FIXME: some targets are broken in various ways.
1047
// Hence there are `cfg` throughout this test to disable parts of it on those targets.
1148
// sparc64: https://github.com/rust-lang/rust/issues/115336
1249
// mips64: https://github.com/rust-lang/rust/issues/115404
1350

51+
#[cfg(host)]
52+
use std::{
53+
any::Any, marker::PhantomData, mem::ManuallyDrop, num::NonZeroI32, ptr::NonNull, rc::Rc,
54+
sync::Arc,
55+
};
56+
57+
/// To work cross-target this test must be no_core.
58+
/// This little prelude supplies what we need.
59+
#[cfg(not(host))]
60+
mod prelude {
61+
#[lang = "sized"]
62+
pub trait Sized {}
63+
64+
#[lang = "receiver"]
65+
pub trait Receiver {}
66+
impl<T: ?Sized> Receiver for &T {}
67+
impl<T: ?Sized> Receiver for &mut T {}
68+
69+
#[lang = "copy"]
70+
pub trait Copy: Sized {}
71+
impl Copy for i32 {}
72+
impl Copy for f32 {}
73+
impl<T: ?Sized> Copy for &T {}
74+
impl<T: ?Sized> Copy for *const T {}
75+
impl<T: ?Sized> Copy for *mut T {}
76+
77+
#[lang = "clone"]
78+
pub trait Clone: Sized {
79+
fn clone(&self) -> Self;
80+
}
81+
82+
#[lang = "phantom_data"]
83+
pub struct PhantomData<T: ?Sized>;
84+
impl<T: ?Sized> Copy for PhantomData<T> {}
85+
86+
#[lang = "unsafe_cell"]
87+
#[repr(transparent)]
88+
pub struct UnsafeCell<T: ?Sized> {
89+
value: T,
90+
}
91+
92+
pub trait Any: 'static {}
93+
94+
pub enum Option<T> {
95+
None,
96+
Some(T),
97+
}
98+
impl<T: Copy> Copy for Option<T> {}
99+
100+
pub enum Result<T, E> {
101+
Ok(T),
102+
Err(E),
103+
}
104+
impl<T: Copy, E: Copy> Copy for Result<T, E> {}
105+
106+
#[lang = "manually_drop"]
107+
#[repr(transparent)]
108+
pub struct ManuallyDrop<T: ?Sized> {
109+
value: T,
110+
}
111+
impl<T: Copy + ?Sized> Copy for ManuallyDrop<T> {}
112+
113+
#[repr(transparent)]
114+
#[rustc_layout_scalar_valid_range_start(1)]
115+
#[rustc_nonnull_optimization_guaranteed]
116+
pub struct NonNull<T: ?Sized> {
117+
pointer: *const T,
118+
}
119+
impl<T: ?Sized> Copy for NonNull<T> {}
120+
121+
#[repr(transparent)]
122+
#[rustc_layout_scalar_valid_range_start(1)]
123+
#[rustc_nonnull_optimization_guaranteed]
124+
pub struct NonZeroI32(i32);
125+
126+
// This just stands in for a non-trivial type.
127+
pub struct Vec<T> {
128+
ptr: NonNull<T>,
129+
cap: usize,
130+
len: usize,
131+
}
132+
133+
pub struct Unique<T: ?Sized> {
134+
pub pointer: NonNull<T>,
135+
pub _marker: PhantomData<T>,
136+
}
137+
138+
pub struct Global;
139+
140+
#[lang = "owned_box"]
141+
pub struct Box<T: ?Sized, A = Global>(Unique<T>, A);
142+
143+
#[repr(C)]
144+
struct RcBox<T: ?Sized> {
145+
strong: UnsafeCell<usize>,
146+
weak: UnsafeCell<usize>,
147+
value: T,
148+
}
149+
pub struct Rc<T: ?Sized, A = Global> {
150+
ptr: NonNull<RcBox<T>>,
151+
phantom: PhantomData<RcBox<T>>,
152+
alloc: A,
153+
}
154+
155+
#[repr(C, align(8))]
156+
struct AtomicUsize(usize);
157+
#[repr(C)]
158+
struct ArcInner<T: ?Sized> {
159+
strong: AtomicUsize,
160+
weak: AtomicUsize,
161+
data: T,
162+
}
163+
pub struct Arc<T: ?Sized, A = Global> {
164+
ptr: NonNull<ArcInner<T>>,
165+
phantom: PhantomData<ArcInner<T>>,
166+
alloc: A,
167+
}
168+
}
169+
#[cfg(not(host))]
170+
use prelude::*;
171+
14172
macro_rules! assert_abi_compatible {
15173
($name:ident, $t1:ty, $t2:ty) => {
16174
mod $name {
@@ -26,8 +184,13 @@ macro_rules! assert_abi_compatible {
26184
};
27185
}
28186

29-
#[derive(Copy, Clone)]
30187
struct Zst;
188+
impl Copy for Zst {}
189+
impl Clone for Zst {
190+
fn clone(&self) -> Self {
191+
Zst
192+
}
193+
}
31194

32195
#[repr(C)]
33196
struct ReprC1<T: ?Sized>(T);
@@ -85,8 +248,8 @@ test_abi_compatible!(nonzero_int, NonZeroI32, i32);
85248

86249
// `DispatchFromDyn` relies on ABI compatibility.
87250
// This is interesting since these types are not `repr(transparent)`.
88-
test_abi_compatible!(rc, std::rc::Rc<i32>, *mut i32);
89-
test_abi_compatible!(arc, std::sync::Arc<i32>, *mut i32);
251+
test_abi_compatible!(rc, Rc<i32>, *mut i32);
252+
test_abi_compatible!(arc, Arc<i32>, *mut i32);
90253

91254
// `repr(transparent)` compatibility.
92255
#[repr(transparent)]
@@ -160,7 +323,7 @@ mod unsized_ {
160323
use super::*;
161324
test_transparent_unsized!(str_, str);
162325
test_transparent_unsized!(slice, [u8]);
163-
test_transparent_unsized!(dyn_trait, dyn std::any::Any);
326+
test_transparent_unsized!(dyn_trait, dyn Any);
164327
}
165328

166329
// RFC 3391 <https://rust-lang.github.io/rfcs/3391-result_ffi_guarantees.html>.
@@ -185,7 +348,7 @@ test_nonnull!(ref_unsized, &[i32]);
185348
test_nonnull!(mut_unsized, &mut [i32]);
186349
test_nonnull!(fn_, fn());
187350
test_nonnull!(nonnull, NonNull<i32>);
188-
test_nonnull!(nonnull_unsized, NonNull<dyn std::fmt::Debug>);
351+
test_nonnull!(nonnull_unsized, NonNull<dyn Any>);
189352
test_nonnull!(non_zero, NonZeroI32);
190353

191354
fn main() {}

0 commit comments

Comments
 (0)