1+ // ignore-tidy-linelength
12#![ allow( unused) ]
23#![ allow( const_err) ] // make sure we cannot allow away the errors tested here
34
@@ -28,7 +29,9 @@ struct BadSliceRepr {
2829union SliceTransmute {
2930 repr : SliceRepr ,
3031 bad : BadSliceRepr ,
32+ addr : usize ,
3133 slice : & ' static [ u8 ] ,
34+ raw_slice : * const [ u8 ] ,
3235 str : & ' static str ,
3336 my_str : & ' static MyStr ,
3437 my_slice : & ' static MySliceBool ,
@@ -59,7 +62,9 @@ union DynTransmute {
5962 repr : DynRepr ,
6063 repr2 : DynRepr2 ,
6164 bad : BadDynRepr ,
65+ addr : usize ,
6266 rust : & ' static dyn Trait ,
67+ raw_rust : * const dyn Trait ,
6368}
6469
6570trait Trait { }
@@ -72,39 +77,37 @@ struct MyStr(str);
7277struct MySlice < T : ?Sized > ( bool , T ) ;
7378type MySliceBool = MySlice < [ bool ] > ;
7479
80+ // # str
7581// OK
76- const A : & str = unsafe { SliceTransmute { repr : SliceRepr { ptr : & 42 , len : 1 } } . str } ;
82+ const STR_VALID : & str = unsafe { SliceTransmute { repr : SliceRepr { ptr : & 42 , len : 1 } } . str } ;
7783// bad str
78- const B : & str = unsafe { SliceTransmute { repr : SliceRepr { ptr : & 42 , len : 999 } } . str } ;
84+ const STR_TOO_LONG : & str = unsafe { SliceTransmute { repr : SliceRepr { ptr : & 42 , len : 999 } } . str } ;
7985//~^ ERROR it is undefined behavior to use this value
8086// bad str
81- const C : & str = unsafe { SliceTransmute { bad : BadSliceRepr { ptr : & 42 , len : & 3 } } . str } ;
87+ const STR_LENGTH_PTR : & str = unsafe { SliceTransmute { bad : BadSliceRepr { ptr : & 42 , len : & 3 } } . str } ;
8288//~^ ERROR it is undefined behavior to use this value
8389// bad str in user-defined unsized type
84- const C2 : & MyStr = unsafe { SliceTransmute { bad : BadSliceRepr { ptr : & 42 , len : & 3 } } . my_str } ;
90+ const MY_STR_LENGTH_PTR : & MyStr = unsafe { SliceTransmute { bad : BadSliceRepr { ptr : & 42 , len : & 3 } } . my_str } ;
8591//~^ ERROR it is undefined behavior to use this value
8692
87- // OK
88- const A2 : & [ u8 ] = unsafe { SliceTransmute { repr : SliceRepr { ptr : & 42 , len : 1 } } . slice } ;
89- // bad slice
90- const B2 : & [ u8 ] = unsafe { SliceTransmute { repr : SliceRepr { ptr : & 42 , len : 999 } } . slice } ;
93+ // invalid UTF-8
94+ const J1 : & str = unsafe { SliceTransmute { slice : & [ 0xFF ] } . str } ;
9195//~^ ERROR it is undefined behavior to use this value
92- // bad slice
93- const C3 : & [ u8 ] = unsafe { SliceTransmute { bad : BadSliceRepr { ptr : & 42 , len : & 3 } } . slice } ;
96+ // invalid UTF-8 in user-defined str-like
97+ const J2 : & MyStr = unsafe { SliceTransmute { slice : & [ 0xFF ] } . my_str } ;
9498//~^ ERROR it is undefined behavior to use this value
9599
96- // bad trait object
97- const D : & dyn Trait = unsafe { DynTransmute { repr : DynRepr { ptr : & 92 , vtable : & 3 } } . rust } ;
98- //~^ ERROR it is undefined behavior to use this value
99- // bad trait object
100- const E : & dyn Trait = unsafe { DynTransmute { repr2 : DynRepr2 { ptr : & 92 , vtable : & 3 } } . rust } ;
100+ // # slice
101+ // OK
102+ const SLICE_VALID : & [ u8 ] = unsafe { SliceTransmute { repr : SliceRepr { ptr : & 42 , len : 1 } } . slice } ;
103+ // bad slice: length uninit
104+ const SLICE_LENGTH_UNINIT : & [ u8 ] = unsafe { SliceTransmute { addr : 42 } . slice } ;
101105//~^ ERROR it is undefined behavior to use this value
102- // bad trait object
103- const F : & dyn Trait = unsafe { DynTransmute { bad : BadDynRepr { ptr : & 92 , vtable : 3 } } . rust } ;
106+ // bad slice: length too big
107+ const SLICE_TOO_LONG : & [ u8 ] = unsafe { SliceTransmute { repr : SliceRepr { ptr : & 42 , len : 999 } } . slice } ;
104108//~^ ERROR it is undefined behavior to use this value
105-
106- // bad data *inside* the trait object
107- const G : & dyn Trait = & unsafe { BoolTransmute { val : 3 } . bl } ;
109+ // bad slice: length not an int
110+ const SLICE_LENGTH_PTR : & [ u8 ] = unsafe { SliceTransmute { bad : BadSliceRepr { ptr : & 42 , len : & 3 } } . slice } ;
108111//~^ ERROR it is undefined behavior to use this value
109112
110113// bad data *inside* the slice
@@ -120,12 +123,33 @@ const I2: &MySliceBool = &MySlice(unsafe { BoolTransmute { val: 3 }.bl }, [false
120123const I3 : & MySliceBool = & MySlice ( true , [ unsafe { BoolTransmute { val : 3 } . bl } ] ) ;
121124//~^ ERROR it is undefined behavior to use this value
122125
123- // invalid UTF-8
124- const J1 : & str = unsafe { SliceTransmute { slice : & [ 0xFF ] } . str } ;
126+ // # raw slice
127+ const RAW_SLICE_VALID : * const [ u8 ] = unsafe { SliceTransmute { repr : SliceRepr { ptr : & 42 , len : 1 } } . raw_slice } ; // ok
128+ const RAW_SLICE_TOO_LONG : * const [ u8 ] = unsafe { SliceTransmute { repr : SliceRepr { ptr : & 42 , len : 999 } } . raw_slice } ; // ok because raw
129+ const RAW_SLICE_LENGTH_UNINIT : * const [ u8 ] = unsafe { SliceTransmute { addr : 42 } . raw_slice } ;
125130//~^ ERROR it is undefined behavior to use this value
126- // invalid UTF-8 in user-defined str-like
127- const J2 : & MyStr = unsafe { SliceTransmute { slice : & [ 0xFF ] } . my_str } ;
131+
132+ // # trait object
133+ // bad trait object
134+ const D : & dyn Trait = unsafe { DynTransmute { repr : DynRepr { ptr : & 92 , vtable : & 3 } } . rust } ;
135+ //~^ ERROR it is undefined behavior to use this value
136+ // bad trait object
137+ const E : & dyn Trait = unsafe { DynTransmute { repr2 : DynRepr2 { ptr : & 92 , vtable : & 3 } } . rust } ;
138+ //~^ ERROR it is undefined behavior to use this value
139+ // bad trait object
140+ const F : & dyn Trait = unsafe { DynTransmute { bad : BadDynRepr { ptr : & 92 , vtable : 3 } } . rust } ;
141+ //~^ ERROR it is undefined behavior to use this value
142+
143+ // bad data *inside* the trait object
144+ const G : & dyn Trait = & unsafe { BoolTransmute { val : 3 } . bl } ;
145+ //~^ ERROR it is undefined behavior to use this value
146+
147+ // # raw trait object
148+ const RAW_TRAIT_OBJ_VTABLE_NULL : * const dyn Trait = unsafe { DynTransmute { bad : BadDynRepr { ptr : & 92 , vtable : 0 } } . rust } ;
149+ //~^ ERROR it is undefined behavior to use this value
150+ const RAW_TRAIT_OBJ_VTABLE_INVALID : * const dyn Trait = unsafe { DynTransmute { repr2 : DynRepr2 { ptr : & 92 , vtable : & 3 } } . raw_rust } ;
128151//~^ ERROR it is undefined behavior to use this value
152+ const RAW_TRAIT_OBJ_CONTENT_INVALID : * const dyn Trait = & unsafe { BoolTransmute { val : 3 } . bl } as * const _ ; // ok because raw
129153
130154fn main ( ) {
131155}
0 commit comments