| // { dg-options "-w" } |
| #![feature(no_core)] |
| #![no_core] |
| |
| #![feature(no_core)] |
| #![feature(intrinsics)] |
| #![feature(lang_items)] |
| #![no_core] |
| |
| #[lang = "sized"] |
| trait Sized {} |
| |
| extern "rust-intrinsic" { |
| fn transmute<T, U>(_: T) -> U; |
| fn offset<T>(src: *const T, offset: isize) -> *const T; |
| } |
| |
| pub mod core { |
| pub mod marker { |
| #[lang = "phantom_data"] |
| pub struct PhantomData<T>; |
| } |
| |
| pub mod slice { |
| use crate::core::marker::PhantomData; |
| use crate::core::option::Option; |
| use crate::offset; |
| use crate::transmute; |
| |
| impl<T> crate::core::iter::IntoIterator for &[T] { |
| type Item = &T; |
| type IntoIter = Weird<T>; |
| |
| fn into_iter(self) -> Weird<T> { |
| self.iter() |
| } |
| } |
| |
| pub struct Weird<T> { |
| ptr: *const T, // should be NonNull<T> but here it does not matter |
| end: *const T, |
| _marker: PhantomData<&T>, |
| } |
| |
| impl<T> Weird<T> { |
| 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::<T>()`? |
| let end = transmute::<usize, *const T>(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<T> Foo for Weird<T> {} |
| |
| impl<T> crate::core::iter::Iterator for Weird<T> { |
| type Item = &T; |
| |
| fn next(&mut self) -> Option<&T> { |
| Option::None |
| } |
| } |
| |
| union Repr<T> { |
| pub(crate) rust: *const [T], |
| rust_mut: *mut [T], |
| pub(crate) raw: FatPtr<T>, |
| } |
| |
| struct FatPtr<T> { |
| data: *const T, |
| pub(crate) len: usize, |
| } |
| |
| impl<T> [T] { |
| pub fn iter(&self) -> Weird<T> { |
| 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<Item = Self::Item>; |
| |
| fn into_iter(self) -> Self::IntoIter; |
| } |
| |
| pub trait Iterator { |
| type Item; |
| |
| fn next(&mut self) -> Option<Self::Item>; |
| } |
| } |
| |
| pub mod option { |
| pub enum Option<T> { |
| Some(T), |
| None, |
| } |
| } |
| } |
| |
| fn main() {} |