about summary refs log tree commit diff
diff options
context:
space:
mode:
authorNathaniel McCallum <nathaniel@congru.us>2021-08-03 16:45:55 -0400
committerNathaniel McCallum <nathaniel@congru.us>2021-08-04 15:30:10 -0400
commit9c0147c02d7a58d41d25d7604d65bbb02b6d21b0 (patch)
tree117124fdfafd4aef3a582dbc60056df4ebb11803
parent7ac0cb0ec1152a9a64da0d444b5f21c801f9ca77 (diff)
downloadrust-9c0147c02d7a58d41d25d7604d65bbb02b6d21b0.tar.gz
rust-9c0147c02d7a58d41d25d7604d65bbb02b6d21b0.zip
Disable unused variable lint for naked functions
In most calling conventions, accessing function parameters may require
stack access. However, naked functions have no assembly prelude to set
up stack access.  This is why naked functions may only contain a single
`asm!()` block. All parameter access is done inside the `asm!()` block,
so we cannot validate the liveness of the input parameters. Therefore,
we should disable the lint for naked functions.

rust-lang/rfcs#2774
rust-lang/rfcs#2972
-rw-r--r--compiler/rustc_passes/src/liveness.rs5
-rw-r--r--src/test/ui/asm/naked-functions-unused.rs10
-rw-r--r--src/test/ui/asm/naked-functions-unused.stderr62
3 files changed, 6 insertions, 71 deletions
diff --git a/compiler/rustc_passes/src/liveness.rs b/compiler/rustc_passes/src/liveness.rs
index 4ceefa17bcf..f2c2521ab43 100644
--- a/compiler/rustc_passes/src/liveness.rs
+++ b/compiler/rustc_passes/src/liveness.rs
@@ -332,6 +332,11 @@ impl<'tcx> Visitor<'tcx> for IrMaps<'tcx> {
             }
         }
 
+        // Don't run unused pass for #[naked]
+        if self.tcx.has_attr(def_id, sym::naked) {
+            return;
+        }
+
         if let Some(captures) = maps.tcx.typeck(local_def_id).closure_min_captures.get(&def_id) {
             for &var_hir_id in captures.keys() {
                 let var_name = maps.tcx.hir().name(var_hir_id);
diff --git a/src/test/ui/asm/naked-functions-unused.rs b/src/test/ui/asm/naked-functions-unused.rs
index 1790541e009..e1f2362bb6f 100644
--- a/src/test/ui/asm/naked-functions-unused.rs
+++ b/src/test/ui/asm/naked-functions-unused.rs
@@ -50,8 +50,6 @@ pub mod normal {
 pub mod naked {
     #[naked]
     pub extern "sysv64" fn function(a: usize, b: usize) -> usize {
-        //~^ ERROR unused variable: `a`
-        //~| ERROR unused variable: `b`
         unsafe { asm!("", options(noreturn)); }
     }
 
@@ -60,15 +58,11 @@ pub mod naked {
     impl Naked {
         #[naked]
         pub extern "sysv64" fn associated(a: usize, b: usize) -> usize {
-            //~^ ERROR unused variable: `a`
-            //~| ERROR unused variable: `b`
             unsafe { asm!("", options(noreturn)); }
         }
 
         #[naked]
         pub extern "sysv64" fn method(&self, a: usize, b: usize) -> usize {
-            //~^ ERROR unused variable: `a`
-            //~| ERROR unused variable: `b`
             unsafe { asm!("", options(noreturn)); }
         }
     }
@@ -76,15 +70,11 @@ pub mod naked {
     impl super::Trait for Naked {
         #[naked]
         extern "sysv64" fn trait_associated(a: usize, b: usize) -> usize {
-            //~^ ERROR unused variable: `a`
-            //~| ERROR unused variable: `b`
             unsafe { asm!("", options(noreturn)); }
         }
 
         #[naked]
         extern "sysv64" fn trait_method(&self, a: usize, b: usize) -> usize {
-            //~^ ERROR unused variable: `a`
-            //~| ERROR unused variable: `b`
             unsafe { asm!("", options(noreturn)); }
         }
     }
diff --git a/src/test/ui/asm/naked-functions-unused.stderr b/src/test/ui/asm/naked-functions-unused.stderr
index 3fffd09e7a5..840353366b6 100644
--- a/src/test/ui/asm/naked-functions-unused.stderr
+++ b/src/test/ui/asm/naked-functions-unused.stderr
@@ -65,65 +65,5 @@ error: unused variable: `b`
 LL |         extern "sysv64" fn trait_method(&self, a: usize, b: usize) -> usize {
    |                                                          ^ help: if this is intentional, prefix it with an underscore: `_b`
 
-error: unused variable: `a`
-  --> $DIR/naked-functions-unused.rs:52:37
-   |
-LL |     pub extern "sysv64" fn function(a: usize, b: usize) -> usize {
-   |                                     ^ help: if this is intentional, prefix it with an underscore: `_a`
-
-error: unused variable: `b`
-  --> $DIR/naked-functions-unused.rs:52:47
-   |
-LL |     pub extern "sysv64" fn function(a: usize, b: usize) -> usize {
-   |                                               ^ help: if this is intentional, prefix it with an underscore: `_b`
-
-error: unused variable: `a`
-  --> $DIR/naked-functions-unused.rs:62:43
-   |
-LL |         pub extern "sysv64" fn associated(a: usize, b: usize) -> usize {
-   |                                           ^ help: if this is intentional, prefix it with an underscore: `_a`
-
-error: unused variable: `b`
-  --> $DIR/naked-functions-unused.rs:62:53
-   |
-LL |         pub extern "sysv64" fn associated(a: usize, b: usize) -> usize {
-   |                                                     ^ help: if this is intentional, prefix it with an underscore: `_b`
-
-error: unused variable: `a`
-  --> $DIR/naked-functions-unused.rs:69:46
-   |
-LL |         pub extern "sysv64" fn method(&self, a: usize, b: usize) -> usize {
-   |                                              ^ help: if this is intentional, prefix it with an underscore: `_a`
-
-error: unused variable: `b`
-  --> $DIR/naked-functions-unused.rs:69:56
-   |
-LL |         pub extern "sysv64" fn method(&self, a: usize, b: usize) -> usize {
-   |                                                        ^ help: if this is intentional, prefix it with an underscore: `_b`
-
-error: unused variable: `a`
-  --> $DIR/naked-functions-unused.rs:78:45
-   |
-LL |         extern "sysv64" fn trait_associated(a: usize, b: usize) -> usize {
-   |                                             ^ help: if this is intentional, prefix it with an underscore: `_a`
-
-error: unused variable: `b`
-  --> $DIR/naked-functions-unused.rs:78:55
-   |
-LL |         extern "sysv64" fn trait_associated(a: usize, b: usize) -> usize {
-   |                                                       ^ help: if this is intentional, prefix it with an underscore: `_b`
-
-error: unused variable: `a`
-  --> $DIR/naked-functions-unused.rs:85:48
-   |
-LL |         extern "sysv64" fn trait_method(&self, a: usize, b: usize) -> usize {
-   |                                                ^ help: if this is intentional, prefix it with an underscore: `_a`
-
-error: unused variable: `b`
-  --> $DIR/naked-functions-unused.rs:85:58
-   |
-LL |         extern "sysv64" fn trait_method(&self, a: usize, b: usize) -> usize {
-   |                                                          ^ help: if this is intentional, prefix it with an underscore: `_b`
-
-error: aborting due to 20 previous errors
+error: aborting due to 10 previous errors