1
+ // ignore-tidy-linelength
1
2
#![ allow( unused) ]
2
3
#![ allow( const_err) ] // make sure we cannot allow away the errors tested here
3
4
@@ -28,7 +29,9 @@ struct BadSliceRepr {
28
29
union SliceTransmute {
29
30
repr : SliceRepr ,
30
31
bad : BadSliceRepr ,
32
+ addr : usize ,
31
33
slice : & ' static [ u8 ] ,
34
+ raw_slice : * const [ u8 ] ,
32
35
str : & ' static str ,
33
36
my_str : & ' static MyStr ,
34
37
my_slice : & ' static MySliceBool ,
@@ -59,7 +62,9 @@ union DynTransmute {
59
62
repr : DynRepr ,
60
63
repr2 : DynRepr2 ,
61
64
bad : BadDynRepr ,
65
+ addr : usize ,
62
66
rust : & ' static dyn Trait ,
67
+ raw_rust : * const dyn Trait ,
63
68
}
64
69
65
70
trait Trait { }
@@ -72,39 +77,37 @@ struct MyStr(str);
72
77
struct MySlice < T : ?Sized > ( bool , T ) ;
73
78
type MySliceBool = MySlice < [ bool ] > ;
74
79
80
+ // # str
75
81
// 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 } ;
77
83
// 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 } ;
79
85
//~^ ERROR it is undefined behavior to use this value
80
86
// 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 } ;
82
88
//~^ ERROR it is undefined behavior to use this value
83
89
// 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 } ;
85
91
//~^ ERROR it is undefined behavior to use this value
86
92
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 } ;
91
95
//~^ 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 } ;
94
98
//~^ ERROR it is undefined behavior to use this value
95
99
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 } ;
101
105
//~^ 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 } ;
104
108
//~^ 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 } ;
108
111
//~^ ERROR it is undefined behavior to use this value
109
112
110
113
// bad data *inside* the slice
@@ -120,12 +123,33 @@ const I2: &MySliceBool = &MySlice(unsafe { BoolTransmute { val: 3 }.bl }, [false
120
123
const I3 : & MySliceBool = & MySlice ( true , [ unsafe { BoolTransmute { val : 3 } . bl } ] ) ;
121
124
//~^ ERROR it is undefined behavior to use this value
122
125
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 } ;
125
130
//~^ 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 } ;
128
151
//~^ 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
129
153
130
154
fn main ( ) {
131
155
}
0 commit comments