8
8
// option. This file may not be copied, modified, or distributed
9
9
// except according to those terms.
10
10
11
- use core:: mem;
12
11
use core:: ptr:: * ;
13
12
use core:: cell:: RefCell ;
14
13
15
-
16
- /// Create a null pointer to a mutable slice. This is implemented like
17
- /// `slice::from_raw_parts_mut`, which we can't use directly because
18
- /// having a null `&mut [T]` even temporarily is UB.
19
- fn null_slice < T > ( ) -> * mut [ T ] {
20
- unsafe {
21
- #[ repr( C ) ]
22
- struct Repr < T > {
23
- pub data : * mut T ,
24
- pub len : usize ,
25
- }
26
-
27
- mem:: transmute ( Repr { data : null_mut :: < T > ( ) , len : 0 } )
28
- }
29
- }
30
-
31
14
#[ test]
32
15
fn test ( ) {
33
16
unsafe {
@@ -80,7 +63,7 @@ fn test_is_null() {
80
63
let mq = unsafe { mp. offset ( 1 ) } ;
81
64
assert ! ( !mq. is_null( ) ) ;
82
65
83
- // Pointers to unsized types
66
+ // Pointers to unsized types -- slices
84
67
let s: & mut [ u8 ] = & mut [ 1 , 2 , 3 ] ;
85
68
let cs: * const [ u8 ] = s;
86
69
assert ! ( !cs. is_null( ) ) ;
@@ -94,11 +77,24 @@ fn test_is_null() {
94
77
let mz: * mut [ u8 ] = & mut [ ] ;
95
78
assert ! ( !mz. is_null( ) ) ;
96
79
97
- let ncs: * const [ u8 ] = null_slice ( ) ;
80
+ let ncs: * const [ u8 ] = null :: < [ u8 ; 3 ] > ( ) ;
98
81
assert ! ( ncs. is_null( ) ) ;
99
82
100
- let nms: * mut [ u8 ] = null_slice ( ) ;
83
+ let nms: * mut [ u8 ] = null_mut :: < [ u8 ; 3 ] > ( ) ;
101
84
assert ! ( nms. is_null( ) ) ;
85
+
86
+ // Pointers to unsized types -- trait objects
87
+ let ci: * const ToString = & 3 ;
88
+ assert ! ( !ci. is_null( ) ) ;
89
+
90
+ let mi: * mut ToString = & mut 3 ;
91
+ assert ! ( !mi. is_null( ) ) ;
92
+
93
+ let nci: * const ToString = null :: < isize > ( ) ;
94
+ assert ! ( nci. is_null( ) ) ;
95
+
96
+ let nmi: * mut ToString = null_mut :: < isize > ( ) ;
97
+ assert ! ( nmi. is_null( ) ) ;
102
98
}
103
99
104
100
#[ test]
@@ -123,7 +119,7 @@ fn test_as_ref() {
123
119
assert_eq ! ( p. as_ref( ) . unwrap( ) , & 2 ) ;
124
120
}
125
121
126
- // Pointers to unsized types
122
+ // Pointers to unsized types -- slices
127
123
let s: & mut [ u8 ] = & mut [ 1 , 2 , 3 ] ;
128
124
let cs: * const [ u8 ] = s;
129
125
assert_eq ! ( cs. as_ref( ) , Some ( & * s) ) ;
@@ -137,11 +133,24 @@ fn test_as_ref() {
137
133
let mz: * mut [ u8 ] = & mut [ ] ;
138
134
assert_eq ! ( mz. as_ref( ) , Some ( & [ ] [ ..] ) ) ;
139
135
140
- let ncs: * const [ u8 ] = null_slice ( ) ;
136
+ let ncs: * const [ u8 ] = null :: < [ u8 ; 3 ] > ( ) ;
141
137
assert_eq ! ( ncs. as_ref( ) , None ) ;
142
138
143
- let nms: * mut [ u8 ] = null_slice ( ) ;
139
+ let nms: * mut [ u8 ] = null_mut :: < [ u8 ; 3 ] > ( ) ;
144
140
assert_eq ! ( nms. as_ref( ) , None ) ;
141
+
142
+ // Pointers to unsized types -- trait objects
143
+ let ci: * const ToString = & 3 ;
144
+ assert ! ( ci. as_ref( ) . is_some( ) ) ;
145
+
146
+ let mi: * mut ToString = & mut 3 ;
147
+ assert ! ( mi. as_ref( ) . is_some( ) ) ;
148
+
149
+ let nci: * const ToString = null :: < isize > ( ) ;
150
+ assert ! ( nci. as_ref( ) . is_none( ) ) ;
151
+
152
+ let nmi: * mut ToString = null_mut :: < isize > ( ) ;
153
+ assert ! ( nmi. as_ref( ) . is_none( ) ) ;
145
154
}
146
155
}
147
156
@@ -161,16 +170,23 @@ fn test_as_mut() {
161
170
assert ! ( p. as_mut( ) . unwrap( ) == & mut 2 ) ;
162
171
}
163
172
164
- // Pointers to unsized types
173
+ // Pointers to unsized types -- slices
165
174
let s: & mut [ u8 ] = & mut [ 1 , 2 , 3 ] ;
166
175
let ms: * mut [ u8 ] = s;
167
176
assert_eq ! ( ms. as_mut( ) , Some ( s) ) ;
168
177
169
178
let mz: * mut [ u8 ] = & mut [ ] ;
170
179
assert_eq ! ( mz. as_mut( ) , Some ( & mut [ ] [ ..] ) ) ;
171
180
172
- let nms: * mut [ u8 ] = null_slice ( ) ;
181
+ let nms: * mut [ u8 ] = null_mut :: < [ u8 ; 3 ] > ( ) ;
173
182
assert_eq ! ( nms. as_mut( ) , None ) ;
183
+
184
+ // Pointers to unsized types -- trait objects
185
+ let mi: * mut ToString = & mut 3 ;
186
+ assert ! ( mi. as_mut( ) . is_some( ) ) ;
187
+
188
+ let nmi: * mut ToString = null_mut :: < isize > ( ) ;
189
+ assert ! ( nmi. as_mut( ) . is_none( ) ) ;
174
190
}
175
191
}
176
192
0 commit comments