// Compiler: // // Run-time: // status: 0 // stdout: 10 // 14 // 1 // 12 // 12 // 1 #![feature(auto_traits, lang_items, no_core, start, intrinsics)] #![no_std] #![no_core] /* * Core */ // Because we don't have core yet. #[lang = "sized"] pub trait Sized {} #[lang = "destruct"] pub trait Destruct {} #[lang = "drop"] pub trait Drop {} #[lang = "copy"] trait Copy { } impl Copy for isize {} #[lang = "receiver"] trait Receiver { } #[lang = "freeze"] pub(crate) unsafe auto trait Freeze {} mod intrinsics { use super::Sized; extern "rust-intrinsic" { pub fn abort() -> !; } } mod libc { #[link(name = "c")] extern "C" { pub fn printf(format: *const i8, ...) -> i32; } } #[lang = "structural_peq"] pub trait StructuralPartialEq {} #[lang = "structural_teq"] pub trait StructuralEq {} #[lang = "drop_in_place"] #[allow(unconditional_recursion)] pub unsafe fn drop_in_place(to_drop: *mut T) { // Code here does not matter - this is replaced by the // real drop glue by the compiler. drop_in_place(to_drop); } /* * Code */ struct Test { field: isize, } struct WithRef { refe: &'static Test, } static mut CONSTANT: isize = 10; static mut TEST: Test = Test { field: 12, }; static mut TEST2: Test = Test { field: 14, }; static mut WITH_REF: WithRef = WithRef { refe: unsafe { &TEST }, }; #[start] fn main(mut argc: isize, _argv: *const *const u8) -> isize { unsafe { libc::printf(b"%ld\n\0" as *const u8 as *const i8, CONSTANT); libc::printf(b"%ld\n\0" as *const u8 as *const i8, TEST2.field); TEST2.field = argc; libc::printf(b"%ld\n\0" as *const u8 as *const i8, TEST2.field); libc::printf(b"%ld\n\0" as *const u8 as *const i8, WITH_REF.refe.field); WITH_REF.refe = &TEST2; libc::printf(b"%ld\n\0" as *const u8 as *const i8, TEST.field); libc::printf(b"%ld\n\0" as *const u8 as *const i8, WITH_REF.refe.field); } 0 }