]>
git.proxmox.com Git - rustc.git/blob - src/test/codegen/avr/avr-func-addrspace.rs
6d25ca56f1488340855427af287ed4f724e0f2da
1 // compile-flags: -O --target=avr-unknown-unknown --crate-type=rlib
2 // needs-llvm-components: avr
4 // This test validates that function pointers can be stored in global variables
5 // and called upon. It ensures that Rust emits function pointers in the correct
6 // address space to LLVM so that an assertion error relating to casting is
9 // It also validates that functions can be called through function pointers
12 #![feature(no_core, lang_items, unboxed_closures, arbitrary_self_types)]
13 #![crate_type = "lib"]
21 pub trait Receiver { }
23 pub struct Result
<T
, E
> { _a: T, _b: E }
25 impl Copy
for usize {}
27 #[lang = "drop_in_place"]
28 pub unsafe fn drop_in_place
<T
: ?Sized
>(_
: *mut T
) {}
31 pub trait FnOnce
<Args
> {
32 #[lang = "fn_once_output"]
35 extern "rust-call" fn call_once(self, args
: Args
) -> Self::Output
;
39 pub trait FnMut
<Args
> : FnOnce
<Args
> {
40 extern "rust-call" fn call_mut(&mut self, args
: Args
) -> Self::Output
;
44 pub trait Fn
<Args
>: FnOnce
<Args
> {
45 /// Performs the call operation.
46 extern "rust-call" fn call(&self, args
: Args
) -> Self::Output
;
49 impl<'a
, A
, R
> FnOnce
<A
> for &'a
fn(A
) -> R
{
52 extern "rust-call" fn call_once(self, args
: A
) -> R
{
57 pub static mut STORAGE_FOO
: fn(&usize, &mut u32) -> Result
<(), ()> = arbitrary_black_box
;
58 pub static mut STORAGE_BAR
: u32 = 12;
60 fn arbitrary_black_box(ptr
: &usize, _
: &mut u32) -> Result
<(), ()> {
61 let raw_ptr
= ptr
as *const usize;
62 let _v
: usize = unsafe { *raw_ptr }
;
68 fn call_through_fn_trait(a
: &mut impl Fn
<(), Output
=()>) {
73 fn update_bar_value() {
79 // CHECK: define void @test(){{.+}}addrspace(1)
81 pub extern "C" fn test() {
84 // A call through the Fn trait must use address space 1.
86 // CHECK: call{{.+}}addrspace(1) void @call_through_fn_trait()
87 call_through_fn_trait(&mut update_bar_value
);
89 // A call through a global variable must use address space 1.
90 // CHECK: load {{.*}}addrspace(1){{.+}}FOO
92 STORAGE_FOO(&1, &mut buf
);