summaryrefslogtreecommitdiffstats
path: root/src/test/ui/lint/lint-unsafe-code.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/test/ui/lint/lint-unsafe-code.rs')
-rw-r--r--src/test/ui/lint/lint-unsafe-code.rs130
1 files changed, 130 insertions, 0 deletions
diff --git a/src/test/ui/lint/lint-unsafe-code.rs b/src/test/ui/lint/lint-unsafe-code.rs
new file mode 100644
index 000000000..b72e4c3a9
--- /dev/null
+++ b/src/test/ui/lint/lint-unsafe-code.rs
@@ -0,0 +1,130 @@
+#![allow(unused_unsafe)]
+#![allow(dead_code)]
+#![deny(unsafe_code)]
+
+struct Bar;
+struct Bar2;
+struct Bar3;
+
+#[allow(unsafe_code)]
+mod allowed_unsafe {
+ fn allowed() { unsafe {} }
+ unsafe fn also_allowed() {}
+ unsafe trait AllowedUnsafe { }
+ unsafe impl AllowedUnsafe for super::Bar {}
+ #[no_mangle] fn allowed2() {}
+ #[export_name = "foo"] fn allowed3() {}
+}
+
+macro_rules! unsafe_in_macro {
+ () => {{
+ #[no_mangle] fn foo() {} //~ ERROR: declaration of a `no_mangle` function
+ #[no_mangle] static FOO: u32 = 5; //~ ERROR: declaration of a `no_mangle` static
+ #[export_name = "bar"] fn bar() {}
+ //~^ ERROR: declaration of a function with `export_name`
+ #[export_name = "BAR"] static BAR: u32 = 5;
+ //~^ ERROR: declaration of a static with `export_name`
+ unsafe {} //~ ERROR: usage of an `unsafe` block
+ }}
+}
+
+#[no_mangle] fn foo() {} //~ ERROR: declaration of a `no_mangle` function
+#[no_mangle] static FOO: u32 = 5; //~ ERROR: declaration of a `no_mangle` static
+
+trait AssocFnTrait {
+ fn foo();
+}
+
+struct AssocFnFoo;
+
+impl AssocFnFoo {
+ #[no_mangle] fn foo() {} //~ ERROR: declaration of a `no_mangle` method
+}
+
+impl AssocFnTrait for AssocFnFoo {
+ #[no_mangle] fn foo() {} //~ ERROR: declaration of a `no_mangle` method
+}
+
+#[export_name = "bar"] fn bar() {} //~ ERROR: declaration of a function with `export_name`
+#[export_name = "BAR"] static BAR: u32 = 5; //~ ERROR: declaration of a static with `export_name`
+
+#[link_section = ".example_section"] fn uwu() {} //~ ERROR: declaration of a function with `link_section`
+#[link_section = ".example_section"] static UWU: u32 = 5; //~ ERROR: declaration of a static with `link_section`
+
+struct AssocFnBar;
+
+impl AssocFnBar {
+ #[export_name = "bar"] fn bar() {} //~ ERROR: declaration of a method with `export_name`
+}
+
+impl AssocFnTrait for AssocFnBar {
+ #[export_name = "bar"] fn foo() {} //~ ERROR: declaration of a method with `export_name`
+}
+
+unsafe fn baz() {} //~ ERROR: declaration of an `unsafe` function
+unsafe trait Foo {} //~ ERROR: declaration of an `unsafe` trait
+unsafe impl Foo for Bar {} //~ ERROR: implementation of an `unsafe` trait
+
+trait Baz {
+ unsafe fn baz(&self); //~ ERROR: declaration of an `unsafe` method
+ unsafe fn provided(&self) {} //~ ERROR: implementation of an `unsafe` method
+ unsafe fn provided_override(&self) {} //~ ERROR: implementation of an `unsafe` method
+}
+
+impl Baz for Bar {
+ unsafe fn baz(&self) {} //~ ERROR: implementation of an `unsafe` method
+ unsafe fn provided_override(&self) {} //~ ERROR: implementation of an `unsafe` method
+}
+
+
+#[allow(unsafe_code)]
+trait A {
+ unsafe fn allowed_unsafe(&self);
+ unsafe fn allowed_unsafe_provided(&self) {}
+}
+
+#[allow(unsafe_code)]
+impl Baz for Bar2 {
+ unsafe fn baz(&self) {}
+ unsafe fn provided_override(&self) {}
+}
+
+impl Baz for Bar3 {
+ #[allow(unsafe_code)]
+ unsafe fn baz(&self) {}
+ unsafe fn provided_override(&self) {} //~ ERROR: implementation of an `unsafe` method
+}
+
+#[allow(unsafe_code)]
+unsafe trait B {
+ fn dummy(&self) {}
+}
+
+trait C {
+ #[allow(unsafe_code)]
+ unsafe fn baz(&self);
+ unsafe fn provided(&self) {} //~ ERROR: implementation of an `unsafe` method
+}
+
+impl C for Bar {
+ #[allow(unsafe_code)]
+ unsafe fn baz(&self) {}
+ unsafe fn provided(&self) {} //~ ERROR: implementation of an `unsafe` method
+}
+
+impl C for Bar2 {
+ unsafe fn baz(&self) {} //~ ERROR: implementation of an `unsafe` method
+}
+
+trait D {
+ #[allow(unsafe_code)]
+ unsafe fn unsafe_provided(&self) {}
+}
+
+impl D for Bar {}
+
+fn main() {
+ unsafe {} //~ ERROR: usage of an `unsafe` block
+
+ unsafe_in_macro!()
+}