// { dg-options "-w" } #![feature(intrinsics)] #![feature(lang_items)] #[lang = "sized"] trait Sized {} extern "rust-intrinsic" { fn transmute(_: T) -> U; fn offset(src: *const T, offset: isize) -> *const T; } pub mod core { pub mod marker { #[lang = "phantom_data"] pub struct PhantomData; } pub mod slice { use crate::core::marker::PhantomData; use crate::core::option::Option; impl crate::core::iter::IntoIterator for &[T] { type Item = &T; type IntoIter = Weird; fn into_iter(self) -> Weird { self.iter() } } pub struct Weird { ptr: *const T, // should be NonNull but here it does not matter end: *const T, _marker: PhantomData<&T>, } impl Weird { pub(super) fn new(slice: &[T]) -> Self { let ptr = slice.as_ptr(); // SAFETY: Similar to `IterMut::new`. unsafe { // should be: ptr.add(slice.len()) let end = transmute::<*const T, usize>(ptr) + slice.len(); // TODO(Arthur): Missing `* size_of::()`? let end = transmute::(end); Self { ptr, end, _marker: PhantomData, } } } fn is_empty(&self) -> bool { self.ptr == self.end } fn next_unchecked(&mut self) -> *const T { let old = self.ptr; self.ptr = unsafe { offset(self.ptr, 1) }; old } } trait Foo {} impl Foo for Weird {} // impl core::iter::Iterator for Iter { // type Item = &T; // fn next(&mut self) -> Option<&T> { // if self.is_empty() { // Option::None // } else { // Option::Some(&*self.next_unchecked()) // } // } // } union Repr { pub(crate) rust: *const [T], rust_mut: *mut [T], pub(crate) raw: FatPtr, } struct FatPtr { data: *const T, pub(crate) len: usize, } impl [T] { pub fn iter(&self) -> Weird { Weird::new(self) } pub fn as_ptr(&self) -> *const T { self as *const [T] as *const T } pub fn len(&self) -> usize { unsafe { Repr { rust: self }.raw.len } } } } pub mod iter { use crate::core::option::Option; pub trait IntoIterator { type Item; type IntoIter: Iterator; fn into_iter(self) -> Self::IntoIter; } pub trait Iterator { type Item; fn next(&mut self) -> Option; } } pub mod option { pub enum Option { Some(T), None, } } } fn main() {}