11// check-pass
2- #![ feature( rustc_attrs, transparent_unions) ]
2+ #![ feature( rustc_attrs, unsized_fn_params , transparent_unions) ]
33#![ allow( unused, improper_ctypes_definitions) ]
44use std:: marker:: PhantomData ;
55use std:: num:: NonZeroI32 ;
@@ -25,7 +25,7 @@ macro_rules! assert_abi_compatible {
2525struct Zst ;
2626
2727#[ repr( C ) ]
28- struct ReprC1 < T > ( T ) ;
28+ struct ReprC1 < T : ? Sized > ( T ) ;
2929#[ repr( C ) ]
3030struct ReprC2Int < T > ( i32 , T ) ;
3131#[ repr( C ) ]
@@ -124,6 +124,23 @@ mod tricky {
124124 test_transparent ! ( triple_f64, ( f64 , f64 , f64 ) ) ;
125125}
126126
127+ // Some tests with unsized types (not all wrappers are compatible with that).
128+ macro_rules! test_transparent_unsized {
129+ ( $name: ident, $t: ty) => {
130+ mod $name {
131+ use super :: * ;
132+ assert_abi_compatible!( wrap1, $t, Wrapper1 <$t>) ;
133+ assert_abi_compatible!( wrap1_reprc, ReprC1 <$t>, ReprC1 <Wrapper1 <$t>>) ;
134+ assert_abi_compatible!( wrap2, $t, Wrapper2 <$t>) ;
135+ assert_abi_compatible!( wrap2_reprc, ReprC1 <$t>, ReprC1 <Wrapper2 <$t>>) ;
136+ }
137+ } ;
138+ }
139+
140+ test_transparent_unsized ! ( str_, str ) ;
141+ test_transparent_unsized ! ( slice, [ u8 ] ) ;
142+ test_transparent_unsized ! ( dyn_trait, dyn std:: any:: Any ) ;
143+
127144// RFC 3391 <https://rust-lang.github.io/rfcs/3391-result_ffi_guarantees.html>.
128145macro_rules! test_nonnull {
129146 ( $name: ident, $t: ty) => {
0 commit comments