aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDario Nieuwenhuis <[email protected]>2024-10-20 23:48:58 +0200
committerDario Nieuwenhuis <[email protected]>2024-10-20 23:54:17 +0200
commit8f9826872332fb0d2abd3ffc3889ff4c0e1c3909 (patch)
treecb9672e8a39c563fb53b1c5f7519bbc0eaa0b503
parentf0de0493084759a5e7310c816919996b201f0bc4 (diff)
executor: add compile-fail / ui tests.
-rwxr-xr-x.github/ci/test-nightly.sh3
-rwxr-xr-x.github/ci/test.sh1
-rw-r--r--embassy-executor/Cargo.toml2
-rw-r--r--embassy-executor/tests/ui.rs23
-rw-r--r--embassy-executor/tests/ui/abi.rs8
-rw-r--r--embassy-executor/tests/ui/abi.stderr5
-rw-r--r--embassy-executor/tests/ui/bad_return.rs10
-rw-r--r--embassy-executor/tests/ui/bad_return.stderr5
-rw-r--r--embassy-executor/tests/ui/generics.rs8
-rw-r--r--embassy-executor/tests/ui/generics.stderr5
-rw-r--r--embassy-executor/tests/ui/impl_trait.rs6
-rw-r--r--embassy-executor/tests/ui/impl_trait.stderr5
-rw-r--r--embassy-executor/tests/ui/impl_trait_nested.rs8
-rw-r--r--embassy-executor/tests/ui/impl_trait_nested.stderr5
-rw-r--r--embassy-executor/tests/ui/impl_trait_static.rs6
-rw-r--r--embassy-executor/tests/ui/impl_trait_static.stderr5
-rw-r--r--embassy-executor/tests/ui/nonstatic_ref_anon.rs6
-rw-r--r--embassy-executor/tests/ui/nonstatic_ref_anon.stderr5
-rw-r--r--embassy-executor/tests/ui/nonstatic_ref_anon_nested.rs6
-rw-r--r--embassy-executor/tests/ui/nonstatic_ref_anon_nested.stderr5
-rw-r--r--embassy-executor/tests/ui/nonstatic_ref_elided.rs6
-rw-r--r--embassy-executor/tests/ui/nonstatic_ref_elided.stderr5
-rw-r--r--embassy-executor/tests/ui/nonstatic_ref_generic.rs6
-rw-r--r--embassy-executor/tests/ui/nonstatic_ref_generic.stderr11
-rw-r--r--embassy-executor/tests/ui/nonstatic_struct_anon.rs8
-rw-r--r--embassy-executor/tests/ui/nonstatic_struct_anon.stderr5
-rw-r--r--embassy-executor/tests/ui/nonstatic_struct_elided.rs8
-rw-r--r--embassy-executor/tests/ui/nonstatic_struct_elided.stderr10
-rw-r--r--embassy-executor/tests/ui/nonstatic_struct_generic.rs8
-rw-r--r--embassy-executor/tests/ui/nonstatic_struct_generic.stderr11
-rw-r--r--embassy-executor/tests/ui/not_async.rs8
-rw-r--r--embassy-executor/tests/ui/not_async.stderr5
-rw-r--r--embassy-executor/tests/ui/self.rs8
-rw-r--r--embassy-executor/tests/ui/self.stderr13
-rw-r--r--embassy-executor/tests/ui/self_ref.rs8
-rw-r--r--embassy-executor/tests/ui/self_ref.stderr13
-rw-r--r--embassy-executor/tests/ui/where_clause.rs12
-rw-r--r--embassy-executor/tests/ui/where_clause.stderr7
38 files changed, 278 insertions, 1 deletions
diff --git a/.github/ci/test-nightly.sh b/.github/ci/test-nightly.sh
index 1724ffe89..a03b55e8d 100755
--- a/.github/ci/test-nightly.sh
+++ b/.github/ci/test-nightly.sh
@@ -9,6 +9,9 @@ export CARGO_HOME=/ci/cache/cargo
9export CARGO_TARGET_DIR=/ci/cache/target 9export CARGO_TARGET_DIR=/ci/cache/target
10mv rust-toolchain-nightly.toml rust-toolchain.toml 10mv rust-toolchain-nightly.toml rust-toolchain.toml
11 11
12cargo test --manifest-path ./embassy-executor/Cargo.toml
13cargo test --manifest-path ./embassy-executor/Cargo.toml --features nightly
14
12MIRIFLAGS=-Zmiri-ignore-leaks cargo miri test --manifest-path ./embassy-executor/Cargo.toml 15MIRIFLAGS=-Zmiri-ignore-leaks cargo miri test --manifest-path ./embassy-executor/Cargo.toml
13MIRIFLAGS=-Zmiri-ignore-leaks cargo miri test --manifest-path ./embassy-executor/Cargo.toml --features nightly 16MIRIFLAGS=-Zmiri-ignore-leaks cargo miri test --manifest-path ./embassy-executor/Cargo.toml --features nightly
14MIRIFLAGS=-Zmiri-ignore-leaks cargo miri test --manifest-path ./embassy-sync/Cargo.toml 17MIRIFLAGS=-Zmiri-ignore-leaks cargo miri test --manifest-path ./embassy-sync/Cargo.toml
diff --git a/.github/ci/test.sh b/.github/ci/test.sh
index 0de265049..0fe088bfe 100755
--- a/.github/ci/test.sh
+++ b/.github/ci/test.sh
@@ -12,6 +12,7 @@ export CARGO_TARGET_DIR=/ci/cache/target
12# used when pointing stm32-metapac to a CI-built one. 12# used when pointing stm32-metapac to a CI-built one.
13export CARGO_NET_GIT_FETCH_WITH_CLI=true 13export CARGO_NET_GIT_FETCH_WITH_CLI=true
14 14
15cargo test --manifest-path ./embassy-executor/Cargo.toml
15cargo test --manifest-path ./embassy-futures/Cargo.toml 16cargo test --manifest-path ./embassy-futures/Cargo.toml
16cargo test --manifest-path ./embassy-sync/Cargo.toml 17cargo test --manifest-path ./embassy-sync/Cargo.toml
17cargo test --manifest-path ./embassy-embedded-hal/Cargo.toml 18cargo test --manifest-path ./embassy-embedded-hal/Cargo.toml
diff --git a/embassy-executor/Cargo.toml b/embassy-executor/Cargo.toml
index e2fedce3c..e138f93b0 100644
--- a/embassy-executor/Cargo.toml
+++ b/embassy-executor/Cargo.toml
@@ -55,7 +55,7 @@ avr-device = { version = "0.5.3", optional = true }
55 55
56[dev-dependencies] 56[dev-dependencies]
57critical-section = { version = "1.1", features = ["std"] } 57critical-section = { version = "1.1", features = ["std"] }
58 58trybuild = "1.0"
59 59
60[features] 60[features]
61 61
diff --git a/embassy-executor/tests/ui.rs b/embassy-executor/tests/ui.rs
new file mode 100644
index 000000000..be4679485
--- /dev/null
+++ b/embassy-executor/tests/ui.rs
@@ -0,0 +1,23 @@
1#[cfg(not(miri))]
2#[test]
3fn ui() {
4 let t = trybuild::TestCases::new();
5 t.compile_fail("tests/ui/abi.rs");
6 t.compile_fail("tests/ui/bad_return.rs");
7 t.compile_fail("tests/ui/generics.rs");
8 t.compile_fail("tests/ui/impl_trait_nested.rs");
9 t.compile_fail("tests/ui/impl_trait.rs");
10 t.compile_fail("tests/ui/impl_trait_static.rs");
11 t.compile_fail("tests/ui/nonstatic_ref_anon_nested.rs");
12 t.compile_fail("tests/ui/nonstatic_ref_anon.rs");
13 t.compile_fail("tests/ui/nonstatic_ref_elided.rs");
14 t.compile_fail("tests/ui/nonstatic_ref_generic.rs");
15 t.compile_fail("tests/ui/nonstatic_struct_anon.rs");
16 #[cfg(not(feature = "nightly"))] // we can't catch this case with the macro, so the output changes on nightly.
17 t.compile_fail("tests/ui/nonstatic_struct_elided.rs");
18 t.compile_fail("tests/ui/nonstatic_struct_generic.rs");
19 t.compile_fail("tests/ui/not_async.rs");
20 t.compile_fail("tests/ui/self_ref.rs");
21 t.compile_fail("tests/ui/self.rs");
22 t.compile_fail("tests/ui/where_clause.rs");
23}
diff --git a/embassy-executor/tests/ui/abi.rs b/embassy-executor/tests/ui/abi.rs
new file mode 100644
index 000000000..fd52f7e41
--- /dev/null
+++ b/embassy-executor/tests/ui/abi.rs
@@ -0,0 +1,8 @@
1#![cfg_attr(feature = "nightly", feature(impl_trait_in_assoc_type))]
2
3struct Foo<'a>(&'a ());
4
5#[embassy_executor::task]
6async extern "C" fn task() {}
7
8fn main() {}
diff --git a/embassy-executor/tests/ui/abi.stderr b/embassy-executor/tests/ui/abi.stderr
new file mode 100644
index 000000000..e264e371a
--- /dev/null
+++ b/embassy-executor/tests/ui/abi.stderr
@@ -0,0 +1,5 @@
1error: task functions must not have an ABI qualifier
2 --> tests/ui/abi.rs:6:1
3 |
46 | async extern "C" fn task() {}
5 | ^^^^^^^^^^^^^^^^^^^^^^^^^^
diff --git a/embassy-executor/tests/ui/bad_return.rs b/embassy-executor/tests/ui/bad_return.rs
new file mode 100644
index 000000000..f09a5205b
--- /dev/null
+++ b/embassy-executor/tests/ui/bad_return.rs
@@ -0,0 +1,10 @@
1#![cfg_attr(feature = "nightly", feature(impl_trait_in_assoc_type))]
2
3struct Foo<'a>(&'a ());
4
5#[embassy_executor::task]
6async fn task() -> u32 {
7 5
8}
9
10fn main() {}
diff --git a/embassy-executor/tests/ui/bad_return.stderr b/embassy-executor/tests/ui/bad_return.stderr
new file mode 100644
index 000000000..e9d94dff8
--- /dev/null
+++ b/embassy-executor/tests/ui/bad_return.stderr
@@ -0,0 +1,5 @@
1error: task functions must either not return a value, return `()` or return `!`
2 --> tests/ui/bad_return.rs:6:1
3 |
46 | async fn task() -> u32 {
5 | ^^^^^^^^^^^^^^^^^^^^^^
diff --git a/embassy-executor/tests/ui/generics.rs b/embassy-executor/tests/ui/generics.rs
new file mode 100644
index 000000000..b83123bb1
--- /dev/null
+++ b/embassy-executor/tests/ui/generics.rs
@@ -0,0 +1,8 @@
1#![cfg_attr(feature = "nightly", feature(impl_trait_in_assoc_type))]
2
3struct Foo<'a>(&'a ());
4
5#[embassy_executor::task]
6async fn task<T: Sized>(_t: T) {}
7
8fn main() {}
diff --git a/embassy-executor/tests/ui/generics.stderr b/embassy-executor/tests/ui/generics.stderr
new file mode 100644
index 000000000..197719a7b
--- /dev/null
+++ b/embassy-executor/tests/ui/generics.stderr
@@ -0,0 +1,5 @@
1error: task functions must not be generic
2 --> tests/ui/generics.rs:6:1
3 |
46 | async fn task<T: Sized>(_t: T) {}
5 | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
diff --git a/embassy-executor/tests/ui/impl_trait.rs b/embassy-executor/tests/ui/impl_trait.rs
new file mode 100644
index 000000000..a21402aa0
--- /dev/null
+++ b/embassy-executor/tests/ui/impl_trait.rs
@@ -0,0 +1,6 @@
1#![cfg_attr(feature = "nightly", feature(impl_trait_in_assoc_type))]
2
3#[embassy_executor::task]
4async fn foo(_x: impl Sized) {}
5
6fn main() {}
diff --git a/embassy-executor/tests/ui/impl_trait.stderr b/embassy-executor/tests/ui/impl_trait.stderr
new file mode 100644
index 000000000..099b1828f
--- /dev/null
+++ b/embassy-executor/tests/ui/impl_trait.stderr
@@ -0,0 +1,5 @@
1error: `impl Trait` is not allowed in task arguments. It is syntax sugar for generics, and tasks can't be generic.
2 --> tests/ui/impl_trait.rs:4:18
3 |
44 | async fn foo(_x: impl Sized) {}
5 | ^^^^^^^^^^
diff --git a/embassy-executor/tests/ui/impl_trait_nested.rs b/embassy-executor/tests/ui/impl_trait_nested.rs
new file mode 100644
index 000000000..07442b8fa
--- /dev/null
+++ b/embassy-executor/tests/ui/impl_trait_nested.rs
@@ -0,0 +1,8 @@
1#![cfg_attr(feature = "nightly", feature(impl_trait_in_assoc_type))]
2
3struct Foo<T>(T);
4
5#[embassy_executor::task]
6async fn foo(_x: Foo<impl Sized + 'static>) {}
7
8fn main() {}
diff --git a/embassy-executor/tests/ui/impl_trait_nested.stderr b/embassy-executor/tests/ui/impl_trait_nested.stderr
new file mode 100644
index 000000000..39592f958
--- /dev/null
+++ b/embassy-executor/tests/ui/impl_trait_nested.stderr
@@ -0,0 +1,5 @@
1error: `impl Trait` is not allowed in task arguments. It is syntax sugar for generics, and tasks can't be generic.
2 --> tests/ui/impl_trait_nested.rs:6:22
3 |
46 | async fn foo(_x: Foo<impl Sized + 'static>) {}
5 | ^^^^^^^^^^^^^^^^^^^^
diff --git a/embassy-executor/tests/ui/impl_trait_static.rs b/embassy-executor/tests/ui/impl_trait_static.rs
new file mode 100644
index 000000000..272470f98
--- /dev/null
+++ b/embassy-executor/tests/ui/impl_trait_static.rs
@@ -0,0 +1,6 @@
1#![cfg_attr(feature = "nightly", feature(impl_trait_in_assoc_type))]
2
3#[embassy_executor::task]
4async fn foo(_x: impl Sized + 'static) {}
5
6fn main() {}
diff --git a/embassy-executor/tests/ui/impl_trait_static.stderr b/embassy-executor/tests/ui/impl_trait_static.stderr
new file mode 100644
index 000000000..0032a20c9
--- /dev/null
+++ b/embassy-executor/tests/ui/impl_trait_static.stderr
@@ -0,0 +1,5 @@
1error: `impl Trait` is not allowed in task arguments. It is syntax sugar for generics, and tasks can't be generic.
2 --> tests/ui/impl_trait_static.rs:4:18
3 |
44 | async fn foo(_x: impl Sized + 'static) {}
5 | ^^^^^^^^^^^^^^^^^^^^
diff --git a/embassy-executor/tests/ui/nonstatic_ref_anon.rs b/embassy-executor/tests/ui/nonstatic_ref_anon.rs
new file mode 100644
index 000000000..417c360a1
--- /dev/null
+++ b/embassy-executor/tests/ui/nonstatic_ref_anon.rs
@@ -0,0 +1,6 @@
1#![cfg_attr(feature = "nightly", feature(impl_trait_in_assoc_type))]
2
3#[embassy_executor::task]
4async fn foo(_x: &'_ u32) {}
5
6fn main() {}
diff --git a/embassy-executor/tests/ui/nonstatic_ref_anon.stderr b/embassy-executor/tests/ui/nonstatic_ref_anon.stderr
new file mode 100644
index 000000000..0544de843
--- /dev/null
+++ b/embassy-executor/tests/ui/nonstatic_ref_anon.stderr
@@ -0,0 +1,5 @@
1error: Arguments for tasks must live forever. Try using the `'static` lifetime.
2 --> tests/ui/nonstatic_ref_anon.rs:4:19
3 |
44 | async fn foo(_x: &'_ u32) {}
5 | ^^
diff --git a/embassy-executor/tests/ui/nonstatic_ref_anon_nested.rs b/embassy-executor/tests/ui/nonstatic_ref_anon_nested.rs
new file mode 100644
index 000000000..175ebccc1
--- /dev/null
+++ b/embassy-executor/tests/ui/nonstatic_ref_anon_nested.rs
@@ -0,0 +1,6 @@
1#![cfg_attr(feature = "nightly", feature(impl_trait_in_assoc_type))]
2
3#[embassy_executor::task]
4async fn foo(_x: &'static &'_ u32) {}
5
6fn main() {}
diff --git a/embassy-executor/tests/ui/nonstatic_ref_anon_nested.stderr b/embassy-executor/tests/ui/nonstatic_ref_anon_nested.stderr
new file mode 100644
index 000000000..79f262e6b
--- /dev/null
+++ b/embassy-executor/tests/ui/nonstatic_ref_anon_nested.stderr
@@ -0,0 +1,5 @@
1error: Arguments for tasks must live forever. Try using the `'static` lifetime.
2 --> tests/ui/nonstatic_ref_anon_nested.rs:4:28
3 |
44 | async fn foo(_x: &'static &'_ u32) {}
5 | ^^
diff --git a/embassy-executor/tests/ui/nonstatic_ref_elided.rs b/embassy-executor/tests/ui/nonstatic_ref_elided.rs
new file mode 100644
index 000000000..cf49ad709
--- /dev/null
+++ b/embassy-executor/tests/ui/nonstatic_ref_elided.rs
@@ -0,0 +1,6 @@
1#![cfg_attr(feature = "nightly", feature(impl_trait_in_assoc_type))]
2
3#[embassy_executor::task]
4async fn foo(_x: &u32) {}
5
6fn main() {}
diff --git a/embassy-executor/tests/ui/nonstatic_ref_elided.stderr b/embassy-executor/tests/ui/nonstatic_ref_elided.stderr
new file mode 100644
index 000000000..7e2b9eb7c
--- /dev/null
+++ b/embassy-executor/tests/ui/nonstatic_ref_elided.stderr
@@ -0,0 +1,5 @@
1error: Arguments for tasks must live forever. Try using the `'static` lifetime.
2 --> tests/ui/nonstatic_ref_elided.rs:4:18
3 |
44 | async fn foo(_x: &u32) {}
5 | ^
diff --git a/embassy-executor/tests/ui/nonstatic_ref_generic.rs b/embassy-executor/tests/ui/nonstatic_ref_generic.rs
new file mode 100644
index 000000000..3f8a26cf8
--- /dev/null
+++ b/embassy-executor/tests/ui/nonstatic_ref_generic.rs
@@ -0,0 +1,6 @@
1#![cfg_attr(feature = "nightly", feature(impl_trait_in_assoc_type))]
2
3#[embassy_executor::task]
4async fn foo<'a>(_x: &'a u32) {}
5
6fn main() {}
diff --git a/embassy-executor/tests/ui/nonstatic_ref_generic.stderr b/embassy-executor/tests/ui/nonstatic_ref_generic.stderr
new file mode 100644
index 000000000..af8491ad7
--- /dev/null
+++ b/embassy-executor/tests/ui/nonstatic_ref_generic.stderr
@@ -0,0 +1,11 @@
1error: task functions must not be generic
2 --> tests/ui/nonstatic_ref_generic.rs:4:1
3 |
44 | async fn foo<'a>(_x: &'a u32) {}
5 | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
6
7error: Arguments for tasks must live forever. Try using the `'static` lifetime.
8 --> tests/ui/nonstatic_ref_generic.rs:4:23
9 |
104 | async fn foo<'a>(_x: &'a u32) {}
11 | ^^
diff --git a/embassy-executor/tests/ui/nonstatic_struct_anon.rs b/embassy-executor/tests/ui/nonstatic_struct_anon.rs
new file mode 100644
index 000000000..ba95d1459
--- /dev/null
+++ b/embassy-executor/tests/ui/nonstatic_struct_anon.rs
@@ -0,0 +1,8 @@
1#![cfg_attr(feature = "nightly", feature(impl_trait_in_assoc_type))]
2
3struct Foo<'a>(&'a ());
4
5#[embassy_executor::task]
6async fn task(_x: Foo<'_>) {}
7
8fn main() {}
diff --git a/embassy-executor/tests/ui/nonstatic_struct_anon.stderr b/embassy-executor/tests/ui/nonstatic_struct_anon.stderr
new file mode 100644
index 000000000..5df2a6e06
--- /dev/null
+++ b/embassy-executor/tests/ui/nonstatic_struct_anon.stderr
@@ -0,0 +1,5 @@
1error: Arguments for tasks must live forever. Try using the `'static` lifetime.
2 --> tests/ui/nonstatic_struct_anon.rs:6:23
3 |
46 | async fn task(_x: Foo<'_>) {}
5 | ^^
diff --git a/embassy-executor/tests/ui/nonstatic_struct_elided.rs b/embassy-executor/tests/ui/nonstatic_struct_elided.rs
new file mode 100644
index 000000000..4cfe2966a
--- /dev/null
+++ b/embassy-executor/tests/ui/nonstatic_struct_elided.rs
@@ -0,0 +1,8 @@
1#![cfg_attr(feature = "nightly", feature(impl_trait_in_assoc_type))]
2
3struct Foo<'a>(&'a ());
4
5#[embassy_executor::task]
6async fn task(_x: Foo) {}
7
8fn main() {}
diff --git a/embassy-executor/tests/ui/nonstatic_struct_elided.stderr b/embassy-executor/tests/ui/nonstatic_struct_elided.stderr
new file mode 100644
index 000000000..099ef8b4e
--- /dev/null
+++ b/embassy-executor/tests/ui/nonstatic_struct_elided.stderr
@@ -0,0 +1,10 @@
1error[E0726]: implicit elided lifetime not allowed here
2 --> tests/ui/nonstatic_struct_elided.rs:6:19
3 |
46 | async fn task(_x: Foo) {}
5 | ^^^ expected lifetime parameter
6 |
7help: indicate the anonymous lifetime
8 |
96 | async fn task(_x: Foo<'_>) {}
10 | ++++
diff --git a/embassy-executor/tests/ui/nonstatic_struct_generic.rs b/embassy-executor/tests/ui/nonstatic_struct_generic.rs
new file mode 100644
index 000000000..ec3d908f6
--- /dev/null
+++ b/embassy-executor/tests/ui/nonstatic_struct_generic.rs
@@ -0,0 +1,8 @@
1#![cfg_attr(feature = "nightly", feature(impl_trait_in_assoc_type))]
2
3struct Foo<'a>(&'a ());
4
5#[embassy_executor::task]
6async fn task<'a>(_x: Foo<'a>) {}
7
8fn main() {}
diff --git a/embassy-executor/tests/ui/nonstatic_struct_generic.stderr b/embassy-executor/tests/ui/nonstatic_struct_generic.stderr
new file mode 100644
index 000000000..61d5231bc
--- /dev/null
+++ b/embassy-executor/tests/ui/nonstatic_struct_generic.stderr
@@ -0,0 +1,11 @@
1error: task functions must not be generic
2 --> tests/ui/nonstatic_struct_generic.rs:6:1
3 |
46 | async fn task<'a>(_x: Foo<'a>) {}
5 | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
6
7error: Arguments for tasks must live forever. Try using the `'static` lifetime.
8 --> tests/ui/nonstatic_struct_generic.rs:6:27
9 |
106 | async fn task<'a>(_x: Foo<'a>) {}
11 | ^^
diff --git a/embassy-executor/tests/ui/not_async.rs b/embassy-executor/tests/ui/not_async.rs
new file mode 100644
index 000000000..f3f7e9bd2
--- /dev/null
+++ b/embassy-executor/tests/ui/not_async.rs
@@ -0,0 +1,8 @@
1#![cfg_attr(feature = "nightly", feature(impl_trait_in_assoc_type))]
2
3struct Foo<'a>(&'a ());
4
5#[embassy_executor::task]
6fn task() {}
7
8fn main() {}
diff --git a/embassy-executor/tests/ui/not_async.stderr b/embassy-executor/tests/ui/not_async.stderr
new file mode 100644
index 000000000..27f040d9c
--- /dev/null
+++ b/embassy-executor/tests/ui/not_async.stderr
@@ -0,0 +1,5 @@
1error: task functions must be async
2 --> tests/ui/not_async.rs:6:1
3 |
46 | fn task() {}
5 | ^^^^^^^^^
diff --git a/embassy-executor/tests/ui/self.rs b/embassy-executor/tests/ui/self.rs
new file mode 100644
index 000000000..f83a962d1
--- /dev/null
+++ b/embassy-executor/tests/ui/self.rs
@@ -0,0 +1,8 @@
1#![cfg_attr(feature = "nightly", feature(impl_trait_in_assoc_type))]
2
3struct Foo<'a>(&'a ());
4
5#[embassy_executor::task]
6async fn task(self) {}
7
8fn main() {}
diff --git a/embassy-executor/tests/ui/self.stderr b/embassy-executor/tests/ui/self.stderr
new file mode 100644
index 000000000..aaf031573
--- /dev/null
+++ b/embassy-executor/tests/ui/self.stderr
@@ -0,0 +1,13 @@
1error: task functions must not have `self` arguments
2 --> tests/ui/self.rs:6:15
3 |
46 | async fn task(self) {}
5 | ^^^^
6
7error: `self` parameter is only allowed in associated functions
8 --> tests/ui/self.rs:6:15
9 |
106 | async fn task(self) {}
11 | ^^^^ not semantically valid as function parameter
12 |
13 = note: associated functions are those in `impl` or `trait` definitions
diff --git a/embassy-executor/tests/ui/self_ref.rs b/embassy-executor/tests/ui/self_ref.rs
new file mode 100644
index 000000000..5e49bba5e
--- /dev/null
+++ b/embassy-executor/tests/ui/self_ref.rs
@@ -0,0 +1,8 @@
1#![cfg_attr(feature = "nightly", feature(impl_trait_in_assoc_type))]
2
3struct Foo<'a>(&'a ());
4
5#[embassy_executor::task]
6async fn task(&mut self) {}
7
8fn main() {}
diff --git a/embassy-executor/tests/ui/self_ref.stderr b/embassy-executor/tests/ui/self_ref.stderr
new file mode 100644
index 000000000..dd2052977
--- /dev/null
+++ b/embassy-executor/tests/ui/self_ref.stderr
@@ -0,0 +1,13 @@
1error: task functions must not have `self` arguments
2 --> tests/ui/self_ref.rs:6:15
3 |
46 | async fn task(&mut self) {}
5 | ^^^^^^^^^
6
7error: `self` parameter is only allowed in associated functions
8 --> tests/ui/self_ref.rs:6:15
9 |
106 | async fn task(&mut self) {}
11 | ^^^^^^^^^ not semantically valid as function parameter
12 |
13 = note: associated functions are those in `impl` or `trait` definitions
diff --git a/embassy-executor/tests/ui/where_clause.rs b/embassy-executor/tests/ui/where_clause.rs
new file mode 100644
index 000000000..848d78149
--- /dev/null
+++ b/embassy-executor/tests/ui/where_clause.rs
@@ -0,0 +1,12 @@
1#![cfg_attr(feature = "nightly", feature(impl_trait_in_assoc_type))]
2
3struct Foo<'a>(&'a ());
4
5#[embassy_executor::task]
6async fn task()
7where
8 (): Sized,
9{
10}
11
12fn main() {}
diff --git a/embassy-executor/tests/ui/where_clause.stderr b/embassy-executor/tests/ui/where_clause.stderr
new file mode 100644
index 000000000..eba45af40
--- /dev/null
+++ b/embassy-executor/tests/ui/where_clause.stderr
@@ -0,0 +1,7 @@
1error: task functions must not have `where` clauses
2 --> tests/ui/where_clause.rs:6:1
3 |
46 | / async fn task()
57 | | where
68 | | (): Sized,
7 | |______________^