1
Fork 0

Rollup merge of #95544 - jam1garner:improve-naked-noreturn-diagnostic, r=tmiasko

Add error message suggestion for missing noreturn in naked function

I had to google the syntax for inline asm's `noreturn` option when I got this error earlier today, so I figured I'd save others the trouble and add the syntax/fix as a suggestion in the error.
This commit is contained in:
Dylan DPC 2022-04-02 03:34:23 +02:00 committed by GitHub
commit 556c7411cc
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
2 changed files with 39 additions and 1 deletions

View file

@ -1,7 +1,7 @@
//! Checks validity of naked functions. //! Checks validity of naked functions.
use rustc_ast::{Attribute, InlineAsmOptions}; use rustc_ast::{Attribute, InlineAsmOptions};
use rustc_errors::struct_span_err; use rustc_errors::{struct_span_err, Applicability};
use rustc_hir as hir; use rustc_hir as hir;
use rustc_hir::def_id::LocalDefId; use rustc_hir::def_id::LocalDefId;
use rustc_hir::intravisit::{FnKind, Visitor}; use rustc_hir::intravisit::{FnKind, Visitor};
@ -274,12 +274,25 @@ impl<'tcx> CheckInlineAssembly<'tcx> {
} }
if !asm.options.contains(InlineAsmOptions::NORETURN) { if !asm.options.contains(InlineAsmOptions::NORETURN) {
let last_span = asm
.operands
.last()
.map_or_else(|| asm.template_strs.last().unwrap().2, |op| op.1)
.shrink_to_hi();
struct_span_err!( struct_span_err!(
self.tcx.sess, self.tcx.sess,
span, span,
E0787, E0787,
"asm in naked functions must use `noreturn` option" "asm in naked functions must use `noreturn` option"
) )
.span_suggestion(
last_span,
"consider specifying that the asm block is responsible \
for returning from the function",
String::from(", options(noreturn)"),
Applicability::MachineApplicable,
)
.emit(); .emit();
} }
} }

View file

@ -97,6 +97,11 @@ LL | |
LL | | sym G, LL | | sym G,
LL | | ); LL | | );
| |_____^ | |_____^
|
help: consider specifying that the asm block is responsible for returning from the function
|
LL | sym G, options(noreturn),
| +++++++++++++++++++
error[E0787]: naked functions must contain a single asm block error[E0787]: naked functions must contain a single asm block
--> $DIR/naked-functions.rs:53:1 --> $DIR/naked-functions.rs:53:1
@ -131,18 +136,33 @@ error[E0787]: asm in naked functions must use `noreturn` option
| |
LL | asm!(""); LL | asm!("");
| ^^^^^^^^ | ^^^^^^^^
|
help: consider specifying that the asm block is responsible for returning from the function
|
LL | asm!("", options(noreturn));
| +++++++++++++++++++
error[E0787]: asm in naked functions must use `noreturn` option error[E0787]: asm in naked functions must use `noreturn` option
--> $DIR/naked-functions.rs:85:5 --> $DIR/naked-functions.rs:85:5
| |
LL | asm!(""); LL | asm!("");
| ^^^^^^^^ | ^^^^^^^^
|
help: consider specifying that the asm block is responsible for returning from the function
|
LL | asm!("", options(noreturn));
| +++++++++++++++++++
error[E0787]: asm in naked functions must use `noreturn` option error[E0787]: asm in naked functions must use `noreturn` option
--> $DIR/naked-functions.rs:87:5 --> $DIR/naked-functions.rs:87:5
| |
LL | asm!(""); LL | asm!("");
| ^^^^^^^^ | ^^^^^^^^
|
help: consider specifying that the asm block is responsible for returning from the function
|
LL | asm!("", options(noreturn));
| +++++++++++++++++++
error[E0787]: naked functions must contain a single asm block error[E0787]: naked functions must contain a single asm block
--> $DIR/naked-functions.rs:81:1 --> $DIR/naked-functions.rs:81:1
@ -198,6 +218,11 @@ error[E0787]: asm in naked functions must use `noreturn` option
| |
LL | asm!("", options(readonly, nostack), options(pure)); LL | asm!("", options(readonly, nostack), options(pure));
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
help: consider specifying that the asm block is responsible for returning from the function
|
LL | asm!("", options(noreturn), options(readonly, nostack), options(pure));
| +++++++++++++++++++
error[E0787]: asm options unsupported in naked functions: `may_unwind` error[E0787]: asm options unsupported in naked functions: `may_unwind`
--> $DIR/naked-functions.rs:118:5 --> $DIR/naked-functions.rs:118:5