| use std::path::Path; | |
| use std::{fmt, io}; | |
| use rustc_errors::codes::*; | |
| use rustc_errors::{DiagArgName, DiagArgValue, DiagMessage}; | |
| use rustc_macros::{Diagnostic, Subdiagnostic}; | |
| use rustc_span::{Span, Symbol}; | |
| use crate::ty::{Instance, Ty}; | |
| #[derive(Diagnostic)] | |
| #[diag("overflow while adding drop-check rules for `{$ty}`", code = E0320)] | |
| #[note("overflowed on `{$overflow_ty}`")] | |
| pub(crate) struct DropCheckOverflow<'tcx> { | |
| #[primary_span] | |
| pub span: Span, | |
| pub ty: Ty<'tcx>, | |
| pub overflow_ty: Ty<'tcx>, | |
| } | |
| #[derive(Diagnostic)] | |
| #[diag("failed to write file {$path}: {$error}\"")] | |
| pub(crate) struct FailedWritingFile<'a> { | |
| pub path: &'a Path, | |
| pub error: io::Error, | |
| } | |
| #[derive(Diagnostic)] | |
| #[diag("concrete type differs from previous defining opaque type use")] | |
| pub(crate) struct OpaqueHiddenTypeMismatch<'tcx> { | |
| pub self_ty: Ty<'tcx>, | |
| pub other_ty: Ty<'tcx>, | |
| #[primary_span] | |
| #[label("expected `{$self_ty}`, got `{$other_ty}`")] | |
| pub other_span: Span, | |
| #[subdiagnostic] | |
| pub sub: TypeMismatchReason, | |
| } | |
| #[derive(Diagnostic)] | |
| #[diag("we don't support unions yet: '{$ty_name}'")] | |
| pub struct UnsupportedUnion { | |
| pub ty_name: String, | |
| } | |
| // FIXME(autodiff): I should get used somewhere | |
| #[derive(Diagnostic)] | |
| #[diag("reading from a `Duplicated` const {$ty} is unsafe")] | |
| pub struct AutodiffUnsafeInnerConstRef<'tcx> { | |
| #[primary_span] | |
| pub span: Span, | |
| pub ty: Ty<'tcx>, | |
| } | |
| #[derive(Subdiagnostic)] | |
| pub enum TypeMismatchReason { | |
| #[label("this expression supplies two conflicting concrete types for the same opaque type")] | |
| ConflictType { | |
| #[primary_span] | |
| span: Span, | |
| }, | |
| #[note("previous use here")] | |
| PreviousUse { | |
| #[primary_span] | |
| span: Span, | |
| }, | |
| } | |
| #[derive(Diagnostic)] | |
| #[diag("reached the recursion limit finding the struct tail for `{$ty}`")] | |
| #[help( | |
| "consider increasing the recursion limit by adding a `#![recursion_limit = \"{$suggested_limit}\"]`" | |
| )] | |
| pub(crate) struct RecursionLimitReached<'tcx> { | |
| #[primary_span] | |
| pub span: Span, | |
| pub ty: Ty<'tcx>, | |
| pub suggested_limit: rustc_hir::limit::Limit, | |
| } | |
| #[derive(Diagnostic)] | |
| #[diag("constant evaluation of enum discriminant resulted in non-integer")] | |
| pub(crate) struct ConstEvalNonIntError { | |
| #[primary_span] | |
| pub span: Span, | |
| } | |
| #[derive(Diagnostic)] | |
| #[diag( | |
| "to use `strict_coherence` on this trait, the `with_negative_coherence` feature must be enabled" | |
| )] | |
| pub(crate) struct StrictCoherenceNeedsNegativeCoherence { | |
| #[primary_span] | |
| pub span: Span, | |
| #[label("due to this attribute")] | |
| pub attr_span: Span, | |
| } | |
| #[derive(Diagnostic)] | |
| #[diag("requires `{$name}` lang_item")] | |
| pub(crate) struct RequiresLangItem { | |
| #[primary_span] | |
| pub span: Span, | |
| pub name: Symbol, | |
| } | |
| #[derive(Diagnostic)] | |
| #[diag( | |
| "const parameter `{$ct}` is part of concrete type but not used in parameter list for the `impl Trait` type alias" | |
| )] | |
| pub(super) struct ConstNotUsedTraitAlias { | |
| pub ct: String, | |
| #[primary_span] | |
| pub span: Span, | |
| } | |
| pub struct CustomSubdiagnostic<'a> { | |
| pub msg: fn() -> DiagMessage, | |
| pub add_args: Box<dyn FnOnce(&mut dyn FnMut(DiagArgName, DiagArgValue)) + 'a>, | |
| } | |
| impl<'a> CustomSubdiagnostic<'a> { | |
| pub fn label(x: fn() -> DiagMessage) -> Self { | |
| Self::label_and_then(x, |_| {}) | |
| } | |
| pub fn label_and_then<F: FnOnce(&mut dyn FnMut(DiagArgName, DiagArgValue)) + 'a>( | |
| msg: fn() -> DiagMessage, | |
| f: F, | |
| ) -> Self { | |
| Self { msg, add_args: Box::new(move |x| f(x)) } | |
| } | |
| } | |
| impl fmt::Debug for CustomSubdiagnostic<'_> { | |
| fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { | |
| f.debug_struct("CustomSubdiagnostic").finish_non_exhaustive() | |
| } | |
| } | |
| #[derive(Diagnostic)] | |
| pub enum LayoutError<'tcx> { | |
| #[diag("the type `{$ty}` has an unknown layout")] | |
| Unknown { ty: Ty<'tcx> }, | |
| #[diag("the type `{$ty}` does not have a fixed layout")] | |
| TooGeneric { ty: Ty<'tcx> }, | |
| #[diag("values of the type `{$ty}` are too big for the target architecture")] | |
| Overflow { ty: Ty<'tcx> }, | |
| #[diag("the SIMD type `{$ty}` has more elements than the limit {$max_lanes}")] | |
| SimdTooManyLanes { ty: Ty<'tcx>, max_lanes: u64 }, | |
| #[diag("the SIMD type `{$ty}` has zero elements")] | |
| SimdZeroLength { ty: Ty<'tcx> }, | |
| #[diag("unable to determine layout for `{$ty}` because `{$failure_ty}` cannot be normalized")] | |
| NormalizationFailure { ty: Ty<'tcx>, failure_ty: String }, | |
| #[diag("a cycle occurred during layout computation")] | |
| Cycle, | |
| #[diag("the type has an unknown layout")] | |
| ReferencesError, | |
| } | |
| #[derive(Diagnostic)] | |
| #[diag("erroneous constant encountered")] | |
| pub(crate) struct ErroneousConstant { | |
| #[primary_span] | |
| pub span: Span, | |
| } | |
| #[derive(Diagnostic)] | |
| #[diag("reached the type-length limit while instantiating `{$instance}`")] | |
| #[help("consider adding a `#![type_length_limit=\"{$type_length}\"]` attribute to your crate")] | |
| pub(crate) struct TypeLengthLimit<'tcx> { | |
| #[primary_span] | |
| pub span: Span, | |
| pub instance: Instance<'tcx>, | |
| pub type_length: usize, | |
| } | |
| #[derive(Diagnostic)] | |
| #[diag("maximum number of nodes exceeded in constant {$global_const_id}")] | |
| pub(crate) struct MaxNumNodesInValtree { | |
| #[primary_span] | |
| pub span: Span, | |
| pub global_const_id: String, | |
| } | |
| #[derive(Diagnostic)] | |
| #[diag("constant {$global_const_id} cannot be used as pattern")] | |
| #[note("constants that reference mutable or external memory cannot be used as patterns")] | |
| pub(crate) struct InvalidConstInValtree { | |
| #[primary_span] | |
| pub span: Span, | |
| pub global_const_id: String, | |
| } | |
| #[derive(Diagnostic)] | |
| #[diag("internal compiler error: reentrant incremental verify failure, suppressing message")] | |
| pub(crate) struct Reentrant; | |
| #[derive(Diagnostic)] | |
| #[diag("internal compiler error: encountered incremental compilation error with {$dep_node}")] | |
| #[note("please follow the instructions below to create a bug report with the provided information")] | |
| #[note("for incremental compilation bugs, having a reproduction is vital")] | |
| #[note( | |
| "an ideal reproduction consists of the code before and some patch that then triggers the bug when applied and compiled again" | |
| )] | |
| #[note("as a workaround, you can run {$run_cmd} to allow your project to compile")] | |
| pub(crate) struct IncrementCompilation { | |
| pub run_cmd: String, | |
| pub dep_node: String, | |
| } |