1
1
// 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
2
42
#![ feature( rustc_attrs, unsized_fn_params, transparent_unions) ]
43
+ #![ cfg_attr( not( host) , feature( no_core, lang_items) , no_std, no_core) ]
3
44
#![ 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 ;
8
45
9
- // FIXME: a bunch of targets are broken in various ways.
46
+ // FIXME: some targets are broken in various ways.
10
47
// Hence there are `cfg` throughout this test to disable parts of it on those targets.
11
48
// sparc64: https://github.com/rust-lang/rust/issues/115336
12
49
// mips64: https://github.com/rust-lang/rust/issues/115404
13
50
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
+
14
172
macro_rules! assert_abi_compatible {
15
173
( $name: ident, $t1: ty, $t2: ty) => {
16
174
mod $name {
@@ -26,8 +184,13 @@ macro_rules! assert_abi_compatible {
26
184
} ;
27
185
}
28
186
29
- #[ derive( Copy , Clone ) ]
30
187
struct Zst ;
188
+ impl Copy for Zst { }
189
+ impl Clone for Zst {
190
+ fn clone ( & self ) -> Self {
191
+ Zst
192
+ }
193
+ }
31
194
32
195
#[ repr( C ) ]
33
196
struct ReprC1 < T : ?Sized > ( T ) ;
@@ -85,8 +248,8 @@ test_abi_compatible!(nonzero_int, NonZeroI32, i32);
85
248
86
249
// `DispatchFromDyn` relies on ABI compatibility.
87
250
// 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 ) ;
90
253
91
254
// `repr(transparent)` compatibility.
92
255
#[ repr( transparent) ]
@@ -160,7 +323,7 @@ mod unsized_ {
160
323
use super :: * ;
161
324
test_transparent_unsized ! ( str_, str ) ;
162
325
test_transparent_unsized ! ( slice, [ u8 ] ) ;
163
- test_transparent_unsized ! ( dyn_trait, dyn std :: any :: Any ) ;
326
+ test_transparent_unsized ! ( dyn_trait, dyn Any ) ;
164
327
}
165
328
166
329
// RFC 3391 <https://rust-lang.github.io/rfcs/3391-result_ffi_guarantees.html>.
@@ -185,7 +348,7 @@ test_nonnull!(ref_unsized, &[i32]);
185
348
test_nonnull ! ( mut_unsized, & mut [ i32 ] ) ;
186
349
test_nonnull ! ( fn_, fn ( ) ) ;
187
350
test_nonnull ! ( nonnull, NonNull <i32 >) ;
188
- test_nonnull ! ( nonnull_unsized, NonNull <dyn std :: fmt :: Debug >) ;
351
+ test_nonnull ! ( nonnull_unsized, NonNull <dyn Any >) ;
189
352
test_nonnull ! ( non_zero, NonZeroI32 ) ;
190
353
191
354
fn main ( ) { }
0 commit comments