//! Auxiliary `minicore` prelude which stubs out `core` items for `no_core` tests that need to work //! in cross-compilation scenarios where no `core` is available (that don't want nor need to //! `-Zbuild-std`). //! //! # Important notes //! //! - `minicore` is **only** intended for `core` items, and the stubs should match the actual `core` //! items. //! - Be careful of adding new features and things that are only available for a subset of targets. //! //! # References //! //! This is partially adapted from `rustc_codegen_cranelift`: //! . // ignore-tidy-linelength #![feature(no_core, lang_items, rustc_attrs, decl_macro)] #![allow(unused, improper_ctypes_definitions, internal_features)] #![feature(asm_experimental_arch)] #![no_std] #![no_core] // `core` has some exotic `marker_impls!` macro for handling the with-generics cases, but for our // purposes, just use a simple macro_rules macro. macro_rules! impl_marker_trait { ($Trait:ident => [$( $ty:ident ),* $(,)?] ) => { $( impl $Trait for $ty {} )* } } #[lang = "sized"] pub trait Sized {} #[lang = "legacy_receiver"] pub trait LegacyReceiver {} impl LegacyReceiver for &T {} impl LegacyReceiver for &mut T {} #[lang = "copy"] pub trait Copy: Sized {} impl_marker_trait!( Copy => [ bool, char, isize, usize, i8, i16, i32, i64, u8, u16, u32, u64, f32, f64 ] ); impl<'a, T: ?Sized> Copy for &'a T {} impl Copy for *const T {} impl Copy for *mut T {} #[lang = "phantom_data"] pub struct PhantomData; impl Copy for PhantomData {} pub enum Option { None, Some(T), } impl Copy for Option {} pub enum Result { Ok(T), Err(E), } impl Copy for Result {} #[lang = "manually_drop"] #[repr(transparent)] pub struct ManuallyDrop { value: T, } impl Copy for ManuallyDrop {} #[lang = "unsafe_cell"] #[repr(transparent)] pub struct UnsafeCell { value: T, } #[rustc_builtin_macro] pub macro asm("assembly template", $(operands,)* $(options($(option),*))?) { /* compiler built-in */ }