session: use derive more
Signed-off-by: David Wood <david.wood@huawei.com>
This commit is contained in:
parent
21d3bbd8b6
commit
f8b628bce4
3 changed files with 46 additions and 32 deletions
|
@ -1,9 +1,7 @@
|
|||
use std::num::NonZeroU32;
|
||||
|
||||
use crate::cgu_reuse_tracker::CguReuse;
|
||||
use rustc_errors::{
|
||||
fluent, DiagnosticBuilder, ErrorGuaranteed, Handler, IntoDiagnostic, MultiSpan,
|
||||
};
|
||||
use rustc_errors::MultiSpan;
|
||||
use rustc_macros::Diagnostic;
|
||||
use rustc_span::{Span, Symbol};
|
||||
use rustc_target::spec::{SplitDebuginfo, StackProtector, TargetTriple};
|
||||
|
@ -148,24 +146,15 @@ pub struct CrateNameEmpty {
|
|||
pub span: Option<Span>,
|
||||
}
|
||||
|
||||
#[derive(Diagnostic)]
|
||||
#[diag(session::invalid_character_in_create_name)]
|
||||
pub struct InvalidCharacterInCrateName<'a> {
|
||||
#[primary_span]
|
||||
pub span: Option<Span>,
|
||||
pub character: char,
|
||||
pub crate_name: &'a str,
|
||||
}
|
||||
|
||||
impl IntoDiagnostic<'_> for InvalidCharacterInCrateName<'_> {
|
||||
fn into_diagnostic(self, sess: &Handler) -> DiagnosticBuilder<'_, ErrorGuaranteed> {
|
||||
let mut diag = sess.struct_err(fluent::session::invalid_character_in_create_name);
|
||||
if let Some(sp) = self.span {
|
||||
diag.set_span(sp);
|
||||
}
|
||||
diag.set_arg("character", self.character);
|
||||
diag.set_arg("crate_name", self.crate_name);
|
||||
diag
|
||||
}
|
||||
}
|
||||
|
||||
#[derive(Subdiagnostic)]
|
||||
#[multipart_suggestion(session::expr_parentheses_needed, applicability = "machine-applicable")]
|
||||
pub struct ExprParenthesesNeeded {
|
||||
|
@ -180,3 +169,25 @@ impl ExprParenthesesNeeded {
|
|||
ExprParenthesesNeeded { left: s.shrink_to_lo(), right: s.shrink_to_hi() }
|
||||
}
|
||||
}
|
||||
|
||||
#[derive(Diagnostic)]
|
||||
#[diag(session::skipping_const_checks)]
|
||||
pub struct SkippingConstChecks {
|
||||
#[subdiagnostic(eager)]
|
||||
pub unleashed_features: Vec<UnleashedFeatureHelp>,
|
||||
}
|
||||
|
||||
#[derive(Subdiagnostic)]
|
||||
pub enum UnleashedFeatureHelp {
|
||||
#[help(session::unleashed_feature_help_named)]
|
||||
Named {
|
||||
#[primary_span]
|
||||
span: Span,
|
||||
gate: Symbol,
|
||||
},
|
||||
#[help(session::unleashed_feature_help_unnamed)]
|
||||
Unnamed {
|
||||
#[primary_span]
|
||||
span: Span,
|
||||
},
|
||||
}
|
||||
|
|
|
@ -5,9 +5,10 @@ use crate::config::{self, CrateType, InstrumentCoverage, OptLevel, OutputType, S
|
|||
use crate::errors::{
|
||||
CannotEnableCrtStaticLinux, CannotMixAndMatchSanitizers, LinkerPluginToWindowsNotSupported,
|
||||
NotCircumventFeature, ProfileSampleUseFileDoesNotExist, ProfileUseFileDoesNotExist,
|
||||
SanitizerCfiEnabled, SanitizerNotSupported, SanitizersNotSupported,
|
||||
SanitizerCfiEnabled, SanitizerNotSupported, SanitizersNotSupported, SkippingConstChecks,
|
||||
SplitDebugInfoUnstablePlatform, StackProtectorNotSupportedForTarget,
|
||||
TargetRequiresUnwindTables, UnstableVirtualFunctionElimination, UnsupportedDwarfVersion,
|
||||
TargetRequiresUnwindTables, UnleashedFeatureHelp, UnstableVirtualFunctionElimination,
|
||||
UnsupportedDwarfVersion,
|
||||
};
|
||||
use crate::parse::{add_feature_diagnostics, ParseSess};
|
||||
use crate::search_paths::{PathKind, SearchPath};
|
||||
|
@ -233,21 +234,19 @@ impl Session {
|
|||
if !unleashed_features.is_empty() {
|
||||
let mut must_err = false;
|
||||
// Create a diagnostic pointing at where things got unleashed.
|
||||
// FIXME(#100717): needs eager translation/lists
|
||||
#[allow(rustc::untranslatable_diagnostic)]
|
||||
#[allow(rustc::diagnostic_outside_of_impl)]
|
||||
let mut diag = self.struct_warn("skipping const checks");
|
||||
for &(span, feature_gate) in unleashed_features.iter() {
|
||||
// FIXME: `span_label` doesn't do anything, so we use "help" as a hack.
|
||||
if let Some(gate) = feature_gate {
|
||||
diag.span_help(span, &format!("skipping check for `{gate}` feature"));
|
||||
// The unleash flag must *not* be used to just "hack around" feature gates.
|
||||
must_err = true;
|
||||
} else {
|
||||
diag.span_help(span, "skipping check that does not even have a feature gate");
|
||||
}
|
||||
}
|
||||
diag.emit();
|
||||
self.emit_warning(SkippingConstChecks {
|
||||
unleashed_features: unleashed_features
|
||||
.iter()
|
||||
.map(|(span, gate)| {
|
||||
gate.map(|gate| {
|
||||
must_err = true;
|
||||
UnleashedFeatureHelp::Named { span: *span, gate }
|
||||
})
|
||||
.unwrap_or(UnleashedFeatureHelp::Unnamed { span: *span })
|
||||
})
|
||||
.collect(),
|
||||
});
|
||||
|
||||
// If we should err, make sure we did.
|
||||
if must_err && self.has_errors().is_none() {
|
||||
// We have skipped a feature gate, and not run into other errors... reject.
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue