88// option. This file may not be copied, modified, or distributed
99// except according to those terms.
1010
11- use core:: mem;
1211use core:: ptr:: * ;
1312use core:: cell:: RefCell ;
1413
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-
3114#[ test]
3215fn test ( ) {
3316 unsafe {
@@ -80,7 +63,7 @@ fn test_is_null() {
8063 let mq = unsafe { mp. offset ( 1 ) } ;
8164 assert ! ( !mq. is_null( ) ) ;
8265
83- // Pointers to unsized types
66+ // Pointers to unsized types -- slices
8467 let s: & mut [ u8 ] = & mut [ 1 , 2 , 3 ] ;
8568 let cs: * const [ u8 ] = s;
8669 assert ! ( !cs. is_null( ) ) ;
@@ -94,11 +77,24 @@ fn test_is_null() {
9477 let mz: * mut [ u8 ] = & mut [ ] ;
9578 assert ! ( !mz. is_null( ) ) ;
9679
97- let ncs: * const [ u8 ] = null_slice ( ) ;
80+ let ncs: * const [ u8 ] = null :: < [ u8 ; 3 ] > ( ) ;
9881 assert ! ( ncs. is_null( ) ) ;
9982
100- let nms: * mut [ u8 ] = null_slice ( ) ;
83+ let nms: * mut [ u8 ] = null_mut :: < [ u8 ; 3 ] > ( ) ;
10184 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( ) ) ;
10298}
10399
104100#[ test]
@@ -123,7 +119,7 @@ fn test_as_ref() {
123119 assert_eq ! ( p. as_ref( ) . unwrap( ) , & 2 ) ;
124120 }
125121
126- // Pointers to unsized types
122+ // Pointers to unsized types -- slices
127123 let s: & mut [ u8 ] = & mut [ 1 , 2 , 3 ] ;
128124 let cs: * const [ u8 ] = s;
129125 assert_eq ! ( cs. as_ref( ) , Some ( & * s) ) ;
@@ -137,11 +133,24 @@ fn test_as_ref() {
137133 let mz: * mut [ u8 ] = & mut [ ] ;
138134 assert_eq ! ( mz. as_ref( ) , Some ( & [ ] [ ..] ) ) ;
139135
140- let ncs: * const [ u8 ] = null_slice ( ) ;
136+ let ncs: * const [ u8 ] = null :: < [ u8 ; 3 ] > ( ) ;
141137 assert_eq ! ( ncs. as_ref( ) , None ) ;
142138
143- let nms: * mut [ u8 ] = null_slice ( ) ;
139+ let nms: * mut [ u8 ] = null_mut :: < [ u8 ; 3 ] > ( ) ;
144140 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( ) ) ;
145154 }
146155}
147156
@@ -161,16 +170,23 @@ fn test_as_mut() {
161170 assert ! ( p. as_mut( ) . unwrap( ) == & mut 2 ) ;
162171 }
163172
164- // Pointers to unsized types
173+ // Pointers to unsized types -- slices
165174 let s: & mut [ u8 ] = & mut [ 1 , 2 , 3 ] ;
166175 let ms: * mut [ u8 ] = s;
167176 assert_eq ! ( ms. as_mut( ) , Some ( s) ) ;
168177
169178 let mz: * mut [ u8 ] = & mut [ ] ;
170179 assert_eq ! ( mz. as_mut( ) , Some ( & mut [ ] [ ..] ) ) ;
171180
172- let nms: * mut [ u8 ] = null_slice ( ) ;
181+ let nms: * mut [ u8 ] = null_mut :: < [ u8 ; 3 ] > ( ) ;
173182 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( ) ) ;
174190 }
175191}
176192
0 commit comments