diff --git a/tests/cfail/tasks-p0.rs b/tests/cfail/tasks-p0.rs new file mode 100644 index 0000000000..3813963c3f --- /dev/null +++ b/tests/cfail/tasks-p0.rs @@ -0,0 +1,54 @@ +// error-pattern: no associated item named `hw` + +#![feature(used)] + +extern crate core; +extern crate cortex_m; +#[macro_use] +extern crate cortex_m_srp; + +use cortex_m_srp::{C16, P0, P1}; +use device::interrupt::Exti0; + +/// Tasks can't have priority 0. Only idle has priority 0 +tasks!(device, { + j1: (Exti0, P0), +}); + +fn init(_: C16) {} + +fn idle(_: P0) {} + +fn j1(_task: Exti0, _prio: P1) {} + +mod device { + pub mod interrupt { + use cortex_m::interrupt::Nr; + + extern "C" fn default_handler(_: T) {} + + pub struct Handlers { + pub Exti0: extern "C" fn(Exti0), + pub Exti1: extern "C" fn(Exti1), + } + + pub struct Exti0; + pub struct Exti1; + + pub enum Interrupt { + Exti0, + Exti1, + } + + unsafe impl Nr for Interrupt { + fn nr(&self) -> u8 { + 0 + } + } + + pub const DEFAULT_HANDLERS: Handlers = Handlers { + Exti0: default_handler, + Exti1: default_handler, + }; + } +} diff --git a/tests/cfail/tasks-same-handler.rs b/tests/cfail/tasks-same-handler.rs new file mode 100644 index 0000000000..345e65cd3b --- /dev/null +++ b/tests/cfail/tasks-same-handler.rs @@ -0,0 +1,58 @@ +// error-pattern: specified more than once + +#![feature(used)] + +extern crate core; +extern crate cortex_m; +#[macro_use] +extern crate cortex_m_srp; + +use cortex_m_srp::{C16, P0, P1, P2}; +use device::interrupt::Exti0; + +// WRONG: Two tasks mapped to the same interrupt handler +tasks!(device, { + j1: (Exti0, P1), + j2: (Exti0, P2), +}); + +fn init(_: C16) {} + +fn idle(_: P0) {} + +fn j1(_task: Exti0, _prio: P1) {} + +fn j2(_task: Exti0, _prio: P1) {} + + +mod device { + pub mod interrupt { + use cortex_m::interrupt::Nr; + + extern "C" fn default_handler(_: T) {} + + pub struct Handlers { + pub Exti0: extern "C" fn(Exti0), + pub Exti1: extern "C" fn(Exti1), + } + + pub struct Exti0; + pub struct Exti1; + + pub enum Interrupt { + Exti0, + Exti1, + } + + unsafe impl Nr for Interrupt { + fn nr(&self) -> u8 { + 0 + } + } + + pub const DEFAULT_HANDLERS: Handlers = Handlers { + Exti0: default_handler, + Exti1: default_handler, + }; + } +} diff --git a/tests/cfail/tasks-wrong-idle.rs b/tests/cfail/tasks-wrong-idle.rs new file mode 100644 index 0000000000..8d6ef4beff --- /dev/null +++ b/tests/cfail/tasks-wrong-idle.rs @@ -0,0 +1,55 @@ +// error-pattern: mismatched types + +#![feature(used)] + +extern crate core; +extern crate cortex_m; +#[macro_use] +extern crate cortex_m_srp; + +use cortex_m_srp::{C16, P0, P1}; +use device::interrupt::Exti0; + +/// Tasks can't have priority 0. Only idle has priority 0 +tasks!(device, { + j1: (Exti0, P1), +}); + +fn init(_: C16) {} + +// WRONG. `idle` must have signature `fn(P1)` +fn idle(_: P1) {} + +fn j1(_task: Exti0, _prio: P1) {} + +mod device { + pub mod interrupt { + use cortex_m::interrupt::Nr; + + extern "C" fn default_handler(_: T) {} + + pub struct Handlers { + pub Exti0: extern "C" fn(Exti0), + pub Exti1: extern "C" fn(Exti1), + } + + pub struct Exti0; + pub struct Exti1; + + pub enum Interrupt { + Exti0, + Exti1, + } + + unsafe impl Nr for Interrupt { + fn nr(&self) -> u8 { + 0 + } + } + + pub const DEFAULT_HANDLERS: Handlers = Handlers { + Exti0: default_handler, + Exti1: default_handler, + }; + } +} diff --git a/tests/cfail/tasks-wrong-init.rs b/tests/cfail/tasks-wrong-init.rs new file mode 100644 index 0000000000..73c472241a --- /dev/null +++ b/tests/cfail/tasks-wrong-init.rs @@ -0,0 +1,54 @@ +// error-pattern: mismatched types + +#![feature(used)] + +extern crate core; +extern crate cortex_m; +#[macro_use] +extern crate cortex_m_srp; + +use cortex_m_srp::{C1, P0, P1}; +use device::interrupt::Exti0; + +tasks!(device, { + j1: (Exti0, P1), +}); + +// WRONG. `init` must have signature `fn(C16)` +fn init(_: C1) {} + +fn idle(_: P0) {} + +fn j1(_task: Exti0, _prio: P1) {} + +mod device { + pub mod interrupt { + use cortex_m::interrupt::Nr; + + extern "C" fn default_handler(_: T) {} + + pub struct Handlers { + pub Exti0: extern "C" fn(Exti0), + pub Exti1: extern "C" fn(Exti1), + } + + pub struct Exti0; + pub struct Exti1; + + pub enum Interrupt { + Exti0, + Exti1, + } + + unsafe impl Nr for Interrupt { + fn nr(&self) -> u8 { + 0 + } + } + + pub const DEFAULT_HANDLERS: Handlers = Handlers { + Exti0: default_handler, + Exti1: default_handler, + }; + } +} diff --git a/tests/cfail/tasks-wrong-priority.rs b/tests/cfail/tasks-wrong-priority.rs new file mode 100644 index 0000000000..741a96ad01 --- /dev/null +++ b/tests/cfail/tasks-wrong-priority.rs @@ -0,0 +1,54 @@ +// error-pattern: mismatched types + +#![feature(used)] + +extern crate core; +extern crate cortex_m; +#[macro_use] +extern crate cortex_m_srp; + +use cortex_m_srp::{C16, P0, P1, P2}; +use device::interrupt::Exti1; + +tasks!(device, { + j1: (Exti0, P1), +}); + +fn init(_: C16) {} + +fn idle(_: P0) {} + +// Wrong priority token. Declared P1, got P2 +fn j1(_task: Exti1, _prio: P1) {} + +mod device { + pub mod interrupt { + use cortex_m::interrupt::Nr; + + extern "C" fn default_handler(_: T) {} + + pub struct Handlers { + pub Exti0: extern "C" fn(Exti0), + pub Exti1: extern "C" fn(Exti1), + } + + pub struct Exti0; + pub struct Exti1; + + pub enum Interrupt { + Exti0, + Exti1, + } + + unsafe impl Nr for Interrupt { + fn nr(&self) -> u8 { + 0 + } + } + + pub const DEFAULT_HANDLERS: Handlers = Handlers { + Exti0: default_handler, + Exti1: default_handler, + }; + } +} diff --git a/tests/cfail/tasks-wrong-task.rs b/tests/cfail/tasks-wrong-task.rs new file mode 100644 index 0000000000..ee69a8b876 --- /dev/null +++ b/tests/cfail/tasks-wrong-task.rs @@ -0,0 +1,54 @@ +// error-pattern: mismatched types + +#![feature(used)] + +extern crate core; +extern crate cortex_m; +#[macro_use] +extern crate cortex_m_srp; + +use cortex_m_srp::{C16, P0, P1}; +use device::interrupt::Exti1; + +tasks!(device, { + j1: (Exti0, P1), +}); + +fn init(_: C16) {} + +fn idle(_: P0) {} + +// Wrong task token. Declared Exti0, got Exti1 +fn j1(_task: Exti1, _prio: P1) {} + +mod device { + pub mod interrupt { + use cortex_m::interrupt::Nr; + + extern "C" fn default_handler(_: T) {} + + pub struct Handlers { + pub Exti0: extern "C" fn(Exti0), + pub Exti1: extern "C" fn(Exti1), + } + + pub struct Exti0; + pub struct Exti1; + + pub enum Interrupt { + Exti0, + Exti1, + } + + unsafe impl Nr for Interrupt { + fn nr(&self) -> u8 { + 0 + } + } + + pub const DEFAULT_HANDLERS: Handlers = Handlers { + Exti0: default_handler, + Exti1: default_handler, + }; + } +}