diff --git a/macros/src/trans.rs b/macros/src/trans.rs index 96631d5d03..77eada4153 100644 --- a/macros/src/trans.rs +++ b/macros/src/trans.rs @@ -438,12 +438,14 @@ fn resources(app: &App, ownerships: &Ownerships, root: &mut Vec) { items.push(quote! { #[allow(non_camel_case_types)] - pub struct #name { _0: () } + pub struct #name { _0: PhantomData<*const ()> } + + unsafe impl Sync for #name {} #[allow(unsafe_code)] impl #name { pub unsafe fn new() -> Self { - #name { _0: () } + #name { _0: PhantomData } } } }); @@ -455,6 +457,8 @@ fn resources(app: &App, ownerships: &Ownerships, root: &mut Vec) { root.push(quote! { #[allow(unsafe_code)] mod _resource { + use core::marker::PhantomData; + #(#items)* } }) diff --git a/tests/cfail/resource-not-send.rs b/tests/cfail/resource-not-send.rs new file mode 100644 index 0000000000..333a3a5469 --- /dev/null +++ b/tests/cfail/resource-not-send.rs @@ -0,0 +1,52 @@ +#![deny(warnings)] +#![feature(const_fn)] +#![feature(proc_macro)] +#![no_std] + +extern crate cortex_m_rtfm as rtfm; +extern crate stm32f103xx; + +use rtfm::{app, Resource, Threshold}; + +app! { + device: stm32f103xx, + + resources: { + static SHARED: bool = false; + }, + + tasks: { + EXTI0: { + path: exti0, + priority: 1, + resources: [SHARED], + }, + + EXTI1: { + path: exti1, + priority: 2, + resources: [SHARED], + }, + }, +} + +fn init(_p: init::Peripherals, _r: init::Resources) {} + +fn idle() -> ! { + loop {} +} + +fn is_send(_: &T) where T: Send {} +fn is_sync(_: &T) where T: Sync {} + +fn exti0(_t: &mut Threshold, r: EXTI0::Resources) { + // OK + is_sync(&r.SHARED); + + // ERROR resource proxies are not `Send`able across tasks + is_send(&r.SHARED); + //~^ error the trait bound `*const (): core::marker::Send` is not satisfied +} + +fn exti1(_t: &mut Threshold, _r: EXTI1::Resources) { +}