1 // Adapted from https://github.com/sunfishcode/mir2cranelift/blob/master/rust-examples/nocore-hello-world.rs
3 #![feature(no_core, unboxed_closures, start, lang_items, box_syntax, slice_patterns, never_type, linkage)]
7 extern crate mini_core;
10 use mini_core::libc::*;
12 unsafe extern "C" fn my_puts(s: *const u8) {
16 #[lang = "termination"]
18 fn report(self) -> i32;
21 impl Termination for () {
22 fn report(self) -> i32 {
24 NUM = 6 * 7 + 1 + (1u8 == 1u8) as u8; // 44
31 fn object_safe(&self);
34 impl SomeTrait for &'static str {
35 fn object_safe(&self) {
37 puts(*self as *const str as *const u8);
44 inner: NoisyDropInner,
47 struct NoisyDropInner;
49 impl Drop for NoisyDrop {
52 puts(self.text as *const str as *const u8);
57 impl Drop for NoisyDropInner {
60 puts("Inner got dropped!\0" as *const str as *const u8);
65 impl SomeTrait for NoisyDrop {
66 fn object_safe(&self) {}
76 fn start<T: Termination + 'static>(
79 argv: *const *const u8,
82 unsafe { puts(*argv); }
83 unsafe { puts(*((argv as usize + intrinsics::size_of::<*const u8>()) as *const *const u8)); }
84 unsafe { puts(*((argv as usize + 2 * intrinsics::size_of::<*const u8>()) as *const *const u8)); }
91 static mut NUM: u8 = 6 * 7;
92 static NUM_REF: &'static u8 = unsafe { &NUM };
97 panic(&(stringify!(! $e), file!(), line!(), 0));
102 macro_rules! assert_eq {
103 ($l:expr, $r: expr) => {
105 panic(&(stringify!($l != $r), file!(), line!(), 0));
110 struct Unique<T: ?Sized> {
112 _marker: PhantomData<T>,
115 impl<T: ?Sized, U: ?Sized> CoerceUnsized<Unique<U>> for Unique<T> where T: Unsize<U> {}
117 fn take_f32(_f: f32) {}
118 fn take_unique(_u: Unique<()>) {}
120 fn return_u128_pair() -> (u128, u128) {
124 fn call_return_u128_pair() {
130 pointer: 0 as *const (),
131 _marker: PhantomData,
135 call_return_u128_pair();
137 let slice = &[0, 1] as &[i32];
138 let slice_ptr = slice as *const [i32] as *const i32;
140 // FIXME On macOS statics and promoted constants have the wrong alignment. This causes this
141 // assertion to fail.
142 if cfg!(not(target_os = "macos")) {
143 assert_eq!(slice_ptr as usize % 4, 0);
149 printf("Hello %s\n\0" as *const str as *const i8, "printf\0" as *const str as *const i8);
151 let hello: &[u8] = b"Hello\0" as &[u8; 6];
152 let ptr: *const u8 = hello as *const [u8] as *const u8;
155 let world: Box<&str> = box "World!\0";
156 puts(*world as *const str as *const u8);
157 world as Box<dyn SomeTrait>;
159 assert_eq!(intrinsics::bitreverse(0b10101000u8), 0b00010101u8);
161 assert_eq!(intrinsics::bswap(0xabu8), 0xabu8);
162 assert_eq!(intrinsics::bswap(0xddccu16), 0xccddu16);
163 assert_eq!(intrinsics::bswap(0xffee_ddccu32), 0xccdd_eeffu32);
164 assert_eq!(intrinsics::bswap(0x1234_5678_ffee_ddccu64), 0xccdd_eeff_7856_3412u64);
166 assert_eq!(intrinsics::size_of_val(hello) as u8, 6);
168 let chars = &['C', 'h', 'a', 'r', 's'];
169 let chars = chars as &[char];
170 assert_eq!(intrinsics::size_of_val(chars) as u8, 4 * 5);
172 let a: &dyn SomeTrait = &"abc\0";
175 assert_eq!(intrinsics::size_of_val(a) as u8, 16);
176 assert_eq!(intrinsics::size_of_val(&0u32) as u8, 4);
178 assert_eq!(intrinsics::min_align_of::<u16>() as u8, 2);
179 assert_eq!(intrinsics::min_align_of_val(&a) as u8, intrinsics::min_align_of::<&str>() as u8);
181 assert!(!intrinsics::needs_drop::<u8>());
182 assert!(intrinsics::needs_drop::<NoisyDrop>());
185 pointer: 0 as *const &str,
186 _marker: PhantomData,
187 } as Unique<dyn SomeTrait>;
189 struct MyDst<T: ?Sized>(T);
191 intrinsics::size_of_val(&MyDst([0u8; 4]) as &MyDst<[u8]>);
198 unsafe fn zeroed<T>() -> T {
199 intrinsics::init::<T>()
202 unsafe fn uninitialized<T>() -> T {
203 MaybeUninit { uninit: () }.value
206 zeroed::<(u8, u8)>();
207 #[allow(unreachable_code)]
212 uninitialized::<Foo>();
217 let _ = box NoisyDrop {
218 text: "Boxed outer got dropped!\0",
219 inner: NoisyDropInner,
220 } as Box<dyn SomeTrait>;
222 const FUNC_REF: Option<fn()> = Some(main);
225 None => assert!(false),
228 match Ordering::Less {
229 Ordering::Less => {},
233 [NoisyDropInner, NoisyDropInner];
235 let x = &[0u32, 42u32] as &[u32];
237 [] => assert_eq!(0u32, 1),
238 [_, ref y @ ..] => assert_eq!(&x[1] as *const u32 as usize, &y[0] as *const u32 as usize),
241 assert_eq!(((|()| 42u8) as fn(()) -> u8)(()), 42);
245 static ABC: *const u8;
251 static ABC: *const u8;
255 unsafe { assert_eq!(ABC as usize, 0); }
257 &mut (|| Some(0 as *const ())) as &mut dyn FnMut() -> Option<*const ()>;
260 assert_eq!(f as u8, 255);
262 assert_eq!(f2 as i8, -128);
263 assert_eq!(f2 as u8, 0);
265 static ANOTHER_STATIC: &u8 = &A_STATIC;
266 assert_eq!(*ANOTHER_STATIC, 42);