blob: 29ab8ee505d69a1bcf149a16661f3d8becdc1c13 [file] [log] [blame]
use rustc_errors::codes::*;
use rustc_errors::{
Diag, DiagCtxtHandle, Diagnostic, EmissionGuarantee, Level, MultiSpan, SingleLabelManySpans,
Subdiagnostic, msg,
};
use rustc_macros::{Diagnostic, LintDiagnostic, Subdiagnostic};
use rustc_span::{Ident, Span, Symbol};
#[derive(LintDiagnostic)]
#[diag("avoid using `.intel_syntax`, Intel syntax is the default")]
pub(crate) struct AvoidIntelSyntax;
#[derive(LintDiagnostic)]
#[diag("avoid using `.att_syntax`, prefer using `options(att_syntax)` instead")]
pub(crate) struct AvoidAttSyntax;
#[derive(LintDiagnostic)]
#[diag("include macro expected single expression in source")]
pub(crate) struct IncompleteInclude;
#[derive(LintDiagnostic)]
#[diag("cannot test inner items")]
pub(crate) struct UnnameableTestItems;
#[derive(LintDiagnostic)]
#[diag("duplicated attribute")]
pub(crate) struct DuplicateMacroAttribute;
#[derive(Diagnostic)]
#[diag("macro requires a cfg-pattern as an argument")]
pub(crate) struct RequiresCfgPattern {
#[primary_span]
#[label("cfg-pattern required")]
pub(crate) span: Span,
}
#[derive(Diagnostic)]
#[diag("expected 1 cfg-pattern")]
pub(crate) struct OneCfgPattern {
#[primary_span]
pub(crate) span: Span,
}
#[derive(Diagnostic)]
#[diag("alloc_error_handler must be a function")]
pub(crate) struct AllocErrorMustBeFn {
#[primary_span]
pub(crate) span: Span,
}
#[derive(Diagnostic)]
#[diag("macro requires a boolean expression as an argument")]
pub(crate) struct AssertRequiresBoolean {
#[primary_span]
#[label("boolean expression required")]
pub(crate) span: Span,
}
#[derive(Diagnostic)]
#[diag("macro requires an expression as an argument")]
pub(crate) struct AssertRequiresExpression {
#[primary_span]
pub(crate) span: Span,
#[suggestion("try removing semicolon", code = "", applicability = "maybe-incorrect")]
pub(crate) token: Span,
}
#[derive(Diagnostic)]
#[diag("unexpected string literal")]
pub(crate) struct AssertMissingComma {
#[primary_span]
pub(crate) span: Span,
#[suggestion(
"try adding a comma",
code = ", ",
applicability = "maybe-incorrect",
style = "short"
)]
pub(crate) comma: Span,
}
#[derive(Diagnostic)]
pub(crate) enum CfgAccessibleInvalid {
#[diag("`cfg_accessible` path is not specified")]
UnspecifiedPath(#[primary_span] Span),
#[diag("multiple `cfg_accessible` paths are specified")]
MultiplePaths(#[primary_span] Span),
#[diag("`cfg_accessible` path cannot be a literal")]
LiteralPath(#[primary_span] Span),
#[diag("`cfg_accessible` path cannot accept arguments")]
HasArguments(#[primary_span] Span),
}
#[derive(Diagnostic)]
#[diag("cannot determine whether the path is accessible or not")]
pub(crate) struct CfgAccessibleIndeterminate {
#[primary_span]
pub(crate) span: Span,
}
#[derive(Diagnostic)]
#[diag("expected a literal")]
#[note("only literals (like `\"foo\"`, `-42` and `3.14`) can be passed to `concat!()`")]
pub(crate) struct ConcatMissingLiteral {
#[primary_span]
pub(crate) spans: Vec<Span>,
}
#[derive(Diagnostic)]
#[diag("cannot concatenate a byte string literal")]
pub(crate) struct ConcatBytestr {
#[primary_span]
pub(crate) span: Span,
}
#[derive(Diagnostic)]
#[diag("cannot concatenate a C string literal")]
pub(crate) struct ConcatCStrLit {
#[primary_span]
pub(crate) span: Span,
}
#[derive(Diagnostic)]
#[diag("cannot export macro_rules! macros from a `proc-macro` crate type currently")]
pub(crate) struct ExportMacroRules {
#[primary_span]
pub(crate) span: Span,
}
#[derive(Diagnostic)]
#[diag(
"`proc-macro` crate types currently cannot export any items other than functions tagged with `#[proc_macro]`, `#[proc_macro_derive]`, or `#[proc_macro_attribute]`"
)]
pub(crate) struct ProcMacro {
#[primary_span]
pub(crate) span: Span,
}
#[derive(Diagnostic)]
#[diag("trace_macros! accepts only `true` or `false`")]
pub(crate) struct TraceMacros {
#[primary_span]
pub(crate) span: Span,
}
#[derive(Diagnostic)]
#[diag("functions used as benches must have signature `fn(&mut Bencher) -> impl Termination`")]
pub(crate) struct BenchSig {
#[primary_span]
pub(crate) span: Span,
}
#[derive(Diagnostic)]
#[diag("allocators must be statics")]
pub(crate) struct AllocMustStatics {
#[primary_span]
pub(crate) span: Span,
}
pub(crate) use autodiff::*;
mod autodiff {
use super::*;
#[derive(Diagnostic)]
#[diag("autodiff requires at least a name and mode")]
pub(crate) struct AutoDiffMissingConfig {
#[primary_span]
pub(crate) span: Span,
}
#[derive(Diagnostic)]
#[diag("did not recognize Activity: `{$act}`")]
pub(crate) struct AutoDiffUnknownActivity {
#[primary_span]
pub(crate) span: Span,
pub(crate) act: String,
}
#[derive(Diagnostic)]
#[diag("{$act} can not be used for this type")]
pub(crate) struct AutoDiffInvalidTypeForActivity {
#[primary_span]
pub(crate) span: Span,
pub(crate) act: String,
}
#[derive(Diagnostic)]
#[diag("expected {$expected} activities, but found {$found}")]
pub(crate) struct AutoDiffInvalidNumberActivities {
#[primary_span]
pub(crate) span: Span,
pub(crate) expected: usize,
pub(crate) found: usize,
}
#[derive(Diagnostic)]
#[diag("{$act} can not be used in {$mode} Mode")]
pub(crate) struct AutoDiffInvalidApplicationModeAct {
#[primary_span]
pub(crate) span: Span,
pub(crate) mode: String,
pub(crate) act: String,
}
#[derive(Diagnostic)]
#[diag("invalid return activity {$act} in {$mode} Mode")]
pub(crate) struct AutoDiffInvalidRetAct {
#[primary_span]
pub(crate) span: Span,
pub(crate) mode: String,
pub(crate) act: String,
}
#[derive(Diagnostic)]
#[diag("autodiff width must fit u32, but is {$width}")]
pub(crate) struct AutoDiffInvalidWidth {
#[primary_span]
pub(crate) span: Span,
pub(crate) width: u128,
}
#[derive(Diagnostic)]
#[diag("autodiff must be applied to function")]
pub(crate) struct AutoDiffInvalidApplication {
#[primary_span]
pub(crate) span: Span,
}
}
#[derive(Diagnostic)]
#[diag("cannot concatenate {$lit_kind} literals")]
pub(crate) struct ConcatBytesInvalid {
#[primary_span]
pub(crate) span: Span,
pub(crate) lit_kind: &'static str,
#[subdiagnostic]
pub(crate) sugg: Option<ConcatBytesInvalidSuggestion>,
#[note("concatenating C strings is ambiguous about including the '\\0'")]
pub(crate) cs_note: Option<()>,
}
#[derive(Subdiagnostic)]
pub(crate) enum ConcatBytesInvalidSuggestion {
#[suggestion(
"try using a byte character",
code = "b{snippet}",
applicability = "machine-applicable"
)]
CharLit {
#[primary_span]
span: Span,
snippet: String,
},
#[suggestion(
"try using a byte string",
code = "b{snippet}",
applicability = "machine-applicable"
)]
StrLit {
#[primary_span]
span: Span,
snippet: String,
},
#[note("concatenating C strings is ambiguous about including the '\\0'")]
#[suggestion(
"try using a null-terminated byte string",
code = "{as_bstr}",
applicability = "machine-applicable"
)]
CStrLit {
#[primary_span]
span: Span,
as_bstr: String,
},
#[suggestion(
"try wrapping the number in an array",
code = "[{snippet}]",
applicability = "machine-applicable"
)]
IntLit {
#[primary_span]
span: Span,
snippet: String,
},
}
#[derive(Diagnostic)]
#[diag("numeric literal is out of bounds")]
pub(crate) struct ConcatBytesOob {
#[primary_span]
pub(crate) span: Span,
}
#[derive(Diagnostic)]
#[diag("numeric literal is not a `u8`")]
pub(crate) struct ConcatBytesNonU8 {
#[primary_span]
pub(crate) span: Span,
}
#[derive(Diagnostic)]
#[diag("expected a byte literal")]
#[note(
"only byte literals (like `b\"foo\"`, `b's'` and `[3, 4, 5]`) can be passed to `concat_bytes!()`"
)]
pub(crate) struct ConcatBytesMissingLiteral {
#[primary_span]
pub(crate) spans: Vec<Span>,
}
#[derive(Diagnostic)]
#[diag("cannot concatenate doubly nested array")]
pub(crate) struct ConcatBytesArray {
#[primary_span]
pub(crate) span: Span,
#[note("byte strings are treated as arrays of bytes")]
#[help("try flattening the array")]
pub(crate) bytestr: bool,
}
#[derive(Diagnostic)]
#[diag("repeat count is not a positive number")]
pub(crate) struct ConcatBytesBadRepeat {
#[primary_span]
pub(crate) span: Span,
}
#[derive(Diagnostic)]
#[diag("`derive` may only be applied to `struct`s, `enum`s and `union`s", code = E0774)]
pub(crate) struct BadDeriveTarget {
#[primary_span]
#[label("not applicable here")]
pub(crate) span: Span,
#[label("not a `struct`, `enum` or `union`")]
pub(crate) item: Span,
}
#[derive(Diagnostic)]
#[diag("building tests with panic=abort is not supported without `-Zpanic_abort_tests`")]
pub(crate) struct TestsNotSupport {}
#[derive(Diagnostic)]
#[diag("expected path to a trait, found literal", code = E0777)]
pub(crate) struct BadDeriveLit {
#[primary_span]
#[label("not a trait")]
pub(crate) span: Span,
#[subdiagnostic]
pub help: BadDeriveLitHelp,
}
#[derive(Subdiagnostic)]
pub(crate) enum BadDeriveLitHelp {
#[help("try using `#[derive({$sym})]`")]
StrLit { sym: Symbol },
#[help("for example, write `#[derive(Debug)]` for `Debug`")]
Other,
}
#[derive(Diagnostic)]
#[diag("traits in `#[derive(...)]` don't accept arguments")]
pub(crate) struct DerivePathArgsList {
#[suggestion("remove the arguments", code = "", applicability = "machine-applicable")]
#[primary_span]
pub(crate) span: Span,
}
#[derive(Diagnostic)]
#[diag("traits in `#[derive(...)]` don't accept values")]
pub(crate) struct DerivePathArgsValue {
#[suggestion("remove the value", code = "", applicability = "machine-applicable")]
#[primary_span]
pub(crate) span: Span,
}
#[derive(Diagnostic)]
#[diag("`#[derive(Default)]` on enum with no `#[default]`", code = E0665)]
pub(crate) struct NoDefaultVariant {
#[primary_span]
pub(crate) span: Span,
#[label("this enum needs a unit variant marked with `#[default]`")]
pub(crate) item_span: Span,
#[subdiagnostic]
pub(crate) suggs: Vec<NoDefaultVariantSugg>,
}
#[derive(Subdiagnostic)]
#[suggestion(
"make this unit variant default by placing `#[default]` on it",
code = "#[default] ",
applicability = "maybe-incorrect"
)]
pub(crate) struct NoDefaultVariantSugg {
#[primary_span]
pub(crate) span: Span,
}
#[derive(Diagnostic)]
#[diag("multiple declared defaults")]
#[note("only one variant can be default")]
pub(crate) struct MultipleDefaults {
#[primary_span]
pub(crate) span: Span,
#[label("first default")]
pub(crate) first: Span,
#[label("additional default")]
pub additional: Vec<Span>,
#[subdiagnostic]
pub suggs: Vec<MultipleDefaultsSugg>,
}
#[derive(Subdiagnostic)]
#[multipart_suggestion(
"make `{$ident}` default",
applicability = "maybe-incorrect",
style = "tool-only"
)]
pub(crate) struct MultipleDefaultsSugg {
#[suggestion_part(code = "")]
pub(crate) spans: Vec<Span>,
pub(crate) ident: Ident,
}
#[derive(Diagnostic)]
#[diag("the `#[default]` attribute may only be used on unit enum variants{$post}")]
#[help("consider a manual implementation of `Default`")]
pub(crate) struct NonUnitDefault {
#[primary_span]
pub(crate) span: Span,
pub(crate) post: &'static str,
}
#[derive(Diagnostic)]
#[diag("default variant must be exhaustive")]
#[help("consider a manual implementation of `Default`")]
pub(crate) struct NonExhaustiveDefault {
#[primary_span]
pub(crate) span: Span,
#[label("declared `#[non_exhaustive]` here")]
pub(crate) non_exhaustive: Span,
}
#[derive(Diagnostic)]
#[diag("multiple `#[default]` attributes")]
#[note("only one `#[default]` attribute is needed")]
pub(crate) struct MultipleDefaultAttrs {
#[primary_span]
pub(crate) span: Span,
#[label("`#[default]` used here")]
pub(crate) first: Span,
#[label("`#[default]` used again here")]
pub(crate) first_rest: Span,
#[help(
"try removing {$only_one ->
[true] this
*[false] these
}"
)]
pub(crate) rest: MultiSpan,
pub(crate) only_one: bool,
#[subdiagnostic]
pub(crate) sugg: MultipleDefaultAttrsSugg,
}
#[derive(Subdiagnostic)]
#[multipart_suggestion(
"consider a manual implementation of `Default`",
applicability = "machine-applicable",
style = "tool-only"
)]
pub(crate) struct MultipleDefaultAttrsSugg {
#[suggestion_part(code = "")]
pub(crate) spans: Vec<Span>,
}
#[derive(Diagnostic)]
#[diag("`#[default]` attribute does not accept a value")]
pub(crate) struct DefaultHasArg {
#[primary_span]
#[suggestion(
"try using `#[default]`",
code = "#[default]",
style = "hidden",
applicability = "maybe-incorrect"
)]
pub(crate) span: Span,
}
#[derive(Diagnostic)]
#[diag("`#[derive(From)]` used on {$kind}")]
#[note("`#[derive(From)]` can only be used on structs with exactly one field")]
pub(crate) struct DeriveFromWrongTarget<'a> {
#[primary_span]
pub(crate) span: MultiSpan,
pub(crate) kind: &'a str,
}
#[derive(Diagnostic)]
#[diag(
"`#[derive(From)]` used on a struct with {$multiple_fields ->
[true] multiple fields
*[false] no fields
}"
)]
#[note("`#[derive(From)]` can only be used on structs with exactly one field")]
pub(crate) struct DeriveFromWrongFieldCount {
#[primary_span]
pub(crate) span: MultiSpan,
pub(crate) multiple_fields: bool,
}
#[derive(Diagnostic)]
#[diag("`derive` cannot be used on items with type macros")]
pub(crate) struct DeriveMacroCall {
#[primary_span]
pub(crate) span: Span,
}
#[derive(Diagnostic)]
#[diag("this trait cannot be derived for unions")]
pub(crate) struct DeriveUnion {
#[primary_span]
pub(crate) span: Span,
}
#[derive(Diagnostic)]
#[diag("`env!()` takes 1 or 2 arguments")]
pub(crate) struct EnvTakesArgs {
#[primary_span]
pub(crate) span: Span,
}
pub(crate) struct EnvNotDefinedWithUserMessage {
pub(crate) span: Span,
pub(crate) msg_from_user: Symbol,
}
// Hand-written implementation to support custom user messages.
impl<'a, G: EmissionGuarantee> Diagnostic<'a, G> for EnvNotDefinedWithUserMessage {
#[track_caller]
fn into_diag(self, dcx: DiagCtxtHandle<'a>, level: Level) -> Diag<'a, G> {
let mut diag = Diag::new(dcx, level, self.msg_from_user.to_string());
diag.span(self.span);
diag
}
}
#[derive(Diagnostic)]
pub(crate) enum EnvNotDefined<'a> {
#[diag("environment variable `{$var}` not defined at compile time")]
#[help(
"Cargo sets build script variables at run time. Use `std::env::var({$var_expr})` instead"
)]
CargoEnvVar {
#[primary_span]
span: Span,
var: Symbol,
var_expr: &'a rustc_ast::Expr,
},
#[diag("environment variable `{$var}` not defined at compile time")]
#[help("there is a similar Cargo environment variable: `{$suggested_var}`")]
CargoEnvVarTypo {
#[primary_span]
span: Span,
var: Symbol,
suggested_var: Symbol,
},
#[diag("environment variable `{$var}` not defined at compile time")]
#[help("use `std::env::var({$var_expr})` to read the variable at run time")]
CustomEnvVar {
#[primary_span]
span: Span,
var: Symbol,
var_expr: &'a rustc_ast::Expr,
},
}
#[derive(Diagnostic)]
#[diag("environment variable `{$var}` is not a valid Unicode string")]
pub(crate) struct EnvNotUnicode {
#[primary_span]
pub(crate) span: Span,
pub(crate) var: Symbol,
}
#[derive(Diagnostic)]
#[diag("requires at least a format string argument")]
pub(crate) struct FormatRequiresString {
#[primary_span]
pub(crate) span: Span,
}
#[derive(Diagnostic)]
#[diag("duplicate argument named `{$ident}`")]
pub(crate) struct FormatDuplicateArg {
#[primary_span]
pub(crate) span: Span,
#[label("previously here")]
pub(crate) prev: Span,
#[label("duplicate argument")]
pub(crate) duplicate: Span,
pub(crate) ident: Ident,
}
#[derive(Diagnostic)]
#[diag("positional arguments cannot follow named arguments")]
pub(crate) struct PositionalAfterNamed {
#[primary_span]
#[label("positional arguments must be before named arguments")]
pub(crate) span: Span,
#[label("named argument")]
pub(crate) args: Vec<Span>,
}
#[derive(Diagnostic)]
#[diag("invalid format string: {$desc}")]
pub(crate) struct InvalidFormatString {
#[primary_span]
#[label("{$label1} in format string")]
pub(crate) span: Span,
pub(crate) desc: String,
pub(crate) label1: String,
#[subdiagnostic]
pub(crate) note_: Option<InvalidFormatStringNote>,
#[subdiagnostic]
pub(crate) label_: Option<InvalidFormatStringLabel>,
#[subdiagnostic]
pub(crate) sugg_: Option<InvalidFormatStringSuggestion>,
}
#[derive(Subdiagnostic)]
#[note("{$note}")]
pub(crate) struct InvalidFormatStringNote {
pub(crate) note: String,
}
#[derive(Subdiagnostic)]
#[label("{$label}")]
pub(crate) struct InvalidFormatStringLabel {
#[primary_span]
pub(crate) span: Span,
pub(crate) label: String,
}
#[derive(Subdiagnostic)]
pub(crate) enum InvalidFormatStringSuggestion {
#[multipart_suggestion(
"consider using a positional formatting argument instead",
style = "verbose",
applicability = "machine-applicable"
)]
UsePositional {
#[suggestion_part(code = "{len}")]
captured: Span,
len: String,
#[suggestion_part(code = ", {arg}")]
span: Span,
arg: String,
},
#[suggestion("remove the `r#`", code = "", applicability = "machine-applicable")]
RemoveRawIdent {
#[primary_span]
span: Span,
},
#[suggestion(
"did you mean `{$replacement}`?",
code = "{replacement}",
style = "verbose",
applicability = "machine-applicable"
)]
ReorderFormatParameter {
#[primary_span]
span: Span,
replacement: String,
},
#[suggestion(
"add a colon before the format specifier",
code = ":?",
applicability = "machine-applicable"
)]
AddMissingColon {
#[primary_span]
span: Span,
},
#[suggestion(
"use rust debug printing macro",
code = "{replacement}",
style = "verbose",
applicability = "machine-applicable"
)]
UseRustDebugPrintingMacro {
#[primary_span]
macro_span: Span,
replacement: String,
},
}
#[derive(Diagnostic)]
#[diag("there is no argument named `{$name}`")]
#[note("did you intend to capture a variable `{$name}` from the surrounding scope?")]
#[note(
"to avoid ambiguity, `format_args!` cannot capture variables when the format string is expanded from a macro"
)]
pub(crate) struct FormatNoArgNamed {
#[primary_span]
pub(crate) span: Span,
pub(crate) name: Symbol,
}
#[derive(Diagnostic)]
#[diag("unknown format trait `{$ty}`")]
#[note(
"the only appropriate formatting traits are:
- ``, which uses the `Display` trait
- `?`, which uses the `Debug` trait
- `e`, which uses the `LowerExp` trait
- `E`, which uses the `UpperExp` trait
- `o`, which uses the `Octal` trait
- `p`, which uses the `Pointer` trait
- `b`, which uses the `Binary` trait
- `x`, which uses the `LowerHex` trait
- `X`, which uses the `UpperHex` trait"
)]
pub(crate) struct FormatUnknownTrait<'a> {
#[primary_span]
pub(crate) span: Span,
pub(crate) ty: &'a str,
#[subdiagnostic]
pub(crate) suggs: Vec<FormatUnknownTraitSugg>,
}
#[derive(Subdiagnostic)]
#[suggestion(
"use the `{$trait_name}` trait",
code = "{fmt}",
style = "tool-only",
applicability = "maybe-incorrect"
)]
pub(crate) struct FormatUnknownTraitSugg {
#[primary_span]
pub span: Span,
pub fmt: &'static str,
pub trait_name: &'static str,
}
#[derive(Diagnostic)]
#[diag(
"{$named ->
[true] named argument
*[false] argument
} never used"
)]
pub(crate) struct FormatUnusedArg {
#[primary_span]
#[label(
"{$named ->
[true] named argument
*[false] argument
} never used"
)]
pub(crate) span: Span,
pub(crate) named: bool,
}
// Allow the singular form to be a subdiagnostic of the multiple-unused
// form of diagnostic.
impl Subdiagnostic for FormatUnusedArg {
fn add_to_diag<G: EmissionGuarantee>(self, diag: &mut Diag<'_, G>) {
diag.arg("named", self.named);
let msg = diag.eagerly_translate(msg!(
"{$named ->
[true] named argument
*[false] argument
} never used"
));
diag.remove_arg("named");
diag.span_label(self.span, msg);
}
}
#[derive(Diagnostic)]
#[diag("multiple unused formatting arguments")]
pub(crate) struct FormatUnusedArgs {
#[primary_span]
pub(crate) unused: Vec<Span>,
#[label("multiple missing formatting specifiers")]
pub(crate) fmt: Span,
#[subdiagnostic]
pub(crate) unused_labels: Vec<FormatUnusedArg>,
}
#[derive(Diagnostic)]
#[diag(
"{$n} positional {$n ->
[one] argument
*[more] arguments
} in format string, but {$desc}"
)]
pub(crate) struct FormatPositionalMismatch {
#[primary_span]
pub(crate) span: MultiSpan,
pub(crate) n: usize,
pub(crate) desc: String,
#[subdiagnostic]
pub(crate) highlight: SingleLabelManySpans,
}
#[derive(Diagnostic)]
#[diag(
"redundant {$n ->
[one] argument
*[more] arguments
}"
)]
pub(crate) struct FormatRedundantArgs {
#[primary_span]
pub(crate) span: MultiSpan,
pub(crate) n: usize,
#[note(
"{$n ->
[one] the formatting specifier is referencing the binding already
*[more] the formatting specifiers are referencing the bindings already
}"
)]
pub(crate) note: MultiSpan,
#[subdiagnostic]
pub(crate) sugg: Option<FormatRedundantArgsSugg>,
}
#[derive(Subdiagnostic)]
#[multipart_suggestion("this can be removed", applicability = "machine-applicable")]
pub(crate) struct FormatRedundantArgsSugg {
#[suggestion_part(code = "")]
pub(crate) spans: Vec<Span>,
}
#[derive(Diagnostic)]
#[diag("`#[test_case]` attribute is only allowed on items")]
pub(crate) struct TestCaseNonItem {
#[primary_span]
pub(crate) span: Span,
}
#[derive(Diagnostic)]
#[diag("{$kind} functions cannot be used for tests")]
pub(crate) struct TestBadFn {
#[primary_span]
pub(crate) span: Span,
#[label("`{$kind}` because of this")]
pub(crate) cause: Span,
pub(crate) kind: &'static str,
}
#[derive(Diagnostic)]
#[diag("explicit register arguments cannot have names")]
pub(crate) struct AsmExplicitRegisterName {
#[primary_span]
pub(crate) span: Span,
}
#[derive(Diagnostic)]
#[diag("the `{$opt1}` and `{$opt2}` options are mutually exclusive")]
pub(crate) struct AsmMutuallyExclusive {
#[primary_span]
pub(crate) spans: Vec<Span>,
pub(crate) opt1: &'static str,
pub(crate) opt2: &'static str,
}
#[derive(Diagnostic)]
#[diag("the `pure` option must be combined with either `nomem` or `readonly`")]
pub(crate) struct AsmPureCombine {
#[primary_span]
pub(crate) spans: Vec<Span>,
}
#[derive(Diagnostic)]
#[diag("asm with the `pure` option must have at least one output")]
pub(crate) struct AsmPureNoOutput {
#[primary_span]
pub(crate) spans: Vec<Span>,
}
#[derive(Diagnostic)]
#[diag("asm template modifier must be a single character")]
pub(crate) struct AsmModifierInvalid {
#[primary_span]
pub(crate) span: Span,
}
#[derive(Diagnostic)]
#[diag("this attribute is not supported on assembly")]
pub(crate) struct AsmAttributeNotSupported {
#[primary_span]
pub(crate) span: Span,
}
#[derive(Diagnostic)]
#[diag("duplicate argument named `{$name}`")]
pub(crate) struct AsmDuplicateArg {
#[primary_span]
#[label("duplicate argument")]
pub(crate) span: Span,
#[label("previously here")]
pub(crate) prev: Span,
pub(crate) name: Symbol,
}
#[derive(Diagnostic)]
#[diag("positional arguments cannot follow named arguments or explicit register arguments")]
pub(crate) struct AsmPositionalAfter {
#[primary_span]
#[label("positional argument")]
pub(crate) span: Span,
#[label("named argument")]
pub(crate) named: Vec<Span>,
#[label("explicit register argument")]
pub(crate) explicit: Vec<Span>,
}
#[derive(Diagnostic)]
#[diag("asm outputs are not allowed with the `noreturn` option")]
pub(crate) struct AsmNoReturn {
#[primary_span]
pub(crate) outputs_sp: Vec<Span>,
}
#[derive(Diagnostic)]
#[diag("there is no argument named `{$name}`")]
pub(crate) struct AsmNoMatchedArgumentName {
pub(crate) name: String,
#[primary_span]
pub(crate) span: Span,
}
#[derive(Diagnostic)]
#[diag("asm labels are not allowed with the `may_unwind` option")]
pub(crate) struct AsmMayUnwind {
#[primary_span]
pub(crate) labels_sp: Vec<Span>,
}
pub(crate) struct AsmClobberNoReg {
pub(crate) spans: Vec<Span>,
pub(crate) clobbers: Vec<Span>,
}
impl<'a, G: EmissionGuarantee> Diagnostic<'a, G> for AsmClobberNoReg {
fn into_diag(self, dcx: DiagCtxtHandle<'a>, level: Level) -> Diag<'a, G> {
// eager translation as `span_labels` takes `AsRef<str>`
let lbl1 = dcx.eagerly_translate_to_string(msg!("clobber_abi"), [].into_iter());
let lbl2 = dcx.eagerly_translate_to_string(msg!("generic outputs"), [].into_iter());
Diag::new(
dcx,
level,
msg!("asm with `clobber_abi` must specify explicit registers for outputs"),
)
.with_span(self.spans.clone())
.with_span_labels(self.clobbers, &lbl1)
.with_span_labels(self.spans, &lbl2)
}
}
#[derive(Diagnostic)]
#[diag("the `{$symbol}` option was already provided")]
pub(crate) struct AsmOptAlreadyprovided {
#[primary_span]
#[label("this option was already provided")]
pub(crate) span: Span,
pub(crate) symbol: Symbol,
#[suggestion(
"remove this option",
code = "",
applicability = "machine-applicable",
style = "tool-only"
)]
pub(crate) span_with_comma: Span,
}
#[derive(Diagnostic)]
#[diag("the `{$symbol}` option cannot be used with `{$macro_name}!`")]
pub(crate) struct AsmUnsupportedOption {
#[primary_span]
#[label("the `{$symbol}` option is not meaningful for global-scoped inline assembly")]
pub(crate) span: Span,
pub(crate) symbol: Symbol,
#[suggestion(
"remove this option",
code = "",
applicability = "machine-applicable",
style = "tool-only"
)]
pub(crate) span_with_comma: Span,
pub(crate) macro_name: &'static str,
}
#[derive(Diagnostic)]
#[diag("`clobber_abi` cannot be used with `{$macro_name}!`")]
pub(crate) struct AsmUnsupportedClobberAbi {
#[primary_span]
pub(crate) spans: Vec<Span>,
pub(crate) macro_name: &'static str,
}
#[derive(Diagnostic)]
#[diag("expected token: `,`")]
pub(crate) struct ExpectedCommaInList {
#[primary_span]
pub span: Span,
}
#[derive(Diagnostic)]
#[diag("{$name} takes 1 argument")]
pub(crate) struct OnlyOneArgument<'a> {
#[primary_span]
pub span: Span,
pub name: &'a str,
}
#[derive(Diagnostic)]
#[diag("{$name} takes no arguments")]
pub(crate) struct TakesNoArguments<'a> {
#[primary_span]
pub span: Span,
pub name: &'a str,
}
#[derive(Diagnostic)]
#[diag("the `#[{$path}]` attribute is only usable with crates of the `proc-macro` crate type")]
pub(crate) struct AttributeOnlyUsableWithCrateType<'a> {
#[primary_span]
pub span: Span,
pub path: &'a str,
}
#[derive(Diagnostic)]
#[diag("expected item, found `{$token}`")]
pub(crate) struct ExpectedItem<'a> {
#[primary_span]
pub span: Span,
pub token: &'a str,
}
#[derive(Diagnostic)]
#[diag("cannot use `#[unsafe(naked)]` with testing attributes", code = E0736)]
pub(crate) struct NakedFunctionTestingAttribute {
#[primary_span]
#[label("`#[unsafe(naked)]` is incompatible with testing attributes")]
pub naked_span: Span,
#[label("function marked with testing attribute here")]
pub testing_span: Span,
}
#[derive(Diagnostic)]
#[diag("the `#[pointee]` attribute may only be used on generic parameters")]
pub(crate) struct NonGenericPointee {
#[primary_span]
pub span: Span,
}
#[derive(Diagnostic)]
#[diag(
"expected operand, {$is_inline_asm ->
[false] options
*[true] clobber_abi, options
}, or additional template string"
)]
pub(crate) struct AsmExpectedOther {
#[primary_span]
#[label(
"expected operand, {$is_inline_asm ->
[false] options
*[true] clobber_abi, options
}, or additional template string"
)]
pub(crate) span: Span,
pub(crate) is_inline_asm: bool,
}
#[derive(Diagnostic)]
#[diag("none of the predicates in this `cfg_select` evaluated to true")]
pub(crate) struct CfgSelectNoMatches {
#[primary_span]
pub span: Span,
}
#[derive(Diagnostic)]
#[diag("`#[eii_declaration(...)]` is only valid on macros")]
pub(crate) struct EiiExternTargetExpectedMacro {
#[primary_span]
pub span: Span,
}
#[derive(Diagnostic)]
#[diag("`#[eii_declaration(...)]` expects a list of one or two elements")]
pub(crate) struct EiiExternTargetExpectedList {
#[primary_span]
pub span: Span,
}
#[derive(Diagnostic)]
#[diag("expected this argument to be \"unsafe\"")]
pub(crate) struct EiiExternTargetExpectedUnsafe {
#[primary_span]
#[note("the second argument is optional")]
pub span: Span,
}
#[derive(Diagnostic)]
#[diag("`#[{$name}]` is only valid on functions")]
pub(crate) struct EiiSharedMacroExpectedFunction {
#[primary_span]
pub span: Span,
pub name: String,
}
#[derive(Diagnostic)]
#[diag("`#[{$name}]` can only be used on functions inside a module")]
pub(crate) struct EiiSharedMacroInStatementPosition {
#[primary_span]
pub span: Span,
pub name: String,
#[label("`#[{$name}]` is used on this item, which is part of another item's local scope")]
pub item_span: Span,
}
#[derive(Diagnostic)]
#[diag("`#[{$name}]` can only be specified once")]
pub(crate) struct EiiOnlyOnce {
#[primary_span]
pub span: Span,
#[note("specified again here")]
pub first_span: Span,
pub name: String,
}
#[derive(Diagnostic)]
#[diag("`#[{$name}]` expected no arguments or a single argument: `#[{$name}(default)]`")]
pub(crate) struct EiiMacroExpectedMaxOneArgument {
#[primary_span]
pub span: Span,
pub name: String,
}