diff options
| author | Brezak <[email protected]> | 2025-07-23 21:17:12 +0200 |
|---|---|---|
| committer | Brezak <[email protected]> | 2025-07-23 21:19:30 +0200 |
| commit | 54d9a7fed3ab211b1049aae0af0bc49f912c9df4 (patch) | |
| tree | e78d37366dbc6d9be5338c136261819cee332592 /embassy-executor | |
| parent | 539ff78ebbdedbb75d0faf940e3ee69f5e7f276a (diff) | |
embassy-executor: add macro ui test for unsafe ops in unsafe tasks
Check if the #[task] macro properly handles unsafe functions so the `unsafe_op_in_unsafe_fn` lint still works
Diffstat (limited to 'embassy-executor')
| -rw-r--r-- | embassy-executor/tests/ui.rs | 2 | ||||
| -rw-r--r-- | embassy-executor/tests/ui/unsafe_op_in_unsafe_task.rs | 10 | ||||
| -rw-r--r-- | embassy-executor/tests/ui/unsafe_op_in_unsafe_task.stderr | 18 |
3 files changed, 30 insertions, 0 deletions
diff --git a/embassy-executor/tests/ui.rs b/embassy-executor/tests/ui.rs index 8b83cd368..5486a0624 100644 --- a/embassy-executor/tests/ui.rs +++ b/embassy-executor/tests/ui.rs | |||
| @@ -32,5 +32,7 @@ fn ui() { | |||
| 32 | t.compile_fail("tests/ui/self.rs"); | 32 | t.compile_fail("tests/ui/self.rs"); |
| 33 | t.compile_fail("tests/ui/type_error.rs"); | 33 | t.compile_fail("tests/ui/type_error.rs"); |
| 34 | t.compile_fail("tests/ui/where_clause.rs"); | 34 | t.compile_fail("tests/ui/where_clause.rs"); |
| 35 | t.compile_fail("tests/ui/unsafe_op_in_unsafe_task.rs"); | ||
| 36 | |||
| 35 | t.pass("tests/ui/task_safety_attribute.rs"); | 37 | t.pass("tests/ui/task_safety_attribute.rs"); |
| 36 | } | 38 | } |
diff --git a/embassy-executor/tests/ui/unsafe_op_in_unsafe_task.rs b/embassy-executor/tests/ui/unsafe_op_in_unsafe_task.rs new file mode 100644 index 000000000..ee7924838 --- /dev/null +++ b/embassy-executor/tests/ui/unsafe_op_in_unsafe_task.rs | |||
| @@ -0,0 +1,10 @@ | |||
| 1 | #![cfg_attr(feature = "nightly", feature(impl_trait_in_assoc_type))] | ||
| 2 | #![deny(unsafe_op_in_unsafe_fn)] | ||
| 3 | |||
| 4 | #[embassy_executor::task] | ||
| 5 | async unsafe fn task() { | ||
| 6 | let x = 5; | ||
| 7 | (&x as *const i32).read(); | ||
| 8 | } | ||
| 9 | |||
| 10 | fn main() {} | ||
diff --git a/embassy-executor/tests/ui/unsafe_op_in_unsafe_task.stderr b/embassy-executor/tests/ui/unsafe_op_in_unsafe_task.stderr new file mode 100644 index 000000000..d987a4b95 --- /dev/null +++ b/embassy-executor/tests/ui/unsafe_op_in_unsafe_task.stderr | |||
| @@ -0,0 +1,18 @@ | |||
| 1 | error[E0133]: call to unsafe function `std::ptr::const_ptr::<impl *const T>::read` is unsafe and requires unsafe block | ||
| 2 | --> tests/ui/unsafe_op_in_unsafe_task.rs:7:5 | ||
| 3 | | | ||
| 4 | 7 | (&x as *const i32).read(); | ||
| 5 | | ^^^^^^^^^^^^^^^^^^^^^^^^^ call to unsafe function | ||
| 6 | | | ||
| 7 | = note: for more information, see <https://doc.rust-lang.org/nightly/edition-guide/rust-2024/unsafe-op-in-unsafe-fn.html> | ||
| 8 | = note: consult the function's documentation for information on how to avoid undefined behavior | ||
| 9 | note: an unsafe function restricts its caller, but its body is safe by default | ||
| 10 | --> tests/ui/unsafe_op_in_unsafe_task.rs:5:1 | ||
| 11 | | | ||
| 12 | 5 | async unsafe fn task() { | ||
| 13 | | ^^^^^^^^^^^^^^^^^^^^^^ | ||
| 14 | note: the lint level is defined here | ||
| 15 | --> tests/ui/unsafe_op_in_unsafe_task.rs:2:9 | ||
| 16 | | | ||
| 17 | 2 | #![deny(unsafe_op_in_unsafe_fn)] | ||
| 18 | | ^^^^^^^^^^^^^^^^^^^^^^ | ||
