Skip to content
/ rust Public
forked from rust-lang/rust

Commit 40a678d

Browse files
committed
Use unsized coercions for null ptr tests
1 parent 5c61183 commit 40a678d

File tree

1 file changed

+41
-25
lines changed

1 file changed

+41
-25
lines changed

src/libcore/tests/ptr.rs

+41-25
Original file line numberDiff line numberDiff line change
@@ -8,26 +8,9 @@
88
// option. This file may not be copied, modified, or distributed
99
// except according to those terms.
1010

11-
use core::mem;
1211
use core::ptr::*;
1312
use 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]
3215
fn 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

Comments
 (0)