mirror of
https://github.com/rust-lang/rust.git
synced 2025-12-01 11:17:40 +00:00
As before, add `MetaSized` and `PointeeSized` traits to all of the non-minicore `no_core` tests so that they don't fail for lack of language items.
53 lines
1.5 KiB
Rust
53 lines
1.5 KiB
Rust
//! This test case is a `#![no_core]`-version of the MVCE presented in #129301.
|
|
//!
|
|
//! The function [`delay()`] is removed, as it is not necessary to trigger the
|
|
//! wrong behavior and would require some additional lang items.
|
|
#![feature(no_core, lang_items, intrinsics, rustc_attrs)]
|
|
#![no_core]
|
|
#![no_main]
|
|
#![allow(internal_features)]
|
|
|
|
use minicore::ptr;
|
|
|
|
#[no_mangle]
|
|
pub fn main() -> ! {
|
|
let port_b = 0x25 as *mut u8; // the I/O-address of PORTB
|
|
|
|
// a simple loop with some trivial instructions within. This loop label has
|
|
// to be placed correctly before the `ptr::write_volatile()` (some LLVM ver-
|
|
// sions did place it after the first loop instruction, causing unsoundness)
|
|
loop {
|
|
unsafe { ptr::write_volatile(port_b, 1) };
|
|
unsafe { ptr::write_volatile(port_b, 2) };
|
|
}
|
|
}
|
|
|
|
// FIXME: replace with proper minicore once available (#130693)
|
|
mod minicore {
|
|
#[lang = "pointee_sized"]
|
|
pub trait PointeeSized {}
|
|
|
|
#[lang = "meta_sized"]
|
|
pub trait MetaSized: PointeeSized {}
|
|
|
|
#[lang = "sized"]
|
|
pub trait Sized: MetaSized {}
|
|
|
|
#[lang = "copy"]
|
|
pub trait Copy {}
|
|
impl Copy for u32 {}
|
|
impl Copy for &u32 {}
|
|
impl<T: PointeeSized> Copy for *mut T {}
|
|
|
|
pub mod ptr {
|
|
#[inline]
|
|
#[rustc_diagnostic_item = "ptr_write_volatile"]
|
|
pub unsafe fn write_volatile<T>(dst: *mut T, src: T) {
|
|
#[rustc_intrinsic]
|
|
pub unsafe fn volatile_store<T>(dst: *mut T, val: T);
|
|
|
|
unsafe { volatile_store(dst, src) };
|
|
}
|
|
}
|
|
}
|