ADD - create and emit Bug support for Diagnostics
UPDATE - migrate constant span_bug to translatable diagnostic.
This commit is contained in:
parent
d1030fab22
commit
27744460e2
@ -585,6 +585,13 @@ pub struct ErroneousConstant {
|
|||||||
pub span: Span,
|
pub span: Span,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[derive(Diagnostic)]
|
||||||
|
#[diag(codegen_ssa_polymorphic_constant_too_generic)]
|
||||||
|
pub struct PolymorphicConstantTooGeneric {
|
||||||
|
#[primary_span]
|
||||||
|
pub span: Span,
|
||||||
|
}
|
||||||
|
|
||||||
#[derive(Diagnostic)]
|
#[derive(Diagnostic)]
|
||||||
#[diag(codegen_ssa_shuffle_indices_evaluation)]
|
#[diag(codegen_ssa_shuffle_indices_evaluation)]
|
||||||
pub struct ShuffleIndicesEvaluation {
|
pub struct ShuffleIndicesEvaluation {
|
||||||
|
@ -48,7 +48,11 @@ impl<'a, 'tcx, Bx: BuilderMethods<'a, 'tcx>> FunctionCx<'a, 'tcx, Bx> {
|
|||||||
self.cx.tcx().sess.emit_err(errors::ErroneousConstant { span: constant.span });
|
self.cx.tcx().sess.emit_err(errors::ErroneousConstant { span: constant.span });
|
||||||
}
|
}
|
||||||
ErrorHandled::TooGeneric => {
|
ErrorHandled::TooGeneric => {
|
||||||
span_bug!(constant.span, "codegen encountered polymorphic constant: {:?}", err);
|
self.cx
|
||||||
|
.tcx()
|
||||||
|
.sess
|
||||||
|
.diagnostic()
|
||||||
|
.emit_bug(errors::PolymorphicConstantTooGeneric { span: constant.span });
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
err
|
err
|
||||||
|
@ -225,3 +225,5 @@ codegen_ssa_invalid_monomorphization_floating_point_vector = invalid monomorphiz
|
|||||||
codegen_ssa_invalid_monomorphization_floating_point_type = invalid monomorphization of `{$name}` intrinsic: `{$in_ty}` is not a floating-point type
|
codegen_ssa_invalid_monomorphization_floating_point_type = invalid monomorphization of `{$name}` intrinsic: `{$in_ty}` is not a floating-point type
|
||||||
|
|
||||||
codegen_ssa_invalid_monomorphization_unrecognized_intrinsic = invalid monomorphization of `{$name}` intrinsic: unrecognized intrinsic `{$name}`
|
codegen_ssa_invalid_monomorphization_unrecognized_intrinsic = invalid monomorphization of `{$name}` intrinsic: unrecognized intrinsic `{$name}`
|
||||||
|
|
||||||
|
codegen_ssa_polymorphic_constant_too_generic = codegen encountered polymorphic constant: TooGeneric
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
use crate::diagnostic::IntoDiagnosticArg;
|
use crate::diagnostic::IntoDiagnosticArg;
|
||||||
use crate::{
|
use crate::{
|
||||||
Diagnostic, DiagnosticId, DiagnosticMessage, DiagnosticStyledString, ErrorGuaranteed,
|
Diagnostic, DiagnosticId, DiagnosticMessage, DiagnosticStyledString, ErrorGuaranteed,
|
||||||
SubdiagnosticMessage,
|
ExplicitBug, SubdiagnosticMessage,
|
||||||
};
|
};
|
||||||
use crate::{Handler, Level, MultiSpan, StashKey};
|
use crate::{Handler, Level, MultiSpan, StashKey};
|
||||||
use rustc_lint_defs::Applicability;
|
use rustc_lint_defs::Applicability;
|
||||||
@ -12,6 +12,7 @@ use std::borrow::Cow;
|
|||||||
use std::fmt::{self, Debug};
|
use std::fmt::{self, Debug};
|
||||||
use std::marker::PhantomData;
|
use std::marker::PhantomData;
|
||||||
use std::ops::{Deref, DerefMut};
|
use std::ops::{Deref, DerefMut};
|
||||||
|
use std::panic;
|
||||||
use std::thread::panicking;
|
use std::thread::panicking;
|
||||||
|
|
||||||
/// Trait implemented by error types. This should not be implemented manually. Instead, use
|
/// Trait implemented by error types. This should not be implemented manually. Instead, use
|
||||||
@ -308,6 +309,58 @@ impl EmissionGuarantee for Noted {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Marker type which enables implementation of `create_bug` and `emit_bug` functions for
|
||||||
|
/// bug struct diagnostics.
|
||||||
|
#[derive(Copy, Clone)]
|
||||||
|
pub struct Bug;
|
||||||
|
|
||||||
|
impl<'a> DiagnosticBuilder<'a, Bug> {
|
||||||
|
/// Convenience function for internal use, clients should use one of the
|
||||||
|
/// `struct_*` methods on [`Handler`].
|
||||||
|
#[track_caller]
|
||||||
|
pub(crate) fn new_bug(handler: &'a Handler, message: impl Into<DiagnosticMessage>) -> Self {
|
||||||
|
let diagnostic = Diagnostic::new_with_code(Level::Bug, None, message);
|
||||||
|
Self::new_diagnostic_bug(handler, diagnostic)
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Creates a new `DiagnosticBuilder` with an already constructed
|
||||||
|
/// diagnostic.
|
||||||
|
pub(crate) fn new_diagnostic_bug(handler: &'a Handler, diagnostic: Diagnostic) -> Self {
|
||||||
|
debug!("Created new diagnostic bug");
|
||||||
|
Self {
|
||||||
|
inner: DiagnosticBuilderInner {
|
||||||
|
state: DiagnosticBuilderState::Emittable(handler),
|
||||||
|
diagnostic: Box::new(diagnostic),
|
||||||
|
},
|
||||||
|
_marker: PhantomData,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl EmissionGuarantee for Bug {
|
||||||
|
fn diagnostic_builder_emit_producing_guarantee(db: &mut DiagnosticBuilder<'_, Self>) -> Self {
|
||||||
|
match db.inner.state {
|
||||||
|
// First `.emit()` call, the `&Handler` is still available.
|
||||||
|
DiagnosticBuilderState::Emittable(handler) => {
|
||||||
|
db.inner.state = DiagnosticBuilderState::AlreadyEmittedOrDuringCancellation;
|
||||||
|
|
||||||
|
handler.emit_diagnostic(&mut db.inner.diagnostic);
|
||||||
|
}
|
||||||
|
// `.emit()` was previously called, disallowed from repeating it.
|
||||||
|
DiagnosticBuilderState::AlreadyEmittedOrDuringCancellation => {}
|
||||||
|
}
|
||||||
|
// Then panic. No need to return the marker type.
|
||||||
|
panic::panic_any(ExplicitBug);
|
||||||
|
}
|
||||||
|
|
||||||
|
fn make_diagnostic_builder(
|
||||||
|
handler: &Handler,
|
||||||
|
msg: impl Into<DiagnosticMessage>,
|
||||||
|
) -> DiagnosticBuilder<'_, Self> {
|
||||||
|
DiagnosticBuilder::new_bug(handler, msg)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
impl<'a> DiagnosticBuilder<'a, !> {
|
impl<'a> DiagnosticBuilder<'a, !> {
|
||||||
/// Convenience function for internal use, clients should use one of the
|
/// Convenience function for internal use, clients should use one of the
|
||||||
/// `struct_*` methods on [`Handler`].
|
/// `struct_*` methods on [`Handler`].
|
||||||
|
@ -1127,6 +1127,20 @@ impl Handler {
|
|||||||
self.create_fatal(fatal).emit()
|
self.create_fatal(fatal).emit()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn create_bug<'a>(
|
||||||
|
&'a self,
|
||||||
|
bug: impl IntoDiagnostic<'a, diagnostic_builder::Bug>,
|
||||||
|
) -> DiagnosticBuilder<'a, diagnostic_builder::Bug> {
|
||||||
|
bug.into_diagnostic(self)
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn emit_bug<'a>(
|
||||||
|
&'a self,
|
||||||
|
bug: impl IntoDiagnostic<'a, diagnostic_builder::Bug>,
|
||||||
|
) -> diagnostic_builder::Bug {
|
||||||
|
self.create_bug(bug).emit()
|
||||||
|
}
|
||||||
|
|
||||||
fn emit_diag_at_span(
|
fn emit_diag_at_span(
|
||||||
&self,
|
&self,
|
||||||
mut diag: Diagnostic,
|
mut diag: Diagnostic,
|
||||||
|
Loading…
x
Reference in New Issue
Block a user