2 #![allow(stable_features)]
4 // compile-flags: -C debug-assertions
6 #![feature(iter_to_slice)]
10 fn foo<T>(v: &[T]) -> Option<&[T]> {
11 let mut it = v.iter();
18 fn foo_mut<T>(v: &mut [T]) -> Option<&mut [T]> {
19 let mut it = v.iter_mut();
27 // In a slice of zero-size elements the pointer is meaningless.
28 // Ensure iteration still works even if the pointer is at the end of the address space.
29 let slice: &[()] = unsafe { slice::from_raw_parts(-5isize as *const (), 10) };
30 assert_eq!(slice.len(), 10);
31 assert_eq!(slice.iter().count(), 10);
33 // .nth() on the iterator should also behave correctly
34 let mut it = slice.iter();
35 assert!(it.nth(5).is_some());
36 assert_eq!(it.count(), 4);
38 // Converting Iter to a slice should never have a null pointer
39 assert!(foo(slice).is_some());
41 // Test mutable iterators as well
42 let slice: &mut [()] = unsafe { slice::from_raw_parts_mut(-5isize as *mut (), 10) };
43 assert_eq!(slice.len(), 10);
44 assert_eq!(slice.iter_mut().count(), 10);
47 let mut it = slice.iter_mut();
48 assert!(it.nth(5).is_some());
49 assert_eq!(it.count(), 4);
52 assert!(foo_mut(slice).is_some())