Add test cases for suggestions with unsafe operations contained inside macros

This commit is contained in:
Wim Looman 2023-06-11 11:59:15 +02:00
parent 8f3e876e52
commit 802c1d5979
No known key found for this signature in database
GPG Key ID: C6F5748C6DD1607B
4 changed files with 114 additions and 25 deletions

View File

@ -0,0 +1,4 @@
pub unsafe fn unsf() {}
#[macro_export]
macro_rules! unsafe_macro { () => ($crate::unsf()) }

View File

@ -1,7 +1,10 @@
// run-rustfix
// aux-build:external_unsafe_macro.rs
#![deny(unsafe_op_in_unsafe_fn)] //~ NOTE
extern crate external_unsafe_macro;
unsafe fn unsf() {}
pub unsafe fn foo() { unsafe {
@ -35,4 +38,29 @@ pub unsafe fn baz() -> i32 { unsafe {
//~| NOTE
}}
macro_rules! unsafe_macro { () => (unsf()) }
//~^ ERROR call to unsafe function is unsafe
//~| NOTE
//~| NOTE
//~| ERROR call to unsafe function is unsafe
//~| NOTE
//~| NOTE
pub unsafe fn unsafe_in_macro() { unsafe {
//~^ NOTE an unsafe function restricts its caller, but its body is safe by default
unsafe_macro!();
//~^ NOTE
//~| NOTE
unsafe_macro!();
//~^ NOTE
//~| NOTE
}}
pub unsafe fn unsafe_in_external_macro() {
// FIXME: https://github.com/rust-lang/rust/issues/112504
// FIXME: ~^ NOTE an unsafe function restricts its caller, but its body is safe by default
external_unsafe_macro::unsafe_macro!();
external_unsafe_macro::unsafe_macro!();
}
fn main() {}

View File

@ -1,7 +1,10 @@
// run-rustfix
// aux-build:external_unsafe_macro.rs
#![deny(unsafe_op_in_unsafe_fn)] //~ NOTE
extern crate external_unsafe_macro;
unsafe fn unsf() {}
pub unsafe fn foo() {
@ -35,4 +38,29 @@ pub unsafe fn baz() -> i32 {
//~| NOTE
}
macro_rules! unsafe_macro { () => (unsf()) }
//~^ ERROR call to unsafe function is unsafe
//~| NOTE
//~| NOTE
//~| ERROR call to unsafe function is unsafe
//~| NOTE
//~| NOTE
pub unsafe fn unsafe_in_macro() {
//~^ NOTE an unsafe function restricts its caller, but its body is safe by default
unsafe_macro!();
//~^ NOTE
//~| NOTE
unsafe_macro!();
//~^ NOTE
//~| NOTE
}
pub unsafe fn unsafe_in_external_macro() {
// FIXME: https://github.com/rust-lang/rust/issues/112504
// FIXME: ~^ NOTE an unsafe function restricts its caller, but its body is safe by default
external_unsafe_macro::unsafe_macro!();
external_unsafe_macro::unsafe_macro!();
}
fn main() {}

View File

@ -1,21 +1,3 @@
error: call to unsafe function is unsafe and requires unsafe block (error E0133)
--> $DIR/wrapping-unsafe-block-sugg.rs:9:5
|
LL | unsf();
| ^^^^^^ call to unsafe function
|
= note: consult the function's documentation for information on how to avoid undefined behavior
note: an unsafe function restricts its caller, but its body is safe by default
--> $DIR/wrapping-unsafe-block-sugg.rs:7:1
|
LL | pub unsafe fn foo() {
| ^^^^^^^^^^^^^^^^^^^
note: the lint level is defined here
--> $DIR/wrapping-unsafe-block-sugg.rs:3:9
|
LL | #![deny(unsafe_op_in_unsafe_fn)]
| ^^^^^^^^^^^^^^^^^^^^^^
error: call to unsafe function is unsafe and requires unsafe block (error E0133)
--> $DIR/wrapping-unsafe-block-sugg.rs:12:5
|
@ -23,22 +5,40 @@ LL | unsf();
| ^^^^^^ call to unsafe function
|
= note: consult the function's documentation for information on how to avoid undefined behavior
note: an unsafe function restricts its caller, but its body is safe by default
--> $DIR/wrapping-unsafe-block-sugg.rs:10:1
|
LL | pub unsafe fn foo() {
| ^^^^^^^^^^^^^^^^^^^
note: the lint level is defined here
--> $DIR/wrapping-unsafe-block-sugg.rs:4:9
|
LL | #![deny(unsafe_op_in_unsafe_fn)]
| ^^^^^^^^^^^^^^^^^^^^^^
error: call to unsafe function is unsafe and requires unsafe block (error E0133)
--> $DIR/wrapping-unsafe-block-sugg.rs:15:5
|
LL | unsf();
| ^^^^^^ call to unsafe function
|
= note: consult the function's documentation for information on how to avoid undefined behavior
error: dereference of raw pointer is unsafe and requires unsafe block (error E0133)
--> $DIR/wrapping-unsafe-block-sugg.rs:19:13
--> $DIR/wrapping-unsafe-block-sugg.rs:22:13
|
LL | let y = *x;
| ^^ dereference of raw pointer
|
= note: raw pointers may be null, dangling or unaligned; they can violate aliasing rules and cause data races: all of these are undefined behavior
note: an unsafe function restricts its caller, but its body is safe by default
--> $DIR/wrapping-unsafe-block-sugg.rs:17:1
--> $DIR/wrapping-unsafe-block-sugg.rs:20:1
|
LL | pub unsafe fn bar(x: *const i32) -> i32 {
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
error: dereference of raw pointer is unsafe and requires unsafe block (error E0133)
--> $DIR/wrapping-unsafe-block-sugg.rs:22:9
--> $DIR/wrapping-unsafe-block-sugg.rs:25:9
|
LL | y + *x
| ^^ dereference of raw pointer
@ -46,25 +46,54 @@ LL | y + *x
= note: raw pointers may be null, dangling or unaligned; they can violate aliasing rules and cause data races: all of these are undefined behavior
error: use of mutable static is unsafe and requires unsafe block (error E0133)
--> $DIR/wrapping-unsafe-block-sugg.rs:30:13
--> $DIR/wrapping-unsafe-block-sugg.rs:33:13
|
LL | let y = BAZ;
| ^^^ use of mutable static
|
= note: mutable statics can be mutated by multiple threads: aliasing violations or data races will cause undefined behavior
note: an unsafe function restricts its caller, but its body is safe by default
--> $DIR/wrapping-unsafe-block-sugg.rs:28:1
--> $DIR/wrapping-unsafe-block-sugg.rs:31:1
|
LL | pub unsafe fn baz() -> i32 {
| ^^^^^^^^^^^^^^^^^^^^^^^^^^
error: use of mutable static is unsafe and requires unsafe block (error E0133)
--> $DIR/wrapping-unsafe-block-sugg.rs:33:9
--> $DIR/wrapping-unsafe-block-sugg.rs:36:9
|
LL | y + BAZ
| ^^^ use of mutable static
|
= note: mutable statics can be mutated by multiple threads: aliasing violations or data races will cause undefined behavior
error: aborting due to 6 previous errors
error: call to unsafe function is unsafe and requires unsafe block (error E0133)
--> $DIR/wrapping-unsafe-block-sugg.rs:41:36
|
LL | macro_rules! unsafe_macro { () => (unsf()) }
| ^^^^^^ call to unsafe function
...
LL | unsafe_macro!();
| --------------- in this macro invocation
|
= note: consult the function's documentation for information on how to avoid undefined behavior
note: an unsafe function restricts its caller, but its body is safe by default
--> $DIR/wrapping-unsafe-block-sugg.rs:49:1
|
LL | pub unsafe fn unsafe_in_macro() {
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
= note: this error originates in the macro `unsafe_macro` (in Nightly builds, run with -Z macro-backtrace for more info)
error: call to unsafe function is unsafe and requires unsafe block (error E0133)
--> $DIR/wrapping-unsafe-block-sugg.rs:41:36
|
LL | macro_rules! unsafe_macro { () => (unsf()) }
| ^^^^^^ call to unsafe function
...
LL | unsafe_macro!();
| --------------- in this macro invocation
|
= note: consult the function's documentation for information on how to avoid undefined behavior
= note: this error originates in the macro `unsafe_macro` (in Nightly builds, run with -Z macro-backtrace for more info)
error: aborting due to 8 previous errors