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)]
7 extern crate mini_core;
13 fn puts(s: *const u8);
16 unsafe extern "C" fn my_puts(s: *const u8) {
20 // TODO remove when jit supports linking rlibs
22 extern "C" fn panic<T>(_: T) -> ! {
28 #[lang = "termination"]
30 fn report(self) -> i32;
33 impl Termination for () {
34 fn report(self) -> i32 {
36 NUM = 6 * 7 + 1 + (1u8 == 1u8) as u8; // 44
43 fn object_safe(&self);
46 impl SomeTrait for &'static str {
47 fn object_safe(&self) {
49 puts(*self as *const str as *const u8);
56 inner: NoisyDropInner,
59 struct NoisyDropInner;
61 impl Drop for NoisyDrop {
64 puts(self.text as *const str as *const u8);
69 impl Drop for NoisyDropInner {
72 puts("Inner got dropped!\0" as *const str as *const u8);
84 fn start<T: Termination + 'static>(
87 _argv: *const *const u8,
89 main().report() as isize
92 static mut NUM: u8 = 6 * 7;
93 static NUM_REF: &'static u8 = unsafe { &NUM };
98 panic(&(stringify!(! $e), file!(), line!(), 0));
103 macro_rules! assert_eq {
104 ($l:expr, $r: expr) => {
106 panic(&(stringify!($l != $r), file!(), line!(), 0));
111 struct Unique<T: ?Sized> {
113 _marker: PhantomData<T>,
116 impl<T: ?Sized, U: ?Sized> CoerceUnsized<Unique<U>> for Unique<T> where T: Unsize<U> {}
118 fn take_f32(f: f32) {}
119 fn take_unique(u: Unique<()>) {}
123 pointer: 0 as *const (),
124 _marker: PhantomData,
131 let hello: &[u8] = b"Hello\0" as &[u8; 6];
132 let ptr: *const u8 = hello as *const [u8] as *const u8;
135 // TODO remove when jit supports linking rlibs
138 let world: Box<&str> = box "World!\0";
139 puts(*world as *const str as *const u8);
140 world as Box<SomeTrait>;
143 assert_eq!(intrinsics::size_of_val(hello) as u8, 6);
145 let chars = &['C', 'h', 'a', 'r', 's'];
146 let chars = chars as &[char];
147 assert_eq!(intrinsics::size_of_val(chars) as u8, 4 * 5);
149 let a: &dyn SomeTrait = &"abc\0";
152 assert_eq!(intrinsics::size_of_val(a) as u8, 16);
153 assert_eq!(intrinsics::size_of_val(&0u32) as u8, 4);
155 assert_eq!(intrinsics::min_align_of::<u16>() as u8, 2);
156 assert_eq!(intrinsics::min_align_of_val(&a) as u8, intrinsics::min_align_of::<&str>() as u8);
158 assert!(!intrinsics::needs_drop::<u8>());
159 assert!(intrinsics::needs_drop::<NoisyDrop>());
162 pointer: 0 as *const &str,
163 _marker: PhantomData,
164 } as Unique<dyn SomeTrait>;
166 struct MyDst<T: ?Sized>(T);
168 intrinsics::size_of_val(&MyDst([0u8; 4]) as &MyDst<[u8]>);
172 text: "Outer got dropped!\0",
173 inner: NoisyDropInner,
176 const FUNC_REF: Option<fn()> = Some(main);
179 None => assert!(false),
182 match Ordering::Less {
183 Ordering::Less => {},
187 [NoisyDropInner, NoisyDropInner];