-
Notifications
You must be signed in to change notification settings - Fork 12.8k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Auto merge of #100868 - Dylan-DPC:rollup-a1hfi1r, r=Dylan-DPC
Rollup of 5 pull requests Successful merges: - #93162 (Std module docs improvements) - #99386 (Add tests that check `Vec::retain` predicate execution order.) - #99915 (Recover keywords in trait bounds) - #100694 (Migrate rustc_ast_passes diagnostics to `SessionDiagnostic` and translatable messages (first part)) - #100757 (Catch overflow early) Failed merges: - #99917 (Move Error trait into core) r? `@ghost` `@rustbot` modify labels: rollup
- Loading branch information
Showing
40 changed files
with
957 additions
and
342 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Large diffs are not rendered by default.
Oops, something went wrong.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,248 @@ | ||
//! Errors emitted by ast_passes. | ||
|
||
use rustc_errors::{fluent, AddSubdiagnostic, Applicability, Diagnostic}; | ||
use rustc_macros::{SessionDiagnostic, SessionSubdiagnostic}; | ||
use rustc_span::{Span, Symbol}; | ||
|
||
use crate::ast_validation::ForbiddenLetReason; | ||
|
||
#[derive(SessionDiagnostic)] | ||
#[diag(ast_passes::forbidden_let)] | ||
#[note] | ||
pub struct ForbiddenLet { | ||
#[primary_span] | ||
pub span: Span, | ||
#[subdiagnostic] | ||
pub(crate) reason: ForbiddenLetReason, | ||
} | ||
|
||
impl AddSubdiagnostic for ForbiddenLetReason { | ||
fn add_to_diagnostic(self, diag: &mut Diagnostic) { | ||
match self { | ||
Self::GenericForbidden => {} | ||
Self::NotSupportedOr(span) => { | ||
diag.span_note(span, fluent::ast_passes::not_supported_or); | ||
} | ||
Self::NotSupportedParentheses(span) => { | ||
diag.span_note(span, fluent::ast_passes::not_supported_parentheses); | ||
} | ||
} | ||
} | ||
} | ||
|
||
#[derive(SessionDiagnostic)] | ||
#[diag(ast_passes::forbidden_assoc_constraint)] | ||
pub struct ForbiddenAssocConstraint { | ||
#[primary_span] | ||
pub span: Span, | ||
} | ||
|
||
#[derive(SessionDiagnostic)] | ||
#[diag(ast_passes::keyword_lifetime)] | ||
pub struct KeywordLifetime { | ||
#[primary_span] | ||
pub span: Span, | ||
} | ||
|
||
#[derive(SessionDiagnostic)] | ||
#[diag(ast_passes::invalid_label)] | ||
pub struct InvalidLabel { | ||
#[primary_span] | ||
pub span: Span, | ||
pub name: Symbol, | ||
} | ||
|
||
#[derive(SessionDiagnostic)] | ||
#[diag(ast_passes::invalid_visibility, code = "E0449")] | ||
pub struct InvalidVisibility { | ||
#[primary_span] | ||
pub span: Span, | ||
#[label(ast_passes::implied)] | ||
pub implied: Option<Span>, | ||
#[subdiagnostic] | ||
pub note: Option<InvalidVisibilityNote>, | ||
} | ||
|
||
#[derive(SessionSubdiagnostic)] | ||
pub enum InvalidVisibilityNote { | ||
#[note(ast_passes::individual_impl_items)] | ||
IndividualImplItems, | ||
#[note(ast_passes::individual_foreign_items)] | ||
IndividualForeignItems, | ||
} | ||
|
||
#[derive(SessionDiagnostic)] | ||
#[diag(ast_passes::trait_fn_async, code = "E0706")] | ||
#[note] | ||
#[note(ast_passes::note2)] | ||
pub struct TraitFnAsync { | ||
#[primary_span] | ||
pub fn_span: Span, | ||
#[label] | ||
pub span: Span, | ||
} | ||
|
||
#[derive(SessionDiagnostic)] | ||
#[diag(ast_passes::trait_fn_const, code = "E0379")] | ||
pub struct TraitFnConst { | ||
#[primary_span] | ||
#[label] | ||
pub span: Span, | ||
} | ||
|
||
#[derive(SessionDiagnostic)] | ||
#[diag(ast_passes::forbidden_lifetime_bound)] | ||
pub struct ForbiddenLifetimeBound { | ||
#[primary_span] | ||
pub spans: Vec<Span>, | ||
} | ||
|
||
#[derive(SessionDiagnostic)] | ||
#[diag(ast_passes::forbidden_non_lifetime_param)] | ||
pub struct ForbiddenNonLifetimeParam { | ||
#[primary_span] | ||
pub spans: Vec<Span>, | ||
} | ||
|
||
#[derive(SessionDiagnostic)] | ||
#[diag(ast_passes::fn_param_too_many)] | ||
pub struct FnParamTooMany { | ||
#[primary_span] | ||
pub span: Span, | ||
pub max_num_args: usize, | ||
} | ||
|
||
#[derive(SessionDiagnostic)] | ||
#[diag(ast_passes::fn_param_c_var_args_only)] | ||
pub struct FnParamCVarArgsOnly { | ||
#[primary_span] | ||
pub span: Span, | ||
} | ||
|
||
#[derive(SessionDiagnostic)] | ||
#[diag(ast_passes::fn_param_c_var_args_not_last)] | ||
pub struct FnParamCVarArgsNotLast { | ||
#[primary_span] | ||
pub span: Span, | ||
} | ||
|
||
#[derive(SessionDiagnostic)] | ||
#[diag(ast_passes::fn_param_doc_comment)] | ||
pub struct FnParamDocComment { | ||
#[primary_span] | ||
#[label] | ||
pub span: Span, | ||
} | ||
|
||
#[derive(SessionDiagnostic)] | ||
#[diag(ast_passes::fn_param_forbidden_attr)] | ||
pub struct FnParamForbiddenAttr { | ||
#[primary_span] | ||
pub span: Span, | ||
} | ||
|
||
#[derive(SessionDiagnostic)] | ||
#[diag(ast_passes::fn_param_forbidden_self)] | ||
#[note] | ||
pub struct FnParamForbiddenSelf { | ||
#[primary_span] | ||
#[label] | ||
pub span: Span, | ||
} | ||
|
||
#[derive(SessionDiagnostic)] | ||
#[diag(ast_passes::forbidden_default)] | ||
pub struct ForbiddenDefault { | ||
#[primary_span] | ||
pub span: Span, | ||
#[label] | ||
pub def_span: Span, | ||
} | ||
|
||
#[derive(SessionDiagnostic)] | ||
#[diag(ast_passes::assoc_const_without_body)] | ||
pub struct AssocConstWithoutBody { | ||
#[primary_span] | ||
pub span: Span, | ||
#[suggestion(code = " = <expr>;", applicability = "has-placeholders")] | ||
pub replace_span: Span, | ||
} | ||
|
||
#[derive(SessionDiagnostic)] | ||
#[diag(ast_passes::assoc_fn_without_body)] | ||
pub struct AssocFnWithoutBody { | ||
#[primary_span] | ||
pub span: Span, | ||
#[suggestion(code = " {{ <body> }}", applicability = "has-placeholders")] | ||
pub replace_span: Span, | ||
} | ||
|
||
#[derive(SessionDiagnostic)] | ||
#[diag(ast_passes::assoc_type_without_body)] | ||
pub struct AssocTypeWithoutBody { | ||
#[primary_span] | ||
pub span: Span, | ||
#[suggestion(code = " = <type>;", applicability = "has-placeholders")] | ||
pub replace_span: Span, | ||
} | ||
|
||
#[derive(SessionDiagnostic)] | ||
#[diag(ast_passes::const_without_body)] | ||
pub struct ConstWithoutBody { | ||
#[primary_span] | ||
pub span: Span, | ||
#[suggestion(code = " = <expr>;", applicability = "has-placeholders")] | ||
pub replace_span: Span, | ||
} | ||
|
||
#[derive(SessionDiagnostic)] | ||
#[diag(ast_passes::static_without_body)] | ||
pub struct StaticWithoutBody { | ||
#[primary_span] | ||
pub span: Span, | ||
#[suggestion(code = " = <expr>;", applicability = "has-placeholders")] | ||
pub replace_span: Span, | ||
} | ||
|
||
#[derive(SessionDiagnostic)] | ||
#[diag(ast_passes::ty_alias_without_body)] | ||
pub struct TyAliasWithoutBody { | ||
#[primary_span] | ||
pub span: Span, | ||
#[suggestion(code = " = <type>;", applicability = "has-placeholders")] | ||
pub replace_span: Span, | ||
} | ||
|
||
#[derive(SessionDiagnostic)] | ||
#[diag(ast_passes::fn_without_body)] | ||
pub struct FnWithoutBody { | ||
#[primary_span] | ||
pub span: Span, | ||
#[suggestion(code = " {{ <body> }}", applicability = "has-placeholders")] | ||
pub replace_span: Span, | ||
#[subdiagnostic] | ||
pub extern_block_suggestion: Option<ExternBlockSuggestion>, | ||
} | ||
|
||
pub struct ExternBlockSuggestion { | ||
pub start_span: Span, | ||
pub end_span: Span, | ||
pub abi: Option<Symbol>, | ||
} | ||
|
||
impl AddSubdiagnostic for ExternBlockSuggestion { | ||
fn add_to_diagnostic(self, diag: &mut Diagnostic) { | ||
let start_suggestion = if let Some(abi) = self.abi { | ||
format!("extern \"{}\" {{", abi) | ||
} else { | ||
"extern {".to_owned() | ||
}; | ||
let end_suggestion = " }".to_owned(); | ||
|
||
diag.multipart_suggestion( | ||
fluent::ast_passes::extern_block_suggestion, | ||
vec![(self.start_span, start_suggestion), (self.end_span, end_suggestion)], | ||
Applicability::MaybeIncorrect, | ||
); | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
93 changes: 93 additions & 0 deletions
93
compiler/rustc_error_messages/locales/en-US/ast_passes.ftl
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,93 @@ | ||
ast_passes_forbidden_let = | ||
`let` expressions are not supported here | ||
.note = only supported directly in conditions of `if` and `while` expressions | ||
.not_supported_or = `||` operators are not supported in let chain expressions | ||
.not_supported_parentheses = `let`s wrapped in parentheses are not supported in a context with let chains | ||
ast_passes_deprecated_where_clause_location = | ||
where clause not allowed here | ||
ast_passes_forbidden_assoc_constraint = | ||
associated type bounds are not allowed within structs, enums, or unions | ||
ast_passes_keyword_lifetime = | ||
lifetimes cannot use keyword names | ||
ast_passes_invalid_label = | ||
invalid label name `{$name}` | ||
ast_passes_invalid_visibility = | ||
unnecessary visibility qualifier | ||
.implied = `pub` not permitted here because it's implied | ||
.individual_impl_items = place qualifiers on individual impl items instead | ||
.individual_foreign_items = place qualifiers on individual foreign items instead | ||
ast_passes_trait_fn_async = | ||
functions in traits cannot be declared `async` | ||
.label = `async` because of this | ||
.note = `async` trait functions are not currently supported | ||
.note2 = consider using the `async-trait` crate: https://crates.io/crates/async-trait | ||
ast_passes_trait_fn_const = | ||
functions in traits cannot be declared const | ||
.label = functions in traits cannot be const | ||
ast_passes_forbidden_lifetime_bound = | ||
lifetime bounds cannot be used in this context | ||
ast_passes_forbidden_non_lifetime_param = | ||
only lifetime parameters can be used in this context | ||
ast_passes_fn_param_too_many = | ||
function can not have more than {$max_num_args} arguments | ||
ast_passes_fn_param_c_var_args_only = | ||
C-variadic function must be declared with at least one named argument | ||
ast_passes_fn_param_c_var_args_not_last = | ||
`...` must be the last argument of a C-variadic function | ||
ast_passes_fn_param_doc_comment = | ||
documentation comments cannot be applied to function parameters | ||
.label = doc comments are not allowed here | ||
ast_passes_fn_param_forbidden_attr = | ||
allow, cfg, cfg_attr, deny, expect, forbid, and warn are the only allowed built-in attributes in function parameters | ||
ast_passes_fn_param_forbidden_self = | ||
`self` parameter is only allowed in associated functions | ||
.label = not semantically valid as function parameter | ||
.note = associated functions are those in `impl` or `trait` definitions | ||
ast_passes_forbidden_default = | ||
`default` is only allowed on items in trait impls | ||
.label = `default` because of this | ||
ast_passes_assoc_const_without_body = | ||
associated constant in `impl` without body | ||
.suggestion = provide a definition for the constant | ||
ast_passes_assoc_fn_without_body = | ||
associated function in `impl` without body | ||
.suggestion = provide a definition for the function | ||
ast_passes_assoc_type_without_body = | ||
associated type in `impl` without body | ||
.suggestion = provide a definition for the type | ||
ast_passes_const_without_body = | ||
free constant item without body | ||
.suggestion = provide a definition for the constant | ||
ast_passes_static_without_body = | ||
free static item without body | ||
.suggestion = provide a definition for the static | ||
ast_passes_ty_alias_without_body = | ||
free type alias without body | ||
.suggestion = provide a definition for the type | ||
ast_passes_fn_without_body = | ||
free function without a body | ||
.suggestion = provide a definition for the function | ||
.extern_block_suggestion = if you meant to declare an externally defined function, use an `extern` block |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.