1use std::borrow::Cow;
4
5use rustc_abi::ExternAbi;
6use rustc_ast::{AssignOpKind, Label};
7use rustc_errors::codes::*;
8use rustc_errors::{
9 Applicability, Diag, DiagArgValue, DiagCtxtHandle, DiagSymbolList, Diagnostic,
10 EmissionGuarantee, IntoDiagArg, Level, MultiSpan, Subdiagnostic, msg,
11};
12use rustc_hir as hir;
13use rustc_hir::ExprKind;
14use rustc_macros::{Diagnostic, Subdiagnostic};
15use rustc_middle::ty::{self, Ty};
16use rustc_span::edition::{Edition, LATEST_STABLE_EDITION};
17use rustc_span::source_map::Spanned;
18use rustc_span::{Ident, Span, Symbol};
19
20use crate::FnCtxt;
21
22#[derive(const _: () =
{
impl<'_sess, G> rustc_errors::Diagnostic<'_sess, G> for
BaseExpressionDoubleDot where G: rustc_errors::EmissionGuarantee {
#[track_caller]
fn into_diag(self, dcx: rustc_errors::DiagCtxtHandle<'_sess>,
level: rustc_errors::Level) -> rustc_errors::Diag<'_sess, G> {
match self {
BaseExpressionDoubleDot {
span: __binding_0,
default_field_values_suggestion: __binding_1,
add_expr: __binding_2,
remove_dots: __binding_3 } => {
let mut diag =
rustc_errors::Diag::new(dcx, level,
rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("base expression required after `..`")));
let __code_0 =
[::alloc::__export::must_use({
::alloc::fmt::format(format_args!("#![feature(default_field_values)]\n"))
})].into_iter();
diag.code(E0797);
;
diag.span(__binding_0);
if let Some(__binding_1) = __binding_1 {
diag.span_suggestions_with_style(__binding_1,
rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("add `#![feature(default_field_values)]` to the crate attributes to enable default values on `struct` fields")),
__code_0, rustc_errors::Applicability::MachineApplicable,
rustc_errors::SuggestionStyle::ShowAlways);
}
if let Some(__binding_2) = __binding_2 {
diag.subdiagnostic(__binding_2);
}
if let Some(__binding_3) = __binding_3 {
diag.subdiagnostic(__binding_3);
}
diag
}
}
}
}
};Diagnostic)]
23#[diag("base expression required after `..`", code = E0797)]
24pub(crate) struct BaseExpressionDoubleDot {
25 #[primary_span]
26 pub span: Span,
27 #[suggestion(
28 "add `#![feature(default_field_values)]` to the crate attributes to enable default values on `struct` fields",
29 code = "#![feature(default_field_values)]\n",
30 applicability = "machine-applicable",
31 style = "verbose"
32 )]
33 pub default_field_values_suggestion: Option<Span>,
34 #[subdiagnostic]
35 pub add_expr: Option<BaseExpressionDoubleDotAddExpr>,
36 #[subdiagnostic]
37 pub remove_dots: Option<BaseExpressionDoubleDotRemove>,
38}
39
40#[derive(const _: () =
{
impl rustc_errors::Subdiagnostic for BaseExpressionDoubleDotRemove {
fn add_to_diag<__G>(self, diag: &mut rustc_errors::Diag<'_, __G>)
where __G: rustc_errors::EmissionGuarantee {
match self {
BaseExpressionDoubleDotRemove { span: __binding_0 } => {
let __code_1 =
[::alloc::__export::must_use({
::alloc::fmt::format(format_args!(""))
})].into_iter();
diag.store_args();
let __message =
diag.eagerly_translate(rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("remove the `..` as all the fields are already present")));
diag.span_suggestions_with_style(__binding_0, __message,
__code_1, rustc_errors::Applicability::MachineApplicable,
rustc_errors::SuggestionStyle::ShowAlways);
diag.restore_args();
}
}
}
}
};Subdiagnostic)]
41#[suggestion(
42 "remove the `..` as all the fields are already present",
43 code = "",
44 applicability = "machine-applicable",
45 style = "verbose"
46)]
47pub(crate) struct BaseExpressionDoubleDotRemove {
48 #[primary_span]
49 pub span: Span,
50}
51
52#[derive(const _: () =
{
impl rustc_errors::Subdiagnostic for BaseExpressionDoubleDotAddExpr {
fn add_to_diag<__G>(self, diag: &mut rustc_errors::Diag<'_, __G>)
where __G: rustc_errors::EmissionGuarantee {
match self {
BaseExpressionDoubleDotAddExpr { span: __binding_0 } => {
let __code_2 =
[::alloc::__export::must_use({
::alloc::fmt::format(format_args!("/* expr */"))
})].into_iter();
diag.store_args();
let __message =
diag.eagerly_translate(rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("add a base expression here")));
diag.span_suggestions_with_style(__binding_0, __message,
__code_2, rustc_errors::Applicability::HasPlaceholders,
rustc_errors::SuggestionStyle::ShowAlways);
diag.restore_args();
}
}
}
}
};Subdiagnostic)]
53#[suggestion(
54 "add a base expression here",
55 code = "/* expr */",
56 applicability = "has-placeholders",
57 style = "verbose"
58)]
59pub(crate) struct BaseExpressionDoubleDotAddExpr {
60 #[primary_span]
61 pub span: Span,
62}
63
64#[derive(const _: () =
{
impl<'_sess, G> rustc_errors::Diagnostic<'_sess, G> for
FieldMultiplySpecifiedInInitializer where
G: rustc_errors::EmissionGuarantee {
#[track_caller]
fn into_diag(self, dcx: rustc_errors::DiagCtxtHandle<'_sess>,
level: rustc_errors::Level) -> rustc_errors::Diag<'_sess, G> {
match self {
FieldMultiplySpecifiedInInitializer {
span: __binding_0,
prev_span: __binding_1,
ident: __binding_2 } => {
let mut diag =
rustc_errors::Diag::new(dcx, level,
rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("field `{$ident}` specified more than once")));
diag.code(E0062);
;
diag.arg("ident", __binding_2);
diag.span(__binding_0);
diag.span_label(__binding_0,
rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("used more than once")));
diag.span_label(__binding_1,
rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("first use of `{$ident}`")));
diag
}
}
}
}
};Diagnostic)]
65#[diag("field `{$ident}` specified more than once", code = E0062)]
66pub(crate) struct FieldMultiplySpecifiedInInitializer {
67 #[primary_span]
68 #[label("used more than once")]
69 pub span: Span,
70 #[label("first use of `{$ident}`")]
71 pub prev_span: Span,
72 pub ident: Ident,
73}
74
75#[derive(const _: () =
{
impl<'_sess, G> rustc_errors::Diagnostic<'_sess, G> for
ReturnStmtOutsideOfFnBody where G: rustc_errors::EmissionGuarantee
{
#[track_caller]
fn into_diag(self, dcx: rustc_errors::DiagCtxtHandle<'_sess>,
level: rustc_errors::Level) -> rustc_errors::Diag<'_sess, G> {
match self {
ReturnStmtOutsideOfFnBody {
span: __binding_0,
encl_body_span: __binding_1,
encl_fn_span: __binding_2,
statement_kind: __binding_3 } => {
let mut diag =
rustc_errors::Diag::new(dcx, level,
rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("{$statement_kind} statement outside of function body")));
diag.code(E0572);
;
diag.arg("statement_kind", __binding_3);
diag.span(__binding_0);
if let Some(__binding_1) = __binding_1 {
diag.span_label(__binding_1,
rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("the {$statement_kind} is part of this body...")));
}
if let Some(__binding_2) = __binding_2 {
diag.span_label(__binding_2,
rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("...not the enclosing function body")));
}
diag
}
}
}
}
};Diagnostic)]
76#[diag("{$statement_kind} statement outside of function body", code = E0572)]
77pub(crate) struct ReturnStmtOutsideOfFnBody {
78 #[primary_span]
79 pub span: Span,
80 #[label("the {$statement_kind} is part of this body...")]
81 pub encl_body_span: Option<Span>,
82 #[label("...not the enclosing function body")]
83 pub encl_fn_span: Option<Span>,
84 pub statement_kind: ReturnLikeStatementKind,
85}
86
87pub(crate) enum ReturnLikeStatementKind {
88 Return,
89 Become,
90}
91
92impl IntoDiagArg for ReturnLikeStatementKind {
93 fn into_diag_arg(self, _: &mut Option<std::path::PathBuf>) -> DiagArgValue {
94 let kind = match self {
95 Self::Return => "return",
96 Self::Become => "become",
97 }
98 .into();
99
100 DiagArgValue::Str(kind)
101 }
102}
103
104#[derive(const _: () =
{
impl<'_sess, G> rustc_errors::Diagnostic<'_sess, G> for
RustCallIncorrectArgs where G: rustc_errors::EmissionGuarantee {
#[track_caller]
fn into_diag(self, dcx: rustc_errors::DiagCtxtHandle<'_sess>,
level: rustc_errors::Level) -> rustc_errors::Diag<'_sess, G> {
match self {
RustCallIncorrectArgs { span: __binding_0 } => {
let mut diag =
rustc_errors::Diag::new(dcx, level,
rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("functions with the \"rust-call\" ABI must take a single non-self tuple argument")));
;
diag.span(__binding_0);
diag
}
}
}
}
};Diagnostic)]
105#[diag("functions with the \"rust-call\" ABI must take a single non-self tuple argument")]
106pub(crate) struct RustCallIncorrectArgs {
107 #[primary_span]
108 pub span: Span,
109}
110
111#[derive(const _: () =
{
impl<'_sess, G> rustc_errors::Diagnostic<'_sess, G> for
YieldExprOutsideOfCoroutine where
G: rustc_errors::EmissionGuarantee {
#[track_caller]
fn into_diag(self, dcx: rustc_errors::DiagCtxtHandle<'_sess>,
level: rustc_errors::Level) -> rustc_errors::Diag<'_sess, G> {
match self {
YieldExprOutsideOfCoroutine { span: __binding_0 } => {
let mut diag =
rustc_errors::Diag::new(dcx, level,
rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("yield expression outside of coroutine literal")));
diag.code(E0627);
;
diag.span(__binding_0);
diag
}
}
}
}
};Diagnostic)]
112#[diag("yield expression outside of coroutine literal", code = E0627)]
113pub(crate) struct YieldExprOutsideOfCoroutine {
114 #[primary_span]
115 pub span: Span,
116}
117
118#[derive(const _: () =
{
impl<'_sess, G> rustc_errors::Diagnostic<'_sess, G> for
StructExprNonExhaustive where G: rustc_errors::EmissionGuarantee {
#[track_caller]
fn into_diag(self, dcx: rustc_errors::DiagCtxtHandle<'_sess>,
level: rustc_errors::Level) -> rustc_errors::Diag<'_sess, G> {
match self {
StructExprNonExhaustive {
span: __binding_0, what: __binding_1 } => {
let mut diag =
rustc_errors::Diag::new(dcx, level,
rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("cannot create non-exhaustive {$what} using struct expression")));
diag.code(E0639);
;
diag.arg("what", __binding_1);
diag.span(__binding_0);
diag
}
}
}
}
};Diagnostic)]
119#[diag("cannot create non-exhaustive {$what} using struct expression", code = E0639)]
120pub(crate) struct StructExprNonExhaustive {
121 #[primary_span]
122 pub span: Span,
123 pub what: &'static str,
124}
125
126#[derive(const _: () =
{
impl<'_sess, G> rustc_errors::Diagnostic<'_sess, G> for
FunctionalRecordUpdateOnNonStruct where
G: rustc_errors::EmissionGuarantee {
#[track_caller]
fn into_diag(self, dcx: rustc_errors::DiagCtxtHandle<'_sess>,
level: rustc_errors::Level) -> rustc_errors::Diag<'_sess, G> {
match self {
FunctionalRecordUpdateOnNonStruct { span: __binding_0 } => {
let mut diag =
rustc_errors::Diag::new(dcx, level,
rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("functional record update syntax requires a struct")));
diag.code(E0436);
;
diag.span(__binding_0);
diag
}
}
}
}
};Diagnostic)]
127#[diag("functional record update syntax requires a struct", code = E0436)]
128pub(crate) struct FunctionalRecordUpdateOnNonStruct {
129 #[primary_span]
130 pub span: Span,
131}
132
133#[derive(const _: () =
{
impl<'_sess, G> rustc_errors::Diagnostic<'_sess, G> for
AddressOfTemporaryTaken where G: rustc_errors::EmissionGuarantee {
#[track_caller]
fn into_diag(self, dcx: rustc_errors::DiagCtxtHandle<'_sess>,
level: rustc_errors::Level) -> rustc_errors::Diag<'_sess, G> {
match self {
AddressOfTemporaryTaken { span: __binding_0 } => {
let mut diag =
rustc_errors::Diag::new(dcx, level,
rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("cannot take address of a temporary")));
diag.code(E0745);
;
diag.span(__binding_0);
diag.span_label(__binding_0,
rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("temporary value")));
diag
}
}
}
}
};Diagnostic)]
134#[diag("cannot take address of a temporary", code = E0745)]
135pub(crate) struct AddressOfTemporaryTaken {
136 #[primary_span]
137 #[label("temporary value")]
138 pub span: Span,
139}
140
141#[derive(const _: () =
{
impl rustc_errors::Subdiagnostic for AddReturnTypeSuggestion {
fn add_to_diag<__G>(self, diag: &mut rustc_errors::Diag<'_, __G>)
where __G: rustc_errors::EmissionGuarantee {
match self {
AddReturnTypeSuggestion::Add {
span: __binding_0, found: __binding_1 } => {
let __code_3 =
[::alloc::__export::must_use({
::alloc::fmt::format(format_args!(" -> {0}", __binding_1))
})].into_iter();
diag.store_args();
diag.arg("found", __binding_1);
let __message =
diag.eagerly_translate(rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("try adding a return type")));
diag.span_suggestions_with_style(__binding_0, __message,
__code_3, rustc_errors::Applicability::MachineApplicable,
rustc_errors::SuggestionStyle::ShowCode);
diag.restore_args();
}
AddReturnTypeSuggestion::MissingHere { span: __binding_0 }
=> {
let __code_4 =
[::alloc::__export::must_use({
::alloc::fmt::format(format_args!(" -> _"))
})].into_iter();
diag.store_args();
let __message =
diag.eagerly_translate(rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("a return type might be missing here")));
diag.span_suggestions_with_style(__binding_0, __message,
__code_4, rustc_errors::Applicability::HasPlaceholders,
rustc_errors::SuggestionStyle::ShowCode);
diag.restore_args();
}
}
}
}
};Subdiagnostic)]
142pub(crate) enum AddReturnTypeSuggestion {
143 #[suggestion(
144 "try adding a return type",
145 code = " -> {found}",
146 applicability = "machine-applicable"
147 )]
148 Add {
149 #[primary_span]
150 span: Span,
151 found: String,
152 },
153 #[suggestion(
154 "a return type might be missing here",
155 code = " -> _",
156 applicability = "has-placeholders"
157 )]
158 MissingHere {
159 #[primary_span]
160 span: Span,
161 },
162}
163
164#[derive(const _: () =
{
impl<'tcx> rustc_errors::Subdiagnostic for
ExpectedReturnTypeLabel<'tcx> {
fn add_to_diag<__G>(self, diag: &mut rustc_errors::Diag<'_, __G>)
where __G: rustc_errors::EmissionGuarantee {
match self {
ExpectedReturnTypeLabel::Unit { span: __binding_0 } => {
diag.store_args();
let __message =
diag.eagerly_translate(rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("expected `()` because of default return type")));
diag.span_label(__binding_0, __message);
diag.restore_args();
}
ExpectedReturnTypeLabel::Other {
span: __binding_0, expected: __binding_1 } => {
diag.store_args();
diag.arg("expected", __binding_1);
let __message =
diag.eagerly_translate(rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("expected `{$expected}` because of return type")));
diag.span_label(__binding_0, __message);
diag.restore_args();
}
}
}
}
};Subdiagnostic)]
165pub(crate) enum ExpectedReturnTypeLabel<'tcx> {
166 #[label("expected `()` because of default return type")]
167 Unit {
168 #[primary_span]
169 span: Span,
170 },
171 #[label("expected `{$expected}` because of return type")]
172 Other {
173 #[primary_span]
174 span: Span,
175 expected: Ty<'tcx>,
176 },
177}
178
179#[derive(const _: () =
{
impl<'_sess, G> rustc_errors::Diagnostic<'_sess, G> for
ExplicitDestructorCall where G: rustc_errors::EmissionGuarantee {
#[track_caller]
fn into_diag(self, dcx: rustc_errors::DiagCtxtHandle<'_sess>,
level: rustc_errors::Level) -> rustc_errors::Diag<'_sess, G> {
match self {
ExplicitDestructorCall {
span: __binding_0, sugg: __binding_1 } => {
let mut diag =
rustc_errors::Diag::new(dcx, level,
rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("explicit use of destructor method")));
diag.code(E0040);
;
diag.span(__binding_0);
diag.span_label(__binding_0,
rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("explicit destructor calls not allowed")));
diag.subdiagnostic(__binding_1);
diag
}
}
}
}
};Diagnostic)]
180#[diag("explicit use of destructor method", code = E0040)]
181pub(crate) struct ExplicitDestructorCall {
182 #[primary_span]
183 #[label("explicit destructor calls not allowed")]
184 pub span: Span,
185 #[subdiagnostic]
186 pub sugg: ExplicitDestructorCallSugg,
187}
188
189#[derive(const _: () =
{
impl rustc_errors::Subdiagnostic for ExplicitDestructorCallSugg {
fn add_to_diag<__G>(self, diag: &mut rustc_errors::Diag<'_, __G>)
where __G: rustc_errors::EmissionGuarantee {
match self {
ExplicitDestructorCallSugg::Empty(__binding_0) => {
let __code_5 =
[::alloc::__export::must_use({
::alloc::fmt::format(format_args!("drop"))
})].into_iter();
diag.store_args();
let __message =
diag.eagerly_translate(rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("consider using `drop` function")));
diag.span_suggestions_with_style(__binding_0, __message,
__code_5, rustc_errors::Applicability::MaybeIncorrect,
rustc_errors::SuggestionStyle::ShowCode);
diag.restore_args();
}
ExplicitDestructorCallSugg::Snippet {
lo: __binding_0, hi: __binding_1 } => {
let mut suggestions = Vec::new();
let __code_6 =
::alloc::__export::must_use({
::alloc::fmt::format(format_args!("drop("))
});
let __code_7 =
::alloc::__export::must_use({
::alloc::fmt::format(format_args!(")"))
});
suggestions.push((__binding_0, __code_6));
suggestions.push((__binding_1, __code_7));
diag.store_args();
let __message =
diag.eagerly_translate(rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("consider using `drop` function")));
diag.multipart_suggestion_with_style(__message, suggestions,
rustc_errors::Applicability::Unspecified,
rustc_errors::SuggestionStyle::HideCodeInline);
diag.restore_args();
}
}
}
}
};Subdiagnostic)]
190pub(crate) enum ExplicitDestructorCallSugg {
191 #[suggestion(
192 "consider using `drop` function",
193 code = "drop",
194 applicability = "maybe-incorrect"
195 )]
196 Empty(#[primary_span] Span),
197 #[multipart_suggestion("consider using `drop` function", style = "short")]
198 Snippet {
199 #[suggestion_part(code = "drop(")]
200 lo: Span,
201 #[suggestion_part(code = ")")]
202 hi: Span,
203 },
204}
205
206#[derive(const _: () =
{
impl<'_sess, 'tcx, G> rustc_errors::Diagnostic<'_sess, G> for
MissingParenthesesInRange<'tcx> where
G: rustc_errors::EmissionGuarantee {
#[track_caller]
fn into_diag(self, dcx: rustc_errors::DiagCtxtHandle<'_sess>,
level: rustc_errors::Level) -> rustc_errors::Diag<'_sess, G> {
match self {
MissingParenthesesInRange {
span: __binding_0,
ty: __binding_1,
method_name: __binding_2,
add_missing_parentheses: __binding_3 } => {
let mut diag =
rustc_errors::Diag::new(dcx, level,
rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("can't call method `{$method_name}` on type `{$ty}`")));
diag.code(E0689);
;
diag.arg("ty", __binding_1);
diag.arg("method_name", __binding_2);
diag.span(__binding_0);
diag.span_label(__binding_0,
rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("can't call method `{$method_name}` on type `{$ty}`")));
if let Some(__binding_3) = __binding_3 {
diag.subdiagnostic(__binding_3);
}
diag
}
}
}
}
};Diagnostic)]
207#[diag("can't call method `{$method_name}` on type `{$ty}`", code = E0689)]
208pub(crate) struct MissingParenthesesInRange<'tcx> {
209 #[primary_span]
210 #[label("can't call method `{$method_name}` on type `{$ty}`")]
211 pub span: Span,
212 pub ty: Ty<'tcx>,
213 pub method_name: String,
214 #[subdiagnostic]
215 pub add_missing_parentheses: Option<AddMissingParenthesesInRange>,
216}
217
218#[derive(const _: () =
{
impl<'_sess, G> rustc_errors::Diagnostic<'_sess, G> for
NeverTypeFallbackFlowingIntoUnsafe where
G: rustc_errors::EmissionGuarantee {
#[track_caller]
fn into_diag(self, dcx: rustc_errors::DiagCtxtHandle<'_sess>,
level: rustc_errors::Level) -> rustc_errors::Diag<'_sess, G> {
match self {
NeverTypeFallbackFlowingIntoUnsafe::Call { sugg: __binding_0
} => {
let mut diag =
rustc_errors::Diag::new(dcx, level,
rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("never type fallback affects this call to an `unsafe` function")));
diag.help(rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("specify the type explicitly")));
;
diag.subdiagnostic(__binding_0);
diag
}
NeverTypeFallbackFlowingIntoUnsafe::Method {
sugg: __binding_0 } => {
let mut diag =
rustc_errors::Diag::new(dcx, level,
rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("never type fallback affects this call to an `unsafe` method")));
diag.help(rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("specify the type explicitly")));
;
diag.subdiagnostic(__binding_0);
diag
}
NeverTypeFallbackFlowingIntoUnsafe::Path { sugg: __binding_0
} => {
let mut diag =
rustc_errors::Diag::new(dcx, level,
rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("never type fallback affects this `unsafe` function")));
diag.help(rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("specify the type explicitly")));
;
diag.subdiagnostic(__binding_0);
diag
}
NeverTypeFallbackFlowingIntoUnsafe::UnionField {
sugg: __binding_0 } => {
let mut diag =
rustc_errors::Diag::new(dcx, level,
rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("never type fallback affects this union access")));
diag.help(rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("specify the type explicitly")));
;
diag.subdiagnostic(__binding_0);
diag
}
NeverTypeFallbackFlowingIntoUnsafe::Deref {
sugg: __binding_0 } => {
let mut diag =
rustc_errors::Diag::new(dcx, level,
rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("never type fallback affects this raw pointer dereference")));
diag.help(rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("specify the type explicitly")));
;
diag.subdiagnostic(__binding_0);
diag
}
}
}
}
};Diagnostic)]
219pub(crate) enum NeverTypeFallbackFlowingIntoUnsafe {
220 #[help("specify the type explicitly")]
221 #[diag("never type fallback affects this call to an `unsafe` function")]
222 Call {
223 #[subdiagnostic]
224 sugg: SuggestAnnotations,
225 },
226 #[help("specify the type explicitly")]
227 #[diag("never type fallback affects this call to an `unsafe` method")]
228 Method {
229 #[subdiagnostic]
230 sugg: SuggestAnnotations,
231 },
232 #[help("specify the type explicitly")]
233 #[diag("never type fallback affects this `unsafe` function")]
234 Path {
235 #[subdiagnostic]
236 sugg: SuggestAnnotations,
237 },
238 #[help("specify the type explicitly")]
239 #[diag("never type fallback affects this union access")]
240 UnionField {
241 #[subdiagnostic]
242 sugg: SuggestAnnotations,
243 },
244 #[help("specify the type explicitly")]
245 #[diag("never type fallback affects this raw pointer dereference")]
246 Deref {
247 #[subdiagnostic]
248 sugg: SuggestAnnotations,
249 },
250}
251
252#[derive(const _: () =
{
impl<'_sess, 'tcx, G> rustc_errors::Diagnostic<'_sess, G> for
DependencyOnUnitNeverTypeFallback<'tcx> where
G: rustc_errors::EmissionGuarantee {
#[track_caller]
fn into_diag(self, dcx: rustc_errors::DiagCtxtHandle<'_sess>,
level: rustc_errors::Level) -> rustc_errors::Diag<'_sess, G> {
match self {
DependencyOnUnitNeverTypeFallback {
obligation_span: __binding_0,
obligation: __binding_1,
sugg: __binding_2 } => {
let mut diag =
rustc_errors::Diag::new(dcx, level,
rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("this function depends on never type fallback being `()`")));
diag.help(rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("specify the types explicitly")));
;
diag.arg("obligation", __binding_1);
diag.span_note(__binding_0,
rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("in edition 2024, the requirement `{$obligation}` will fail")));
diag.subdiagnostic(__binding_2);
diag
}
}
}
}
};Diagnostic)]
253#[help("specify the types explicitly")]
254#[diag("this function depends on never type fallback being `()`")]
255pub(crate) struct DependencyOnUnitNeverTypeFallback<'tcx> {
256 #[note("in edition 2024, the requirement `{$obligation}` will fail")]
257 pub obligation_span: Span,
258 pub obligation: ty::Predicate<'tcx>,
259 #[subdiagnostic]
260 pub sugg: SuggestAnnotations,
261}
262
263#[derive(#[automatically_derived]
impl ::core::clone::Clone for SuggestAnnotation {
#[inline]
fn clone(&self) -> SuggestAnnotation {
match self {
SuggestAnnotation::Unit(__self_0) =>
SuggestAnnotation::Unit(::core::clone::Clone::clone(__self_0)),
SuggestAnnotation::Path(__self_0) =>
SuggestAnnotation::Path(::core::clone::Clone::clone(__self_0)),
SuggestAnnotation::Local(__self_0) =>
SuggestAnnotation::Local(::core::clone::Clone::clone(__self_0)),
SuggestAnnotation::Turbo(__self_0, __self_1, __self_2) =>
SuggestAnnotation::Turbo(::core::clone::Clone::clone(__self_0),
::core::clone::Clone::clone(__self_1),
::core::clone::Clone::clone(__self_2)),
}
}
}Clone)]
264pub(crate) enum SuggestAnnotation {
265 Unit(Span),
266 Path(Span),
267 Local(Span),
268 Turbo(Span, usize, usize),
269}
270
271#[derive(#[automatically_derived]
impl ::core::clone::Clone for SuggestAnnotations {
#[inline]
fn clone(&self) -> SuggestAnnotations {
SuggestAnnotations {
suggestions: ::core::clone::Clone::clone(&self.suggestions),
}
}
}Clone)]
272pub(crate) struct SuggestAnnotations {
273 pub suggestions: Vec<SuggestAnnotation>,
274}
275impl Subdiagnostic for SuggestAnnotations {
276 fn add_to_diag<G: EmissionGuarantee>(self, diag: &mut Diag<'_, G>) {
277 if self.suggestions.is_empty() {
278 return;
279 }
280
281 let mut suggestions = ::alloc::vec::Vec::new()vec![];
282 for suggestion in self.suggestions {
283 match suggestion {
284 SuggestAnnotation::Unit(span) => {
285 suggestions.push((span, "()".to_string()));
286 }
287 SuggestAnnotation::Path(span) => {
288 suggestions.push((span.shrink_to_lo(), "<() as ".to_string()));
289 suggestions.push((span.shrink_to_hi(), ">".to_string()));
290 }
291 SuggestAnnotation::Local(span) => {
292 suggestions.push((span, ": ()".to_string()));
293 }
294 SuggestAnnotation::Turbo(span, n_args, idx) => suggestions.push((
295 span,
296 ::alloc::__export::must_use({
::alloc::fmt::format(format_args!("::<{0}>",
(0..n_args).map(|i|
if i == idx {
"()"
} else { "_" }).collect::<Vec<_>>().join(", ")))
})format!(
297 "::<{}>",
298 (0..n_args)
299 .map(|i| if i == idx { "()" } else { "_" })
300 .collect::<Vec<_>>()
301 .join(", "),
302 ),
303 )),
304 }
305 }
306
307 diag.multipart_suggestion(
308 "use `()` annotations to avoid fallback changes",
309 suggestions,
310 Applicability::MachineApplicable,
311 );
312 }
313}
314
315#[derive(const _: () =
{
impl rustc_errors::Subdiagnostic for AddMissingParenthesesInRange {
fn add_to_diag<__G>(self, diag: &mut rustc_errors::Diag<'_, __G>)
where __G: rustc_errors::EmissionGuarantee {
match self {
AddMissingParenthesesInRange {
func_name: __binding_0,
left: __binding_1,
right: __binding_2 } => {
let mut suggestions = Vec::new();
let __code_8 =
::alloc::__export::must_use({
::alloc::fmt::format(format_args!("("))
});
let __code_9 =
::alloc::__export::must_use({
::alloc::fmt::format(format_args!(")"))
});
suggestions.push((__binding_1, __code_8));
suggestions.push((__binding_2, __code_9));
diag.store_args();
diag.arg("func_name", __binding_0);
let __message =
diag.eagerly_translate(rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("you must surround the range in parentheses to call its `{$func_name}` function")));
diag.multipart_suggestion_with_style(__message, suggestions,
rustc_errors::Applicability::MaybeIncorrect,
rustc_errors::SuggestionStyle::ShowAlways);
diag.restore_args();
}
}
}
}
};Subdiagnostic)]
316#[multipart_suggestion(
317 "you must surround the range in parentheses to call its `{$func_name}` function",
318 style = "verbose",
319 applicability = "maybe-incorrect"
320)]
321pub(crate) struct AddMissingParenthesesInRange {
322 pub func_name: String,
323 #[suggestion_part(code = "(")]
324 pub left: Span,
325 #[suggestion_part(code = ")")]
326 pub right: Span,
327}
328
329pub(crate) struct TypeMismatchFruTypo {
330 pub expr_span: Span,
332 pub fru_span: Span,
334 pub expr: Option<String>,
336}
337
338impl Subdiagnostic for TypeMismatchFruTypo {
339 fn add_to_diag<G: EmissionGuarantee>(self, diag: &mut Diag<'_, G>) {
340 diag.arg("expr", self.expr.as_deref().unwrap_or("NONE"));
341
342 if self.expr_span.between(self.fru_span).is_empty() {
344 diag.span_note(
345 self.expr_span.to(self.fru_span),
346 rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("this expression may have been misinterpreted as a `..` range expression"))msg!("this expression may have been misinterpreted as a `..` range expression"),
347 );
348 } else {
349 let mut multispan: MultiSpan = ::alloc::boxed::box_assume_init_into_vec_unsafe(::alloc::intrinsics::write_box_via_move(::alloc::boxed::Box::new_uninit(),
[self.expr_span, self.fru_span]))vec![self.expr_span, self.fru_span].into();
350 multispan.push_span_label(
351 self.expr_span,
352 rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("this expression does not end in a comma..."))msg!("this expression does not end in a comma..."),
353 );
354 multispan.push_span_label(self.fru_span, rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("... so this is interpreted as a `..` range expression, instead of functional record update syntax"))msg!("... so this is interpreted as a `..` range expression, instead of functional record update syntax"));
355 diag.span_note(
356 multispan,
357 rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("this expression may have been misinterpreted as a `..` range expression"))msg!("this expression may have been misinterpreted as a `..` range expression"),
358 );
359 }
360
361 diag.span_suggestion(
362 self.expr_span.shrink_to_hi(),
363 rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("to set the remaining fields{$expr ->\n [NONE]{\"\"}\n *[other] {\" \"}from `{$expr}`\n }, separate the last named field with a comma"))msg!(
364 "to set the remaining fields{$expr ->
365 [NONE]{\"\"}
366 *[other] {\" \"}from `{$expr}`
367 }, separate the last named field with a comma"
368 ),
369 ", ",
370 Applicability::MaybeIncorrect,
371 );
372 }
373}
374
375#[derive(const _: () =
{
impl<'_sess, 'tcx, G> rustc_errors::Diagnostic<'_sess, G> for
LossyProvenanceInt2Ptr<'tcx> where
G: rustc_errors::EmissionGuarantee {
#[track_caller]
fn into_diag(self, dcx: rustc_errors::DiagCtxtHandle<'_sess>,
level: rustc_errors::Level) -> rustc_errors::Diag<'_sess, G> {
match self {
LossyProvenanceInt2Ptr {
expr_ty: __binding_0,
cast_ty: __binding_1,
sugg: __binding_2 } => {
let mut diag =
rustc_errors::Diag::new(dcx, level,
rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("strict provenance disallows casting integer `{$expr_ty}` to pointer `{$cast_ty}`")));
diag.help(rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("if you can't comply with strict provenance and don't have a pointer with the correct provenance you can use `std::ptr::with_exposed_provenance()` instead")));
;
diag.arg("expr_ty", __binding_0);
diag.arg("cast_ty", __binding_1);
diag.subdiagnostic(__binding_2);
diag
}
}
}
}
};Diagnostic)]
376#[diag("strict provenance disallows casting integer `{$expr_ty}` to pointer `{$cast_ty}`")]
377#[help(
378 "if you can't comply with strict provenance and don't have a pointer with the correct provenance you can use `std::ptr::with_exposed_provenance()` instead"
379)]
380pub(crate) struct LossyProvenanceInt2Ptr<'tcx> {
381 pub expr_ty: Ty<'tcx>,
382 pub cast_ty: Ty<'tcx>,
383 #[subdiagnostic]
384 pub sugg: LossyProvenanceInt2PtrSuggestion,
385}
386
387#[derive(const _: () =
{
impl<'_sess, G> rustc_errors::Diagnostic<'_sess, G> for
PtrCastAddAutoToObject where G: rustc_errors::EmissionGuarantee {
#[track_caller]
fn into_diag(self, dcx: rustc_errors::DiagCtxtHandle<'_sess>,
level: rustc_errors::Level) -> rustc_errors::Diag<'_sess, G> {
match self {
PtrCastAddAutoToObject {
span: __binding_0,
traits_len: __binding_1,
traits: __binding_2 } => {
let mut diag =
rustc_errors::Diag::new(dcx, level,
rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("cannot add {$traits_len ->\n [1] auto trait {$traits}\n *[other] auto traits {$traits}\n} to dyn bound via pointer cast")));
diag.code(E0804);
diag.note(rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("this could allow UB elsewhere")));
diag.help(rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("use `transmute` if you're sure this is sound")));
;
diag.arg("traits_len", __binding_1);
diag.arg("traits", __binding_2);
diag.span(__binding_0);
diag.span_label(__binding_0,
rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("unsupported cast")));
diag
}
}
}
}
};Diagnostic)]
388#[diag("cannot add {$traits_len ->
389 [1] auto trait {$traits}
390 *[other] auto traits {$traits}
391} to dyn bound via pointer cast", code = E0804)]
392#[note("this could allow UB elsewhere")]
393#[help("use `transmute` if you're sure this is sound")]
394pub(crate) struct PtrCastAddAutoToObject {
395 #[primary_span]
396 #[label("unsupported cast")]
397 pub span: Span,
398 pub traits_len: usize,
399 pub traits: DiagSymbolList<String>,
400}
401
402#[derive(const _: () =
{
impl rustc_errors::Subdiagnostic for LossyProvenanceInt2PtrSuggestion
{
fn add_to_diag<__G>(self, diag: &mut rustc_errors::Diag<'_, __G>)
where __G: rustc_errors::EmissionGuarantee {
match self {
LossyProvenanceInt2PtrSuggestion {
lo: __binding_0, hi: __binding_1 } => {
let mut suggestions = Vec::new();
let __code_10 =
::alloc::__export::must_use({
::alloc::fmt::format(format_args!("(...).with_addr("))
});
let __code_11 =
::alloc::__export::must_use({
::alloc::fmt::format(format_args!(")"))
});
suggestions.push((__binding_0, __code_10));
suggestions.push((__binding_1, __code_11));
diag.store_args();
let __message =
diag.eagerly_translate(rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("use `.with_addr()` to adjust a valid pointer in the same allocation, to this address")));
diag.multipart_suggestion_with_style(__message, suggestions,
rustc_errors::Applicability::HasPlaceholders,
rustc_errors::SuggestionStyle::ShowCode);
diag.restore_args();
}
}
}
}
};Subdiagnostic)]
403#[multipart_suggestion(
404 "use `.with_addr()` to adjust a valid pointer in the same allocation, to this address",
405 applicability = "has-placeholders"
406)]
407pub(crate) struct LossyProvenanceInt2PtrSuggestion {
408 #[suggestion_part(code = "(...).with_addr(")]
409 pub lo: Span,
410 #[suggestion_part(code = ")")]
411 pub hi: Span,
412}
413
414#[derive(const _: () =
{
impl<'_sess, 'tcx, G> rustc_errors::Diagnostic<'_sess, G> for
LossyProvenancePtr2Int<'tcx> where
G: rustc_errors::EmissionGuarantee {
#[track_caller]
fn into_diag(self, dcx: rustc_errors::DiagCtxtHandle<'_sess>,
level: rustc_errors::Level) -> rustc_errors::Diag<'_sess, G> {
match self {
LossyProvenancePtr2Int {
expr_ty: __binding_0,
cast_ty: __binding_1,
sugg: __binding_2 } => {
let mut diag =
rustc_errors::Diag::new(dcx, level,
rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("under strict provenance it is considered bad style to cast pointer `{$expr_ty}` to integer `{$cast_ty}`")));
diag.help(rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("if you can't comply with strict provenance and need to expose the pointer provenance you can use `.expose_provenance()` instead")));
;
diag.arg("expr_ty", __binding_0);
diag.arg("cast_ty", __binding_1);
diag.subdiagnostic(__binding_2);
diag
}
}
}
}
};Diagnostic)]
415#[diag(
416 "under strict provenance it is considered bad style to cast pointer `{$expr_ty}` to integer `{$cast_ty}`"
417)]
418#[help(
419 "if you can't comply with strict provenance and need to expose the pointer provenance you can use `.expose_provenance()` instead"
420)]
421pub(crate) struct LossyProvenancePtr2Int<'tcx> {
422 pub expr_ty: Ty<'tcx>,
423 pub cast_ty: Ty<'tcx>,
424 #[subdiagnostic]
425 pub sugg: LossyProvenancePtr2IntSuggestion<'tcx>,
426}
427
428#[derive(const _: () =
{
impl<'tcx> rustc_errors::Subdiagnostic for
LossyProvenancePtr2IntSuggestion<'tcx> {
fn add_to_diag<__G>(self, diag: &mut rustc_errors::Diag<'_, __G>)
where __G: rustc_errors::EmissionGuarantee {
match self {
LossyProvenancePtr2IntSuggestion::NeedsParensCast {
expr_span: __binding_0,
cast_span: __binding_1,
cast_ty: __binding_2 } => {
let mut suggestions = Vec::new();
let __code_12 =
::alloc::__export::must_use({
::alloc::fmt::format(format_args!("("))
});
let __code_13 =
::alloc::__export::must_use({
::alloc::fmt::format(format_args!(").addr() as {0}",
__binding_2))
});
suggestions.push((__binding_0, __code_12));
suggestions.push((__binding_1, __code_13));
diag.store_args();
diag.arg("cast_ty", __binding_2);
let __message =
diag.eagerly_translate(rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("use `.addr()` to obtain the address of a pointer")));
diag.multipart_suggestion_with_style(__message, suggestions,
rustc_errors::Applicability::MaybeIncorrect,
rustc_errors::SuggestionStyle::ShowCode);
diag.restore_args();
}
LossyProvenancePtr2IntSuggestion::NeedsParens {
expr_span: __binding_0, cast_span: __binding_1 } => {
let mut suggestions = Vec::new();
let __code_14 =
::alloc::__export::must_use({
::alloc::fmt::format(format_args!("("))
});
let __code_15 =
::alloc::__export::must_use({
::alloc::fmt::format(format_args!(").addr()"))
});
suggestions.push((__binding_0, __code_14));
suggestions.push((__binding_1, __code_15));
diag.store_args();
let __message =
diag.eagerly_translate(rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("use `.addr()` to obtain the address of a pointer")));
diag.multipart_suggestion_with_style(__message, suggestions,
rustc_errors::Applicability::MaybeIncorrect,
rustc_errors::SuggestionStyle::ShowCode);
diag.restore_args();
}
LossyProvenancePtr2IntSuggestion::NeedsCast {
cast_span: __binding_0, cast_ty: __binding_1 } => {
let __code_16 =
[::alloc::__export::must_use({
::alloc::fmt::format(format_args!(".addr() as {0}",
__binding_1))
})].into_iter();
diag.store_args();
diag.arg("cast_ty", __binding_1);
let __message =
diag.eagerly_translate(rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("use `.addr()` to obtain the address of a pointer")));
diag.span_suggestions_with_style(__binding_0, __message,
__code_16, rustc_errors::Applicability::MaybeIncorrect,
rustc_errors::SuggestionStyle::ShowCode);
diag.restore_args();
}
LossyProvenancePtr2IntSuggestion::Other {
cast_span: __binding_0 } => {
let __code_17 =
[::alloc::__export::must_use({
::alloc::fmt::format(format_args!(".addr()"))
})].into_iter();
diag.store_args();
let __message =
diag.eagerly_translate(rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("use `.addr()` to obtain the address of a pointer")));
diag.span_suggestions_with_style(__binding_0, __message,
__code_17, rustc_errors::Applicability::MaybeIncorrect,
rustc_errors::SuggestionStyle::ShowCode);
diag.restore_args();
}
}
}
}
};Subdiagnostic)]
429pub(crate) enum LossyProvenancePtr2IntSuggestion<'tcx> {
430 #[multipart_suggestion(
431 "use `.addr()` to obtain the address of a pointer",
432 applicability = "maybe-incorrect"
433 )]
434 NeedsParensCast {
435 #[suggestion_part(code = "(")]
436 expr_span: Span,
437 #[suggestion_part(code = ").addr() as {cast_ty}")]
438 cast_span: Span,
439 cast_ty: Ty<'tcx>,
440 },
441 #[multipart_suggestion(
442 "use `.addr()` to obtain the address of a pointer",
443 applicability = "maybe-incorrect"
444 )]
445 NeedsParens {
446 #[suggestion_part(code = "(")]
447 expr_span: Span,
448 #[suggestion_part(code = ").addr()")]
449 cast_span: Span,
450 },
451 #[suggestion(
452 "use `.addr()` to obtain the address of a pointer",
453 code = ".addr() as {cast_ty}",
454 applicability = "maybe-incorrect"
455 )]
456 NeedsCast {
457 #[primary_span]
458 cast_span: Span,
459 cast_ty: Ty<'tcx>,
460 },
461 #[suggestion(
462 "use `.addr()` to obtain the address of a pointer",
463 code = ".addr()",
464 applicability = "maybe-incorrect"
465 )]
466 Other {
467 #[primary_span]
468 cast_span: Span,
469 },
470}
471
472#[derive(const _: () =
{
impl rustc_errors::Subdiagnostic for HelpUseLatestEdition {
fn add_to_diag<__G>(self, diag: &mut rustc_errors::Diag<'_, __G>)
where __G: rustc_errors::EmissionGuarantee {
match self {
HelpUseLatestEdition::Cargo { edition: __binding_0 } => {
diag.store_args();
diag.arg("edition", __binding_0);
let __message =
diag.eagerly_translate(rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("set `edition = \"{$edition}\"` in `Cargo.toml`")));
diag.help(__message);
let __message =
diag.eagerly_translate(rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("for more on editions, read https://doc.rust-lang.org/edition-guide")));
diag.note(__message);
diag.restore_args();
}
HelpUseLatestEdition::Standalone { edition: __binding_0 } =>
{
diag.store_args();
diag.arg("edition", __binding_0);
let __message =
diag.eagerly_translate(rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("pass `--edition {$edition}` to `rustc`")));
diag.help(__message);
let __message =
diag.eagerly_translate(rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("for more on editions, read https://doc.rust-lang.org/edition-guide")));
diag.note(__message);
diag.restore_args();
}
}
}
}
};Subdiagnostic)]
473pub(crate) enum HelpUseLatestEdition {
474 #[help("set `edition = \"{$edition}\"` in `Cargo.toml`")]
475 #[note("for more on editions, read https://doc.rust-lang.org/edition-guide")]
476 Cargo { edition: Edition },
477 #[help("pass `--edition {$edition}` to `rustc`")]
478 #[note("for more on editions, read https://doc.rust-lang.org/edition-guide")]
479 Standalone { edition: Edition },
480}
481
482impl HelpUseLatestEdition {
483 pub(crate) fn new() -> Self {
484 let edition = LATEST_STABLE_EDITION;
485 if rustc_session::utils::was_invoked_from_cargo() {
486 Self::Cargo { edition }
487 } else {
488 Self::Standalone { edition }
489 }
490 }
491}
492
493#[derive(const _: () =
{
impl<'_sess, 'tcx, G> rustc_errors::Diagnostic<'_sess, G> for
NoFieldOnVariant<'tcx> where G: rustc_errors::EmissionGuarantee {
#[track_caller]
fn into_diag(self, dcx: rustc_errors::DiagCtxtHandle<'_sess>,
level: rustc_errors::Level) -> rustc_errors::Diag<'_sess, G> {
match self {
NoFieldOnVariant {
span: __binding_0,
container: __binding_1,
ident: __binding_2,
field: __binding_3,
enum_span: __binding_4,
field_span: __binding_5 } => {
let mut diag =
rustc_errors::Diag::new(dcx, level,
rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("no field named `{$field}` on enum variant `{$container}::{$ident}`")));
diag.code(E0609);
;
diag.arg("container", __binding_1);
diag.arg("ident", __binding_2);
diag.arg("field", __binding_3);
diag.span(__binding_0);
diag.span_label(__binding_4,
rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("this enum variant...")));
diag.span_label(__binding_5,
rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("...does not have this field")));
diag
}
}
}
}
};Diagnostic)]
494#[diag("no field named `{$field}` on enum variant `{$container}::{$ident}`", code = E0609)]
495pub(crate) struct NoFieldOnVariant<'tcx> {
496 #[primary_span]
497 pub(crate) span: Span,
498 pub(crate) container: Ty<'tcx>,
499 pub(crate) ident: Ident,
500 pub(crate) field: Ident,
501 #[label("this enum variant...")]
502 pub(crate) enum_span: Span,
503 #[label("...does not have this field")]
504 pub(crate) field_span: Span,
505}
506
507#[derive(const _: () =
{
impl<'_sess, 'tcx, G> rustc_errors::Diagnostic<'_sess, G> for
CantDereference<'tcx> where G: rustc_errors::EmissionGuarantee {
#[track_caller]
fn into_diag(self, dcx: rustc_errors::DiagCtxtHandle<'_sess>,
level: rustc_errors::Level) -> rustc_errors::Diag<'_sess, G> {
match self {
CantDereference { span: __binding_0, ty: __binding_1 } => {
let mut diag =
rustc_errors::Diag::new(dcx, level,
rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("type `{$ty}` cannot be dereferenced")));
diag.code(E0614);
;
diag.arg("ty", __binding_1);
diag.span(__binding_0);
diag.span_label(__binding_0,
rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("can't be dereferenced")));
diag
}
}
}
}
};Diagnostic)]
508#[diag("type `{$ty}` cannot be dereferenced", code = E0614)]
509pub(crate) struct CantDereference<'tcx> {
510 #[primary_span]
511 #[label("can't be dereferenced")]
512 pub(crate) span: Span,
513 pub(crate) ty: Ty<'tcx>,
514}
515
516#[derive(const _: () =
{
impl<'_sess, 'tcx, G> rustc_errors::Diagnostic<'_sess, G> for
ExpectedArrayOrSlice<'tcx> where
G: rustc_errors::EmissionGuarantee {
#[track_caller]
fn into_diag(self, dcx: rustc_errors::DiagCtxtHandle<'_sess>,
level: rustc_errors::Level) -> rustc_errors::Diag<'_sess, G> {
match self {
ExpectedArrayOrSlice {
span: __binding_0,
ty: __binding_1,
slice_pat_semantics: __binding_2,
as_deref: __binding_3,
slicing: __binding_4 } => {
let mut diag =
rustc_errors::Diag::new(dcx, level,
rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("expected an array or slice, found `{$ty}`")));
diag.code(E0529);
;
diag.arg("ty", __binding_1);
diag.arg("slice_pat_semantics", __binding_2);
diag.span(__binding_0);
diag.span_label(__binding_0,
rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("pattern cannot match with input type `{$ty}`")));
if let Some(__binding_3) = __binding_3 {
diag.subdiagnostic(__binding_3);
}
if let Some(__binding_4) = __binding_4 {
diag.subdiagnostic(__binding_4);
}
diag
}
}
}
}
};Diagnostic)]
517#[diag("expected an array or slice, found `{$ty}`", code = E0529)]
518pub(crate) struct ExpectedArrayOrSlice<'tcx> {
519 #[primary_span]
520 #[label("pattern cannot match with input type `{$ty}`")]
521 pub(crate) span: Span,
522 pub(crate) ty: Ty<'tcx>,
523 pub(crate) slice_pat_semantics: bool,
524 #[subdiagnostic]
525 pub(crate) as_deref: Option<AsDerefSuggestion>,
526 #[subdiagnostic]
527 pub(crate) slicing: Option<SlicingSuggestion>,
528}
529
530#[derive(const _: () =
{
impl rustc_errors::Subdiagnostic for AsDerefSuggestion {
fn add_to_diag<__G>(self, diag: &mut rustc_errors::Diag<'_, __G>)
where __G: rustc_errors::EmissionGuarantee {
match self {
AsDerefSuggestion { span: __binding_0 } => {
let __code_18 =
[::alloc::__export::must_use({
::alloc::fmt::format(format_args!(".as_deref()"))
})].into_iter();
diag.store_args();
let __message =
diag.eagerly_translate(rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("consider using `as_deref` here")));
diag.span_suggestions_with_style(__binding_0, __message,
__code_18, rustc_errors::Applicability::MaybeIncorrect,
rustc_errors::SuggestionStyle::ShowAlways);
diag.restore_args();
}
}
}
}
};Subdiagnostic)]
531#[suggestion(
532 "consider using `as_deref` here",
533 code = ".as_deref()",
534 style = "verbose",
535 applicability = "maybe-incorrect"
536)]
537pub(crate) struct AsDerefSuggestion {
538 #[primary_span]
539 pub(crate) span: Span,
540}
541
542#[derive(const _: () =
{
impl rustc_errors::Subdiagnostic for SlicingSuggestion {
fn add_to_diag<__G>(self, diag: &mut rustc_errors::Diag<'_, __G>)
where __G: rustc_errors::EmissionGuarantee {
match self {
SlicingSuggestion { span: __binding_0 } => {
let __code_19 =
[::alloc::__export::must_use({
::alloc::fmt::format(format_args!("[..]"))
})].into_iter();
diag.store_args();
let __message =
diag.eagerly_translate(rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("consider slicing here")));
diag.span_suggestions_with_style(__binding_0, __message,
__code_19, rustc_errors::Applicability::MaybeIncorrect,
rustc_errors::SuggestionStyle::ShowAlways);
diag.restore_args();
}
}
}
}
};Subdiagnostic)]
543#[suggestion(
544 "consider slicing here",
545 code = "[..]",
546 style = "verbose",
547 applicability = "maybe-incorrect"
548)]
549pub(crate) struct SlicingSuggestion {
550 #[primary_span]
551 pub(crate) span: Span,
552}
553
554#[derive(const _: () =
{
impl<'_sess, 'tcx, G> rustc_errors::Diagnostic<'_sess, G> for
InvalidCallee<'tcx> where G: rustc_errors::EmissionGuarantee {
#[track_caller]
fn into_diag(self, dcx: rustc_errors::DiagCtxtHandle<'_sess>,
level: rustc_errors::Level) -> rustc_errors::Diag<'_sess, G> {
match self {
InvalidCallee {
span: __binding_0, ty: __binding_1, found: __binding_2 } =>
{
let mut diag =
rustc_errors::Diag::new(dcx, level,
rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("expected function, found {$found}")));
diag.code(E0618);
;
diag.arg("ty", __binding_1);
diag.arg("found", __binding_2);
diag.span(__binding_0);
diag
}
}
}
}
};Diagnostic)]
555#[diag("expected function, found {$found}", code = E0618)]
556pub(crate) struct InvalidCallee<'tcx> {
557 #[primary_span]
558 pub span: Span,
559 pub ty: Ty<'tcx>,
560 pub found: String,
561}
562
563#[derive(const _: () =
{
impl<'_sess, 'tcx, G> rustc_errors::Diagnostic<'_sess, G> for
ScalableVectorCtor<'tcx> where G: rustc_errors::EmissionGuarantee
{
#[track_caller]
fn into_diag(self, dcx: rustc_errors::DiagCtxtHandle<'_sess>,
level: rustc_errors::Level) -> rustc_errors::Diag<'_sess, G> {
match self {
ScalableVectorCtor { span: __binding_0, ty: __binding_1 } =>
{
let mut diag =
rustc_errors::Diag::new(dcx, level,
rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("scalable vector types cannot be initialised using their constructor")));
;
diag.arg("ty", __binding_1);
diag.span(__binding_0);
diag
}
}
}
}
};Diagnostic)]
564#[diag("scalable vector types cannot be initialised using their constructor")]
565pub(crate) struct ScalableVectorCtor<'tcx> {
566 #[primary_span]
567 pub span: Span,
568 pub ty: Ty<'tcx>,
569}
570
571#[derive(const _: () =
{
impl<'_sess, 'tcx, G> rustc_errors::Diagnostic<'_sess, G> for
IntToWide<'tcx> where G: rustc_errors::EmissionGuarantee {
#[track_caller]
fn into_diag(self, dcx: rustc_errors::DiagCtxtHandle<'_sess>,
level: rustc_errors::Level) -> rustc_errors::Diag<'_sess, G> {
match self {
IntToWide {
span: __binding_0,
metadata: __binding_1,
expr_ty: __binding_2,
cast_ty: __binding_3,
expr_if_nightly: __binding_4,
known_wide: __binding_5,
param_note: __binding_6 } => {
let mut diag =
rustc_errors::Diag::new(dcx, level,
rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("cannot cast `{$expr_ty}` to a pointer that {$known_wide ->\n [true] is\n *[false] may be\n} wide")));
diag.code(E0606);
;
diag.arg("metadata", __binding_1);
diag.arg("expr_ty", __binding_2);
diag.arg("cast_ty", __binding_3);
diag.arg("known_wide", __binding_5);
diag.span(__binding_0);
diag.span_label(__binding_0,
rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("creating a `{$cast_ty}` requires both an address and {$metadata}")));
if let Some(__binding_4) = __binding_4 {
diag.span_label(__binding_4,
rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("consider casting this expression to `*const ()`, then using `core::ptr::from_raw_parts`")));
}
if let Some(__binding_6) = __binding_6 {
diag.subdiagnostic(__binding_6);
}
diag
}
}
}
}
};Diagnostic)]
572#[diag("cannot cast `{$expr_ty}` to a pointer that {$known_wide ->
573 [true] is
574 *[false] may be
575} wide", code = E0606)]
576pub(crate) struct IntToWide<'tcx> {
577 #[primary_span]
578 #[label("creating a `{$cast_ty}` requires both an address and {$metadata}")]
579 pub span: Span,
580 pub metadata: &'tcx str,
581 pub expr_ty: Ty<'tcx>,
582 pub cast_ty: Ty<'tcx>,
583 #[label(
584 "consider casting this expression to `*const ()`, then using `core::ptr::from_raw_parts`"
585 )]
586 pub expr_if_nightly: Option<Span>,
587 pub known_wide: bool,
588 #[subdiagnostic]
589 pub param_note: Option<IntToWideParamNote>,
590}
591
592#[derive(const _: () =
{
impl rustc_errors::Subdiagnostic for IntToWideParamNote {
fn add_to_diag<__G>(self, diag: &mut rustc_errors::Diag<'_, __G>)
where __G: rustc_errors::EmissionGuarantee {
match self {
IntToWideParamNote { param: __binding_0 } => {
diag.store_args();
diag.arg("param", __binding_0);
let __message =
diag.eagerly_translate(rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("the type parameter `{$param}` is not known to be `Sized`, so this pointer may be wide")));
diag.note(__message);
diag.restore_args();
}
}
}
}
};Subdiagnostic)]
593#[note("the type parameter `{$param}` is not known to be `Sized`, so this pointer may be wide")]
594pub(crate) struct IntToWideParamNote {
595 pub param: Symbol,
596}
597
598#[derive(const _: () =
{
impl rustc_errors::Subdiagnostic for OptionResultRefMismatch {
fn add_to_diag<__G>(self, diag: &mut rustc_errors::Diag<'_, __G>)
where __G: rustc_errors::EmissionGuarantee {
match self {
OptionResultRefMismatch::Copied {
span: __binding_0, def_path: __binding_1 } => {
let __code_20 =
[::alloc::__export::must_use({
::alloc::fmt::format(format_args!(".copied()"))
})].into_iter();
diag.store_args();
diag.arg("def_path", __binding_1);
let __message =
diag.eagerly_translate(rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("use `{$def_path}::copied` to copy the value inside the `{$def_path}`")));
diag.span_suggestions_with_style(__binding_0, __message,
__code_20, rustc_errors::Applicability::MachineApplicable,
rustc_errors::SuggestionStyle::ShowAlways);
diag.restore_args();
}
OptionResultRefMismatch::Cloned {
span: __binding_0, def_path: __binding_1 } => {
let __code_21 =
[::alloc::__export::must_use({
::alloc::fmt::format(format_args!(".cloned()"))
})].into_iter();
diag.store_args();
diag.arg("def_path", __binding_1);
let __message =
diag.eagerly_translate(rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("use `{$def_path}::cloned` to clone the value inside the `{$def_path}`")));
diag.span_suggestions_with_style(__binding_0, __message,
__code_21, rustc_errors::Applicability::MachineApplicable,
rustc_errors::SuggestionStyle::ShowAlways);
diag.restore_args();
}
}
}
}
};Subdiagnostic)]
599pub(crate) enum OptionResultRefMismatch {
600 #[suggestion(
601 "use `{$def_path}::copied` to copy the value inside the `{$def_path}`",
602 code = ".copied()",
603 style = "verbose",
604 applicability = "machine-applicable"
605 )]
606 Copied {
607 #[primary_span]
608 span: Span,
609 def_path: String,
610 },
611 #[suggestion(
612 "use `{$def_path}::cloned` to clone the value inside the `{$def_path}`",
613 code = ".cloned()",
614 style = "verbose",
615 applicability = "machine-applicable"
616 )]
617 Cloned {
618 #[primary_span]
619 span: Span,
620 def_path: String,
621 },
622 }
637
638pub(crate) struct RemoveSemiForCoerce {
639 pub expr: Span,
640 pub ret: Span,
641 pub semi: Span,
642}
643
644impl Subdiagnostic for RemoveSemiForCoerce {
645 fn add_to_diag<G: EmissionGuarantee>(self, diag: &mut Diag<'_, G>) {
646 let mut multispan: MultiSpan = self.semi.into();
647 multispan.push_span_label(
648 self.expr,
649 rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("this could be implicitly returned but it is a statement, not a tail expression"))msg!("this could be implicitly returned but it is a statement, not a tail expression"),
650 );
651 multispan
652 .push_span_label(self.ret, rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("the `match` arms can conform to this return type"))msg!("the `match` arms can conform to this return type"));
653 multispan.push_span_label(
654 self.semi,
655 rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("the `match` is a statement because of this semicolon, consider removing it"))msg!("the `match` is a statement because of this semicolon, consider removing it"),
656 );
657 diag.span_note(multispan, rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("you might have meant to return the `match` expression"))msg!("you might have meant to return the `match` expression"));
658
659 diag.tool_only_span_suggestion(
660 self.semi,
661 rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("remove this semicolon"))msg!("remove this semicolon"),
662 "",
663 Applicability::MaybeIncorrect,
664 );
665 }
666}
667
668#[derive(const _: () =
{
impl<'_sess, G> rustc_errors::Diagnostic<'_sess, G> for
UnionPatMultipleFields where G: rustc_errors::EmissionGuarantee {
#[track_caller]
fn into_diag(self, dcx: rustc_errors::DiagCtxtHandle<'_sess>,
level: rustc_errors::Level) -> rustc_errors::Diag<'_sess, G> {
match self {
UnionPatMultipleFields { span: __binding_0 } => {
let mut diag =
rustc_errors::Diag::new(dcx, level,
rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("union patterns should have exactly one field")));
;
diag.span(__binding_0);
diag
}
}
}
}
};Diagnostic)]
669#[diag("union patterns should have exactly one field")]
670pub(crate) struct UnionPatMultipleFields {
671 #[primary_span]
672 pub span: Span,
673}
674
675#[derive(const _: () =
{
impl<'_sess, G> rustc_errors::Diagnostic<'_sess, G> for UnionPatDotDot
where G: rustc_errors::EmissionGuarantee {
#[track_caller]
fn into_diag(self, dcx: rustc_errors::DiagCtxtHandle<'_sess>,
level: rustc_errors::Level) -> rustc_errors::Diag<'_sess, G> {
match self {
UnionPatDotDot { span: __binding_0 } => {
let mut diag =
rustc_errors::Diag::new(dcx, level,
rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("`..` cannot be used in union patterns")));
;
diag.span(__binding_0);
diag
}
}
}
}
};Diagnostic)]
676#[diag("`..` cannot be used in union patterns")]
677pub(crate) struct UnionPatDotDot {
678 #[primary_span]
679 pub span: Span,
680}
681
682#[derive(const _: () =
{
impl<'tcx> rustc_errors::Subdiagnostic for UseIsEmpty<'tcx> {
fn add_to_diag<__G>(self, diag: &mut rustc_errors::Diag<'_, __G>)
where __G: rustc_errors::EmissionGuarantee {
match self {
UseIsEmpty {
lo: __binding_0, hi: __binding_1, expr_ty: __binding_2 } =>
{
let mut suggestions = Vec::new();
let __code_22 =
::alloc::__export::must_use({
::alloc::fmt::format(format_args!("!"))
});
let __code_23 =
::alloc::__export::must_use({
::alloc::fmt::format(format_args!(".is_empty()"))
});
suggestions.push((__binding_0, __code_22));
suggestions.push((__binding_1, __code_23));
diag.store_args();
diag.arg("expr_ty", __binding_2);
let __message =
diag.eagerly_translate(rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("consider using the `is_empty` method on `{$expr_ty}` to determine if it contains anything")));
diag.multipart_suggestion_with_style(__message, suggestions,
rustc_errors::Applicability::MaybeIncorrect,
rustc_errors::SuggestionStyle::ShowAlways);
diag.restore_args();
}
}
}
}
};Subdiagnostic)]
683#[multipart_suggestion(
684 "consider using the `is_empty` method on `{$expr_ty}` to determine if it contains anything",
685 applicability = "maybe-incorrect",
686 style = "verbose"
687)]
688pub(crate) struct UseIsEmpty<'tcx> {
689 #[suggestion_part(code = "!")]
690 pub lo: Span,
691 #[suggestion_part(code = ".is_empty()")]
692 pub hi: Span,
693 pub expr_ty: Ty<'tcx>,
694}
695
696#[derive(const _: () =
{
impl<'_sess, G> rustc_errors::Diagnostic<'_sess, G> for
ArgMismatchIndeterminate where G: rustc_errors::EmissionGuarantee
{
#[track_caller]
fn into_diag(self, dcx: rustc_errors::DiagCtxtHandle<'_sess>,
level: rustc_errors::Level) -> rustc_errors::Diag<'_sess, G> {
match self {
ArgMismatchIndeterminate { span: __binding_0 } => {
let mut diag =
rustc_errors::Diag::new(dcx, level,
rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("argument type mismatch was detected, but rustc had trouble determining where")));
;
diag.span(__binding_0);
diag
}
}
}
}
};Diagnostic)]
697#[diag("argument type mismatch was detected, but rustc had trouble determining where")]
698pub(crate) struct ArgMismatchIndeterminate {
699 #[primary_span]
700 pub span: Span,
701}
702
703#[derive(const _: () =
{
impl rustc_errors::Subdiagnostic for SuggestBoxing {
fn add_to_diag<__G>(self, diag: &mut rustc_errors::Diag<'_, __G>)
where __G: rustc_errors::EmissionGuarantee {
match self {
SuggestBoxing::Unit { start: __binding_0, end: __binding_1 }
=> {
let mut suggestions = Vec::new();
let __code_24 =
::alloc::__export::must_use({
::alloc::fmt::format(format_args!("Box::new(())"))
});
let __code_25 =
::alloc::__export::must_use({
::alloc::fmt::format(format_args!(""))
});
suggestions.push((__binding_0, __code_24));
suggestions.push((__binding_1, __code_25));
diag.store_args();
let __message =
diag.eagerly_translate(rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("for more on the distinction between the stack and the heap, read https://doc.rust-lang.org/book/ch15-01-box.html, https://doc.rust-lang.org/rust-by-example/std/box.html, and https://doc.rust-lang.org/std/boxed/index.html")));
diag.note(__message);
let __message =
diag.eagerly_translate(rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("store this in the heap by calling `Box::new`")));
diag.multipart_suggestion_with_style(__message, suggestions,
rustc_errors::Applicability::MachineApplicable,
rustc_errors::SuggestionStyle::ShowCode);
diag.restore_args();
}
SuggestBoxing::AsyncBody => {
diag.store_args();
let __message =
diag.eagerly_translate(rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("for more on the distinction between the stack and the heap, read https://doc.rust-lang.org/book/ch15-01-box.html, https://doc.rust-lang.org/rust-by-example/std/box.html, and https://doc.rust-lang.org/std/boxed/index.html")));
diag.note(__message);
diag.restore_args();
}
SuggestBoxing::ExprFieldShorthand {
start: __binding_0, end: __binding_1, ident: __binding_2 }
=> {
let mut suggestions = Vec::new();
let __code_26 =
::alloc::__export::must_use({
::alloc::fmt::format(format_args!("{0}: Box::new(",
__binding_2))
});
let __code_27 =
::alloc::__export::must_use({
::alloc::fmt::format(format_args!(")"))
});
suggestions.push((__binding_0, __code_26));
suggestions.push((__binding_1, __code_27));
diag.store_args();
diag.arg("ident", __binding_2);
let __message =
diag.eagerly_translate(rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("for more on the distinction between the stack and the heap, read https://doc.rust-lang.org/book/ch15-01-box.html, https://doc.rust-lang.org/rust-by-example/std/box.html, and https://doc.rust-lang.org/std/boxed/index.html")));
diag.note(__message);
let __message =
diag.eagerly_translate(rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("store this in the heap by calling `Box::new`")));
diag.multipart_suggestion_with_style(__message, suggestions,
rustc_errors::Applicability::MachineApplicable,
rustc_errors::SuggestionStyle::ShowCode);
diag.restore_args();
}
SuggestBoxing::Other { start: __binding_0, end: __binding_1
} => {
let mut suggestions = Vec::new();
let __code_28 =
::alloc::__export::must_use({
::alloc::fmt::format(format_args!("Box::new("))
});
let __code_29 =
::alloc::__export::must_use({
::alloc::fmt::format(format_args!(")"))
});
suggestions.push((__binding_0, __code_28));
suggestions.push((__binding_1, __code_29));
diag.store_args();
let __message =
diag.eagerly_translate(rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("for more on the distinction between the stack and the heap, read https://doc.rust-lang.org/book/ch15-01-box.html, https://doc.rust-lang.org/rust-by-example/std/box.html, and https://doc.rust-lang.org/std/boxed/index.html")));
diag.note(__message);
let __message =
diag.eagerly_translate(rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("store this in the heap by calling `Box::new`")));
diag.multipart_suggestion_with_style(__message, suggestions,
rustc_errors::Applicability::MachineApplicable,
rustc_errors::SuggestionStyle::ShowCode);
diag.restore_args();
}
}
}
}
};Subdiagnostic)]
704pub(crate) enum SuggestBoxing {
705 #[note(
706 "for more on the distinction between the stack and the heap, read https://doc.rust-lang.org/book/ch15-01-box.html, https://doc.rust-lang.org/rust-by-example/std/box.html, and https://doc.rust-lang.org/std/boxed/index.html"
707 )]
708 #[multipart_suggestion(
709 "store this in the heap by calling `Box::new`",
710 applicability = "machine-applicable"
711 )]
712 Unit {
713 #[suggestion_part(code = "Box::new(())")]
714 start: Span,
715 #[suggestion_part(code = "")]
716 end: Span,
717 },
718 #[note(
719 "for more on the distinction between the stack and the heap, read https://doc.rust-lang.org/book/ch15-01-box.html, https://doc.rust-lang.org/rust-by-example/std/box.html, and https://doc.rust-lang.org/std/boxed/index.html"
720 )]
721 AsyncBody,
722 #[note(
723 "for more on the distinction between the stack and the heap, read https://doc.rust-lang.org/book/ch15-01-box.html, https://doc.rust-lang.org/rust-by-example/std/box.html, and https://doc.rust-lang.org/std/boxed/index.html"
724 )]
725 #[multipart_suggestion(
726 "store this in the heap by calling `Box::new`",
727 applicability = "machine-applicable"
728 )]
729 ExprFieldShorthand {
730 #[suggestion_part(code = "{ident}: Box::new(")]
731 start: Span,
732 #[suggestion_part(code = ")")]
733 end: Span,
734 ident: Ident,
735 },
736 #[note(
737 "for more on the distinction between the stack and the heap, read https://doc.rust-lang.org/book/ch15-01-box.html, https://doc.rust-lang.org/rust-by-example/std/box.html, and https://doc.rust-lang.org/std/boxed/index.html"
738 )]
739 #[multipart_suggestion(
740 "store this in the heap by calling `Box::new`",
741 applicability = "machine-applicable"
742 )]
743 Other {
744 #[suggestion_part(code = "Box::new(")]
745 start: Span,
746 #[suggestion_part(code = ")")]
747 end: Span,
748 },
749}
750
751#[derive(const _: () =
{
impl rustc_errors::Subdiagnostic for SuggestPtrNullMut {
fn add_to_diag<__G>(self, diag: &mut rustc_errors::Diag<'_, __G>)
where __G: rustc_errors::EmissionGuarantee {
match self {
SuggestPtrNullMut { span: __binding_0 } => {
let __code_30 =
[::alloc::__export::must_use({
::alloc::fmt::format(format_args!("core::ptr::null_mut()"))
})].into_iter();
diag.store_args();
let __message =
diag.eagerly_translate(rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("consider using `core::ptr::null_mut` instead")));
diag.span_suggestions_with_style(__binding_0, __message,
__code_30, rustc_errors::Applicability::MaybeIncorrect,
rustc_errors::SuggestionStyle::ShowAlways);
diag.restore_args();
}
}
}
}
};Subdiagnostic)]
752#[suggestion(
753 "consider using `core::ptr::null_mut` instead",
754 applicability = "maybe-incorrect",
755 style = "verbose",
756 code = "core::ptr::null_mut()"
757)]
758pub(crate) struct SuggestPtrNullMut {
759 #[primary_span]
760 pub span: Span,
761}
762
763#[derive(const _: () =
{
impl<'_sess, 'tcx, G> rustc_errors::Diagnostic<'_sess, G> for
TrivialCast<'tcx> where G: rustc_errors::EmissionGuarantee {
#[track_caller]
fn into_diag(self, dcx: rustc_errors::DiagCtxtHandle<'_sess>,
level: rustc_errors::Level) -> rustc_errors::Diag<'_sess, G> {
match self {
TrivialCast {
numeric: __binding_0,
expr_ty: __binding_1,
cast_ty: __binding_2 } => {
let mut diag =
rustc_errors::Diag::new(dcx, level,
rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("trivial {$numeric ->\n [true] numeric cast\n *[false] cast\n }: `{$expr_ty}` as `{$cast_ty}`")));
diag.help(rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("cast can be replaced by coercion; this might require a temporary variable")));
;
diag.arg("numeric", __binding_0);
diag.arg("expr_ty", __binding_1);
diag.arg("cast_ty", __binding_2);
diag
}
}
}
}
};Diagnostic)]
764#[diag(
765 "trivial {$numeric ->
766 [true] numeric cast
767 *[false] cast
768 }: `{$expr_ty}` as `{$cast_ty}`"
769)]
770#[help("cast can be replaced by coercion; this might require a temporary variable")]
771pub(crate) struct TrivialCast<'tcx> {
772 pub numeric: bool,
773 pub expr_ty: Ty<'tcx>,
774 pub cast_ty: Ty<'tcx>,
775}
776
777pub(crate) struct BreakNonLoop<'a> {
778 pub span: Span,
779 pub head: Option<Span>,
780 pub kind: &'a str,
781 pub suggestion: String,
782 pub loop_label: Option<Label>,
783 pub break_label: Option<Label>,
784 pub break_expr_kind: &'a ExprKind<'a>,
785 pub break_expr_span: Span,
786}
787
788impl<'a, G: EmissionGuarantee> Diagnostic<'_, G> for BreakNonLoop<'a> {
789 #[track_caller]
790 fn into_diag(self, dcx: DiagCtxtHandle<'_>, level: Level) -> Diag<'_, G> {
791 let mut diag = Diag::new(dcx, level, rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("`break` with value from a `{$kind}` loop"))msg!("`break` with value from a `{$kind}` loop"));
792 diag.span(self.span);
793 diag.code(E0571);
794 diag.arg("kind", self.kind);
795 diag.span_label(
796 self.span,
797 rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("can only break with a value inside `loop` or breakable block"))msg!("can only break with a value inside `loop` or breakable block"),
798 );
799 if let Some(head) = self.head {
800 diag.span_label(head, rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("you can't `break` with a value in a `{$kind}` loop"))msg!("you can't `break` with a value in a `{$kind}` loop"));
801 }
802 diag.span_suggestion(
803 self.span,
804 rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("use `break` on its own without a value inside this `{$kind}` loop"))msg!("use `break` on its own without a value inside this `{$kind}` loop"),
805 self.suggestion,
806 Applicability::MaybeIncorrect,
807 );
808 if let (Some(label), None) = (self.loop_label, self.break_label) {
809 match self.break_expr_kind {
810 ExprKind::Path(hir::QPath::Resolved(
811 None,
812 hir::Path { segments: [segment], res: hir::def::Res::Err, .. },
813 )) if label.ident.to_string() == ::alloc::__export::must_use({
::alloc::fmt::format(format_args!("\'{0}", segment.ident))
})format!("'{}", segment.ident) => {
814 diag.downgrade_to_delayed_bug();
818 }
819 _ => {
820 diag.span_suggestion(
821 self.break_expr_span,
822 rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("alternatively, you might have meant to use the available loop label"))msg!("alternatively, you might have meant to use the available loop label"),
823 label.ident,
824 Applicability::MaybeIncorrect,
825 );
826 }
827 }
828 }
829 diag
830 }
831}
832
833#[derive(const _: () =
{
impl<'_sess, G> rustc_errors::Diagnostic<'_sess, G> for
ContinueLabeledBlock where G: rustc_errors::EmissionGuarantee {
#[track_caller]
fn into_diag(self, dcx: rustc_errors::DiagCtxtHandle<'_sess>,
level: rustc_errors::Level) -> rustc_errors::Diag<'_sess, G> {
match self {
ContinueLabeledBlock {
span: __binding_0, block_span: __binding_1 } => {
let mut diag =
rustc_errors::Diag::new(dcx, level,
rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("`continue` pointing to a labeled block")));
diag.code(E0696);
;
diag.span(__binding_0);
diag.span_label(__binding_0,
rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("labeled blocks cannot be `continue`'d")));
diag.span_label(__binding_1,
rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("labeled block the `continue` points to")));
diag
}
}
}
}
};Diagnostic)]
834#[diag("`continue` pointing to a labeled block", code = E0696)]
835pub(crate) struct ContinueLabeledBlock {
836 #[primary_span]
837 #[label("labeled blocks cannot be `continue`'d")]
838 pub span: Span,
839 #[label("labeled block the `continue` points to")]
840 pub block_span: Span,
841}
842
843#[derive(const _: () =
{
impl<'_sess, 'a, G> rustc_errors::Diagnostic<'_sess, G> for
BreakInsideClosure<'a> where G: rustc_errors::EmissionGuarantee {
#[track_caller]
fn into_diag(self, dcx: rustc_errors::DiagCtxtHandle<'_sess>,
level: rustc_errors::Level) -> rustc_errors::Diag<'_sess, G> {
match self {
BreakInsideClosure {
span: __binding_0,
closure_span: __binding_1,
name: __binding_2 } => {
let mut diag =
rustc_errors::Diag::new(dcx, level,
rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("`{$name}` inside of a closure")));
diag.code(E0267);
;
diag.arg("name", __binding_2);
diag.span(__binding_0);
diag.span_label(__binding_0,
rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("cannot `{$name}` inside of a closure")));
diag.span_label(__binding_1,
rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("enclosing closure")));
diag
}
}
}
}
};Diagnostic)]
844#[diag("`{$name}` inside of a closure", code = E0267)]
845pub(crate) struct BreakInsideClosure<'a> {
846 #[primary_span]
847 #[label("cannot `{$name}` inside of a closure")]
848 pub span: Span,
849 #[label("enclosing closure")]
850 pub closure_span: Span,
851 pub name: &'a str,
852}
853
854#[derive(const _: () =
{
impl<'_sess, 'a, G> rustc_errors::Diagnostic<'_sess, G> for
BreakInsideCoroutine<'a> where G: rustc_errors::EmissionGuarantee
{
#[track_caller]
fn into_diag(self, dcx: rustc_errors::DiagCtxtHandle<'_sess>,
level: rustc_errors::Level) -> rustc_errors::Diag<'_sess, G> {
match self {
BreakInsideCoroutine {
span: __binding_0,
coroutine_span: __binding_1,
name: __binding_2,
kind: __binding_3,
source: __binding_4 } => {
let mut diag =
rustc_errors::Diag::new(dcx, level,
rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("`{$name}` inside `{$kind}` {$source}")));
diag.code(E0267);
;
diag.arg("name", __binding_2);
diag.arg("kind", __binding_3);
diag.arg("source", __binding_4);
diag.span(__binding_0);
diag.span_label(__binding_0,
rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("cannot `{$name}` inside `{$kind}` {$source}")));
diag.span_label(__binding_1,
rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("enclosing `{$kind}` {$source}")));
diag
}
}
}
}
};Diagnostic)]
855#[diag("`{$name}` inside `{$kind}` {$source}", code = E0267)]
856pub(crate) struct BreakInsideCoroutine<'a> {
857 #[primary_span]
858 #[label("cannot `{$name}` inside `{$kind}` {$source}")]
859 pub span: Span,
860 #[label("enclosing `{$kind}` {$source}")]
861 pub coroutine_span: Span,
862 pub name: &'a str,
863 pub kind: &'a str,
864 pub source: &'a str,
865}
866
867#[derive(const _: () =
{
impl<'_sess, 'a, G> rustc_errors::Diagnostic<'_sess, G> for
OutsideLoop<'a> where G: rustc_errors::EmissionGuarantee {
#[track_caller]
fn into_diag(self, dcx: rustc_errors::DiagCtxtHandle<'_sess>,
level: rustc_errors::Level) -> rustc_errors::Diag<'_sess, G> {
match self {
OutsideLoop {
spans: __binding_0,
name: __binding_1,
is_break: __binding_2,
suggestion: __binding_3 } => {
let mut diag =
rustc_errors::Diag::new(dcx, level,
rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("`{$name}` outside of a loop{$is_break ->\n [true] {\" or labeled block\"}\n *[false] {\"\"}\n }")));
diag.code(E0268);
;
diag.arg("name", __binding_1);
diag.arg("is_break", __binding_2);
diag.span(__binding_0.clone());
for __binding_0 in __binding_0 {
diag.span_label(__binding_0,
rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("cannot `{$name}` outside of a loop{$is_break ->\n [true] {\" or labeled block\"}\n *[false] {\"\"}\n }")));
}
if let Some(__binding_3) = __binding_3 {
diag.subdiagnostic(__binding_3);
}
diag
}
}
}
}
};Diagnostic)]
868#[diag("`{$name}` outside of a loop{$is_break ->
869 [true] {\" or labeled block\"}
870 *[false] {\"\"}
871 }", code = E0268)]
872pub(crate) struct OutsideLoop<'a> {
873 #[primary_span]
874 #[label(
875 "cannot `{$name}` outside of a loop{$is_break ->
876 [true] {\" or labeled block\"}
877 *[false] {\"\"}
878 }"
879 )]
880 pub spans: Vec<Span>,
881 pub name: &'a str,
882 pub is_break: bool,
883 #[subdiagnostic]
884 pub suggestion: Option<OutsideLoopSuggestion>,
885}
886#[derive(const _: () =
{
impl rustc_errors::Subdiagnostic for OutsideLoopSuggestion {
fn add_to_diag<__G>(self, diag: &mut rustc_errors::Diag<'_, __G>)
where __G: rustc_errors::EmissionGuarantee {
match self {
OutsideLoopSuggestion {
block_span: __binding_0, break_spans: __binding_1 } => {
let mut suggestions = Vec::new();
let __code_31 =
::alloc::__export::must_use({
::alloc::fmt::format(format_args!("\'block: "))
});
let __code_32 =
::alloc::__export::must_use({
::alloc::fmt::format(format_args!(" \'block"))
});
suggestions.push((__binding_0, __code_31));
for __binding_1 in __binding_1 {
suggestions.push((__binding_1, __code_32.clone()));
}
diag.store_args();
let __message =
diag.eagerly_translate(rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("consider labeling this block to be able to break within it")));
diag.multipart_suggestion_with_style(__message, suggestions,
rustc_errors::Applicability::MaybeIncorrect,
rustc_errors::SuggestionStyle::ShowCode);
diag.restore_args();
}
}
}
}
};Subdiagnostic)]
887#[multipart_suggestion(
888 "consider labeling this block to be able to break within it",
889 applicability = "maybe-incorrect"
890)]
891pub(crate) struct OutsideLoopSuggestion {
892 #[suggestion_part(code = "'block: ")]
893 pub block_span: Span,
894 #[suggestion_part(code = " 'block")]
895 pub break_spans: Vec<Span>,
896}
897
898#[derive(const _: () =
{
impl<'_sess, 'a, G> rustc_errors::Diagnostic<'_sess, G> for
UnlabeledInLabeledBlock<'a> where
G: rustc_errors::EmissionGuarantee {
#[track_caller]
fn into_diag(self, dcx: rustc_errors::DiagCtxtHandle<'_sess>,
level: rustc_errors::Level) -> rustc_errors::Diag<'_sess, G> {
match self {
UnlabeledInLabeledBlock {
span: __binding_0, cf_type: __binding_1 } => {
let mut diag =
rustc_errors::Diag::new(dcx, level,
rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("unlabeled `{$cf_type}` inside of a labeled block")));
diag.code(E0695);
;
diag.arg("cf_type", __binding_1);
diag.span(__binding_0);
diag.span_label(__binding_0,
rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("`{$cf_type}` statements that would diverge to or through a labeled block need to bear a label")));
diag
}
}
}
}
};Diagnostic)]
899#[diag("unlabeled `{$cf_type}` inside of a labeled block", code = E0695)]
900pub(crate) struct UnlabeledInLabeledBlock<'a> {
901 #[primary_span]
902 #[label(
903 "`{$cf_type}` statements that would diverge to or through a labeled block need to bear a label"
904 )]
905 pub span: Span,
906 pub cf_type: &'a str,
907}
908
909#[derive(const _: () =
{
impl<'_sess, 'a, G> rustc_errors::Diagnostic<'_sess, G> for
UnlabeledCfInWhileCondition<'a> where
G: rustc_errors::EmissionGuarantee {
#[track_caller]
fn into_diag(self, dcx: rustc_errors::DiagCtxtHandle<'_sess>,
level: rustc_errors::Level) -> rustc_errors::Diag<'_sess, G> {
match self {
UnlabeledCfInWhileCondition {
span: __binding_0, cf_type: __binding_1 } => {
let mut diag =
rustc_errors::Diag::new(dcx, level,
rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("`break` or `continue` with no label in the condition of a `while` loop")));
diag.code(E0590);
;
diag.arg("cf_type", __binding_1);
diag.span(__binding_0);
diag.span_label(__binding_0,
rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("unlabeled `{$cf_type}` in the condition of a `while` loop")));
diag
}
}
}
}
};Diagnostic)]
910#[diag("`break` or `continue` with no label in the condition of a `while` loop", code = E0590)]
911pub(crate) struct UnlabeledCfInWhileCondition<'a> {
912 #[primary_span]
913 #[label("unlabeled `{$cf_type}` in the condition of a `while` loop")]
914 pub span: Span,
915 pub cf_type: &'a str,
916}
917
918#[derive(const _: () =
{
impl<'_sess, 'tcx, G> rustc_errors::Diagnostic<'_sess, G> for
NoAssociatedItem<'tcx> where G: rustc_errors::EmissionGuarantee {
#[track_caller]
fn into_diag(self, dcx: rustc_errors::DiagCtxtHandle<'_sess>,
level: rustc_errors::Level) -> rustc_errors::Diag<'_sess, G> {
match self {
NoAssociatedItem {
span: __binding_0,
item_kind: __binding_1,
item_ident: __binding_2,
ty_prefix: __binding_3,
ty: __binding_4,
trait_missing_method: __binding_5 } => {
let mut diag =
rustc_errors::Diag::new(dcx, level,
rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("no {$item_kind} named `{$item_ident}` found for {$ty_prefix} `{$ty}`{$trait_missing_method ->\n [true] {\"\"}\n *[other] {\" \"}in the current scope\n}")));
diag.code(E0599);
;
diag.arg("item_kind", __binding_1);
diag.arg("item_ident", __binding_2);
diag.arg("ty_prefix", __binding_3);
diag.arg("ty", __binding_4);
diag.arg("trait_missing_method", __binding_5);
diag.span(__binding_0);
diag
}
}
}
}
};Diagnostic)]
919#[diag("no {$item_kind} named `{$item_ident}` found for {$ty_prefix} `{$ty}`{$trait_missing_method ->
920 [true] {\"\"}
921 *[other] {\" \"}in the current scope
922}", code = E0599)]
923pub(crate) struct NoAssociatedItem<'tcx> {
924 #[primary_span]
925 pub span: Span,
926 pub item_kind: &'static str,
927 pub item_ident: Ident,
928 pub ty_prefix: Cow<'static, str>,
929 pub ty: Ty<'tcx>,
930 pub trait_missing_method: bool,
931}
932
933#[derive(const _: () =
{
impl rustc_errors::Subdiagnostic for CandidateTraitNote {
fn add_to_diag<__G>(self, diag: &mut rustc_errors::Diag<'_, __G>)
where __G: rustc_errors::EmissionGuarantee {
match self {
CandidateTraitNote {
span: __binding_0,
trait_name: __binding_1,
item_name: __binding_2,
action_or_ty: __binding_3 } => {
diag.store_args();
diag.arg("trait_name", __binding_1);
diag.arg("item_name", __binding_2);
diag.arg("action_or_ty", __binding_3);
let __message =
diag.eagerly_translate(rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("`{$trait_name}` defines an item `{$item_name}`{$action_or_ty ->\n [NONE] {\"\"}\n [implement] , perhaps you need to implement it\n *[other] , perhaps you need to restrict type parameter `{$action_or_ty}` with it\n }")));
diag.span_note(__binding_0, __message);
diag.restore_args();
}
}
}
}
};Subdiagnostic)]
934#[note(
935 "`{$trait_name}` defines an item `{$item_name}`{$action_or_ty ->
936 [NONE] {\"\"}
937 [implement] , perhaps you need to implement it
938 *[other] , perhaps you need to restrict type parameter `{$action_or_ty}` with it
939 }"
940)]
941pub(crate) struct CandidateTraitNote {
942 #[primary_span]
943 pub span: Span,
944 pub trait_name: String,
945 pub item_name: Ident,
946 pub action_or_ty: String,
947}
948
949#[derive(const _: () =
{
impl<'_sess, 'tcx, G> rustc_errors::Diagnostic<'_sess, G> for
CannotCastToBool<'tcx> where G: rustc_errors::EmissionGuarantee {
#[track_caller]
fn into_diag(self, dcx: rustc_errors::DiagCtxtHandle<'_sess>,
level: rustc_errors::Level) -> rustc_errors::Diag<'_sess, G> {
match self {
CannotCastToBool {
span: __binding_0, expr_ty: __binding_1, help: __binding_2 }
=> {
let mut diag =
rustc_errors::Diag::new(dcx, level,
rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("cannot cast `{$expr_ty}` as `bool`")));
diag.code(E0054);
;
diag.arg("expr_ty", __binding_1);
diag.span(__binding_0);
diag.subdiagnostic(__binding_2);
diag
}
}
}
}
};Diagnostic)]
950#[diag("cannot cast `{$expr_ty}` as `bool`", code = E0054)]
951pub(crate) struct CannotCastToBool<'tcx> {
952 #[primary_span]
953 pub span: Span,
954 pub expr_ty: Ty<'tcx>,
955 #[subdiagnostic]
956 pub help: CannotCastToBoolHelp,
957}
958
959#[derive(const _: () =
{
impl<'_sess, 'tcx, G> rustc_errors::Diagnostic<'_sess, G> for
CastEnumDrop<'tcx> where G: rustc_errors::EmissionGuarantee {
#[track_caller]
fn into_diag(self, dcx: rustc_errors::DiagCtxtHandle<'_sess>,
level: rustc_errors::Level) -> rustc_errors::Diag<'_sess, G> {
match self {
CastEnumDrop {
span: __binding_0,
expr_ty: __binding_1,
cast_ty: __binding_2 } => {
let mut diag =
rustc_errors::Diag::new(dcx, level,
rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("cannot cast enum `{$expr_ty}` into integer `{$cast_ty}` because it implements `Drop`")));
;
diag.arg("expr_ty", __binding_1);
diag.arg("cast_ty", __binding_2);
diag.span(__binding_0);
diag
}
}
}
}
};Diagnostic)]
960#[diag("cannot cast enum `{$expr_ty}` into integer `{$cast_ty}` because it implements `Drop`")]
961pub(crate) struct CastEnumDrop<'tcx> {
962 #[primary_span]
963 pub span: Span,
964 pub expr_ty: Ty<'tcx>,
965 pub cast_ty: Ty<'tcx>,
966}
967
968#[derive(const _: () =
{
impl<'_sess, G> rustc_errors::Diagnostic<'_sess, G> for
CastUnknownPointer where G: rustc_errors::EmissionGuarantee {
#[track_caller]
fn into_diag(self, dcx: rustc_errors::DiagCtxtHandle<'_sess>,
level: rustc_errors::Level) -> rustc_errors::Diag<'_sess, G> {
match self {
CastUnknownPointer {
span: __binding_0, to: __binding_1, sub: __binding_2 } => {
let mut diag =
rustc_errors::Diag::new(dcx, level,
rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("cannot cast {$to ->\n [true] to\n *[false] from\n} a pointer of an unknown kind")));
diag.code(E0641);
;
diag.arg("to", __binding_1);
diag.span(__binding_0);
diag.subdiagnostic(__binding_2);
diag
}
}
}
}
};Diagnostic)]
969#[diag("cannot cast {$to ->
970 [true] to
971 *[false] from
972} a pointer of an unknown kind", code = E0641)]
973pub(crate) struct CastUnknownPointer {
974 #[primary_span]
975 pub span: Span,
976 pub to: bool,
977 #[subdiagnostic]
978 pub sub: CastUnknownPointerSub,
979}
980
981pub(crate) enum CastUnknownPointerSub {
982 To(Span),
983 From(Span),
984}
985
986impl rustc_errors::Subdiagnostic for CastUnknownPointerSub {
987 fn add_to_diag<G: EmissionGuarantee>(self, diag: &mut Diag<'_, G>) {
988 match self {
989 CastUnknownPointerSub::To(span) => {
990 let msg = diag.eagerly_translate(rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("needs more type information"))msg!("needs more type information"));
991 diag.span_label(span, msg);
992 let msg = diag.eagerly_translate(rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("the type information given here is insufficient to check whether the pointer cast is valid"))msg!("the type information given here is insufficient to check whether the pointer cast is valid"));
993 diag.note(msg);
994 }
995 CastUnknownPointerSub::From(span) => {
996 let msg = diag.eagerly_translate(rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("the type information given here is insufficient to check whether the pointer cast is valid"))msg!("the type information given here is insufficient to check whether the pointer cast is valid"));
997 diag.span_label(span, msg);
998 }
999 }
1000 }
1001}
1002
1003#[derive(const _: () =
{
impl rustc_errors::Subdiagnostic for CannotCastToBoolHelp {
fn add_to_diag<__G>(self, diag: &mut rustc_errors::Diag<'_, __G>)
where __G: rustc_errors::EmissionGuarantee {
match self {
CannotCastToBoolHelp::Numeric(__binding_0) => {
let __code_33 =
[::alloc::__export::must_use({
::alloc::fmt::format(format_args!(" != 0"))
})].into_iter();
diag.store_args();
let __message =
diag.eagerly_translate(rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("compare with zero instead")));
diag.span_suggestions_with_style(__binding_0, __message,
__code_33, rustc_errors::Applicability::MachineApplicable,
rustc_errors::SuggestionStyle::ShowAlways);
diag.restore_args();
}
CannotCastToBoolHelp::Unsupported(__binding_0) => {
diag.store_args();
let __message =
diag.eagerly_translate(rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("unsupported cast")));
diag.span_label(__binding_0, __message);
diag.restore_args();
}
}
}
}
};Subdiagnostic)]
1004pub(crate) enum CannotCastToBoolHelp {
1005 #[suggestion(
1006 "compare with zero instead",
1007 applicability = "machine-applicable",
1008 code = " != 0",
1009 style = "verbose"
1010 )]
1011 Numeric(#[primary_span] Span),
1012 #[label("unsupported cast")]
1013 Unsupported(#[primary_span] Span),
1014}
1015
1016#[derive(const _: () =
{
impl<'_sess, G> rustc_errors::Diagnostic<'_sess, G> for CtorIsPrivate
where G: rustc_errors::EmissionGuarantee {
#[track_caller]
fn into_diag(self, dcx: rustc_errors::DiagCtxtHandle<'_sess>,
level: rustc_errors::Level) -> rustc_errors::Diag<'_sess, G> {
match self {
CtorIsPrivate { span: __binding_0, def: __binding_1 } => {
let mut diag =
rustc_errors::Diag::new(dcx, level,
rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("tuple struct constructor `{$def}` is private")));
diag.code(E0603);
;
diag.arg("def", __binding_1);
diag.span(__binding_0);
diag
}
}
}
}
};Diagnostic)]
1017#[diag("tuple struct constructor `{$def}` is private", code = E0603)]
1018pub(crate) struct CtorIsPrivate {
1019 #[primary_span]
1020 pub span: Span,
1021 pub def: String,
1022}
1023
1024#[derive(const _: () =
{
impl<'tcx> rustc_errors::Subdiagnostic for DerefImplsIsEmpty<'tcx> {
fn add_to_diag<__G>(self, diag: &mut rustc_errors::Diag<'_, __G>)
where __G: rustc_errors::EmissionGuarantee {
match self {
DerefImplsIsEmpty { span: __binding_0, deref_ty: __binding_1
} => {
diag.store_args();
diag.arg("deref_ty", __binding_1);
let __message =
diag.eagerly_translate(rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("this expression `Deref`s to `{$deref_ty}` which implements `is_empty`")));
diag.span_note(__binding_0, __message);
diag.restore_args();
}
}
}
}
};Subdiagnostic)]
1025#[note("this expression `Deref`s to `{$deref_ty}` which implements `is_empty`")]
1026pub(crate) struct DerefImplsIsEmpty<'tcx> {
1027 #[primary_span]
1028 pub span: Span,
1029 pub deref_ty: Ty<'tcx>,
1030}
1031
1032#[derive(const _: () =
{
impl<'tcx> rustc_errors::Subdiagnostic for
SuggestConvertViaMethod<'tcx> {
fn add_to_diag<__G>(self, diag: &mut rustc_errors::Diag<'_, __G>)
where __G: rustc_errors::EmissionGuarantee {
match self {
SuggestConvertViaMethod {
span: __binding_0,
borrow_removal_span: __binding_1,
sugg: __binding_2,
expected: __binding_3,
found: __binding_4 } => {
let mut suggestions = Vec::new();
let __code_34 =
::alloc::__export::must_use({
::alloc::fmt::format(format_args!("{0}", __binding_2))
});
let __code_35 =
::alloc::__export::must_use({
::alloc::fmt::format(format_args!(""))
});
suggestions.push((__binding_0, __code_34));
if let Some(__binding_1) = __binding_1 {
suggestions.push((__binding_1, __code_35));
}
diag.store_args();
diag.arg("sugg", __binding_2);
diag.arg("expected", __binding_3);
diag.arg("found", __binding_4);
let __message =
diag.eagerly_translate(rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("try using `{$sugg}` to convert `{$found}` to `{$expected}`")));
diag.multipart_suggestion_with_style(__message, suggestions,
rustc_errors::Applicability::MachineApplicable,
rustc_errors::SuggestionStyle::ShowAlways);
diag.restore_args();
}
}
}
}
};Subdiagnostic)]
1033#[multipart_suggestion(
1034 "try using `{$sugg}` to convert `{$found}` to `{$expected}`",
1035 applicability = "machine-applicable",
1036 style = "verbose"
1037)]
1038pub(crate) struct SuggestConvertViaMethod<'tcx> {
1039 #[suggestion_part(code = "{sugg}")]
1040 pub span: Span,
1041 #[suggestion_part(code = "")]
1042 pub borrow_removal_span: Option<Span>,
1043 pub sugg: String,
1044 pub expected: Ty<'tcx>,
1045 pub found: Ty<'tcx>,
1046}
1047
1048#[derive(const _: () =
{
impl<'tcx> rustc_errors::Subdiagnostic for
NoteCallerChoosesTyForTyParam<'tcx> {
fn add_to_diag<__G>(self, diag: &mut rustc_errors::Diag<'_, __G>)
where __G: rustc_errors::EmissionGuarantee {
match self {
NoteCallerChoosesTyForTyParam {
ty_param_name: __binding_0, found_ty: __binding_1 } => {
diag.store_args();
diag.arg("ty_param_name", __binding_0);
diag.arg("found_ty", __binding_1);
let __message =
diag.eagerly_translate(rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("the caller chooses a type for `{$ty_param_name}` which can be different from `{$found_ty}`")));
diag.note(__message);
diag.restore_args();
}
}
}
}
};Subdiagnostic)]
1049#[note(
1050 "the caller chooses a type for `{$ty_param_name}` which can be different from `{$found_ty}`"
1051)]
1052pub(crate) struct NoteCallerChoosesTyForTyParam<'tcx> {
1053 pub ty_param_name: Symbol,
1054 pub found_ty: Ty<'tcx>,
1055}
1056
1057#[derive(const _: () =
{
impl rustc_errors::Subdiagnostic for SuggestBoxingForReturnImplTrait {
fn add_to_diag<__G>(self, diag: &mut rustc_errors::Diag<'_, __G>)
where __G: rustc_errors::EmissionGuarantee {
match self {
SuggestBoxingForReturnImplTrait::ChangeReturnType {
start_sp: __binding_0, end_sp: __binding_1 } => {
let mut suggestions = Vec::new();
let __code_36 =
::alloc::__export::must_use({
::alloc::fmt::format(format_args!("Box<dyn"))
});
let __code_37 =
::alloc::__export::must_use({
::alloc::fmt::format(format_args!(">"))
});
suggestions.push((__binding_0, __code_36));
suggestions.push((__binding_1, __code_37));
diag.store_args();
let __message =
diag.eagerly_translate(rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("you could change the return type to be a boxed trait object")));
diag.multipart_suggestion_with_style(__message, suggestions,
rustc_errors::Applicability::MaybeIncorrect,
rustc_errors::SuggestionStyle::ShowCode);
diag.restore_args();
}
SuggestBoxingForReturnImplTrait::BoxReturnExpr {
starts: __binding_0, ends: __binding_1 } => {
let mut suggestions = Vec::new();
let __code_38 =
::alloc::__export::must_use({
::alloc::fmt::format(format_args!("Box::new("))
});
let __code_39 =
::alloc::__export::must_use({
::alloc::fmt::format(format_args!(")"))
});
for __binding_0 in __binding_0 {
suggestions.push((__binding_0, __code_38.clone()));
}
for __binding_1 in __binding_1 {
suggestions.push((__binding_1, __code_39.clone()));
}
diag.store_args();
let __message =
diag.eagerly_translate(rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("if you change the return type to expect trait objects, box the returned expressions")));
diag.multipart_suggestion_with_style(__message, suggestions,
rustc_errors::Applicability::MaybeIncorrect,
rustc_errors::SuggestionStyle::ShowCode);
diag.restore_args();
}
}
}
}
};Subdiagnostic)]
1058pub(crate) enum SuggestBoxingForReturnImplTrait {
1059 #[multipart_suggestion(
1060 "you could change the return type to be a boxed trait object",
1061 applicability = "maybe-incorrect"
1062 )]
1063 ChangeReturnType {
1064 #[suggestion_part(code = "Box<dyn")]
1065 start_sp: Span,
1066 #[suggestion_part(code = ">")]
1067 end_sp: Span,
1068 },
1069 #[multipart_suggestion(
1070 "if you change the return type to expect trait objects, box the returned expressions",
1071 applicability = "maybe-incorrect"
1072 )]
1073 BoxReturnExpr {
1074 #[suggestion_part(code = "Box::new(")]
1075 starts: Vec<Span>,
1076 #[suggestion_part(code = ")")]
1077 ends: Vec<Span>,
1078 },
1079}
1080
1081#[derive(const _: () =
{
impl<'_sess, G> rustc_errors::Diagnostic<'_sess, G> for
SelfCtorFromOuterItem where G: rustc_errors::EmissionGuarantee {
#[track_caller]
fn into_diag(self, dcx: rustc_errors::DiagCtxtHandle<'_sess>,
level: rustc_errors::Level) -> rustc_errors::Diag<'_sess, G> {
match self {
SelfCtorFromOuterItem {
span: __binding_0,
impl_span: __binding_1,
sugg: __binding_2,
item: __binding_3 } => {
let mut diag =
rustc_errors::Diag::new(dcx, level,
rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("can't reference `Self` constructor from outer item")));
diag.code(E0401);
;
diag.span(__binding_0);
diag.span_label(__binding_1,
rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("the inner item doesn't inherit generics from this impl, so `Self` is invalid to reference")));
if let Some(__binding_2) = __binding_2 {
diag.subdiagnostic(__binding_2);
}
if let Some(__binding_3) = __binding_3 {
diag.subdiagnostic(__binding_3);
}
diag
}
}
}
}
};Diagnostic)]
1082#[diag("can't reference `Self` constructor from outer item", code = E0401)]
1083pub(crate) struct SelfCtorFromOuterItem {
1084 #[primary_span]
1085 pub span: Span,
1086 #[label(
1087 "the inner item doesn't inherit generics from this impl, so `Self` is invalid to reference"
1088 )]
1089 pub impl_span: Span,
1090 #[subdiagnostic]
1091 pub sugg: Option<ReplaceWithName>,
1092 #[subdiagnostic]
1093 pub item: Option<InnerItem>,
1094}
1095
1096#[derive(const _: () =
{
impl rustc_errors::Subdiagnostic for InnerItem {
fn add_to_diag<__G>(self, diag: &mut rustc_errors::Diag<'_, __G>)
where __G: rustc_errors::EmissionGuarantee {
match self {
InnerItem { span: __binding_0 } => {
diag.store_args();
let __message =
diag.eagerly_translate(rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("`Self` used in this inner item")));
diag.span_label(__binding_0, __message);
diag.restore_args();
}
}
}
}
};Subdiagnostic)]
1097#[label("`Self` used in this inner item")]
1098pub(crate) struct InnerItem {
1099 #[primary_span]
1100 pub span: Span,
1101}
1102
1103#[derive(const _: () =
{
impl<'_sess, G> rustc_errors::Diagnostic<'_sess, G> for
SelfCtorFromOuterItemLint where G: rustc_errors::EmissionGuarantee
{
#[track_caller]
fn into_diag(self, dcx: rustc_errors::DiagCtxtHandle<'_sess>,
level: rustc_errors::Level) -> rustc_errors::Diag<'_sess, G> {
match self {
SelfCtorFromOuterItemLint {
impl_span: __binding_0, sugg: __binding_1, item: __binding_2
} => {
let mut diag =
rustc_errors::Diag::new(dcx, level,
rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("can't reference `Self` constructor from outer item")));
;
diag.span_label(__binding_0,
rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("the inner item doesn't inherit generics from this impl, so `Self` is invalid to reference")));
if let Some(__binding_1) = __binding_1 {
diag.subdiagnostic(__binding_1);
}
if let Some(__binding_2) = __binding_2 {
diag.subdiagnostic(__binding_2);
}
diag
}
}
}
}
};Diagnostic)]
1104#[diag("can't reference `Self` constructor from outer item")]
1105pub(crate) struct SelfCtorFromOuterItemLint {
1106 #[label(
1107 "the inner item doesn't inherit generics from this impl, so `Self` is invalid to reference"
1108 )]
1109 pub impl_span: Span,
1110 #[subdiagnostic]
1111 pub sugg: Option<ReplaceWithName>,
1112 #[subdiagnostic]
1113 pub item: Option<InnerItem>,
1114}
1115
1116#[derive(const _: () =
{
impl rustc_errors::Subdiagnostic for ReplaceWithName {
fn add_to_diag<__G>(self, diag: &mut rustc_errors::Diag<'_, __G>)
where __G: rustc_errors::EmissionGuarantee {
match self {
ReplaceWithName { span: __binding_0, name: __binding_1 } =>
{
let __code_40 =
[::alloc::__export::must_use({
::alloc::fmt::format(format_args!("{0}", __binding_1))
})].into_iter();
diag.store_args();
diag.arg("name", __binding_1);
let __message =
diag.eagerly_translate(rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("replace `Self` with the actual type")));
diag.span_suggestions_with_style(__binding_0, __message,
__code_40, rustc_errors::Applicability::MachineApplicable,
rustc_errors::SuggestionStyle::ShowCode);
diag.restore_args();
}
}
}
}
};Subdiagnostic)]
1117#[suggestion(
1118 "replace `Self` with the actual type",
1119 code = "{name}",
1120 applicability = "machine-applicable"
1121)]
1122pub(crate) struct ReplaceWithName {
1123 #[primary_span]
1124 pub span: Span,
1125 pub name: String,
1126}
1127
1128#[derive(const _: () =
{
impl<'_sess, 'tcx, G> rustc_errors::Diagnostic<'_sess, G> for
CastThinPointerToWidePointer<'tcx> where
G: rustc_errors::EmissionGuarantee {
#[track_caller]
fn into_diag(self, dcx: rustc_errors::DiagCtxtHandle<'_sess>,
level: rustc_errors::Level) -> rustc_errors::Diag<'_sess, G> {
match self {
CastThinPointerToWidePointer {
span: __binding_0,
expr_ty: __binding_1,
cast_ty: __binding_2,
teach: __binding_3 } => {
let mut diag =
rustc_errors::Diag::new(dcx, level,
rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("cannot cast thin pointer `{$expr_ty}` to wide pointer `{$cast_ty}`")));
diag.code(E0607);
;
diag.arg("expr_ty", __binding_1);
diag.arg("cast_ty", __binding_2);
diag.span(__binding_0);
if __binding_3 {
diag.note(rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("thin pointers are \"simple\" pointers: they are purely a reference to a\n memory address.\n\n Wide pointers are pointers referencing \"Dynamically Sized Types\" (also\n called DST). DST don't have a statically known size, therefore they can\n only exist behind some kind of pointers that contain additional\n information. Slices and trait objects are DSTs. In the case of slices,\n the additional information the wide pointer holds is their size.\n\n To fix this error, don't try to cast directly between thin and wide\n pointers.\n\n For more information about casts, take a look at The Book:\n https://doc.rust-lang.org/reference/expressions/operator-expr.html#type-cast-expressions")));
}
diag
}
}
}
}
};Diagnostic)]
1129#[diag("cannot cast thin pointer `{$expr_ty}` to wide pointer `{$cast_ty}`", code = E0607)]
1130pub(crate) struct CastThinPointerToWidePointer<'tcx> {
1131 #[primary_span]
1132 pub span: Span,
1133 pub expr_ty: Ty<'tcx>,
1134 pub cast_ty: Ty<'tcx>,
1135 #[note(
1136 "thin pointers are \"simple\" pointers: they are purely a reference to a
1137 memory address.
1138
1139 Wide pointers are pointers referencing \"Dynamically Sized Types\" (also
1140 called DST). DST don't have a statically known size, therefore they can
1141 only exist behind some kind of pointers that contain additional
1142 information. Slices and trait objects are DSTs. In the case of slices,
1143 the additional information the wide pointer holds is their size.
1144
1145 To fix this error, don't try to cast directly between thin and wide
1146 pointers.
1147
1148 For more information about casts, take a look at The Book:
1149 https://doc.rust-lang.org/reference/expressions/operator-expr.html#type-cast-expressions"
1150 )]
1151 pub(crate) teach: bool,
1152}
1153
1154#[derive(const _: () =
{
impl<'_sess, 'a, 'tcx, G> rustc_errors::Diagnostic<'_sess, G> for
PassToVariadicFunction<'a, 'tcx> where
G: rustc_errors::EmissionGuarantee {
#[track_caller]
fn into_diag(self, dcx: rustc_errors::DiagCtxtHandle<'_sess>,
level: rustc_errors::Level) -> rustc_errors::Diag<'_sess, G> {
match self {
PassToVariadicFunction {
span: __binding_0,
ty: __binding_1,
cast_ty: __binding_2,
sugg_span: __binding_3,
teach: __binding_4 } => {
let mut diag =
rustc_errors::Diag::new(dcx, level,
rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("can't pass `{$ty}` to variadic function")));
let __code_41 =
[::alloc::__export::must_use({
::alloc::fmt::format(format_args!(" as {0}", __binding_2))
})].into_iter();
diag.code(E0617);
;
diag.arg("ty", __binding_1);
diag.arg("cast_ty", __binding_2);
diag.span(__binding_0);
diag.span_suggestions_with_style(__binding_3,
rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("cast the value to `{$cast_ty}`")),
__code_41, rustc_errors::Applicability::MachineApplicable,
rustc_errors::SuggestionStyle::ShowAlways);
if __binding_4 {
diag.note(rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("certain types, like `{$ty}`, must be cast before passing them to a variadic function to match the implicit cast that a C compiler would perform as part of C's numeric promotion rules")));
}
diag
}
}
}
}
};Diagnostic)]
1155#[diag("can't pass `{$ty}` to variadic function", code = E0617)]
1156pub(crate) struct PassToVariadicFunction<'a, 'tcx> {
1157 #[primary_span]
1158 pub span: Span,
1159 pub ty: Ty<'tcx>,
1160 pub cast_ty: &'a str,
1161 #[suggestion(
1162 "cast the value to `{$cast_ty}`",
1163 code = " as {cast_ty}",
1164 applicability = "machine-applicable",
1165 style = "verbose"
1166 )]
1167 pub sugg_span: Span,
1168 #[note(
1169 "certain types, like `{$ty}`, must be cast before passing them to a variadic function to match the implicit cast that a C compiler would perform as part of C's numeric promotion rules"
1170 )]
1171 pub(crate) teach: bool,
1172}
1173
1174#[derive(const _: () =
{
impl<'_sess, G> rustc_errors::Diagnostic<'_sess, G> for
PassFnItemToVariadicFunction where
G: rustc_errors::EmissionGuarantee {
#[track_caller]
fn into_diag(self, dcx: rustc_errors::DiagCtxtHandle<'_sess>,
level: rustc_errors::Level) -> rustc_errors::Diag<'_sess, G> {
match self {
PassFnItemToVariadicFunction {
span: __binding_0,
sugg_span: __binding_1,
replace: __binding_2 } => {
let mut diag =
rustc_errors::Diag::new(dcx, level,
rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("can't pass a function item to a variadic function")));
let __code_42 =
[::alloc::__export::must_use({
::alloc::fmt::format(format_args!(" as {0}", __binding_2))
})].into_iter();
diag.code(E0617);
diag.help(rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("a function item is zero-sized and needs to be cast into a function pointer to be used in FFI")));
diag.note(rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("for more information on function items, visit https://doc.rust-lang.org/reference/types/function-item.html")));
;
diag.arg("replace", __binding_2);
diag.span(__binding_0);
diag.span_suggestions_with_style(__binding_1,
rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("use a function pointer instead")),
__code_42, rustc_errors::Applicability::MachineApplicable,
rustc_errors::SuggestionStyle::ShowAlways);
diag
}
}
}
}
};Diagnostic)]
1175#[diag("can't pass a function item to a variadic function", code = E0617)]
1176#[help(
1177 "a function item is zero-sized and needs to be cast into a function pointer to be used in FFI"
1178)]
1179#[note(
1180 "for more information on function items, visit https://doc.rust-lang.org/reference/types/function-item.html"
1181)]
1182pub(crate) struct PassFnItemToVariadicFunction {
1183 #[primary_span]
1184 pub span: Span,
1185 #[suggestion(
1186 "use a function pointer instead",
1187 code = " as {replace}",
1188 applicability = "machine-applicable",
1189 style = "verbose"
1190 )]
1191 pub sugg_span: Span,
1192 pub replace: String,
1193}
1194
1195#[derive(const _: () =
{
impl rustc_errors::Subdiagnostic for ReplaceCommaWithSemicolon {
fn add_to_diag<__G>(self, diag: &mut rustc_errors::Diag<'_, __G>)
where __G: rustc_errors::EmissionGuarantee {
match self {
ReplaceCommaWithSemicolon {
comma_span: __binding_0, descr: __binding_1 } => {
let __code_43 =
[::alloc::__export::must_use({
::alloc::fmt::format(format_args!("; "))
})].into_iter();
diag.store_args();
diag.arg("descr", __binding_1);
let __message =
diag.eagerly_translate(rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("replace the comma with a semicolon to create {$descr}")));
diag.span_suggestions_with_style(__binding_0, __message,
__code_43, rustc_errors::Applicability::MachineApplicable,
rustc_errors::SuggestionStyle::ShowAlways);
diag.restore_args();
}
}
}
}
};Subdiagnostic)]
1196#[suggestion(
1197 "replace the comma with a semicolon to create {$descr}",
1198 applicability = "machine-applicable",
1199 style = "verbose",
1200 code = "; "
1201)]
1202pub(crate) struct ReplaceCommaWithSemicolon {
1203 #[primary_span]
1204 pub comma_span: Span,
1205 pub descr: &'static str,
1206}
1207
1208#[derive(const _: () =
{
impl<'_sess, G> rustc_errors::Diagnostic<'_sess, G> for
SupertraitItemShadowing where G: rustc_errors::EmissionGuarantee {
#[track_caller]
fn into_diag(self, dcx: rustc_errors::DiagCtxtHandle<'_sess>,
level: rustc_errors::Level) -> rustc_errors::Diag<'_sess, G> {
match self {
SupertraitItemShadowing {
item: __binding_0,
subtrait: __binding_1,
shadower: __binding_2,
shadowee: __binding_3 } => {
let mut diag =
rustc_errors::Diag::new(dcx, level,
rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("trait item `{$item}` from `{$subtrait}` shadows identically named item from supertrait")));
;
diag.arg("item", __binding_0);
diag.arg("subtrait", __binding_1);
diag.subdiagnostic(__binding_2);
diag.subdiagnostic(__binding_3);
diag
}
}
}
}
};Diagnostic)]
1209#[diag("trait item `{$item}` from `{$subtrait}` shadows identically named item from supertrait")]
1210pub(crate) struct SupertraitItemShadowing {
1211 pub item: Symbol,
1212 pub subtrait: Symbol,
1213 #[subdiagnostic]
1214 pub shadower: SupertraitItemShadower,
1215 #[subdiagnostic]
1216 pub shadowee: SupertraitItemShadowee,
1217}
1218
1219#[derive(const _: () =
{
impl rustc_errors::Subdiagnostic for SupertraitItemShadower {
fn add_to_diag<__G>(self, diag: &mut rustc_errors::Diag<'_, __G>)
where __G: rustc_errors::EmissionGuarantee {
match self {
SupertraitItemShadower {
subtrait: __binding_0, span: __binding_1 } => {
diag.store_args();
diag.arg("subtrait", __binding_0);
let __message =
diag.eagerly_translate(rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("item from `{$subtrait}` shadows a supertrait item")));
diag.span_note(__binding_1, __message);
diag.restore_args();
}
}
}
}
};Subdiagnostic)]
1220#[note("item from `{$subtrait}` shadows a supertrait item")]
1221pub(crate) struct SupertraitItemShadower {
1222 pub subtrait: Symbol,
1223 #[primary_span]
1224 pub span: Span,
1225}
1226
1227#[derive(const _: () =
{
impl rustc_errors::Subdiagnostic for SupertraitItemShadowee {
fn add_to_diag<__G>(self, diag: &mut rustc_errors::Diag<'_, __G>)
where __G: rustc_errors::EmissionGuarantee {
match self {
SupertraitItemShadowee::Labeled {
span: __binding_0, supertrait: __binding_1 } => {
diag.store_args();
diag.arg("supertrait", __binding_1);
let __message =
diag.eagerly_translate(rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("item from `{$supertrait}` is shadowed by a subtrait item")));
diag.span_note(__binding_0, __message);
diag.restore_args();
}
SupertraitItemShadowee::Several {
spans: __binding_0, traits: __binding_1 } => {
diag.store_args();
diag.arg("traits", __binding_1);
let __message =
diag.eagerly_translate(rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("items from several supertraits are shadowed: {$traits}")));
diag.span_note(__binding_0, __message);
diag.restore_args();
}
}
}
}
};Subdiagnostic)]
1228pub(crate) enum SupertraitItemShadowee {
1229 #[note("item from `{$supertrait}` is shadowed by a subtrait item")]
1230 Labeled {
1231 #[primary_span]
1232 span: Span,
1233 supertrait: Symbol,
1234 },
1235 #[note("items from several supertraits are shadowed: {$traits}")]
1236 Several {
1237 #[primary_span]
1238 spans: MultiSpan,
1239 traits: DiagSymbolList,
1240 },
1241}
1242
1243#[derive(const _: () =
{
impl<'_sess, 'a, G> rustc_errors::Diagnostic<'_sess, G> for
RegisterTypeUnstable<'a> where G: rustc_errors::EmissionGuarantee
{
#[track_caller]
fn into_diag(self, dcx: rustc_errors::DiagCtxtHandle<'_sess>,
level: rustc_errors::Level) -> rustc_errors::Diag<'_sess, G> {
match self {
RegisterTypeUnstable { span: __binding_0, ty: __binding_1 }
=> {
let mut diag =
rustc_errors::Diag::new(dcx, level,
rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("type `{$ty}` cannot be used with this register class in stable")));
;
diag.arg("ty", __binding_1);
diag.span(__binding_0);
diag
}
}
}
}
};Diagnostic)]
1244#[diag("type `{$ty}` cannot be used with this register class in stable")]
1245pub(crate) struct RegisterTypeUnstable<'a> {
1246 #[primary_span]
1247 pub span: Span,
1248 pub ty: Ty<'a>,
1249}
1250
1251#[derive(const _: () =
{
impl<'_sess, G> rustc_errors::Diagnostic<'_sess, G> for
NakedAsmOutsideNakedFn where G: rustc_errors::EmissionGuarantee {
#[track_caller]
fn into_diag(self, dcx: rustc_errors::DiagCtxtHandle<'_sess>,
level: rustc_errors::Level) -> rustc_errors::Diag<'_sess, G> {
match self {
NakedAsmOutsideNakedFn { span: __binding_0 } => {
let mut diag =
rustc_errors::Diag::new(dcx, level,
rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("the `naked_asm!` macro can only be used in functions marked with `#[unsafe(naked)]`")));
;
diag.span(__binding_0);
diag
}
}
}
}
};Diagnostic)]
1252#[diag("the `naked_asm!` macro can only be used in functions marked with `#[unsafe(naked)]`")]
1253pub(crate) struct NakedAsmOutsideNakedFn {
1254 #[primary_span]
1255 pub span: Span,
1256}
1257
1258#[derive(const _: () =
{
impl<'_sess, G> rustc_errors::Diagnostic<'_sess, G> for NoPatterns
where G: rustc_errors::EmissionGuarantee {
#[track_caller]
fn into_diag(self, dcx: rustc_errors::DiagCtxtHandle<'_sess>,
level: rustc_errors::Level) -> rustc_errors::Diag<'_sess, G> {
match self {
NoPatterns { span: __binding_0 } => {
let mut diag =
rustc_errors::Diag::new(dcx, level,
rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("patterns not allowed in naked function parameters")));
;
diag.span(__binding_0);
diag
}
}
}
}
};Diagnostic)]
1259#[diag("patterns not allowed in naked function parameters")]
1260pub(crate) struct NoPatterns {
1261 #[primary_span]
1262 pub span: Span,
1263}
1264
1265#[derive(const _: () =
{
impl<'_sess, G> rustc_errors::Diagnostic<'_sess, G> for
ParamsNotAllowed where G: rustc_errors::EmissionGuarantee {
#[track_caller]
fn into_diag(self, dcx: rustc_errors::DiagCtxtHandle<'_sess>,
level: rustc_errors::Level) -> rustc_errors::Diag<'_sess, G> {
match self {
ParamsNotAllowed { span: __binding_0 } => {
let mut diag =
rustc_errors::Diag::new(dcx, level,
rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("referencing function parameters is not allowed in naked functions")));
diag.help(rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("follow the calling convention in asm block to use parameters")));
;
diag.span(__binding_0);
diag
}
}
}
}
};Diagnostic)]
1266#[diag("referencing function parameters is not allowed in naked functions")]
1267#[help("follow the calling convention in asm block to use parameters")]
1268pub(crate) struct ParamsNotAllowed {
1269 #[primary_span]
1270 pub span: Span,
1271}
1272
1273pub(crate) struct NakedFunctionsAsmBlock {
1274 pub span: Span,
1275 pub multiple_asms: Vec<Span>,
1276 pub non_asms: Vec<Span>,
1277}
1278
1279impl<G: EmissionGuarantee> Diagnostic<'_, G> for NakedFunctionsAsmBlock {
1280 #[track_caller]
1281 fn into_diag(self, dcx: DiagCtxtHandle<'_>, level: Level) -> Diag<'_, G> {
1282 let mut diag = Diag::new(
1283 dcx,
1284 level,
1285 rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("naked functions must contain a single `naked_asm!` invocation"))msg!("naked functions must contain a single `naked_asm!` invocation"),
1286 );
1287 diag.span(self.span);
1288 diag.code(E0787);
1289 for span in self.multiple_asms.iter() {
1290 diag.span_label(
1291 *span,
1292 rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("multiple `naked_asm!` invocations are not allowed in naked functions"))msg!("multiple `naked_asm!` invocations are not allowed in naked functions"),
1293 );
1294 }
1295 for span in self.non_asms.iter() {
1296 diag.span_label(*span, rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("not allowed in naked functions"))msg!("not allowed in naked functions"));
1297 }
1298 diag
1299 }
1300}
1301
1302pub(crate) fn maybe_emit_plus_equals_diagnostic<'a>(
1303 fnctxt: &FnCtxt<'a, '_>,
1304 assign_op: Spanned<AssignOpKind>,
1305 lhs_expr: &hir::Expr<'_>,
1306) -> Result<(), Diag<'a>> {
1307 if assign_op.node == hir::AssignOpKind::AddAssign
1308 && let hir::ExprKind::Binary(bin_op, left, right) = &lhs_expr.kind
1309 && bin_op.node == hir::BinOpKind::And
1310 && crate::op::contains_let_in_chain(left)
1311 && let hir::ExprKind::Path(hir::QPath::Resolved(_, path)) = &right.kind
1312 && #[allow(non_exhaustive_omitted_patterns)] match path.res {
hir::def::Res::Local(_) => true,
_ => false,
}matches!(path.res, hir::def::Res::Local(_))
1313 {
1314 let mut err = fnctxt.dcx().struct_span_err(
1315 assign_op.span,
1316 "binary assignment operation `+=` cannot be used in a let chain",
1317 );
1318
1319 err.span_label(
1320 lhs_expr.span,
1321 "you are add-assigning the right-hand side expression to the result of this let-chain",
1322 );
1323
1324 err.span_label(assign_op.span, "cannot use `+=` in a let chain");
1325
1326 err.span_suggestion(
1327 assign_op.span,
1328 "you might have meant to compare with `==` instead of assigning with `+=`",
1329 "==",
1330 Applicability::MaybeIncorrect,
1331 );
1332
1333 return Err(err);
1334 }
1335 Ok(())
1336}
1337
1338#[derive(const _: () =
{
impl<'_sess, G> rustc_errors::Diagnostic<'_sess, G> for
NakedFunctionsMustNakedAsm where
G: rustc_errors::EmissionGuarantee {
#[track_caller]
fn into_diag(self, dcx: rustc_errors::DiagCtxtHandle<'_sess>,
level: rustc_errors::Level) -> rustc_errors::Diag<'_sess, G> {
match self {
NakedFunctionsMustNakedAsm { span: __binding_0 } => {
let mut diag =
rustc_errors::Diag::new(dcx, level,
rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("the `asm!` macro is not allowed in naked functions")));
diag.code(E0787);
;
diag.span(__binding_0);
diag.span_label(__binding_0,
rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("consider using the `naked_asm!` macro instead")));
diag
}
}
}
}
};Diagnostic)]
1339#[diag("the `asm!` macro is not allowed in naked functions", code = E0787)]
1340pub(crate) struct NakedFunctionsMustNakedAsm {
1341 #[primary_span]
1342 #[label("consider using the `naked_asm!` macro instead")]
1343 pub span: Span,
1344}
1345
1346#[derive(const _: () =
{
impl<'_sess, G> rustc_errors::Diagnostic<'_sess, G> for
AbiCannotBeCalled where G: rustc_errors::EmissionGuarantee {
#[track_caller]
fn into_diag(self, dcx: rustc_errors::DiagCtxtHandle<'_sess>,
level: rustc_errors::Level) -> rustc_errors::Diag<'_sess, G> {
match self {
AbiCannotBeCalled { span: __binding_0, abi: __binding_1 } =>
{
let mut diag =
rustc_errors::Diag::new(dcx, level,
rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("functions with the {$abi} ABI cannot be called")));
;
diag.arg("abi", __binding_1);
diag.span(__binding_0);
diag.span_note(__binding_0,
rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("an `extern {$abi}` function can only be called using inline assembly")));
diag
}
}
}
}
};Diagnostic)]
1347#[diag("functions with the {$abi} ABI cannot be called")]
1348pub(crate) struct AbiCannotBeCalled {
1349 #[primary_span]
1350 #[note("an `extern {$abi}` function can only be called using inline assembly")]
1351 pub span: Span,
1352 pub abi: ExternAbi,
1353}
1354
1355#[derive(const _: () =
{
impl<'_sess, G> rustc_errors::Diagnostic<'_sess, G> for
GpuKernelAbiCannotBeCalled where
G: rustc_errors::EmissionGuarantee {
#[track_caller]
fn into_diag(self, dcx: rustc_errors::DiagCtxtHandle<'_sess>,
level: rustc_errors::Level) -> rustc_errors::Diag<'_sess, G> {
match self {
GpuKernelAbiCannotBeCalled { span: __binding_0 } => {
let mut diag =
rustc_errors::Diag::new(dcx, level,
rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("functions with the \"gpu-kernel\" ABI cannot be called")));
;
diag.span(__binding_0);
diag.span_note(__binding_0,
rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("an `extern \"gpu-kernel\"` function must be launched on the GPU by the runtime")));
diag
}
}
}
}
};Diagnostic)]
1356#[diag("functions with the \"gpu-kernel\" ABI cannot be called")]
1357pub(crate) struct GpuKernelAbiCannotBeCalled {
1358 #[primary_span]
1359 #[note("an `extern \"gpu-kernel\"` function must be launched on the GPU by the runtime")]
1360 pub span: Span,
1361}
1362
1363#[derive(const _: () =
{
impl<'_sess, G> rustc_errors::Diagnostic<'_sess, G> for
ConstContinueBadLabel where G: rustc_errors::EmissionGuarantee {
#[track_caller]
fn into_diag(self, dcx: rustc_errors::DiagCtxtHandle<'_sess>,
level: rustc_errors::Level) -> rustc_errors::Diag<'_sess, G> {
match self {
ConstContinueBadLabel { span: __binding_0 } => {
let mut diag =
rustc_errors::Diag::new(dcx, level,
rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("`#[const_continue]` must break to a labeled block that participates in a `#[loop_match]`")));
;
diag.span(__binding_0);
diag
}
}
}
}
};Diagnostic)]
1364#[diag("`#[const_continue]` must break to a labeled block that participates in a `#[loop_match]`")]
1365pub(crate) struct ConstContinueBadLabel {
1366 #[primary_span]
1367 pub span: Span,
1368}
1369
1370#[derive(const _: () =
{
impl<'_sess, G> rustc_errors::Diagnostic<'_sess, G> for
ProjectOnNonPinProjectType where
G: rustc_errors::EmissionGuarantee {
#[track_caller]
fn into_diag(self, dcx: rustc_errors::DiagCtxtHandle<'_sess>,
level: rustc_errors::Level) -> rustc_errors::Diag<'_sess, G> {
match self {
ProjectOnNonPinProjectType {
span: __binding_0,
def_span: __binding_1,
sugg_span: __binding_2 } => {
let mut diag =
rustc_errors::Diag::new(dcx, level,
rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("cannot project on type that is not `#[pin_v2]`")));
let __code_44 =
[::alloc::__export::must_use({
::alloc::fmt::format(format_args!("#[pin_v2]\n"))
})].into_iter();
;
diag.span(__binding_0);
if let Some(__binding_1) = __binding_1 {
diag.span_note(__binding_1,
rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("type defined here")));
}
if let Some(__binding_2) = __binding_2 {
diag.span_suggestions_with_style(__binding_2,
rustc_errors::DiagMessage::Inline(std::borrow::Cow::Borrowed("add `#[pin_v2]` here")),
__code_44, rustc_errors::Applicability::MachineApplicable,
rustc_errors::SuggestionStyle::ShowCode);
}
diag
}
}
}
}
};Diagnostic)]
1371#[diag("cannot project on type that is not `#[pin_v2]`")]
1372pub(crate) struct ProjectOnNonPinProjectType {
1373 #[primary_span]
1374 pub span: Span,
1375 #[note("type defined here")]
1376 pub def_span: Option<Span>,
1377 #[suggestion(
1378 "add `#[pin_v2]` here",
1379 code = "#[pin_v2]\n",
1380 applicability = "machine-applicable"
1381 )]
1382 pub sugg_span: Option<Span>,
1383}