aboutsummaryrefslogtreecommitdiff
path: root/rtic-macros/ui
diff options
context:
space:
mode:
Diffstat (limited to 'rtic-macros/ui')
-rw-r--r--rtic-macros/ui/extern-interrupt-used.rs16
-rw-r--r--rtic-macros/ui/extern-interrupt-used.stderr5
-rw-r--r--rtic-macros/ui/idle-double-local.rs9
-rw-r--r--rtic-macros/ui/idle-double-local.stderr5
-rw-r--r--rtic-macros/ui/idle-double-shared.rs9
-rw-r--r--rtic-macros/ui/idle-double-shared.stderr5
-rw-r--r--rtic-macros/ui/idle-input.rs9
-rw-r--r--rtic-macros/ui/idle-input.stderr5
-rw-r--r--rtic-macros/ui/idle-no-context.rs9
-rw-r--r--rtic-macros/ui/idle-no-context.stderr5
-rw-r--r--rtic-macros/ui/idle-not-divergent.rs7
-rw-r--r--rtic-macros/ui/idle-not-divergent.stderr5
-rw-r--r--rtic-macros/ui/idle-output.rs9
-rw-r--r--rtic-macros/ui/idle-output.stderr5
-rw-r--r--rtic-macros/ui/idle-pub.rs9
-rw-r--r--rtic-macros/ui/idle-pub.stderr5
-rw-r--r--rtic-macros/ui/idle-unsafe.rs9
-rw-r--r--rtic-macros/ui/idle-unsafe.stderr5
-rw-r--r--rtic-macros/ui/init-divergent.rs13
-rw-r--r--rtic-macros/ui/init-divergent.stderr5
-rw-r--r--rtic-macros/ui/init-double-local.rs7
-rw-r--r--rtic-macros/ui/init-double-local.stderr5
-rw-r--r--rtic-macros/ui/init-double-shared.rs7
-rw-r--r--rtic-macros/ui/init-double-shared.stderr5
-rw-r--r--rtic-macros/ui/init-input.rs13
-rw-r--r--rtic-macros/ui/init-input.stderr5
-rw-r--r--rtic-macros/ui/init-no-context.rs13
-rw-r--r--rtic-macros/ui/init-no-context.stderr5
-rw-r--r--rtic-macros/ui/init-output.rs9
-rw-r--r--rtic-macros/ui/init-output.stderr5
-rw-r--r--rtic-macros/ui/init-pub.rs13
-rw-r--r--rtic-macros/ui/init-pub.stderr5
-rw-r--r--rtic-macros/ui/init-unsafe.rs7
-rw-r--r--rtic-macros/ui/init-unsafe.stderr5
-rw-r--r--rtic-macros/ui/interrupt-double.rs10
-rw-r--r--rtic-macros/ui/interrupt-double.stderr5
-rw-r--r--rtic-macros/ui/local-collision-2.rs18
-rw-r--r--rtic-macros/ui/local-collision-2.stderr17
-rw-r--r--rtic-macros/ui/local-collision.rs21
-rw-r--r--rtic-macros/ui/local-collision.stderr11
-rw-r--r--rtic-macros/ui/local-malformed-1.rs16
-rw-r--r--rtic-macros/ui/local-malformed-1.stderr5
-rw-r--r--rtic-macros/ui/local-malformed-2.rs16
-rw-r--r--rtic-macros/ui/local-malformed-2.stderr5
-rw-r--r--rtic-macros/ui/local-malformed-3.rs16
-rw-r--r--rtic-macros/ui/local-malformed-3.stderr5
-rw-r--r--rtic-macros/ui/local-malformed-4.rs16
-rw-r--r--rtic-macros/ui/local-malformed-4.stderr5
-rw-r--r--rtic-macros/ui/local-not-declared.rs16
-rw-r--r--rtic-macros/ui/local-not-declared.stderr5
-rw-r--r--rtic-macros/ui/local-pub.rs15
-rw-r--r--rtic-macros/ui/local-pub.stderr5
-rw-r--r--rtic-macros/ui/local-shared-attribute.rs21
-rw-r--r--rtic-macros/ui/local-shared-attribute.stderr6
-rw-r--r--rtic-macros/ui/local-shared.rs28
-rw-r--r--rtic-macros/ui/local-shared.stderr11
-rw-r--r--rtic-macros/ui/shared-lock-free.rs38
-rw-r--r--rtic-macros/ui/shared-lock-free.stderr17
-rw-r--r--rtic-macros/ui/shared-not-declared.rs16
-rw-r--r--rtic-macros/ui/shared-not-declared.stderr5
-rw-r--r--rtic-macros/ui/shared-pub.rs9
-rw-r--r--rtic-macros/ui/shared-pub.stderr5
-rw-r--r--rtic-macros/ui/task-divergent.rs9
-rw-r--r--rtic-macros/ui/task-divergent.stderr5
-rw-r--r--rtic-macros/ui/task-double-local.rs7
-rw-r--r--rtic-macros/ui/task-double-local.stderr5
-rw-r--r--rtic-macros/ui/task-double-priority.rs7
-rw-r--r--rtic-macros/ui/task-double-priority.stderr5
-rw-r--r--rtic-macros/ui/task-double-shared.rs7
-rw-r--r--rtic-macros/ui/task-double-shared.stderr5
-rw-r--r--rtic-macros/ui/task-idle.rs13
-rw-r--r--rtic-macros/ui/task-idle.stderr5
-rw-r--r--rtic-macros/ui/task-init.rs17
-rw-r--r--rtic-macros/ui/task-init.stderr5
-rw-r--r--rtic-macros/ui/task-interrupt.rs10
-rw-r--r--rtic-macros/ui/task-interrupt.stderr5
-rw-r--r--rtic-macros/ui/task-no-context.rs7
-rw-r--r--rtic-macros/ui/task-no-context.stderr5
-rw-r--r--rtic-macros/ui/task-priority-too-high.rs7
-rw-r--r--rtic-macros/ui/task-priority-too-high.stderr5
-rw-r--r--rtic-macros/ui/task-priority-too-low.rs7
-rw-r--r--rtic-macros/ui/task-priority-too-low.stderr5
-rw-r--r--rtic-macros/ui/task-pub.rs7
-rw-r--r--rtic-macros/ui/task-pub.stderr5
-rw-r--r--rtic-macros/ui/task-unsafe.rs7
-rw-r--r--rtic-macros/ui/task-unsafe.stderr5
-rw-r--r--rtic-macros/ui/task-zero-prio.rs19
-rw-r--r--rtic-macros/ui/task-zero-prio.stderr5
88 files changed, 805 insertions, 0 deletions
diff --git a/rtic-macros/ui/extern-interrupt-used.rs b/rtic-macros/ui/extern-interrupt-used.rs
new file mode 100644
index 0000000..6346a7d
--- /dev/null
+++ b/rtic-macros/ui/extern-interrupt-used.rs
@@ -0,0 +1,16 @@
+#![no_main]
+
+#[rtic_macros::mock_app(device = mock, dispatchers = [EXTI0])]
+mod app {
+ #[shared]
+ struct Shared {}
+
+ #[local]
+ struct Local {}
+
+ #[init]
+ fn init(_: init::Context) -> (Shared, Local) {}
+
+ #[task(binds = EXTI0)]
+ fn foo(_: foo::Context) {}
+}
diff --git a/rtic-macros/ui/extern-interrupt-used.stderr b/rtic-macros/ui/extern-interrupt-used.stderr
new file mode 100644
index 0000000..970d39b
--- /dev/null
+++ b/rtic-macros/ui/extern-interrupt-used.stderr
@@ -0,0 +1,5 @@
+error: dispatcher interrupts can't be used as hardware tasks
+ --> ui/extern-interrupt-used.rs:14:20
+ |
+14 | #[task(binds = EXTI0)]
+ | ^^^^^
diff --git a/rtic-macros/ui/idle-double-local.rs b/rtic-macros/ui/idle-double-local.rs
new file mode 100644
index 0000000..54e67d3
--- /dev/null
+++ b/rtic-macros/ui/idle-double-local.rs
@@ -0,0 +1,9 @@
+#![no_main]
+
+#[rtic_macros::mock_app(device = mock)]
+mod app {
+ #[idle(local = [A], local = [B])]
+ fn idle(_: idle::Context) -> ! {
+ loop {}
+ }
+}
diff --git a/rtic-macros/ui/idle-double-local.stderr b/rtic-macros/ui/idle-double-local.stderr
new file mode 100644
index 0000000..b558136
--- /dev/null
+++ b/rtic-macros/ui/idle-double-local.stderr
@@ -0,0 +1,5 @@
+error: argument appears more than once
+ --> ui/idle-double-local.rs:5:25
+ |
+5 | #[idle(local = [A], local = [B])]
+ | ^^^^^
diff --git a/rtic-macros/ui/idle-double-shared.rs b/rtic-macros/ui/idle-double-shared.rs
new file mode 100644
index 0000000..f66cb93
--- /dev/null
+++ b/rtic-macros/ui/idle-double-shared.rs
@@ -0,0 +1,9 @@
+#![no_main]
+
+#[rtic_macros::mock_app(device = mock)]
+mod app {
+ #[idle(shared = [A], shared = [B])]
+ fn idle(_: idle::Context) -> ! {
+ loop {}
+ }
+}
diff --git a/rtic-macros/ui/idle-double-shared.stderr b/rtic-macros/ui/idle-double-shared.stderr
new file mode 100644
index 0000000..6f62ad2
--- /dev/null
+++ b/rtic-macros/ui/idle-double-shared.stderr
@@ -0,0 +1,5 @@
+error: argument appears more than once
+ --> ui/idle-double-shared.rs:5:26
+ |
+5 | #[idle(shared = [A], shared = [B])]
+ | ^^^^^^
diff --git a/rtic-macros/ui/idle-input.rs b/rtic-macros/ui/idle-input.rs
new file mode 100644
index 0000000..c896b1c
--- /dev/null
+++ b/rtic-macros/ui/idle-input.rs
@@ -0,0 +1,9 @@
+#![no_main]
+
+#[rtic_macros::mock_app(device = mock)]
+mod app {
+ #[idle]
+ fn idle(_: idle::Context, _undef: u32) -> ! {
+ loop {}
+ }
+}
diff --git a/rtic-macros/ui/idle-input.stderr b/rtic-macros/ui/idle-input.stderr
new file mode 100644
index 0000000..34c38fc
--- /dev/null
+++ b/rtic-macros/ui/idle-input.stderr
@@ -0,0 +1,5 @@
+error: this `#[idle]` function must have signature `fn(idle::Context) -> !`
+ --> ui/idle-input.rs:6:8
+ |
+6 | fn idle(_: idle::Context, _undef: u32) -> ! {
+ | ^^^^
diff --git a/rtic-macros/ui/idle-no-context.rs b/rtic-macros/ui/idle-no-context.rs
new file mode 100644
index 0000000..bab4680
--- /dev/null
+++ b/rtic-macros/ui/idle-no-context.rs
@@ -0,0 +1,9 @@
+#![no_main]
+
+#[rtic_macros::mock_app(device = mock)]
+mod app {
+ #[idle]
+ fn idle() -> ! {
+ loop {}
+ }
+}
diff --git a/rtic-macros/ui/idle-no-context.stderr b/rtic-macros/ui/idle-no-context.stderr
new file mode 100644
index 0000000..c9f4b3d
--- /dev/null
+++ b/rtic-macros/ui/idle-no-context.stderr
@@ -0,0 +1,5 @@
+error: this `#[idle]` function must have signature `fn(idle::Context) -> !`
+ --> ui/idle-no-context.rs:6:8
+ |
+6 | fn idle() -> ! {
+ | ^^^^
diff --git a/rtic-macros/ui/idle-not-divergent.rs b/rtic-macros/ui/idle-not-divergent.rs
new file mode 100644
index 0000000..d1ae8b1
--- /dev/null
+++ b/rtic-macros/ui/idle-not-divergent.rs
@@ -0,0 +1,7 @@
+#![no_main]
+
+#[rtic_macros::mock_app(device = mock)]
+mod app {
+ #[idle]
+ fn idle(_: idle::Context) {}
+}
diff --git a/rtic-macros/ui/idle-not-divergent.stderr b/rtic-macros/ui/idle-not-divergent.stderr
new file mode 100644
index 0000000..e318f58
--- /dev/null
+++ b/rtic-macros/ui/idle-not-divergent.stderr
@@ -0,0 +1,5 @@
+error: this `#[idle]` function must have signature `fn(idle::Context) -> !`
+ --> ui/idle-not-divergent.rs:6:8
+ |
+6 | fn idle(_: idle::Context) {}
+ | ^^^^
diff --git a/rtic-macros/ui/idle-output.rs b/rtic-macros/ui/idle-output.rs
new file mode 100644
index 0000000..1662157
--- /dev/null
+++ b/rtic-macros/ui/idle-output.rs
@@ -0,0 +1,9 @@
+#![no_main]
+
+#[rtic_macros::mock_app(device = mock)]
+mod app {
+ #[idle]
+ fn idle(_: idle::Context) -> u32 {
+ 0
+ }
+}
diff --git a/rtic-macros/ui/idle-output.stderr b/rtic-macros/ui/idle-output.stderr
new file mode 100644
index 0000000..7070e25
--- /dev/null
+++ b/rtic-macros/ui/idle-output.stderr
@@ -0,0 +1,5 @@
+error: this `#[idle]` function must have signature `fn(idle::Context) -> !`
+ --> ui/idle-output.rs:6:8
+ |
+6 | fn idle(_: idle::Context) -> u32 {
+ | ^^^^
diff --git a/rtic-macros/ui/idle-pub.rs b/rtic-macros/ui/idle-pub.rs
new file mode 100644
index 0000000..0d8dd01
--- /dev/null
+++ b/rtic-macros/ui/idle-pub.rs
@@ -0,0 +1,9 @@
+#![no_main]
+
+#[rtic_macros::mock_app(device = mock)]
+mod app {
+ #[idle]
+ pub fn idle(_: idle::Context) -> ! {
+ loop {}
+ }
+}
diff --git a/rtic-macros/ui/idle-pub.stderr b/rtic-macros/ui/idle-pub.stderr
new file mode 100644
index 0000000..aa46ac3
--- /dev/null
+++ b/rtic-macros/ui/idle-pub.stderr
@@ -0,0 +1,5 @@
+error: this `#[idle]` function must have signature `fn(idle::Context) -> !`
+ --> ui/idle-pub.rs:6:12
+ |
+6 | pub fn idle(_: idle::Context) -> ! {
+ | ^^^^
diff --git a/rtic-macros/ui/idle-unsafe.rs b/rtic-macros/ui/idle-unsafe.rs
new file mode 100644
index 0000000..3422ef2
--- /dev/null
+++ b/rtic-macros/ui/idle-unsafe.rs
@@ -0,0 +1,9 @@
+#![no_main]
+
+#[rtic_macros::mock_app(device = mock)]
+mod app {
+ #[idle]
+ unsafe fn idle(_: idle::Context) -> ! {
+ loop {}
+ }
+}
diff --git a/rtic-macros/ui/idle-unsafe.stderr b/rtic-macros/ui/idle-unsafe.stderr
new file mode 100644
index 0000000..a416800
--- /dev/null
+++ b/rtic-macros/ui/idle-unsafe.stderr
@@ -0,0 +1,5 @@
+error: this `#[idle]` function must have signature `fn(idle::Context) -> !`
+ --> ui/idle-unsafe.rs:6:15
+ |
+6 | unsafe fn idle(_: idle::Context) -> ! {
+ | ^^^^
diff --git a/rtic-macros/ui/init-divergent.rs b/rtic-macros/ui/init-divergent.rs
new file mode 100644
index 0000000..5e4e96a
--- /dev/null
+++ b/rtic-macros/ui/init-divergent.rs
@@ -0,0 +1,13 @@
+#![no_main]
+
+#[rtic_macros::mock_app(device = mock)]
+mod app {
+ #[shared]
+ struct Shared {}
+
+ #[local]
+ struct Local {}
+
+ #[init]
+ fn init(_: init::Context) -> ! {}
+}
diff --git a/rtic-macros/ui/init-divergent.stderr b/rtic-macros/ui/init-divergent.stderr
new file mode 100644
index 0000000..9f6acf6
--- /dev/null
+++ b/rtic-macros/ui/init-divergent.stderr
@@ -0,0 +1,5 @@
+error: the `#[init]` function must have signature `fn(init::Context) -> (Shared resources struct, Local resources struct)`
+ --> ui/init-divergent.rs:12:8
+ |
+12 | fn init(_: init::Context) -> ! {}
+ | ^^^^
diff --git a/rtic-macros/ui/init-double-local.rs b/rtic-macros/ui/init-double-local.rs
new file mode 100644
index 0000000..5f6d7ac
--- /dev/null
+++ b/rtic-macros/ui/init-double-local.rs
@@ -0,0 +1,7 @@
+#![no_main]
+
+#[rtic_macros::mock_app(device = mock)]
+mod app {
+ #[init(local = [A], local = [B])]
+ fn init(_: init::Context) {}
+}
diff --git a/rtic-macros/ui/init-double-local.stderr b/rtic-macros/ui/init-double-local.stderr
new file mode 100644
index 0000000..07c3b50
--- /dev/null
+++ b/rtic-macros/ui/init-double-local.stderr
@@ -0,0 +1,5 @@
+error: argument appears more than once
+ --> ui/init-double-local.rs:5:25
+ |
+5 | #[init(local = [A], local = [B])]
+ | ^^^^^
diff --git a/rtic-macros/ui/init-double-shared.rs b/rtic-macros/ui/init-double-shared.rs
new file mode 100644
index 0000000..4503c87
--- /dev/null
+++ b/rtic-macros/ui/init-double-shared.rs
@@ -0,0 +1,7 @@
+#![no_main]
+
+#[rtic_macros::mock_app(device = mock)]
+mod app {
+ #[init(shared = [A], shared = [B])]
+ fn init(_: init::Context) {}
+}
diff --git a/rtic-macros/ui/init-double-shared.stderr b/rtic-macros/ui/init-double-shared.stderr
new file mode 100644
index 0000000..af2a97b
--- /dev/null
+++ b/rtic-macros/ui/init-double-shared.stderr
@@ -0,0 +1,5 @@
+error: unexpected argument
+ --> ui/init-double-shared.rs:5:12
+ |
+5 | #[init(shared = [A], shared = [B])]
+ | ^^^^^^
diff --git a/rtic-macros/ui/init-input.rs b/rtic-macros/ui/init-input.rs
new file mode 100644
index 0000000..d41a503
--- /dev/null
+++ b/rtic-macros/ui/init-input.rs
@@ -0,0 +1,13 @@
+#![no_main]
+
+#[rtic_macros::mock_app(device = mock)]
+mod app {
+ #[shared]
+ struct Shared {}
+
+ #[local]
+ struct Local {}
+
+ #[init]
+ fn init(_: init::Context, _undef: u32) -> (Shared, Local) {}
+}
diff --git a/rtic-macros/ui/init-input.stderr b/rtic-macros/ui/init-input.stderr
new file mode 100644
index 0000000..e236043
--- /dev/null
+++ b/rtic-macros/ui/init-input.stderr
@@ -0,0 +1,5 @@
+error: the `#[init]` function must have signature `fn(init::Context) -> (Shared resources struct, Local resources struct)`
+ --> ui/init-input.rs:12:8
+ |
+12 | fn init(_: init::Context, _undef: u32) -> (Shared, Local) {}
+ | ^^^^
diff --git a/rtic-macros/ui/init-no-context.rs b/rtic-macros/ui/init-no-context.rs
new file mode 100644
index 0000000..cdce4c5
--- /dev/null
+++ b/rtic-macros/ui/init-no-context.rs
@@ -0,0 +1,13 @@
+#![no_main]
+
+#[rtic_macros::mock_app(device = mock)]
+mod app {
+ #[shared]
+ struct Shared {}
+
+ #[local]
+ struct Local {}
+
+ #[init]
+ fn init() -> (Shared, Local) {}
+}
diff --git a/rtic-macros/ui/init-no-context.stderr b/rtic-macros/ui/init-no-context.stderr
new file mode 100644
index 0000000..28e1fd4
--- /dev/null
+++ b/rtic-macros/ui/init-no-context.stderr
@@ -0,0 +1,5 @@
+error: the `#[init]` function must have signature `fn(init::Context) -> (Shared resources struct, Local resources struct)`
+ --> ui/init-no-context.rs:12:8
+ |
+12 | fn init() -> (Shared, Local) {}
+ | ^^^^
diff --git a/rtic-macros/ui/init-output.rs b/rtic-macros/ui/init-output.rs
new file mode 100644
index 0000000..7057c95
--- /dev/null
+++ b/rtic-macros/ui/init-output.rs
@@ -0,0 +1,9 @@
+#![no_main]
+
+#[rtic_macros::mock_app(device = mock)]
+mod app {
+ #[init]
+ fn init(_: init::Context) -> u32 {
+ 0
+ }
+}
diff --git a/rtic-macros/ui/init-output.stderr b/rtic-macros/ui/init-output.stderr
new file mode 100644
index 0000000..8bc3c83
--- /dev/null
+++ b/rtic-macros/ui/init-output.stderr
@@ -0,0 +1,5 @@
+error: the `#[init]` function must have signature `fn(init::Context) -> (Shared resources struct, Local resources struct)`
+ --> ui/init-output.rs:6:8
+ |
+6 | fn init(_: init::Context) -> u32 {
+ | ^^^^
diff --git a/rtic-macros/ui/init-pub.rs b/rtic-macros/ui/init-pub.rs
new file mode 100644
index 0000000..dd59aa1
--- /dev/null
+++ b/rtic-macros/ui/init-pub.rs
@@ -0,0 +1,13 @@
+#![no_main]
+
+#[rtic_macros::mock_app(device = mock)]
+mod app {
+ #[shared]
+ struct Shared {}
+
+ #[local]
+ struct Local {}
+
+ #[init]
+ pub fn init(_: init::Context) -> (Shared, Local) {}
+}
diff --git a/rtic-macros/ui/init-pub.stderr b/rtic-macros/ui/init-pub.stderr
new file mode 100644
index 0000000..b1610ed
--- /dev/null
+++ b/rtic-macros/ui/init-pub.stderr
@@ -0,0 +1,5 @@
+error: the `#[init]` function must have signature `fn(init::Context) -> (Shared resources struct, Local resources struct)`
+ --> ui/init-pub.rs:12:12
+ |
+12 | pub fn init(_: init::Context) -> (Shared, Local) {}
+ | ^^^^
diff --git a/rtic-macros/ui/init-unsafe.rs b/rtic-macros/ui/init-unsafe.rs
new file mode 100644
index 0000000..4f89baf
--- /dev/null
+++ b/rtic-macros/ui/init-unsafe.rs
@@ -0,0 +1,7 @@
+#![no_main]
+
+#[rtic_macros::mock_app(device = mock)]
+mod app {
+ #[init]
+ unsafe fn init(_: init::Context) -> (Shared, Local) {}
+}
diff --git a/rtic-macros/ui/init-unsafe.stderr b/rtic-macros/ui/init-unsafe.stderr
new file mode 100644
index 0000000..fd0b8f3
--- /dev/null
+++ b/rtic-macros/ui/init-unsafe.stderr
@@ -0,0 +1,5 @@
+error: the `#[init]` function must have signature `fn(init::Context) -> (Shared resources struct, Local resources struct)`
+ --> ui/init-unsafe.rs:6:15
+ |
+6 | unsafe fn init(_: init::Context) -> (Shared, Local) {}
+ | ^^^^
diff --git a/rtic-macros/ui/interrupt-double.rs b/rtic-macros/ui/interrupt-double.rs
new file mode 100644
index 0000000..e2addc7
--- /dev/null
+++ b/rtic-macros/ui/interrupt-double.rs
@@ -0,0 +1,10 @@
+#![no_main]
+
+#[rtic_macros::mock_app(device = mock)]
+mod app {
+ #[task(binds = UART0)]
+ fn foo(_: foo::Context) {}
+
+ #[task(binds = UART0)]
+ fn bar(_: bar::Context) {}
+}
diff --git a/rtic-macros/ui/interrupt-double.stderr b/rtic-macros/ui/interrupt-double.stderr
new file mode 100644
index 0000000..8db34e2
--- /dev/null
+++ b/rtic-macros/ui/interrupt-double.stderr
@@ -0,0 +1,5 @@
+error: this interrupt is already bound
+ --> ui/interrupt-double.rs:8:20
+ |
+8 | #[task(binds = UART0)]
+ | ^^^^^
diff --git a/rtic-macros/ui/local-collision-2.rs b/rtic-macros/ui/local-collision-2.rs
new file mode 100644
index 0000000..08bc8e5
--- /dev/null
+++ b/rtic-macros/ui/local-collision-2.rs
@@ -0,0 +1,18 @@
+#![no_main]
+
+#[rtic_macros::mock_app(device = mock)]
+mod app {
+ #[shared]
+ struct Shared {}
+
+ #[local]
+ struct Local {
+ a: u32,
+ }
+
+ #[task(local = [a: u8 = 3])]
+ async fn bar(_: bar::Context) {}
+
+ #[init(local = [a: u16 = 2])]
+ fn init(_: init::Context) -> (Shared, Local) {}
+}
diff --git a/rtic-macros/ui/local-collision-2.stderr b/rtic-macros/ui/local-collision-2.stderr
new file mode 100644
index 0000000..47dbbe3
--- /dev/null
+++ b/rtic-macros/ui/local-collision-2.stderr
@@ -0,0 +1,17 @@
+error: Local resource "a" is used by multiple tasks or collides with multiple definitions
+ --> ui/local-collision-2.rs:10:9
+ |
+10 | a: u32,
+ | ^
+
+error: Local resource "a" is used by multiple tasks or collides with multiple definitions
+ --> ui/local-collision-2.rs:16:21
+ |
+16 | #[init(local = [a: u16 = 2])]
+ | ^
+
+error: Local resource "a" is used by multiple tasks or collides with multiple definitions
+ --> ui/local-collision-2.rs:13:21
+ |
+13 | #[task(local = [a: u8 = 3])]
+ | ^
diff --git a/rtic-macros/ui/local-collision.rs b/rtic-macros/ui/local-collision.rs
new file mode 100644
index 0000000..0e4eef7
--- /dev/null
+++ b/rtic-macros/ui/local-collision.rs
@@ -0,0 +1,21 @@
+#![no_main]
+
+#[rtic_macros::mock_app(device = mock)]
+mod app {
+ #[shared]
+ struct Shared {}
+
+ #[local]
+ struct Local {
+ a: u32,
+ }
+
+ #[task(local = [a])]
+ async fn foo(_: foo::Context) {}
+
+ #[task(local = [a: u8 = 3])]
+ async fn bar(_: bar::Context) {}
+
+ #[init]
+ fn init(_: init::Context) -> (Shared, Local) {}
+}
diff --git a/rtic-macros/ui/local-collision.stderr b/rtic-macros/ui/local-collision.stderr
new file mode 100644
index 0000000..47fbb6e
--- /dev/null
+++ b/rtic-macros/ui/local-collision.stderr
@@ -0,0 +1,11 @@
+error: Local resource "a" is used by multiple tasks or collides with multiple definitions
+ --> ui/local-collision.rs:10:9
+ |
+10 | a: u32,
+ | ^
+
+error: Local resource "a" is used by multiple tasks or collides with multiple definitions
+ --> ui/local-collision.rs:16:21
+ |
+16 | #[task(local = [a: u8 = 3])]
+ | ^
diff --git a/rtic-macros/ui/local-malformed-1.rs b/rtic-macros/ui/local-malformed-1.rs
new file mode 100644
index 0000000..219eef5
--- /dev/null
+++ b/rtic-macros/ui/local-malformed-1.rs
@@ -0,0 +1,16 @@
+#![no_main]
+
+#[rtic_macros::mock_app(device = mock)]
+mod app {
+ #[shared]
+ struct Shared {}
+
+ #[local]
+ struct Local {}
+
+ #[task(local = [a:])]
+ async fn foo(_: foo::Context) {}
+
+ #[init]
+ fn init(_: init::Context) -> (Shared, Local) {}
+}
diff --git a/rtic-macros/ui/local-malformed-1.stderr b/rtic-macros/ui/local-malformed-1.stderr
new file mode 100644
index 0000000..d15c324
--- /dev/null
+++ b/rtic-macros/ui/local-malformed-1.stderr
@@ -0,0 +1,5 @@
+error: unexpected end of input, expected one of: `for`, parentheses, `fn`, `unsafe`, `extern`, identifier, `::`, `<`, square brackets, `*`, `&`, `!`, `impl`, `_`, lifetime
+ --> ui/local-malformed-1.rs:11:23
+ |
+11 | #[task(local = [a:])]
+ | ^
diff --git a/rtic-macros/ui/local-malformed-2.rs b/rtic-macros/ui/local-malformed-2.rs
new file mode 100644
index 0000000..d691453
--- /dev/null
+++ b/rtic-macros/ui/local-malformed-2.rs
@@ -0,0 +1,16 @@
+#![no_main]
+
+#[rtic_macros::mock_app(device = mock)]
+mod app {
+ #[shared]
+ struct Shared {}
+
+ #[local]
+ struct Local {}
+
+ #[task(local = [a: u32])]
+ async fn foo(_: foo::Context) {}
+
+ #[init]
+ fn init(_: init::Context) -> (Shared, Local) {}
+}
diff --git a/rtic-macros/ui/local-malformed-2.stderr b/rtic-macros/ui/local-malformed-2.stderr
new file mode 100644
index 0000000..0b448f0
--- /dev/null
+++ b/rtic-macros/ui/local-malformed-2.stderr
@@ -0,0 +1,5 @@
+error: malformed, expected 'IDENT: TYPE = EXPR'
+ --> ui/local-malformed-2.rs:11:21
+ |
+11 | #[task(local = [a: u32])]
+ | ^^^^^^
diff --git a/rtic-macros/ui/local-malformed-3.rs b/rtic-macros/ui/local-malformed-3.rs
new file mode 100644
index 0000000..7eddfa4
--- /dev/null
+++ b/rtic-macros/ui/local-malformed-3.rs
@@ -0,0 +1,16 @@
+#![no_main]
+
+#[rtic_macros::mock_app(device = mock)]
+mod app {
+ #[shared]
+ struct Shared {}
+
+ #[local]
+ struct Local {}
+
+ #[task(local = [a: u32 =])]
+ async fn foo(_: foo::Context) {}
+
+ #[init]
+ fn init(_: init::Context) -> (Shared, Local) {}
+}
diff --git a/rtic-macros/ui/local-malformed-3.stderr b/rtic-macros/ui/local-malformed-3.stderr
new file mode 100644
index 0000000..61af4f3
--- /dev/null
+++ b/rtic-macros/ui/local-malformed-3.stderr
@@ -0,0 +1,5 @@
+error: unexpected end of input, expected expression
+ --> ui/local-malformed-3.rs:11:29
+ |
+11 | #[task(local = [a: u32 =])]
+ | ^
diff --git a/rtic-macros/ui/local-malformed-4.rs b/rtic-macros/ui/local-malformed-4.rs
new file mode 100644
index 0000000..b913947
--- /dev/null
+++ b/rtic-macros/ui/local-malformed-4.rs
@@ -0,0 +1,16 @@
+#![no_main]
+
+#[rtic_macros::mock_app(device = mock)]
+mod app {
+ #[shared]
+ struct Shared {}
+
+ #[local]
+ struct Local {}
+
+ #[task(local = [a = u32])]
+ async fn foo(_: foo::Context) {}
+
+ #[init]
+ fn init(_: init::Context) -> (Shared, Local) {}
+}
diff --git a/rtic-macros/ui/local-malformed-4.stderr b/rtic-macros/ui/local-malformed-4.stderr
new file mode 100644
index 0000000..0f7d9e7
--- /dev/null
+++ b/rtic-macros/ui/local-malformed-4.stderr
@@ -0,0 +1,5 @@
+error: malformed, expected a type
+ --> ui/local-malformed-4.rs:11:21
+ |
+11 | #[task(local = [a = u32])]
+ | ^
diff --git a/rtic-macros/ui/local-not-declared.rs b/rtic-macros/ui/local-not-declared.rs
new file mode 100644
index 0000000..7c087e4
--- /dev/null
+++ b/rtic-macros/ui/local-not-declared.rs
@@ -0,0 +1,16 @@
+#![no_main]
+
+#[rtic_macros::mock_app(device = mock)]
+mod app {
+ #[shared]
+ struct Shared {}
+
+ #[local]
+ struct Local {}
+
+ #[task(local = [A])]
+ async fn foo(_: foo::Context) {}
+
+ #[init]
+ fn init(_: init::Context) -> (Shared, Local) {}
+}
diff --git a/rtic-macros/ui/local-not-declared.stderr b/rtic-macros/ui/local-not-declared.stderr
new file mode 100644
index 0000000..10d4b04
--- /dev/null
+++ b/rtic-macros/ui/local-not-declared.stderr
@@ -0,0 +1,5 @@
+error: this local resource has NOT been declared
+ --> ui/local-not-declared.rs:11:21
+ |
+11 | #[task(local = [A])]
+ | ^
diff --git a/rtic-macros/ui/local-pub.rs b/rtic-macros/ui/local-pub.rs
new file mode 100644
index 0000000..42da4f4
--- /dev/null
+++ b/rtic-macros/ui/local-pub.rs
@@ -0,0 +1,15 @@
+#![no_main]
+
+#[rtic_macros::mock_app(device = mock)]
+mod app {
+ #[shared]
+ struct Shared {}
+
+ #[local]
+ struct Local {
+ pub x: u32,
+ }
+
+ #[init]
+ fn init(_: init::Context) -> (Shared, Local) {}
+}
diff --git a/rtic-macros/ui/local-pub.stderr b/rtic-macros/ui/local-pub.stderr
new file mode 100644
index 0000000..e4814ca
--- /dev/null
+++ b/rtic-macros/ui/local-pub.stderr
@@ -0,0 +1,5 @@
+error: this field must have inherited / private visibility
+ --> ui/local-pub.rs:10:13
+ |
+10 | pub x: u32,
+ | ^
diff --git a/rtic-macros/ui/local-shared-attribute.rs b/rtic-macros/ui/local-shared-attribute.rs
new file mode 100644
index 0000000..c594b5f
--- /dev/null
+++ b/rtic-macros/ui/local-shared-attribute.rs
@@ -0,0 +1,21 @@
+#![no_main]
+
+#[rtic_macros::mock_app(device = mock)]
+mod app {
+ #[shared]
+ struct Shared {}
+
+ #[local]
+ struct Local {}
+
+ #[init]
+ fn init(_: init::Context) -> (Shared, Local) {}
+
+ #[task(local = [
+ #[test]
+ a: u32 = 0, // Ok
+ #[test]
+ b, // Error
+ ])]
+ fn foo(_: foo::Context) {}
+}
diff --git a/rtic-macros/ui/local-shared-attribute.stderr b/rtic-macros/ui/local-shared-attribute.stderr
new file mode 100644
index 0000000..a8130e8
--- /dev/null
+++ b/rtic-macros/ui/local-shared-attribute.stderr
@@ -0,0 +1,6 @@
+error: attributes are not supported here
+ --> ui/local-shared-attribute.rs:17:9
+ |
+17 | / #[test]
+18 | | b, // Error
+ | |_________^
diff --git a/rtic-macros/ui/local-shared.rs b/rtic-macros/ui/local-shared.rs
new file mode 100644
index 0000000..4e8f9f4
--- /dev/null
+++ b/rtic-macros/ui/local-shared.rs
@@ -0,0 +1,28 @@
+#![no_main]
+
+#[rtic_macros::mock_app(device = mock)]
+mod app {
+ #[shared]
+ struct Shared {}
+
+ #[local]
+ struct Local {
+ l1: u32,
+ l2: u32,
+ }
+
+ #[init]
+ fn init(_: init::Context) -> (Shared, Local) {}
+
+ // l2 ok
+ #[idle(local = [l2])]
+ fn idle(cx: idle::Context) -> ! {}
+
+ // l1 rejected (not local)
+ #[task(priority = 1, local = [l1])]
+ async fn uart0(cx: uart0::Context) {}
+
+ // l1 rejected (not lock_free)
+ #[task(priority = 2, local = [l1])]
+ async fn uart1(cx: uart1::Context) {}
+}
diff --git a/rtic-macros/ui/local-shared.stderr b/rtic-macros/ui/local-shared.stderr
new file mode 100644
index 0000000..fceb763
--- /dev/null
+++ b/rtic-macros/ui/local-shared.stderr
@@ -0,0 +1,11 @@
+error: Local resource "l1" is used by multiple tasks or collides with multiple definitions
+ --> ui/local-shared.rs:22:35
+ |
+22 | #[task(priority = 1, local = [l1])]
+ | ^^
+
+error: Local resource "l1" is used by multiple tasks or collides with multiple definitions
+ --> ui/local-shared.rs:26:35
+ |
+26 | #[task(priority = 2, local = [l1])]
+ | ^^
diff --git a/rtic-macros/ui/shared-lock-free.rs b/rtic-macros/ui/shared-lock-free.rs
new file mode 100644
index 0000000..b3a4b9c
--- /dev/null
+++ b/rtic-macros/ui/shared-lock-free.rs
@@ -0,0 +1,38 @@
+#![no_main]
+
+#[rtic_macros::mock_app(device = mock)]
+mod app {
+ #[shared]
+ struct Shared {
+ // An exclusive, early resource
+ #[lock_free]
+ e1: u32,
+
+ // An exclusive, late resource
+ #[lock_free]
+ e2: u32,
+ }
+
+ #[local]
+ struct Local {}
+
+ #[init]
+ fn init(_: init::Context) -> (Shared, Local) {}
+
+ // e2 ok
+ #[idle(shared = [e2])]
+ fn idle(cx: idle::Context) -> ! {
+ debug::exit(debug::EXIT_SUCCESS);
+ loop {}
+ }
+
+ // e1 rejected (not lock_free)
+ #[task(binds = UART0, priority = 1, shared = [e1])]
+ fn uart0(cx: uart0::Context) {
+ *cx.resources.e1 += 10;
+ }
+
+ // e1 rejected (not lock_free)
+ #[task(binds = UART1, priority = 2, shared = [e1])]
+ fn uart1(cx: uart1::Context) {}
+}
diff --git a/rtic-macros/ui/shared-lock-free.stderr b/rtic-macros/ui/shared-lock-free.stderr
new file mode 100644
index 0000000..51e99a0
--- /dev/null
+++ b/rtic-macros/ui/shared-lock-free.stderr
@@ -0,0 +1,17 @@
+error: Lock free shared resource "e1" is used by tasks at different priorities
+ --> ui/shared-lock-free.rs:9:9
+ |
+9 | e1: u32,
+ | ^^
+
+error: Shared resource "e1" is declared lock free but used by tasks at different priorities
+ --> ui/shared-lock-free.rs:30:51
+ |
+30 | #[task(binds = UART0, priority = 1, shared = [e1])]
+ | ^^
+
+error: Shared resource "e1" is declared lock free but used by tasks at different priorities
+ --> ui/shared-lock-free.rs:36:51
+ |
+36 | #[task(binds = UART1, priority = 2, shared = [e1])]
+ | ^^
diff --git a/rtic-macros/ui/shared-not-declared.rs b/rtic-macros/ui/shared-not-declared.rs
new file mode 100644
index 0000000..5fef534
--- /dev/null
+++ b/rtic-macros/ui/shared-not-declared.rs
@@ -0,0 +1,16 @@
+#![no_main]
+
+#[rtic_macros::mock_app(device = mock)]
+mod app {
+ #[shared]
+ struct Shared {}
+
+ #[local]
+ struct Local {}
+
+ #[task(shared = [A])]
+ async fn foo(_: foo::Context) {}
+
+ #[init]
+ fn init(_: init::Context) -> (Shared, Local) {}
+}
diff --git a/rtic-macros/ui/shared-not-declared.stderr b/rtic-macros/ui/shared-not-declared.stderr
new file mode 100644
index 0000000..7c5fb32
--- /dev/null
+++ b/rtic-macros/ui/shared-not-declared.stderr
@@ -0,0 +1,5 @@
+error: this shared resource has NOT been declared
+ --> ui/shared-not-declared.rs:11:22
+ |
+11 | #[task(shared = [A])]
+ | ^
diff --git a/rtic-macros/ui/shared-pub.rs b/rtic-macros/ui/shared-pub.rs
new file mode 100644
index 0000000..10351fd
--- /dev/null
+++ b/rtic-macros/ui/shared-pub.rs
@@ -0,0 +1,9 @@
+#![no_main]
+
+#[rtic_macros::mock_app(device = mock)]
+mod app {
+ #[shared]
+ struct Shared {
+ pub x: u32,
+ }
+}
diff --git a/rtic-macros/ui/shared-pub.stderr b/rtic-macros/ui/shared-pub.stderr
new file mode 100644
index 0000000..7148893
--- /dev/null
+++ b/rtic-macros/ui/shared-pub.stderr
@@ -0,0 +1,5 @@
+error: this field must have inherited / private visibility
+ --> ui/shared-pub.rs:7:13
+ |
+7 | pub x: u32,
+ | ^
diff --git a/rtic-macros/ui/task-divergent.rs b/rtic-macros/ui/task-divergent.rs
new file mode 100644
index 0000000..ffe2dc0
--- /dev/null
+++ b/rtic-macros/ui/task-divergent.rs
@@ -0,0 +1,9 @@
+#![no_main]
+
+#[rtic_macros::mock_app(device = mock)]
+mod app {
+ #[task]
+ async fn foo(_: foo::Context) -> ! {
+ loop {}
+ }
+}
diff --git a/rtic-macros/ui/task-divergent.stderr b/rtic-macros/ui/task-divergent.stderr
new file mode 100644
index 0000000..dd00208
--- /dev/null
+++ b/rtic-macros/ui/task-divergent.stderr
@@ -0,0 +1,5 @@
+error: this task handler must have type signature `async fn(foo::Context, ..)`
+ --> ui/task-divergent.rs:6:14
+ |
+6 | async fn foo(_: foo::Context) -> ! {
+ | ^^^
diff --git a/rtic-macros/ui/task-double-local.rs b/rtic-macros/ui/task-double-local.rs
new file mode 100644
index 0000000..c5277e2
--- /dev/null
+++ b/rtic-macros/ui/task-double-local.rs
@@ -0,0 +1,7 @@
+#![no_main]
+
+#[rtic_macros::mock_app(device = mock)]
+mod app {
+ #[task(local = [A], local = [B])]
+ async fn foo(_: foo::Context) {}
+}
diff --git a/rtic-macros/ui/task-double-local.stderr b/rtic-macros/ui/task-double-local.stderr
new file mode 100644
index 0000000..91ed844
--- /dev/null
+++ b/rtic-macros/ui/task-double-local.stderr
@@ -0,0 +1,5 @@
+error: argument appears more than once
+ --> ui/task-double-local.rs:5:25
+ |
+5 | #[task(local = [A], local = [B])]
+ | ^^^^^
diff --git a/rtic-macros/ui/task-double-priority.rs b/rtic-macros/ui/task-double-priority.rs
new file mode 100644
index 0000000..5c8bd5b
--- /dev/null
+++ b/rtic-macros/ui/task-double-priority.rs
@@ -0,0 +1,7 @@
+#![no_main]
+
+#[rtic_macros::mock_app(device = mock)]
+mod app {
+ #[task(priority = 1, priority = 2)]
+ async fn foo(_: foo::Context) {}
+}
diff --git a/rtic-macros/ui/task-double-priority.stderr b/rtic-macros/ui/task-double-priority.stderr
new file mode 100644
index 0000000..b3c814a
--- /dev/null
+++ b/rtic-macros/ui/task-double-priority.stderr
@@ -0,0 +1,5 @@
+error: argument appears more than once
+ --> ui/task-double-priority.rs:5:26
+ |
+5 | #[task(priority = 1, priority = 2)]
+ | ^^^^^^^^
diff --git a/rtic-macros/ui/task-double-shared.rs b/rtic-macros/ui/task-double-shared.rs
new file mode 100644
index 0000000..f9812d3
--- /dev/null
+++ b/rtic-macros/ui/task-double-shared.rs
@@ -0,0 +1,7 @@
+#![no_main]
+
+#[rtic_macros::mock_app(device = mock)]
+mod app {
+ #[task(shared = [A], shared = [B])]
+ async fn foo(_: foo::Context) {}
+}
diff --git a/rtic-macros/ui/task-double-shared.stderr b/rtic-macros/ui/task-double-shared.stderr
new file mode 100644
index 0000000..bb90212
--- /dev/null
+++ b/rtic-macros/ui/task-double-shared.stderr
@@ -0,0 +1,5 @@
+error: argument appears more than once
+ --> ui/task-double-shared.rs:5:26
+ |
+5 | #[task(shared = [A], shared = [B])]
+ | ^^^^^^
diff --git a/rtic-macros/ui/task-idle.rs b/rtic-macros/ui/task-idle.rs
new file mode 100644
index 0000000..353c782
--- /dev/null
+++ b/rtic-macros/ui/task-idle.rs
@@ -0,0 +1,13 @@
+#![no_main]
+
+#[rtic_macros::mock_app(device = mock)]
+mod app {
+ #[idle]
+ fn foo(_: foo::Context) -> ! {
+ loop {}
+ }
+
+ // name collides with `#[idle]` function
+ #[task]
+ async fn foo(_: foo::Context) {}
+}
diff --git a/rtic-macros/ui/task-idle.stderr b/rtic-macros/ui/task-idle.stderr
new file mode 100644
index 0000000..4ccc113
--- /dev/null
+++ b/rtic-macros/ui/task-idle.stderr
@@ -0,0 +1,5 @@
+error: this identifier has already been used
+ --> ui/task-idle.rs:12:14
+ |
+12 | async fn foo(_: foo::Context) {}
+ | ^^^
diff --git a/rtic-macros/ui/task-init.rs b/rtic-macros/ui/task-init.rs
new file mode 100644
index 0000000..e58fdce
--- /dev/null
+++ b/rtic-macros/ui/task-init.rs
@@ -0,0 +1,17 @@
+#![no_main]
+
+#[rtic_macros::mock_app(device = mock)]
+mod app {
+ #[shared]
+ struct Shared {}
+
+ #[local]
+ struct Local {}
+
+ #[init]
+ fn foo(_: foo::Context) -> (Shared, Local) {}
+
+ // name collides with `#[idle]` function
+ #[task]
+ async fn foo(_: foo::Context) {}
+}
diff --git a/rtic-macros/ui/task-init.stderr b/rtic-macros/ui/task-init.stderr
new file mode 100644
index 0000000..161e194
--- /dev/null
+++ b/rtic-macros/ui/task-init.stderr
@@ -0,0 +1,5 @@
+error: this identifier has already been used
+ --> ui/task-init.rs:16:14
+ |
+16 | async fn foo(_: foo::Context) {}
+ | ^^^
diff --git a/rtic-macros/ui/task-interrupt.rs b/rtic-macros/ui/task-interrupt.rs
new file mode 100644
index 0000000..3d50bd8
--- /dev/null
+++ b/rtic-macros/ui/task-interrupt.rs
@@ -0,0 +1,10 @@
+#![no_main]
+
+#[rtic_macros::mock_app(device = mock)]
+mod app {
+ #[task(binds = SysTick)]
+ fn foo(_: foo::Context) {}
+
+ #[task]
+ async fn foo(_: foo::Context) {}
+}
diff --git a/rtic-macros/ui/task-interrupt.stderr b/rtic-macros/ui/task-interrupt.stderr
new file mode 100644
index 0000000..087b6c6
--- /dev/null
+++ b/rtic-macros/ui/task-interrupt.stderr
@@ -0,0 +1,5 @@
+error: this task is defined multiple times
+ --> ui/task-interrupt.rs:9:14
+ |
+9 | async fn foo(_: foo::Context) {}
+ | ^^^
diff --git a/rtic-macros/ui/task-no-context.rs b/rtic-macros/ui/task-no-context.rs
new file mode 100644
index 0000000..55e8c3b
--- /dev/null
+++ b/rtic-macros/ui/task-no-context.rs
@@ -0,0 +1,7 @@
+#![no_main]
+
+#[rtic_macros::mock_app(device = mock)]
+mod app {
+ #[task]
+ async fn foo() {}
+}
diff --git a/rtic-macros/ui/task-no-context.stderr b/rtic-macros/ui/task-no-context.stderr
new file mode 100644
index 0000000..62147aa
--- /dev/null
+++ b/rtic-macros/ui/task-no-context.stderr
@@ -0,0 +1,5 @@
+error: this task handler must have type signature `async fn(foo::Context, ..)`
+ --> ui/task-no-context.rs:6:14
+ |
+6 | async fn foo() {}
+ | ^^^
diff --git a/rtic-macros/ui/task-priority-too-high.rs b/rtic-macros/ui/task-priority-too-high.rs
new file mode 100644
index 0000000..f33ba56
--- /dev/null
+++ b/rtic-macros/ui/task-priority-too-high.rs
@@ -0,0 +1,7 @@
+#![no_main]
+
+#[rtic_macros::mock_app(device = mock)]
+mod app {
+ #[task(priority = 256)]
+ async fn foo(_: foo::Context) {}
+}
diff --git a/rtic-macros/ui/task-priority-too-high.stderr b/rtic-macros/ui/task-priority-too-high.stderr
new file mode 100644
index 0000000..5790c88
--- /dev/null
+++ b/rtic-macros/ui/task-priority-too-high.stderr
@@ -0,0 +1,5 @@
+error: this literal must be in the range 0...255
+ --> ui/task-priority-too-high.rs:5:23
+ |
+5 | #[task(priority = 256)]
+ | ^^^
diff --git a/rtic-macros/ui/task-priority-too-low.rs b/rtic-macros/ui/task-priority-too-low.rs
new file mode 100644
index 0000000..16e0557
--- /dev/null
+++ b/rtic-macros/ui/task-priority-too-low.rs
@@ -0,0 +1,7 @@
+#![no_main]
+
+#[rtic_macros::mock_app(device = mock)]
+mod app {
+ #[task(binds = UART0, priority = 0)]
+ fn foo(_: foo::Context) {}
+}
diff --git a/rtic-macros/ui/task-priority-too-low.stderr b/rtic-macros/ui/task-priority-too-low.stderr
new file mode 100644
index 0000000..85c8660
--- /dev/null
+++ b/rtic-macros/ui/task-priority-too-low.stderr
@@ -0,0 +1,5 @@
+error: hardware tasks are not allowed to be at priority 0
+ --> ui/task-priority-too-low.rs:5:38
+ |
+5 | #[task(binds = UART0, priority = 0)]
+ | ^
diff --git a/rtic-macros/ui/task-pub.rs b/rtic-macros/ui/task-pub.rs
new file mode 100644
index 0000000..1ae533f
--- /dev/null
+++ b/rtic-macros/ui/task-pub.rs
@@ -0,0 +1,7 @@
+#![no_main]
+
+#[rtic_macros::mock_app(device = mock)]
+mod app {
+ #[task]
+ pub async fn foo(_: foo::Context) {}
+}
diff --git a/rtic-macros/ui/task-pub.stderr b/rtic-macros/ui/task-pub.stderr
new file mode 100644
index 0000000..7b9813d
--- /dev/null
+++ b/rtic-macros/ui/task-pub.stderr
@@ -0,0 +1,5 @@
+error: this task handler must have type signature `async fn(foo::Context, ..)`
+ --> ui/task-pub.rs:6:18
+ |
+6 | pub async fn foo(_: foo::Context) {}
+ | ^^^
diff --git a/rtic-macros/ui/task-unsafe.rs b/rtic-macros/ui/task-unsafe.rs
new file mode 100644
index 0000000..a8383ef
--- /dev/null
+++ b/rtic-macros/ui/task-unsafe.rs
@@ -0,0 +1,7 @@
+#![no_main]
+
+#[rtic_macros::mock_app(device = mock)]
+mod app {
+ #[task]
+ async unsafe fn foo(_: foo::Context) {}
+}
diff --git a/rtic-macros/ui/task-unsafe.stderr b/rtic-macros/ui/task-unsafe.stderr
new file mode 100644
index 0000000..90ac76f
--- /dev/null
+++ b/rtic-macros/ui/task-unsafe.stderr
@@ -0,0 +1,5 @@
+error: this task handler must have type signature `async fn(foo::Context, ..)`
+ --> ui/task-unsafe.rs:6:21
+ |
+6 | async unsafe fn foo(_: foo::Context) {}
+ | ^^^
diff --git a/rtic-macros/ui/task-zero-prio.rs b/rtic-macros/ui/task-zero-prio.rs
new file mode 100644
index 0000000..de3c86f
--- /dev/null
+++ b/rtic-macros/ui/task-zero-prio.rs
@@ -0,0 +1,19 @@
+#![no_main]
+
+#[rtic_macros::mock_app(device = mock)]
+mod app {
+ #[shared]
+ struct Shared {}
+
+ #[local]
+ struct Local {}
+
+ #[init]
+ fn init(_: init::Context) -> (Shared, Local) {}
+
+ #[task(priority = 0)]
+ fn foo(_: foo::Context) {}
+
+ #[idle]
+ fn idle(_: idle::Context) -> ! {}
+}
diff --git a/rtic-macros/ui/task-zero-prio.stderr b/rtic-macros/ui/task-zero-prio.stderr
new file mode 100644
index 0000000..1ab9aab
--- /dev/null
+++ b/rtic-macros/ui/task-zero-prio.stderr
@@ -0,0 +1,5 @@
+error: this task handler must have type signature `async fn(foo::Context, ..)`
+ --> ui/task-zero-prio.rs:15:8
+ |
+15 | fn foo(_: foo::Context) {}
+ | ^^^