ghc-9.14.1: GHC/Types/Error/Codes.hs
{-# LANGUAGE AllowAmbiguousTypes #-}
{-# LANGUAGE ConstraintKinds #-}
{-# LANGUAGE DataKinds #-}
{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE MagicHash #-}
{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE PolyKinds #-}
{-# LANGUAGE StandaloneKindSignatures #-}
{-# LANGUAGE TypeApplications #-}
{-# LANGUAGE TypeFamilyDependencies #-}
{-# LANGUAGE UndecidableInstances #-}
-- | Defines diagnostic codes for the diagnostics emitted by GHC.
--
-- A diagnostic code is a numeric unique identifier for a diagnostic.
-- See Note [Diagnostic codes].
module GHC.Types.Error.Codes
( -- * General diagnostic code infrastructure
DiagnosticCodeNameSpace(NameSpaceTag, DiagnosticCodeFor, ConRecursIntoFor)
, Outdated
, constructorCode, constructorCodes
-- * GHC diagnostic codes
, GHC, GhcDiagnosticCode, ConRecursInto
)
where
import GHC.Prelude
import GHC.Core.InstEnv ( LookupInstanceErrReason )
import GHC.Hs.Extension ( GhcRn )
import GHC.Types.Error ( DiagnosticCode(..), UnknownDiagnostic (..)
, diagnosticCode, UnknownDiagnosticFor )
import GHC.Iface.Errors.Types
import GHC.Driver.Errors.Types ( DriverMessage )
import GHC.Parser.Errors.Types ( PsMessage, PsHeaderMessage )
import GHC.HsToCore.Errors.Types ( DsMessage, UselessSpecialisePragmaReason )
import GHC.Tc.Errors.Types
import GHC.Unit.Module.Warnings ( WarningTxt )
import GHC.Utils.Panic.Plain
-- Import all the structured error data types
import GHC.Driver.Errors.Types ( GhcMessage )
import Data.Kind ( Type, Constraint )
import GHC.Exts ( proxy# )
import GHC.Generics
import GHC.TypeLits ( Symbol, KnownSymbol, symbolVal'
, TypeError, ErrorMessage(..) )
import GHC.TypeNats ( Nat, KnownNat, natVal' )
import Data.Map.Strict ( Map )
import qualified Data.Map.Strict as Map
{- Note [Diagnostic codes]
~~~~~~~~~~~~~~~~~~~~~~~~~~
Every time a new diagnostic (error or warning) is introduced to GHC,
it is assigned a new numeric code, which has never been used before.
To ensure uniqueness across GHC versions, we proceed as follows:
- all diagnostic codes are defined in a single module, GHC.Types.Error.Codes.
- uniqueness of diagnostic codes is ensured by the use of an injective type family,
GhcDiagnosticCode,
- a diagnostic code never gets deleted from the GhcDiagnosticCode type family
in GHC.Types.Error.Codes, even if it is no longer used.
Older versions of GHC might still display the code, and we don't want that
old code to get confused with the error code of a different, new, error message.*
Note that this module also provides a 'DiagnosticCodeNameSpace' typeclass which
allows diagnostic codes to be emitted in different namespaces than the GHC
namespace; see Note [Diagnostic code namespaces].
[Instructions for adding a new diagnostic code]
After adding a constructor to a diagnostic datatype, such as PsMessage,
TcRnMessage, DsMessage or DriverMessage, you can add corresponding
diagnostic codes as follows:
a. To give a single diagnostic code to the constructor, simply add a
type family equation to GHC.Error.Codes.GhcDiagnosticCode, e.g.:
GhcDiagnosticCode "MyNewErrorConstructor" = 12345
You can obtain new randomly-generated error codes by using
https://www.random.org/integers/?num=10&min=1&max=99999&col=1&base=10&format=plain
You will get a type error if you try to use an error code that is already
used by another constructor.
b. If you instead require more granular diagnostic codes, add a type family
equation to GHC.Error.Codes.ConRecursInto, specifying which argument
to recur into to obtain an diagnostic code.
For example, the 'TcRnCannotDeriveInstance' constructor is associated
with several diagnostic codes, depending on the value of the argument of
type 'DeriveInstanceErrReason'. This is achieved as follows:
- The equation
ConRecursInto "TcRnCannotDeriveInstance" = 'Just DeriveInstanceErrReason
says to recur into the argument of type 'DeriveInstanceErrReason'
to get a diagnostic code.
- The equations
GhcDiagnosticCode "DerivErrNotWellKinded" = 62016
GhcDiagnosticCode "DerivErrSafeHaskellGenericInst" = 07214
GhcDiagnosticCode "DerivErrDerivingViaWrongKind" = 63174
...
give the diagnostic codes for the various constructors of DeriveInstanceErrReason.
These are added following the procedure in (a).
Never remove a return value from the 'GhcDiagnosticCode' type family!
Outdated error messages must still be tracked to ensure uniqueness
of diagnostic codes across GHC versions. Instead, you should wrap the
return value in the 'Outdated' type synonym. The presence of this type synonym
is used by the 'codes' test to determine which diagnostic codes to check
for testsuite coverage.
-}
{- *********************************************************************
* *
DiagnosticCode infrastructure
* *
********************************************************************* -}
{- Note [Diagnostic code namespaces]
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
The machinery for GHC diagnostic codes described in Note [Diagnostic codes]
works for other namespaces than the GHC namespaces; one example is GHCi-specific
diagnostic codes.
To achieve this, we parametrise all the machinery over a namespace type-level
argument, using the 'DiagnosticCodeNameSpace' class.
To provide diagnostic codes, one needs to supply an instance of this class,
which means supplying the following pieces of information:
- a type that represents the namespace, e.g. `data GHC` can be used to
represent the GHC namespace,
- a type family equation for 'NameSpaceTag', e.g. 'NameSpaceTag GHC = "GHC"',
- a diagnostic code type family, e.g. 'DiagnosticCodeFor GHC con = GhcDiagnosticCode con',
- a type family that specifies how to recur into constructor arguments,
e.g. 'ConRecursIntoFor GHC con = ConRecursInto con'.
This allows any tool that imports the GHC library to re-use the diagnostic
code machinery that GHC uses.
-}
-- | A constraint for a namespace which has its own diagnostic codes.
--
-- See Note [Diagnostic code namespaces].
type DiagnosticCodeNameSpace :: Type -> Constraint
class DiagnosticCodeNameSpace namespace where
-- | The symbolic tag for a namespace.
type NameSpaceTag namespace = (r :: Symbol) | r -> namespace
-- NB: the injectivity annotation ensures uniqueness of namespaces,
-- e.g. it prevents two different namespaces from using the same symbolic tag.
-- | A diagnostic code in a given namespace.
type DiagnosticCodeFor namespace (c :: Symbol) :: Nat
-- | Specify that one should recur into an argument of a constructor
-- in order to obtain a diagnostic code. See Note [Diagnostic codes].
type ConRecursIntoFor namespace (c :: Symbol) :: Maybe Type
-- | Use this type synonym to mark a diagnostic code as outdated.
--
-- The presence of this type synonym is used by the 'codes' test to determine
-- which diagnostic codes to check for testsuite coverage.
type Outdated a = a
-- | This function obtains a diagnostic code by looking up the constructor
-- name using generics, and using the 'DiagnosticCode' type family.
constructorCode :: forall namespace diag
. (Generic diag, GDiagnosticCode namespace (Rep diag))
=> diag -> Maybe DiagnosticCode
constructorCode diag = gdiagnosticCode @namespace (from diag)
-- | This function computes all diagnostic codes that occur inside a given
-- type using generics and the 'DiagnosticCode' type family.
--
-- For example, if @T = MkT1 | MkT2@, @GhcDiagnosticCode \"MkT1\" = 123@ and
-- @GhcDiagnosticCode \"MkT2\" = 456@, then we will get
-- > constructorCodes @GHC @T = fromList [ (DiagnosticCode "GHC" 123, \"MkT1\"), (DiagnosticCode "GHC" 456, \"MkT2\") ]
constructorCodes :: forall namespace diag
. (Generic diag, GDiagnosticCodes namespace '[diag] (Rep diag))
=> Map DiagnosticCode String
constructorCodes = gdiagnosticCodes @namespace @'[diag] @(Rep diag)
-- See Note [diagnosticCodes: don't recur into already-seen types]
-- for the @'[diag] type argument.
{- *********************************************************************
* *
The GhcDiagnosticCode type family
* *
********************************************************************* -}
-- | The GHC namespace for diagnostic codes.
data GHC
instance DiagnosticCodeNameSpace GHC where
type instance NameSpaceTag GHC = "GHC"
type instance DiagnosticCodeFor GHC con = GhcDiagnosticCode con
type instance ConRecursIntoFor GHC con = ConRecursInto con
-- | Type family computing the numeric diagnostic code for a given error message constructor.
--
-- Its injectivity annotation ensures uniqueness of error codes.
--
-- Never remove a return value from this type family! Outdated error messages must still
-- be tracked here to ensure uniqueness of diagnostic codes across GHC versions.
--
-- See Note [Diagnostic codes] in GHC.Types.Error.
type GhcDiagnosticCode :: Symbol -> Nat
type family GhcDiagnosticCode c = n | n -> c where
-- Desugarer diagnostic codes
GhcDiagnosticCode "DsEmptyEnumeration" = 10190
GhcDiagnosticCode "DsIdentitiesFound" = 04214
GhcDiagnosticCode "DsOverflowedLiterals" = 97441
GhcDiagnosticCode "DsRedundantBangPatterns" = 38520
GhcDiagnosticCode "DsOverlappingPatterns" = 53633
GhcDiagnosticCode "DsInaccessibleRhs" = 94210
GhcDiagnosticCode "DsMaxPmCheckModelsReached" = 61505
GhcDiagnosticCode "DsNonExhaustivePatterns" = 62161
GhcDiagnosticCode "DsTopLevelBindsNotAllowed" = 48099
GhcDiagnosticCode "DsOrphanRule" = 58181
GhcDiagnosticCode "DsRuleLhsTooComplicated" = 69441
GhcDiagnosticCode "DsRuleIgnoredDueToConstructor" = 00828
GhcDiagnosticCode "DsRuleBindersNotBound" = 40548
GhcDiagnosticCode "DsLazyPatCantBindVarsOfUnliftedType" = 17879
GhcDiagnosticCode "DsNotYetHandledByTH" = 65904
GhcDiagnosticCode "DsAggregatedViewExpressions" = 19551
GhcDiagnosticCode "DsUnbangedStrictPatterns" = 21030
GhcDiagnosticCode "DsCannotMixPolyAndUnliftedBindings" = 20036
GhcDiagnosticCode "DsWrongDoBind" = 08838
GhcDiagnosticCode "DsUnusedDoBind" = 81995
GhcDiagnosticCode "DsRecBindsNotAllowedForUnliftedTys" = 20185
GhcDiagnosticCode "DsRuleMightInlineFirst" = 95396
GhcDiagnosticCode "DsAnotherRuleMightFireFirst" = 87502
GhcDiagnosticCode "DsIncompleteRecordSelector" = 17335
-- Constructors of 'UselessSpecialisePragmaReason'
GhcDiagnosticCode "UselessSpecialiseForClassMethodSelector" = 93315
GhcDiagnosticCode "UselessSpecialiseForNoInlineFunction" = 38524
GhcDiagnosticCode "UselessSpecialiseNoSpecialisation" = 66582
-- Parser diagnostic codes
GhcDiagnosticCode "PsErrParseLanguagePragma" = 68686
GhcDiagnosticCode "PsErrUnsupportedExt" = 46537
GhcDiagnosticCode "PsErrParseOptionsPragma" = 24342
GhcDiagnosticCode "PsErrUnknownOptionsPragma" = 04924
GhcDiagnosticCode "PsWarnBidirectionalFormatChars" = 03272
GhcDiagnosticCode "PsWarnTab" = 94817
GhcDiagnosticCode "PsWarnTransitionalLayout" = 93617
GhcDiagnosticCode "PsWarnOperatorWhitespaceExtConflict" = 47082
GhcDiagnosticCode "PsWarnOperatorWhitespace" = 40798
GhcDiagnosticCode "PsWarnHaddockInvalidPos" = 94458
GhcDiagnosticCode "PsWarnHaddockIgnoreMulti" = 05641
GhcDiagnosticCode "PsWarnStarBinder" = 21887
GhcDiagnosticCode "PsWarnStarIsType" = 39567
GhcDiagnosticCode "PsWarnUnrecognisedPragma" = 42044
GhcDiagnosticCode "PsWarnMisplacedPragma" = 28007
GhcDiagnosticCode "PsWarnImportPreQualified" = 07924
GhcDiagnosticCode "PsWarnViewPatternSignatures" = 00834
GhcDiagnosticCode "PsErrLexer" = 21231
GhcDiagnosticCode "PsErrCmmLexer" = 75725
GhcDiagnosticCode "PsErrCmmParser" = 09848
GhcDiagnosticCode "PsErrParse" = 58481
GhcDiagnosticCode "PsErrTypeAppWithoutSpace" = 84077
GhcDiagnosticCode "PsErrLazyPatWithoutSpace" = 27207
GhcDiagnosticCode "PsErrBangPatWithoutSpace" = 95644
GhcDiagnosticCode "PsErrInvalidInfixHole" = 45106
GhcDiagnosticCode "PsErrExpectedHyphen" = 44524
GhcDiagnosticCode "PsErrSpaceInSCC" = 76176
GhcDiagnosticCode "PsErrEmptyDoubleQuotes" = 11861
GhcDiagnosticCode "PsErrLambdaCase" = 51179
GhcDiagnosticCode "PsErrEmptyLambda" = 71614
GhcDiagnosticCode "PsErrLinearFunction" = 31574
GhcDiagnosticCode "PsErrMultiWayIf" = 28985
GhcDiagnosticCode "PsErrOverloadedRecordUpdateNotEnabled" = 82135
GhcDiagnosticCode "PsErrNumUnderscores" = 62330
GhcDiagnosticCode "PsErrIllegalBangPattern" = 79767
GhcDiagnosticCode "PsErrOverloadedRecordDotInvalid" = 26832
GhcDiagnosticCode "PsErrIllegalPatSynExport" = 89515
GhcDiagnosticCode "PsErrOverloadedRecordUpdateNoQualifiedFields" = 94863
GhcDiagnosticCode "PsErrExplicitForall" = 25955
GhcDiagnosticCode "PsErrIllegalQualifiedDo" = 40280
GhcDiagnosticCode "PsErrQualifiedDoInCmd" = 54089
GhcDiagnosticCode "PsErrRecordSyntaxInPatSynDecl" = 28021
GhcDiagnosticCode "PsErrEmptyWhereInPatSynDecl" = 13248
GhcDiagnosticCode "PsErrInvalidWhereBindInPatSynDecl" = 24737
GhcDiagnosticCode "PsErrNoSingleWhereBindInPatSynDecl" = 65536
GhcDiagnosticCode "PsErrDeclSpliceNotAtTopLevel" = 08451
GhcDiagnosticCode "PsErrMultipleNamesInStandaloneKindSignature" = 42569
GhcDiagnosticCode "PsErrIllegalExplicitNamespace" = 47007
GhcDiagnosticCode "PsErrUnallowedPragma" = 85314
GhcDiagnosticCode "PsErrImportPostQualified" = 87491
GhcDiagnosticCode "PsErrImportQualifiedTwice" = 05661
GhcDiagnosticCode "PsErrSpliceOrQuoteTwice" = 26105
GhcDiagnosticCode "PsErrIllegalImportBundleForm" = 81284
GhcDiagnosticCode "PsErrInvalidRuleActivationMarker" = 50396
GhcDiagnosticCode "PsErrMissingBlock" = 16849
GhcDiagnosticCode "PsErrUnsupportedBoxedSumExpr" = 09550
GhcDiagnosticCode "PsErrUnsupportedBoxedSumPat" = 16863
GhcDiagnosticCode "PsErrUnexpectedQualifiedConstructor" = 73413
GhcDiagnosticCode "PsErrTupleSectionInPat" = 09646
GhcDiagnosticCode "PsErrOpFewArgs" = 24180
GhcDiagnosticCode "PsErrVarForTyCon" = 18208
GhcDiagnosticCode "PsErrMalformedEntityString" = 26204
GhcDiagnosticCode "PsErrDotsInRecordUpdate" = 70712
GhcDiagnosticCode "PsErrInvalidDataCon" = 46574
GhcDiagnosticCode "PsErrInvalidInfixDataCon" = 30670
GhcDiagnosticCode "PsErrIllegalPromotionQuoteDataCon" = 80236
GhcDiagnosticCode "PsErrUnpackDataCon" = 40845
GhcDiagnosticCode "PsErrUnexpectedKindAppInDataCon" = 83653
GhcDiagnosticCode "PsErrInvalidRecordCon" = 08195
GhcDiagnosticCode "PsErrIllegalUnboxedStringInPat" = 69925
GhcDiagnosticCode "PsErrIllegalUnboxedFloatingLitInPat" = 76595
GhcDiagnosticCode "PsErrDoNotationInPat" = 06446
GhcDiagnosticCode "PsErrIfThenElseInPat" = 45696
GhcDiagnosticCode "PsErrLambdaCaseInPat" = Outdated 07636
GhcDiagnosticCode "PsErrCaseInPat" = 53786
GhcDiagnosticCode "PsErrLetInPat" = 78892
GhcDiagnosticCode "PsErrLambdaInPat" = 00482
GhcDiagnosticCode "PsErrArrowExprInPat" = 04584
GhcDiagnosticCode "PsErrArrowCmdInPat" = 98980
GhcDiagnosticCode "PsErrArrowCmdInExpr" = 66043
GhcDiagnosticCode "PsErrViewPatInExpr" = Outdated 66228
GhcDiagnosticCode "PsErrOrPatInExpr" = 66718
GhcDiagnosticCode "PsErrLambdaCmdInFunAppCmd" = 12178
GhcDiagnosticCode "PsErrCaseCmdInFunAppCmd" = 92971
GhcDiagnosticCode "PsErrLambdaCaseCmdInFunAppCmd" = Outdated 47171
GhcDiagnosticCode "PsErrIfCmdInFunAppCmd" = 97005
GhcDiagnosticCode "PsErrLetCmdInFunAppCmd" = 70526
GhcDiagnosticCode "PsErrDoCmdInFunAppCmd" = 77808
GhcDiagnosticCode "PsErrDoInFunAppExpr" = 52095
GhcDiagnosticCode "PsErrMDoInFunAppExpr" = 67630
GhcDiagnosticCode "PsErrLambdaInFunAppExpr" = 06074
GhcDiagnosticCode "PsErrCaseInFunAppExpr" = 25037
GhcDiagnosticCode "PsErrLambdaCaseInFunAppExpr" = Outdated 77182
GhcDiagnosticCode "PsErrLetInFunAppExpr" = 90355
GhcDiagnosticCode "PsErrIfInFunAppExpr" = 01239
GhcDiagnosticCode "PsErrProcInFunAppExpr" = 04807
GhcDiagnosticCode "PsErrMalformedTyOrClDecl" = 47568
GhcDiagnosticCode "PsErrIllegalWhereInDataDecl" = 36952
GhcDiagnosticCode "PsErrIllegalDataTypeContext" = 87429
GhcDiagnosticCode "PsErrPrimStringInvalidChar" = 43080
GhcDiagnosticCode "PsErrSuffixAT" = 33856
GhcDiagnosticCode "PsErrPrecedenceOutOfRange" = 25078
GhcDiagnosticCode "PsErrSemiColonsInCondExpr" = 75254
GhcDiagnosticCode "PsErrSemiColonsInCondCmd" = 18910
GhcDiagnosticCode "PsErrAtInPatPos" = 08382
GhcDiagnosticCode "PsErrParseErrorOnInput" = 66418
GhcDiagnosticCode "PsErrMalformedDecl" = 85316
GhcDiagnosticCode "PsErrNotADataCon" = 25742
GhcDiagnosticCode "PsErrInferredTypeVarNotAllowed" = 57342
GhcDiagnosticCode "PsErrIllegalTraditionalRecordSyntax" = 65719
GhcDiagnosticCode "PsErrParseErrorInCmd" = 03790
GhcDiagnosticCode "PsErrInPat" = 07626
GhcDiagnosticCode "PsErrIllegalRoleName" = 09009
GhcDiagnosticCode "PsErrInvalidTypeSignature" = 94426
GhcDiagnosticCode "PsErrUnexpectedTypeInDecl" = 77878
GhcDiagnosticCode "PsErrInvalidPackageName" = 21926
GhcDiagnosticCode "PsErrParseRightOpSectionInPat" = 72516
GhcDiagnosticCode "PsErrIllegalGadtRecordMultiplicity" = 37475
GhcDiagnosticCode "PsErrInvalidCApiImport" = 72744
GhcDiagnosticCode "PsErrMultipleConForNewtype" = 05380
GhcDiagnosticCode "PsErrUnicodeCharLooksLike" = 31623
GhcDiagnosticCode "PsErrInvalidPun" = 52943
GhcDiagnosticCode "PsErrIllegalOrPat" = 29847
GhcDiagnosticCode "PsErrTypeSyntaxInPat" = 32181
GhcDiagnosticCode "PsErrSpecExprMultipleTypeAscription" = 62037
GhcDiagnosticCode "PsWarnSpecMultipleTypeAscription" = 73026
GhcDiagnosticCode "PsWarnPatternNamespaceSpecifier" = 68383
-- Driver diagnostic codes
GhcDiagnosticCode "DriverMissingHomeModules" = 32850
GhcDiagnosticCode "DriverUnknownHiddenModules" = 38189
GhcDiagnosticCode "DriverUnknownReexportedModules" = 68286
GhcDiagnosticCode "DriverUnusedPackages" = 42258
GhcDiagnosticCode "DriverUnnecessarySourceImports" = 88907
GhcDiagnosticCode "DriverDuplicatedModuleDeclaration" = 29235
GhcDiagnosticCode "DriverModuleNotFound" = 82272
GhcDiagnosticCode "DriverFileModuleNameMismatch" = 28623
GhcDiagnosticCode "DriverUnexpectedSignature" = 66004
GhcDiagnosticCode "DriverFileNotFound" = 49196
GhcDiagnosticCode "DriverStaticPointersNotSupported" = 77799
GhcDiagnosticCode "DriverBackpackModuleNotFound" = 19971
GhcDiagnosticCode "DriverUserDefinedRuleIgnored" = 56147
GhcDiagnosticCode "DriverMixedSafetyImport" = 70172
GhcDiagnosticCode "DriverCannotLoadInterfaceFile" = 37141
GhcDiagnosticCode "DriverInferredSafeModule" = 58656
GhcDiagnosticCode "DriverMarkedTrustworthyButInferredSafe" = 19244
GhcDiagnosticCode "DriverInferredSafeImport" = 82658
GhcDiagnosticCode "DriverCannotImportUnsafeModule" = 44360
GhcDiagnosticCode "DriverMissingSafeHaskellMode" = 29747
GhcDiagnosticCode "DriverPackageNotTrusted" = 08674
GhcDiagnosticCode "DriverCannotImportFromUntrustedPackage" = 75165
GhcDiagnosticCode "DriverRedirectedNoMain" = 95379
GhcDiagnosticCode "DriverHomePackagesNotClosed" = 03271
GhcDiagnosticCode "DriverInconsistentDynFlags" = 74335
GhcDiagnosticCode "DriverSafeHaskellIgnoredExtension" = 98887
GhcDiagnosticCode "DriverPackageTrustIgnored" = 83552
GhcDiagnosticCode "DriverUnrecognisedFlag" = 93741
GhcDiagnosticCode "DriverDeprecatedFlag" = 53692
GhcDiagnosticCode "DriverModuleGraphCycle" = 92213
GhcDiagnosticCode "DriverInstantiationNodeInDependencyGeneration" = 74284
GhcDiagnosticCode "DriverNoConfiguredLLVMToolchain" = 66599
-- Constraint solver diagnostic codes
GhcDiagnosticCode "BadTelescope" = 97739
GhcDiagnosticCode "UserTypeError" = 64725
GhcDiagnosticCode "UnsatisfiableError" = 22250
GhcDiagnosticCode "ReportHoleError" = 88464
GhcDiagnosticCode "FixedRuntimeRepError" = 55287
GhcDiagnosticCode "ExpectingMoreArguments" = 81325
GhcDiagnosticCode "UnboundImplicitParams" = 91416
GhcDiagnosticCode "AmbiguityPreventsSolvingCt" = 78125
GhcDiagnosticCode "CannotResolveInstance" = 39999
GhcDiagnosticCode "OverlappingInstances" = 43085
GhcDiagnosticCode "UnsafeOverlap" = 36705
GhcDiagnosticCode "MultiplicityCoercionsNotSupported" = 59840
-- Type mismatch errors
GhcDiagnosticCode "BasicMismatch" = 18872
GhcDiagnosticCode "TypeEqMismatch" = 83865
GhcDiagnosticCode "CouldNotDeduce" = 05617
-- Variable unification errors
GhcDiagnosticCode "CannotUnifyWithPolytype" = 91028
GhcDiagnosticCode "OccursCheck" = 27958
GhcDiagnosticCode "SkolemEscape" = 46956
GhcDiagnosticCode "DifferentTyVars" = 25897
GhcDiagnosticCode "RepresentationalEq" = 10283
-- Typechecker/renamer diagnostic codes
GhcDiagnosticCode "TcRnSolverDepthError" = 40404
GhcDiagnosticCode "TcRnRedundantConstraints" = 30606
GhcDiagnosticCode "TcRnInaccessibleCode" = 40564
GhcDiagnosticCode "TcRnInaccessibleCoAxBranch" = 28129
GhcDiagnosticCode "TcRnTypeDoesNotHaveFixedRuntimeRep" = 18478
GhcDiagnosticCode "TcRnImplicitLift" = 00846
GhcDiagnosticCode "TcRnUnusedPatternBinds" = 61367
GhcDiagnosticCode "TcRnDodgyExports" = 75356
GhcDiagnosticCode "TcRnMissingImportList" = 77037
GhcDiagnosticCode "TcRnUnsafeDueToPlugin" = 01687
GhcDiagnosticCode "TcRnModMissingRealSrcSpan" = 84170
GhcDiagnosticCode "TcRnIdNotExportedFromModuleSig" = 44188
GhcDiagnosticCode "TcRnIdNotExportedFromLocalSig" = 50058
GhcDiagnosticCode "TcRnShadowedName" = 63397
GhcDiagnosticCode "TcRnInvalidWarningCategory" = 53573
GhcDiagnosticCode "TcRnDuplicateWarningDecls" = 00711
GhcDiagnosticCode "TcRnSimplifierTooManyIterations" = 95822
GhcDiagnosticCode "TcRnIllegalPatSynDecl" = 82077
GhcDiagnosticCode "TcRnLinearPatSyn" = 15172
GhcDiagnosticCode "TcRnEmptyRecordUpdate" = 20825
GhcDiagnosticCode "TcRnIllegalFieldPunning" = 44287
GhcDiagnosticCode "TcRnIllegalWildcardsInRecord" = 37132
GhcDiagnosticCode "TcRnIllegalWildcardInType" = 65507
GhcDiagnosticCode "TcRnIllegalNamedWildcardInTypeArgument" = 93411
GhcDiagnosticCode "TcRnIllegalImplicitTyVarInTypeArgument" = 80557
GhcDiagnosticCode "TcRnIllegalPunnedVarOccInTypeArgument" = 09591
GhcDiagnosticCode "TcRnDuplicateFieldName" = 85524
GhcDiagnosticCode "TcRnIllegalViewPattern" = 22406
GhcDiagnosticCode "TcRnCharLiteralOutOfRange" = 17268
GhcDiagnosticCode "TcRnIllegalWildcardsInConstructor" = 47217
GhcDiagnosticCode "TcRnIgnoringAnnotations" = 66649
GhcDiagnosticCode "TcRnAnnotationInSafeHaskell" = 68934
GhcDiagnosticCode "TcRnInvalidTypeApplication" = 95781
GhcDiagnosticCode "TcRnTagToEnumMissingValArg" = 36495
GhcDiagnosticCode "TcRnTagToEnumUnspecifiedResTy" = 08522
GhcDiagnosticCode "TcRnTagToEnumResTyNotAnEnum" = 49356
GhcDiagnosticCode "TcRnTagToEnumResTyTypeData" = 96189
GhcDiagnosticCode "TcRnArrowIfThenElsePredDependsOnResultTy" = 55868
GhcDiagnosticCode "TcRnIllegalHsBootOrSigDecl" = 58195
GhcDiagnosticCode "TcRnRecursivePatternSynonym" = 72489
GhcDiagnosticCode "TcRnPartialTypeSigTyVarMismatch" = 88793
GhcDiagnosticCode "TcRnPartialTypeSigBadQuantifier" = 94185
GhcDiagnosticCode "TcRnMissingSignature" = 38417
GhcDiagnosticCode "TcRnPolymorphicBinderMissingSig" = 64414
GhcDiagnosticCode "TcRnOverloadedSig" = 16675
GhcDiagnosticCode "TcRnTupleConstraintInst" = 69012
GhcDiagnosticCode "TcRnUserTypeError" = 47403
GhcDiagnosticCode "TcRnConstraintInKind" = 01259
GhcDiagnosticCode "TcRnUnboxedTupleOrSumTypeFuncArg" = 19590
GhcDiagnosticCode "TcRnLinearFuncInKind" = 13218
GhcDiagnosticCode "TcRnForAllEscapeError" = 31147
GhcDiagnosticCode "TcRnVDQInTermType" = 51580
GhcDiagnosticCode "TcRnBadQuantPredHead" = 02550
GhcDiagnosticCode "TcRnIllegalTupleConstraint" = 77539
GhcDiagnosticCode "TcRnNonTypeVarArgInConstraint" = 80003
GhcDiagnosticCode "TcRnIllegalImplicitParam" = 75863
GhcDiagnosticCode "TcRnIllegalConstraintSynonymOfKind" = 75844
GhcDiagnosticCode "TcRnOversaturatedVisibleKindArg" = 45474
GhcDiagnosticCode "TcRnForAllRankErr" = 91510
GhcDiagnosticCode "TcRnMonomorphicBindings" = 55524
GhcDiagnosticCode "TcRnOrphanInstance" = 90177
GhcDiagnosticCode "TcRnFunDepConflict" = 46208
GhcDiagnosticCode "TcRnDupInstanceDecls" = 59692
GhcDiagnosticCode "TcRnConflictingFamInstDecls" = 34447
GhcDiagnosticCode "TcRnFamInstNotInjective" = 05175
GhcDiagnosticCode "TcRnBangOnUnliftedType" = 55666
GhcDiagnosticCode "TcRnLazyBangOnUnliftedType" = 71444
GhcDiagnosticCode "TcRnPatSynBundledWithNonDataCon" = 66775
GhcDiagnosticCode "TcRnPatSynBundledWithWrongType" = 66025
GhcDiagnosticCode "TcRnDupeModuleExport" = 51876
GhcDiagnosticCode "TcRnExportedModNotImported" = 90973
GhcDiagnosticCode "TcRnNullExportedModule" = 64649
GhcDiagnosticCode "TcRnMissingExportList" = 85401
GhcDiagnosticCode "TcRnExportHiddenComponents" = 94558
GhcDiagnosticCode "TcRnExportHiddenDefault" = 74775
GhcDiagnosticCode "TcRnDuplicateExport" = 47854
GhcDiagnosticCode "TcRnDuplicateNamedDefaultExport" = 31584
GhcDiagnosticCode "TcRnExportedParentChildMismatch" = 88993
GhcDiagnosticCode "TcRnConflictingExports" = 69158
GhcDiagnosticCode "TcRnDuplicateFieldExport" = 97219
GhcDiagnosticCode "TcRnAmbiguousFieldInUpdate" = 56428
GhcDiagnosticCode "TcRnAmbiguousRecordUpdate" = 02256
GhcDiagnosticCode "TcRnMissingFields" = 20125
GhcDiagnosticCode "TcRnFieldUpdateInvalidType" = 63055
GhcDiagnosticCode "TcRnMissingStrictFields" = 95909
GhcDiagnosticCode "TcRnStaticFormNotClosed" = 88431
GhcDiagnosticCode "TcRnIllegalStaticExpression" = 23800
GhcDiagnosticCode "TcRnUselessTypeable" = 90584
GhcDiagnosticCode "TcRnDerivingDefaults" = 20042
GhcDiagnosticCode "TcRnNonUnaryTypeclassConstraint" = 73993
GhcDiagnosticCode "TcRnPartialTypeSignatures" = 60661
GhcDiagnosticCode "TcRnLazyGADTPattern" = 87005
GhcDiagnosticCode "TcRnArrowProcGADTPattern" = 64525
GhcDiagnosticCode "TcRnTypeEqualityOutOfScope" = 12003
GhcDiagnosticCode "TcRnTypeEqualityRequiresOperators" = 58520
GhcDiagnosticCode "TcRnIllegalTypeOperator" = 62547
GhcDiagnosticCode "TcRnGADTMonoLocalBinds" = 58008
GhcDiagnosticCode "TcRnIncorrectNameSpace" = 31891
GhcDiagnosticCode "TcRnNoRebindableSyntaxRecordDot" = 65945
GhcDiagnosticCode "TcRnNoFieldPunsRecordDot" = 57365
GhcDiagnosticCode "TcRnListComprehensionDuplicateBinding" = 81232
GhcDiagnosticCode "TcRnLastStmtNotExpr" = 55814
GhcDiagnosticCode "TcRnUnexpectedStatementInContext" = 42026
GhcDiagnosticCode "TcRnSectionWithoutParentheses" = 95880
GhcDiagnosticCode "TcRnIllegalImplicitParameterBindings" = 50730
GhcDiagnosticCode "TcRnIllegalTupleSection" = 59155
GhcDiagnosticCode "TcRnTermNameInType" = 37479
GhcDiagnosticCode "TcRnUnexpectedKindVar" = 12875
GhcDiagnosticCode "TcRnNegativeNumTypeLiteral" = 93632
GhcDiagnosticCode "TcRnUnusedQuantifiedTypeVar" = 54180
GhcDiagnosticCode "TcRnMissingRoleAnnotation" = 65490
GhcDiagnosticCode "TcRnUntickedPromotedThing" = 49957
GhcDiagnosticCode "TcRnIllegalBuiltinSyntax" = 39716
GhcDiagnosticCode "TcRnForeignImportPrimExtNotSet" = 49692
GhcDiagnosticCode "TcRnForeignImportPrimSafeAnn" = 26133
GhcDiagnosticCode "TcRnForeignFunctionImportAsValue" = 76251
GhcDiagnosticCode "TcRnFunPtrImportWithoutAmpersand" = 57989
GhcDiagnosticCode "TcRnIllegalForeignDeclBackend" = 03355
GhcDiagnosticCode "TcRnUnsupportedCallConv" = 01245
GhcDiagnosticCode "TcRnInvalidCIdentifier" = 95774
GhcDiagnosticCode "TcRnExpectedValueId" = 01570
GhcDiagnosticCode "TcRnRecSelectorEscapedTyVar" = 55876
GhcDiagnosticCode "TcRnPatSynNotBidirectional" = 16444
GhcDiagnosticCode "TcRnIllegalDerivingItem" = 11913
GhcDiagnosticCode "TcRnUnexpectedAnnotation" = 18932
GhcDiagnosticCode "TcRnIllegalRecordSyntax" = 89246
GhcDiagnosticCode "TcRnInvalidVisibleKindArgument" = 20967
GhcDiagnosticCode "TcRnTooManyBinders" = 05989
GhcDiagnosticCode "TcRnDifferentNamesForTyVar" = 17370
GhcDiagnosticCode "TcRnDisconnectedTyVar" = 59738
GhcDiagnosticCode "TcRnInvalidReturnKind" = 55233
GhcDiagnosticCode "TcRnClassKindNotConstraint" = 80768
GhcDiagnosticCode "TcRnMatchesHaveDiffNumArgs" = 91938
GhcDiagnosticCode "TcRnCannotBindScopedTyVarInPatSig" = 46131
GhcDiagnosticCode "TcRnCannotBindTyVarsInPatBind" = 48361
GhcDiagnosticCode "TcRnTooManyTyArgsInConPattern" = Outdated 01629
GhcDiagnosticCode "TcRnMultipleInlinePragmas" = 96665
GhcDiagnosticCode "TcRnUnexpectedPragmas" = 88293
GhcDiagnosticCode "TcRnNonOverloadedSpecialisePragma" = 35827
GhcDiagnosticCode "TcRnSpecialiseNotVisible" = 85337
GhcDiagnosticCode "TcRnDifferentExportWarnings" = 92878
GhcDiagnosticCode "TcRnIncompleteExportWarnings" = 94721
GhcDiagnosticCode "TcRnIllegalTypeOperatorDecl" = 50649
GhcDiagnosticCode "TcRnOrPatBindsVariables" = 81303
GhcDiagnosticCode "TcRnIllegalKind" = 64861
GhcDiagnosticCode "TcRnUnexpectedPatSigType" = 74097
GhcDiagnosticCode "TcRnIllegalKindSignature" = 91382
GhcDiagnosticCode "TcRnDataKindsError" = 68567
GhcDiagnosticCode "TcRnIllegalHsigDefaultMethods" = 93006
GhcDiagnosticCode "TcRnHsigFixityMismatch" = 93007
GhcDiagnosticCode "TcRnHsigMissingModuleExport" = 93011
GhcDiagnosticCode "TcRnBadGenericMethod" = 59794
GhcDiagnosticCode "TcRnWarningMinimalDefIncomplete" = 13511
GhcDiagnosticCode "TcRnDefaultMethodForPragmaLacksBinding" = 28587
GhcDiagnosticCode "TcRnIgnoreSpecialisePragmaOnDefMethod" = 72520
GhcDiagnosticCode "TcRnBadMethodErr" = 46284
GhcDiagnosticCode "TcRnIllegalTypeData" = 15013
GhcDiagnosticCode "TcRnTypeDataForbids" = 67297
GhcDiagnosticCode "TcRnUnsatisfiedMinimalDef" = 06201
GhcDiagnosticCode "TcRnMisplacedInstSig" = 06202
GhcDiagnosticCode "TcRnCapturedTermName" = 54201
GhcDiagnosticCode "TcRnBindingOfExistingName" = 58805
GhcDiagnosticCode "TcRnMultipleFixityDecls" = 50419
GhcDiagnosticCode "TcRnIllegalPatternSynonymDecl" = 41507
GhcDiagnosticCode "TcRnIllegalClassBinding" = 69248
GhcDiagnosticCode "TcRnOrphanCompletePragma" = 93961
GhcDiagnosticCode "TcRnEmptyCase" = 48010
GhcDiagnosticCode "TcRnNonStdGuards" = 59119
GhcDiagnosticCode "TcRnDuplicateSigDecl" = 31744
GhcDiagnosticCode "TcRnMisplacedSigDecl" = 87866
GhcDiagnosticCode "TcRnUnexpectedDefaultSig" = 40700
GhcDiagnosticCode "TcRnDuplicateMinimalSig" = 85346
GhcDiagnosticCode "TcRnSpecSigShape" = 93944
GhcDiagnosticCode "TcRnLoopySuperclassSolve" = Outdated 36038
GhcDiagnosticCode "TcRnUnexpectedStandaloneDerivingDecl" = 95159
GhcDiagnosticCode "TcRnUnusedVariableInRuleDecl" = 65669
GhcDiagnosticCode "TcRnUnexpectedStandaloneKindSig" = 45906
GhcDiagnosticCode "TcRnIllegalRuleLhs" = 63294
GhcDiagnosticCode "TcRnRuleLhsEqualities" = 53522
GhcDiagnosticCode "TcRnDuplicateRoleAnnot" = 97170
GhcDiagnosticCode "TcRnDuplicateKindSig" = 43371
GhcDiagnosticCode "TcRnIllegalDerivStrategy" = 87139
GhcDiagnosticCode "TcRnIllegalMultipleDerivClauses" = 30281
GhcDiagnosticCode "TcRnNoDerivStratSpecified" = 55631
GhcDiagnosticCode "TcRnStupidThetaInGadt" = 18403
GhcDiagnosticCode "TcRnShadowedTyVarNameInFamResult" = 99412
GhcDiagnosticCode "TcRnIncorrectTyVarOnLhsOfInjCond" = 88333
GhcDiagnosticCode "TcRnUnknownTyVarsOnRhsOfInjCond" = 48254
GhcDiagnosticCode "TcRnBadlyLevelled" = 28914
GhcDiagnosticCode "TcRnBadlyLevelledType" = 86357
GhcDiagnosticCode "TcRnStageRestriction" = Outdated 18157
GhcDiagnosticCode "TcRnTyThingUsedWrong" = 10969
GhcDiagnosticCode "TcRnCannotDefaultKindVar" = 79924
GhcDiagnosticCode "TcRnUninferrableTyVar" = 16220
GhcDiagnosticCode "TcRnSkolemEscape" = 71451
GhcDiagnosticCode "TcRnPatSynEscapedCoercion" = 88986
GhcDiagnosticCode "TcRnPatSynExistentialInResult" = 33973
GhcDiagnosticCode "TcRnPatSynArityMismatch" = 18365
GhcDiagnosticCode "TcRnTyFamDepsDisabled" = 43991
GhcDiagnosticCode "TcRnAbstractClosedTyFamDecl" = 60012
GhcDiagnosticCode "TcRnPartialFieldSelector" = 82712
GhcDiagnosticCode "TcRnHasFieldResolvedIncomplete" = 86894
GhcDiagnosticCode "TcRnSuperclassCycle" = 29210
GhcDiagnosticCode "TcRnDefaultSigMismatch" = 72771
GhcDiagnosticCode "TcRnTyFamResultDisabled" = 44012
GhcDiagnosticCode "TcRnCommonFieldResultTypeMismatch" = 31004
GhcDiagnosticCode "TcRnCommonFieldTypeMismatch" = 91827
GhcDiagnosticCode "TcRnDataConParentTypeMismatch" = 45219
GhcDiagnosticCode "TcRnGADTsDisabled" = 23894
GhcDiagnosticCode "TcRnExistentialQuantificationDisabled" = 25709
GhcDiagnosticCode "TcRnGADTDataContext" = 61072
GhcDiagnosticCode "TcRnMultipleConForNewtype" = 16409
GhcDiagnosticCode "TcRnKindSignaturesDisabled" = 49378
GhcDiagnosticCode "TcRnEmptyDataDeclsDisabled" = 32478
GhcDiagnosticCode "TcRnRoleMismatch" = 29178
GhcDiagnosticCode "TcRnRoleCountMismatch" = 54298
GhcDiagnosticCode "TcRnIllegalRoleAnnotation" = 77192
GhcDiagnosticCode "TcRnRoleAnnotationsDisabled" = 17779
GhcDiagnosticCode "TcRnIncoherentRoles" = 18273
GhcDiagnosticCode "TcRnTypeSynonymCycle" = 97522
GhcDiagnosticCode "TcRnSelfImport" = 43281
GhcDiagnosticCode "TcRnNoExplicitImportList" = 16029
GhcDiagnosticCode "TcRnSafeImportsDisabled" = 26971
GhcDiagnosticCode "TcRnDeprecatedModule" = 15328
GhcDiagnosticCode "TcRnCompatUnqualifiedImport" = Outdated 82347
GhcDiagnosticCode "TcRnRedundantSourceImport" = 54478
GhcDiagnosticCode "TcRnDuplicateDecls" = 29916
GhcDiagnosticCode "TcRnPackageImportsDisabled" = 10032
GhcDiagnosticCode "TcRnIllegalDataCon" = 78448
GhcDiagnosticCode "TcRnNestedForallsContexts" = 71492
GhcDiagnosticCode "TcRnRedundantRecordWildcard" = 15932
GhcDiagnosticCode "TcRnUnusedRecordWildcard" = 83475
GhcDiagnosticCode "TcRnUnusedName" = 40910
GhcDiagnosticCode "TcRnQualifiedBinder" = 28329
GhcDiagnosticCode "TcRnInvalidRecordField" = 53822
GhcDiagnosticCode "TcRnTupleTooLarge" = 94803
GhcDiagnosticCode "TcRnCTupleTooLarge" = 89347
GhcDiagnosticCode "TcRnIllegalInferredTyVars" = 54832
GhcDiagnosticCode "TcRnAmbiguousName" = 87543
GhcDiagnosticCode "TcRnBindingNameConflict" = 10498
GhcDiagnosticCode "NonCanonicalMonoid" = 50928
GhcDiagnosticCode "NonCanonicalMonad" = 22705
GhcDiagnosticCode "TcRnDefaultedExceptionContext" = 46235
GhcDiagnosticCode "TcRnImplicitImportOfPrelude" = 20540
GhcDiagnosticCode "TcRnMissingMain" = 67120
GhcDiagnosticCode "TcRnGhciUnliftedBind" = 17999
GhcDiagnosticCode "TcRnGhciMonadLookupFail" = 44990
GhcDiagnosticCode "TcRnArityMismatch" = 27346
GhcDiagnosticCode "TcRnSimplifiableConstraint" = 62412
GhcDiagnosticCode "TcRnIllegalQuasiQuotes" = 77343
GhcDiagnosticCode "TcRnImplicitRhsQuantification" = 16382
GhcDiagnosticCode "TcRnBadTyConTelescope" = 87279
GhcDiagnosticCode "TcRnPatersonCondFailure" = 22979
GhcDiagnosticCode "TcRnDeprecatedInvisTyArgInConPat" = Outdated 69797
GhcDiagnosticCode "TcRnInvalidDefaultedTyVar" = 45625
GhcDiagnosticCode "TcRnIllegalTermLevelUse" = 01928
GhcDiagnosticCode "TcRnNamespacedWarningPragmaWithoutFlag" = 14995
GhcDiagnosticCode "TcRnNamespacedFixitySigWithoutFlag" = 78534
GhcDiagnosticCode "TcRnOutOfArityTyVar" = 84925
GhcDiagnosticCode "TcRnIllformedTypePattern" = 88754
GhcDiagnosticCode "TcRnIllegalTypePattern" = 70206
GhcDiagnosticCode "TcRnIllformedTypeArgument" = 29092
GhcDiagnosticCode "TcRnIllegalTypeExpr" = 35499
GhcDiagnosticCode "TcRnUnexpectedTypeSyntaxInTerms" = 31244
GhcDiagnosticCode "TcRnTypeApplicationsDisabled" = 23482
-- TcRnIllegalInvisibleTypePattern
GhcDiagnosticCode "InvisPatWithoutFlag" = 78249
GhcDiagnosticCode "InvisPatNoForall" = 14964
GhcDiagnosticCode "InvisPatMisplaced" = 11983
-- PatSynInvalidRhsReason
GhcDiagnosticCode "PatSynNotInvertible" = 69317
GhcDiagnosticCode "PatSynUnboundVar" = 28572
-- TcRnBadFieldAnnotation/BadFieldAnnotationReason
GhcDiagnosticCode "LazyFieldsDisabled" = 81601
GhcDiagnosticCode "UnpackWithoutStrictness" = 10107
GhcDiagnosticCode "UnusableUnpackPragma" = 40091
-- TcRnRoleValidationFailed/RoleInferenceFailedReason
GhcDiagnosticCode "TyVarRoleMismatch" = 22221
GhcDiagnosticCode "TyVarMissingInEnv" = 99991
GhcDiagnosticCode "BadCoercionRole" = 92834
-- TcRnClassExtensionDisabled/DisabledClassExtension
GhcDiagnosticCode "MultiParamDisabled" = 28349
GhcDiagnosticCode "FunDepsDisabled" = 15708
GhcDiagnosticCode "ConstrainedClassMethodsDisabled" = 25079
-- TcRnTyFamsDisabled/TyFamsDisabledReason
GhcDiagnosticCode "TyFamsDisabledFamily" = 39191
GhcDiagnosticCode "TyFamsDisabledInstance" = 06206
GhcDiagnosticCode "TcRnPrecedenceParsingError" = 88747
GhcDiagnosticCode "TcRnSectionPrecedenceError" = 46878
-- HsigShapeMismatchReason
GhcDiagnosticCode "HsigShapeSortMismatch" = 93008
GhcDiagnosticCode "HsigShapeNotUnifiable" = 93009
-- Invisible binders
GhcDiagnosticCode "TcRnIllegalInvisTyVarBndr" = 58589
GhcDiagnosticCode "TcRnIllegalWildcardTyVarBndr" = 12211
GhcDiagnosticCode "TcRnInvalidInvisTyVarBndr" = 57916
GhcDiagnosticCode "TcRnInvisBndrWithoutSig" = 92337
-- IllegalNewtypeReason
GhcDiagnosticCode "DoesNotHaveSingleField" = 23517
GhcDiagnosticCode "IsNonLinear" = 38291
GhcDiagnosticCode "IsGADT" = 89498
GhcDiagnosticCode "HasConstructorContext" = 17440
GhcDiagnosticCode "HasExistentialTyVar" = 07525
GhcDiagnosticCode "HasStrictnessAnnotation" = 04049
-- TcRnBadRecordUpdate
GhcDiagnosticCode "NoConstructorHasAllFields" = 14392
GhcDiagnosticCode "MultiplePossibleParents" = 99339
GhcDiagnosticCode "InvalidTyConParent" = 33238
-- BadImport
GhcDiagnosticCode "BadImportNotExported" = 61689
GhcDiagnosticCode "BadImportAvailDataCon" = 35373
GhcDiagnosticCode "BadImportNotExportedSubordinates" = 10237
GhcDiagnosticCode "BadImportNonTypeSubordinates" = 51433
GhcDiagnosticCode "BadImportNonDataSubordinates" = 46557
GhcDiagnosticCode "BadImportAvailTyCon" = 56449
GhcDiagnosticCode "BadImportAvailVar" = 12112
-- TcRnPragmaWarning
GhcDiagnosticCode "WarningTxt" = 63394
GhcDiagnosticCode "DeprecatedTxt" = 68441
-- TcRnRunSliceFailure/ConversionFail
GhcDiagnosticCode "IllegalOccName" = 55017
GhcDiagnosticCode "SumAltArityExceeded" = 68444
GhcDiagnosticCode "IllegalSumAlt" = 63966
GhcDiagnosticCode "IllegalSumArity" = 97721
GhcDiagnosticCode "MalformedType" = 28709
GhcDiagnosticCode "IllegalLastStatement" = 47373
GhcDiagnosticCode "KindSigsOnlyAllowedOnGADTs" = 40746
GhcDiagnosticCode "IllegalDeclaration" = 23882
GhcDiagnosticCode "CannotMixGADTConsWith98Cons" = 24104
GhcDiagnosticCode "EmptyStmtListInDoBlock" = 34949
GhcDiagnosticCode "NonVarInInfixExpr" = 99831
GhcDiagnosticCode "MultiWayIfWithoutAlts" = 63930
GhcDiagnosticCode "CasesExprWithoutAlts" = 91745
GhcDiagnosticCode "ImplicitParamsWithOtherBinds" = 42974
GhcDiagnosticCode "InvalidCCallImpent" = 60220
GhcDiagnosticCode "RecGadtNoCons" = 18816
GhcDiagnosticCode "GadtNoCons" = 38140
GhcDiagnosticCode "InvalidTypeInstanceHeader" = 37056
GhcDiagnosticCode "InvalidTyFamInstLHS" = 78486
GhcDiagnosticCode "InvalidImplicitParamBinding" = 51603
GhcDiagnosticCode "DefaultDataInstDecl" = 39639
GhcDiagnosticCode "FunBindLacksEquations" = 52078
GhcDiagnosticCode "EmptyGuard" = 45149
GhcDiagnosticCode "EmptyParStmt" = 95595
-- TcRnDodgyImports/DodgyImportsReason
GhcDiagnosticCode "DodgyImportsEmptyParent" = 99623
-- TcRnImportLookup/ImportLookupReason
GhcDiagnosticCode "ImportLookupQualified" = 48795
GhcDiagnosticCode "ImportLookupIllegal" = 14752
GhcDiagnosticCode "ImportLookupAmbiguous" = 92057
-- TcRnUnusedImport/UnusedImportReason
GhcDiagnosticCode "UnusedImportNone" = 66111
GhcDiagnosticCode "UnusedImportSome" = 38856
-- TcRnIllegalInstance
GhcDiagnosticCode "IllegalFamilyApplicationInInstance" = 73138
-- TcRnIllegalClassInstance/IllegalClassInstanceReason
GhcDiagnosticCode "IllegalSpecialClassInstance" = 97044
GhcDiagnosticCode "IllegalInstanceFailsCoverageCondition" = 21572
-- IllegalInstanceHead
GhcDiagnosticCode "InstHeadAbstractClass" = 51758
GhcDiagnosticCode "InstHeadNonClassHead" = 53946
GhcDiagnosticCode "InstHeadTySynArgs" = 93557
GhcDiagnosticCode "InstHeadNonTyVarArgs" = 48406
GhcDiagnosticCode "InstHeadMultiParam" = 91901
-- IllegalHasFieldInstance
GhcDiagnosticCode "IllegalHasFieldInstanceNotATyCon" = 88994
GhcDiagnosticCode "IllegalHasFieldInstanceFamilyTyCon" = 70743
GhcDiagnosticCode "IllegalHasFieldInstanceTyConHasFields" = 43406
GhcDiagnosticCode "IllegalHasFieldInstanceTyConHasField" = 30836
-- TcRnIllegalFamilyInstance/IllegalFamilyInstanceReason
GhcDiagnosticCode "NotAFamilyTyCon" = 06204
GhcDiagnosticCode "NotAnOpenFamilyTyCon" = 06207
GhcDiagnosticCode "FamilyCategoryMismatch" = 52347
GhcDiagnosticCode "FamilyArityMismatch" = 12985
GhcDiagnosticCode "TyFamNameMismatch" = 88221
GhcDiagnosticCode "FamInstRHSOutOfScopeTyVars" = 53634
GhcDiagnosticCode "FamInstLHSUnusedBoundTyVars" = 30337
-- InvalidAssocInstance
GhcDiagnosticCode "AssocInstanceMissing" = 08585
GhcDiagnosticCode "AssocInstanceNotInAClass" = 06205
GhcDiagnosticCode "AssocNotInThisClass" = 38351
GhcDiagnosticCode "AssocNoClassTyVar" = 55912
GhcDiagnosticCode "AssocTyVarsDontMatch" = 95424
-- InvalidAssocDefault
GhcDiagnosticCode "AssocDefaultNotAssoc" = 78822
GhcDiagnosticCode "AssocMultipleDefaults" = 59128
-- AssocDefaultBadArgs
GhcDiagnosticCode "AssocDefaultNonTyVarArg" = 41522
GhcDiagnosticCode "AssocDefaultDuplicateTyVars" = 48178
-- Diagnostic codes for the foreign function interface
GhcDiagnosticCode "NotADataType" = 31136
GhcDiagnosticCode "NewtypeDataConNotInScope" = 72317
GhcDiagnosticCode "UnliftedFFITypesNeeded" = 10964
GhcDiagnosticCode "NotABoxedMarshalableTyCon" = 89401
GhcDiagnosticCode "ForeignLabelNotAPtr" = 26070
GhcDiagnosticCode "NotSimpleUnliftedType" = 43510
GhcDiagnosticCode "NotBoxedKindAny" = 64097
GhcDiagnosticCode "ForeignDynNotPtr" = 27555
GhcDiagnosticCode "SafeHaskellMustBeInIO" = 57638
GhcDiagnosticCode "IOResultExpected" = 41843
GhcDiagnosticCode "UnexpectedNestedForall" = 92994
GhcDiagnosticCode "LinearTypesNotAllowed" = 57396
GhcDiagnosticCode "OneArgExpected" = 91490
GhcDiagnosticCode "AtLeastOneArgExpected" = 07641
-- Interface errors
GhcDiagnosticCode "BadSourceImport" = 64852
GhcDiagnosticCode "HomeModError" = 58427
GhcDiagnosticCode "DynamicHashMismatchError" = 54709
GhcDiagnosticCode "CouldntFindInFiles" = 94559
GhcDiagnosticCode "GenericMissing" = 87110
GhcDiagnosticCode "MissingPackageFiles" = 22211
GhcDiagnosticCode "MissingPackageWayFiles" = 88719
GhcDiagnosticCode "ModuleSuggestion" = 61948
GhcDiagnosticCode "MultiplePackages" = 45102
GhcDiagnosticCode "NoUnitIdMatching" = 51294
GhcDiagnosticCode "NotAModule" = 35235
GhcDiagnosticCode "Can'tFindNameInInterface" = 83249
GhcDiagnosticCode "CircularImport" = 75429
GhcDiagnosticCode "HiModuleNameMismatchWarn" = 53693
GhcDiagnosticCode "ExceptionOccurred" = 47808
-- Out of scope errors
GhcDiagnosticCode "NotInScope" = 76037
GhcDiagnosticCode "NotARecordField" = 22385
GhcDiagnosticCode "NoExactName" = 97784
GhcDiagnosticCode "SameName" = 81573
GhcDiagnosticCode "MissingBinding" = 44432
GhcDiagnosticCode "NoTopLevelBinding" = 10173
GhcDiagnosticCode "UnknownSubordinate" = 54721
GhcDiagnosticCode "NotInScopeTc" = 76329
-- Diagnostic codes for deriving
GhcDiagnosticCode "DerivErrNotWellKinded" = 62016
GhcDiagnosticCode "DerivErrSafeHaskellGenericInst" = 07214
GhcDiagnosticCode "DerivErrDerivingViaWrongKind" = 63174
GhcDiagnosticCode "DerivErrNoEtaReduce" = 38996
GhcDiagnosticCode "DerivErrBootFileFound" = 30903
GhcDiagnosticCode "DerivErrDataConsNotAllInScope" = 54540
GhcDiagnosticCode "DerivErrGNDUsedOnData" = 10333
GhcDiagnosticCode "DerivErrNullaryClasses" = 04956
GhcDiagnosticCode "DerivErrLastArgMustBeApp" = 28323
GhcDiagnosticCode "DerivErrNoFamilyInstance" = 82614
GhcDiagnosticCode "DerivErrNotStockDeriveable" = 00158
GhcDiagnosticCode "DerivErrHasAssociatedDatatypes" = 34611
GhcDiagnosticCode "DerivErrNewtypeNonDeriveableClass" = 82023
GhcDiagnosticCode "DerivErrCannotEtaReduceEnough" = 26557
GhcDiagnosticCode "DerivErrOnlyAnyClassDeriveable" = 23244
GhcDiagnosticCode "DerivErrNotDeriveable" = 38178
GhcDiagnosticCode "DerivErrNotAClass" = 63388
GhcDiagnosticCode "DerivErrNoConstructors" = 64560
GhcDiagnosticCode "DerivErrLangExtRequired" = 86639
GhcDiagnosticCode "DerivErrDunnoHowToDeriveForType" = 48959
GhcDiagnosticCode "DerivErrMustBeEnumType" = 30750
GhcDiagnosticCode "DerivErrMustHaveExactlyOneConstructor" = 37542
GhcDiagnosticCode "DerivErrMustHaveSomeParameters" = 45539
GhcDiagnosticCode "DerivErrMustNotHaveClassContext" = 16588
GhcDiagnosticCode "DerivErrBadConstructor" = 16437
GhcDiagnosticCode "DerivErrGenerics" = 30367
GhcDiagnosticCode "DerivErrEnumOrProduct" = 58291
-- Diagnostic codes for instance lookup
GhcDiagnosticCode "LookupInstErrNotExact" = 10372
GhcDiagnosticCode "LookupInstErrFlexiVar" = 10373
GhcDiagnosticCode "LookupInstErrNotFound" = 10374
-- Diagnostic codes for default declarations and type defaulting
GhcDiagnosticCode "TcRnMultipleDefaultDeclarations" = 99565
GhcDiagnosticCode "TcRnIllegalDefaultClass" = 26555
GhcDiagnosticCode "TcRnIllegalNamedDefault" = 55756
GhcDiagnosticCode "TcRnBadDefaultType" = 88933
GhcDiagnosticCode "TcRnWarnDefaulting" = 18042
GhcDiagnosticCode "TcRnWarnClashingDefaultImports" = 77007
-- TcRnEmptyStmtsGroupError/EmptyStatementGroupErrReason
GhcDiagnosticCode "EmptyStmtsGroupInParallelComp" = 41242
GhcDiagnosticCode "EmptyStmtsGroupInTransformListComp" = 92693
GhcDiagnosticCode "EmptyStmtsGroupInDoNotation" = 82311
GhcDiagnosticCode "EmptyStmtsGroupInArrowNotation" = 19442
-- HsBoot and Hsig errors
GhcDiagnosticCode "MissingBootDefinition" = 63610
GhcDiagnosticCode "MissingBootExport" = 91999
GhcDiagnosticCode "MissingBootInstance" = 79857
GhcDiagnosticCode "BadReexportedBootThing" = 12424
GhcDiagnosticCode "BootMismatchedIdTypes" = 11890
GhcDiagnosticCode "BootMismatchedTyCons" = 15843
-- TH errors
GhcDiagnosticCode "TypedTHWithPolyType" = 94642
GhcDiagnosticCode "SplicePolymorphicLocalVar" = 06568
GhcDiagnosticCode "SpliceThrewException" = 87897
GhcDiagnosticCode "InvalidTopDecl" = 52886
GhcDiagnosticCode "NonExactName" = 77923
GhcDiagnosticCode "AddInvalidCorePlugin" = 86463
GhcDiagnosticCode "AddDocToNonLocalDefn" = 67760
GhcDiagnosticCode "FailedToLookupThInstName" = 49530
GhcDiagnosticCode "CannotReifyInstance" = 30384
GhcDiagnosticCode "CannotReifyOutOfScopeThing" = 24922
GhcDiagnosticCode "CannotReifyThingNotInTypeEnv" = 79890
GhcDiagnosticCode "NoRolesAssociatedWithThing" = 65923
GhcDiagnosticCode "CannotRepresentType" = 75721
GhcDiagnosticCode "ReportCustomQuasiError" = 39584
GhcDiagnosticCode "MismatchedSpliceType" = 45108
GhcDiagnosticCode "IllegalTHQuotes" = 62558
GhcDiagnosticCode "IllegalTHSplice" = 26759
GhcDiagnosticCode "NestedTHBrackets" = 59185
GhcDiagnosticCode "AddTopDeclsUnexpectedDeclarationSplice" = 17599
GhcDiagnosticCode "BadImplicitSplice" = 25277
GhcDiagnosticCode "QuotedNameWrongStage" = Outdated 57695
GhcDiagnosticCode "IllegalStaticFormInSplice" = 12219
-- Zonker messages
GhcDiagnosticCode "ZonkerCannotDefaultConcrete" = 52083
-- Promotion errors
GhcDiagnosticCode "ClassPE" = 86934
GhcDiagnosticCode "TyConPE" = 85413
GhcDiagnosticCode "PatSynPE" = 70349
GhcDiagnosticCode "FamDataConPE" = 64578
GhcDiagnosticCode "ConstrainedDataConPE" = 28374
GhcDiagnosticCode "RecDataConPE" = 56753
GhcDiagnosticCode "TermVariablePE" = 45510
GhcDiagnosticCode "TypeVariablePE" = 47557
-- To generate new random numbers:
-- https://www.random.org/integers/?num=10&min=1&max=99999&col=1&base=10&format=plain
--
-- NB: never remove a return value from this type family!
-- We need to ensure uniquess of diagnostic codes across GHC versions,
-- and this includes outdated diagnostic codes for errors that GHC
-- no longer reports. These are mostly collected below, but for ease
-- of rebasing it is often better to simply declare a constructor outdated
-- without moving it down here.
GhcDiagnosticCode "TcRnIllegalInstanceHeadDecl" = Outdated 12222
GhcDiagnosticCode "TcRnNoClassInstHead" = Outdated 56538
-- The above two are subsumed by InstHeadNonClassHead [GHC-53946]
GhcDiagnosticCode "TcRnNameByTemplateHaskellQuote" = Outdated 40027
GhcDiagnosticCode "TcRnIllegalBindingOfBuiltIn" = Outdated 69639
GhcDiagnosticCode "TcRnMixedSelectors" = Outdated 40887
GhcDiagnosticCode "TcRnBadBootFamInstDecl" = Outdated 06203
GhcDiagnosticCode "TcRnBindInBootFile" = Outdated 11247
GhcDiagnosticCode "TcRnUnexpectedTypeSplice" = Outdated 39180
GhcDiagnosticCode "PsErrUnexpectedTypeAppInDecl" = Outdated 45054
GhcDiagnosticCode "TcRnUnpromotableThing" = Outdated 88634
GhcDiagnosticCode "UntouchableVariable" = Outdated 34699
GhcDiagnosticCode "TcRnBindVarAlreadyInScope" = Outdated 69710
GhcDiagnosticCode "TcRnBindMultipleVariables" = Outdated 92957
GhcDiagnosticCode "TcRnHsigNoIface" = Outdated 93010
GhcDiagnosticCode "TcRnInterfaceLookupError" = Outdated 52243
GhcDiagnosticCode "TcRnForallIdentifier" = Outdated 64088
GhcDiagnosticCode "TypeApplicationInPattern" = Outdated 17916
{- *********************************************************************
* *
Recurring into an argument
* *
********************************************************************* -}
-- | Some constructors of diagnostic datatypes don't have
-- corresponding error codes, because we recur inside them.
--
-- For example, we don't have an error code for the
-- 'TcRnCannotDeriveInstance' constructor of 'TcRnMessage',
-- because we recur into the 'DeriveInstanceErrReason' to obtain
-- an error code.
--
-- This type family keeps track of such constructors.
type ConRecursInto :: Symbol -> Maybe Type
type family ConRecursInto con where
----------------------------------
-- Constructors of GhcMessage
ConRecursInto "GhcDriverMessage" = 'Just DriverMessage
ConRecursInto "GhcPsMessage" = 'Just PsMessage
ConRecursInto "GhcTcRnMessage" = 'Just TcRnMessage
ConRecursInto "GhcDsMessage" = 'Just DsMessage
ConRecursInto "GhcUnknownMessage" = 'Just (UnknownDiagnosticFor GhcMessage)
----------------------------------
-- Constructors of DriverMessage
ConRecursInto "DriverUnknownMessage" = 'Just (UnknownDiagnosticFor DriverMessage)
ConRecursInto "DriverPsHeaderMessage" = 'Just PsMessage
ConRecursInto "DriverInterfaceError" = 'Just IfaceMessage
ConRecursInto "CantFindErr" = 'Just CantFindInstalled
ConRecursInto "CantFindInstalledErr" = 'Just CantFindInstalled
ConRecursInto "CantFindInstalled" = 'Just CantFindInstalledReason
ConRecursInto "BadIfaceFile" = 'Just ReadInterfaceError
ConRecursInto "FailedToLoadDynamicInterface" = 'Just ReadInterfaceError
----------------------------------
-- Constructors of PsMessage
ConRecursInto "PsUnknownMessage" = 'Just (UnknownDiagnosticFor PsMessage)
ConRecursInto "PsHeaderMessage" = 'Just PsHeaderMessage
----------------------------------
-- Constructors of DsMessage
ConRecursInto "DsUselessSpecialisePragma" = 'Just UselessSpecialisePragmaReason
----------------------------------
-- Constructors of TcRnMessage
ConRecursInto "TcRnUnknownMessage" = 'Just (UnknownDiagnosticFor TcRnMessage)
-- Recur into TcRnMessageWithInfo to get the underlying TcRnMessage
ConRecursInto "TcRnMessageWithInfo" = 'Just TcRnMessageDetailed
ConRecursInto "TcRnMessageDetailed" = 'Just TcRnMessage
ConRecursInto "TcRnWithHsDocContext" = 'Just TcRnMessage
ConRecursInto "TcRnCannotDeriveInstance" = 'Just DeriveInstanceErrReason
ConRecursInto "TcRnLookupInstance" = 'Just LookupInstanceErrReason
ConRecursInto "TcRnPragmaWarning" = 'Just (WarningTxt GhcRn)
ConRecursInto "TcRnNotInScope" = 'Just NotInScopeError
ConRecursInto "TcRnIllegalNewtype" = 'Just IllegalNewtypeReason
ConRecursInto "TcRnHsigShapeMismatch" = 'Just HsigShapeMismatchReason
ConRecursInto "TcRnPatSynInvalidRhs" = 'Just PatSynInvalidRhsReason
ConRecursInto "TcRnBadRecordUpdate" = 'Just BadRecordUpdateReason
ConRecursInto "TcRnBadFieldAnnotation" = 'Just BadFieldAnnotationReason
ConRecursInto "TcRnRoleValidationFailed" = 'Just RoleValidationFailedReason
ConRecursInto "TcRnClassExtensionDisabled" = 'Just DisabledClassExtension
ConRecursInto "TcRnTyFamsDisabled" = 'Just TyFamsDisabledReason
ConRecursInto "TcRnDodgyImports" = 'Just DodgyImportsReason
ConRecursInto "DodgyImportsHiding" = 'Just ImportLookupReason
ConRecursInto "TcRnImportLookup" = 'Just ImportLookupReason
ConRecursInto "TcRnUnusedImport" = 'Just UnusedImportReason
ConRecursInto "TcRnNonCanonicalDefinition" = 'Just NonCanonicalDefinition
ConRecursInto "TcRnIllegalInstance" = 'Just IllegalInstanceReason
ConRecursInto "TcRnIllegalInvisibleTypePattern" = 'Just BadInvisPatReason
-- Illegal instance reasons
ConRecursInto "IllegalClassInstance" = 'Just IllegalClassInstanceReason
ConRecursInto "IllegalFamilyInstance" = 'Just IllegalFamilyInstanceReason
-- Illegal class instance reasons
ConRecursInto "IllegalInstanceHead" = 'Just IllegalInstanceHeadReason
ConRecursInto "IllegalHasFieldInstance" = 'Just IllegalHasFieldInstance
-- Illegal family instance reasons
ConRecursInto "InvalidAssoc" = 'Just InvalidAssoc
ConRecursInto "InvalidAssocInstance" = 'Just InvalidAssocInstance
ConRecursInto "InvalidAssocDefault" = 'Just InvalidAssocDefault
ConRecursInto "AssocDefaultBadArgs" = 'Just AssocDefaultBadArgs
--
-- TH errors
ConRecursInto "TcRnTHError" = 'Just THError
ConRecursInto "THSyntaxError" = 'Just THSyntaxError
ConRecursInto "THNameError" = 'Just THNameError
ConRecursInto "THReifyError" = 'Just THReifyError
ConRecursInto "TypedTHError" = 'Just TypedTHError
ConRecursInto "THSpliceFailed" = 'Just SpliceFailReason
ConRecursInto "RunSpliceFailure" = 'Just RunSpliceFailReason
ConRecursInto "ConversionFail" = 'Just ConversionFailReason
ConRecursInto "AddTopDeclsError" = 'Just AddTopDeclsError
ConRecursInto "AddTopDeclsRunSpliceFailure" = 'Just RunSpliceFailReason
-- Interface file errors
ConRecursInto "TcRnInterfaceError" = 'Just IfaceMessage
ConRecursInto "Can'tFindInterface" = 'Just MissingInterfaceError
-- HsBoot and Hsig errors
ConRecursInto "TcRnBootMismatch" = 'Just BootMismatch
ConRecursInto "MissingBootThing" = 'Just MissingBootThing
ConRecursInto "BootMismatch" = 'Just BootMismatchWhat
-- Zonker errors
ConRecursInto "TcRnZonkerMessage" = 'Just ZonkerMessage
------------------
-- FFI errors
ConRecursInto "TcRnIllegalForeignType" = 'Just IllegalForeignTypeReason
-- IllegalForeignTypeReason: recur into TypeCannotBeMarshaled for the reason
ConRecursInto "TypeCannotBeMarshaled" = 'Just TypeCannotBeMarshaledReason
------------------
-- Solver reports
-- Recur inside TcRnSolverReport to get the underlying TcSolverReportMsg
ConRecursInto "TcRnSolverReport" = 'Just SolverReportWithCtxt
ConRecursInto "SolverReportWithCtxt" = 'Just TcSolverReportMsg
ConRecursInto "TcReportWithInfo" = 'Just TcSolverReportMsg
-- Recur inside CannotUnifyVariable to get the underlying reason
ConRecursInto "CannotUnifyVariable" = 'Just CannotUnifyVariableReason
-- Recur inside Mismatch to get the underlying reason
ConRecursInto "Mismatch" = 'Just MismatchMsg
-- Recur inside empty statements groups to get the underlying statements block
ConRecursInto "TcRnEmptyStmtsGroup" = 'Just EmptyStatementGroupErrReason
----------------------------------
-- Constructors of DsMessage
ConRecursInto "DsUnknownMessage" = 'Just (UnknownDiagnosticFor DsMessage)
----------------------------------
-- Constructors of ImportLookupBad
ConRecursInto "ImportLookupBad" = 'Just BadImportKind
ConRecursInto "TcRnUnpromotableThing" = 'Just PromotionErr
----------------------------------
-- Any other constructors: don't recur, instead directly
-- use the constructor name for the error code.
ConRecursInto _ = 'Nothing
{- *********************************************************************
* *
Generics machinery
* *
********************************************************************* -}
{- Note [Diagnostic codes using generics]
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Diagnostic codes for GHC are specified at the type-level using the injective
type family 'GhcDiagnosticCode'. This ensures uniqueness of diagnostic
codes, giving quick feedback (in the form of a type error).
Using this type family, we need to obtain corresponding value-level
functions, e.g.
diagnosticCode :: TcRnMessage -> DiagnosticCode
diagnosticCode diag = case diag of
TcRnInaccessibleCode {} -> ghcDiagnosticCode 40564
TcRnTypeDoesNotHaveFixedRuntimeRep {} -> ghcDiagnosticCode 18478
TcRnCannotDeriveInstance _ _ _ _ reason ->
case reason of
DerivErrNotWellKinded {} -> ghcDiagnosticCode 62016
DerivErrNotAClass {} -> ghcDiagnosticCode 63388
...
...
For some constructors, such as 'TcRnInaccessibleCode', we directly get a
diagnostic code, using the 'GhcDiagnosticCode' type family. For other
constructors, such as 'TcRnCannotDeriveInstance', we instead recur into an
argument (in this case 'DeriveInstanceErrReason') to obtain a diagnostic code.
To achieve this, we use a variant of the 'typed' lens from 'generic-lens'
(we only need a getter, not a setter):
- Using GHC.Generics, we obtain the type-level structure
of diagnostic types, as sums of products, with extra metadata.
- The 'ConRecursInto' type family declares when we should
recur into an argument of the constructor instead of using
the constructor name itself for the diagnostic code.
- To decide whether to recur, in the generic representation,
we must look at all factors of a product to see if there is
a type we should recur into. We look at the left branch
first, and decide whether to recur into it using the
HasTypeQ type family.
- The two different behaviours are controlled by two main instances (*) and (**).
- (*) directly uses the constructor name, by using the 'DiagnosticCodeFor'
type family. The 'KnownConstructor' context (ERR2) on the instance provides
a custom error message in case of a missing diagnostic code, which points
GHC contributors to the documentation explaining how to add diagnostic codes
for their diagnostics.
- (**) recurses into a subtype, when we have a type family equation such as:
ConRecursInto "TcRnCannotDeriveInstance" = 'Just DeriveInstanceErrReason
In this case, for the constructor 'TcRnCannotDeriveInstance', we recur into the
type 'DeriveInstanceErrReason'.
The overlapping instance (ERR1) provides an error message in case a constructor
does not have the type specified by the 'ConRecursInto' type family.
-}
-- | Use the generic representation of a type to retrieve the
-- diagnostic code, using 'DiagnosticCodeFor namespace' type family.
--
-- See Note [Diagnostic codes using generics] in GHC.Types.Error.Codes.
type GDiagnosticCode :: Type -> (Type -> Type) -> Constraint
class GDiagnosticCode namespace f where
gdiagnosticCode :: f a -> Maybe DiagnosticCode
-- | Use the generic representation of a type to retrieve the collection
-- of all diagnostic codes it can give rise to.
type GDiagnosticCodes :: Type -> [Type] -> (Type -> Type) -> Constraint
class GDiagnosticCodes namespace seen f where
gdiagnosticCodes :: Map DiagnosticCode String
type ConstructorCode :: Type -> Symbol -> (Type -> Type) -> Maybe Type -> Constraint
class ConstructorCode namespace con f recur where
gconstructorCode :: f a -> Maybe DiagnosticCode
type ConstructorCodes :: Type -> Symbol -> (Type -> Type) -> [Type] -> Maybe Type -> Constraint
class ConstructorCodes namespace con f seen recur where
gconstructorCodes :: Map DiagnosticCode String
-- If we recur into the 'UnknownDiagnostic' existential datatype,
-- unwrap the existential and obtain the error code.
instance {-# OVERLAPPING #-}
( ConRecursIntoFor namespace con ~ 'Just (UnknownDiagnostic opts hint)
, HasType namespace (UnknownDiagnostic opts hint) con f )
=> ConstructorCode namespace con f ('Just (UnknownDiagnostic opts hint)) where
gconstructorCode diag = case getType @namespace @(UnknownDiagnostic opts hint) @con @f diag of
UnknownDiagnostic _ _ diag -> diagnosticCode diag
instance {-# OVERLAPPING #-}
( ConRecursIntoFor namespace con ~ 'Just (UnknownDiagnostic opts hint) )
=> ConstructorCodes namespace con f seen ('Just (UnknownDiagnostic opts hint)) where
gconstructorCodes = Map.empty
-- | (*) Base instance: use the diagnostic code for this constructor in this namespace.
instance (KnownNameSpace namespace, KnownConstructor namespace con, KnownSymbol con)
=> ConstructorCode namespace con f 'Nothing where
gconstructorCode _ = Just $ DiagnosticCode (symbolVal' @(NameSpaceTag namespace) proxy#) $ natVal' @(DiagnosticCodeFor namespace con) proxy#
instance ( KnownNameSpace namespace, KnownConstructor namespace con, KnownSymbol con) => ConstructorCodes namespace con f seen 'Nothing where
gconstructorCodes =
Map.singleton
(DiagnosticCode (symbolVal' @(NameSpaceTag namespace) proxy#) $ natVal' @(DiagnosticCodeFor namespace con) proxy#)
(symbolVal' @con proxy#)
-- | (**) Recursive instance: recur into the given type.
instance ( ConRecursIntoFor namespace con ~ 'Just ty, HasType namespace ty con f
, Generic ty, GDiagnosticCode namespace (Rep ty) )
=> ConstructorCode namespace con f ('Just ty) where
gconstructorCode diag = gdiagnosticCode @namespace (from $ getType @namespace @ty @con @f diag)
instance ( ConRecursIntoFor namespace con ~ 'Just ty, HasType namespace ty con f
, Generic ty, GDiagnosticCodes namespace (Insert ty seen) (Rep ty)
, Seen seen ty )
=> ConstructorCodes namespace con f seen ('Just ty) where
gconstructorCodes =
-- See Note [diagnosticCodes: don't recur into already-seen types]
if wasSeen @seen @ty
then Map.empty
else gdiagnosticCodes @namespace @(Insert ty seen) @(Rep ty)
instance (ConstructorCode namespace con f recur, recur ~ ConRecursIntoFor namespace con, KnownSymbol con)
=> GDiagnosticCode namespace (M1 i ('MetaCons con x y) f) where
gdiagnosticCode (M1 x) = gconstructorCode @namespace @con @f @recur x
instance (ConstructorCodes namespace con f seen recur, recur ~ ConRecursIntoFor namespace con, KnownSymbol con)
=> GDiagnosticCodes namespace seen (M1 i ('MetaCons con x y) f) where
gdiagnosticCodes = gconstructorCodes @namespace @con @f @seen @recur
-- Handle sum types (the diagnostic types are sums of constructors).
instance (GDiagnosticCode namespace f, GDiagnosticCode namespace g) => GDiagnosticCode namespace (f :+: g) where
gdiagnosticCode (L1 x) = gdiagnosticCode @namespace @f x
gdiagnosticCode (R1 y) = gdiagnosticCode @namespace @g y
instance (GDiagnosticCodes namespace seen f, GDiagnosticCodes namespace seen g) => GDiagnosticCodes namespace seen (f :+: g) where
gdiagnosticCodes = Map.union (gdiagnosticCodes @namespace @seen @f) (gdiagnosticCodes @namespace @seen @g)
-- Discard metadata we don't need.
instance GDiagnosticCode namespace f
=> GDiagnosticCode namespace (M1 i ('MetaData nm mod pkg nt) f) where
gdiagnosticCode (M1 x) = gdiagnosticCode @namespace @f x
instance GDiagnosticCodes namespace seen f
=> GDiagnosticCodes namespace seen (M1 i ('MetaData nm mod pkg nt) f) where
gdiagnosticCodes = gdiagnosticCodes @namespace @seen @f
-- | Decide whether to pick the left or right branch
-- when deciding how to recurse into a product.
type family HasTypeQ (ty :: Type) f :: Maybe Type where
HasTypeQ typ (M1 _ _ (K1 _ typ))
= 'Just typ
HasTypeQ typ (M1 _ _ x)
= HasTypeQ typ x
HasTypeQ typ (l :*: r)
= Alt (HasTypeQ typ l) (HasTypeQ typ r)
HasTypeQ typ (l :+: r)
= Both (HasTypeQ typ l) (HasTypeQ typ r)
HasTypeQ typ (K1 _ _)
= 'Nothing
HasTypeQ typ U1
= 'Nothing
HasTypeQ typ V1
= 'Nothing
type family Both (m1 :: Maybe a) (m2 :: Maybe a) :: Maybe a where
Both ('Just a) ('Just a) = 'Just a
type family Alt (m1 :: Maybe a) (m2 :: Maybe a) :: Maybe a where
Alt ('Just a) _ = 'Just a
Alt _ b = b
type HasType :: Type -> Type -> Symbol -> (Type -> Type) -> Constraint
class HasType namespace ty orig f where
getType :: f a -> ty
instance HasType namespace ty orig (M1 i s (K1 x ty)) where
getType (M1 (K1 x)) = x
instance HasTypeProd namespace ty (HasTypeQ ty f) orig f g => HasType namespace ty orig (f :*: g) where
getType = getTypeProd @namespace @ty @(HasTypeQ ty f) @orig
-- The lr parameter tells us whether to pick the left or right
-- branch in a product, and is computed using 'HasTypeQ'.
--
-- If it's @Just l@, then we have found the type in the left branch,
-- so use that. Otherwise, look in the right branch.
class HasTypeProd namespace ty lr orig f g where
getTypeProd :: (f :*: g) a -> ty
-- Pick the left branch.
instance HasType namespace ty orig f => HasTypeProd namespace ty ('Just l) orig f g where
getTypeProd (x :*: _) = getType @namespace @ty @orig @f x
-- Pick the right branch.
instance HasType namespace ty orig g => HasTypeProd namespace ty 'Nothing orig f g where
getTypeProd (_ :*: y) = getType @namespace @ty @orig @g y
{- Note [diagnosticCodes: don't recur into already-seen types]
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
When traversing through the Generic representation of a datatype to compute all
of the corresponding error codes, we need to keep track of types we have already
seen in order to avoid a runtime loop.
For example, TcRnMessage is defined recursively in terms of itself:
data TcRnMessage where
...
TcRnMessageWithInfo :: !UnitState
-> !TcRnMessageDetailed -- contains a TcRnMessage
-> TcRnMessage
If we naively computed the collection of error codes, we would get a computation
of the form
diagnosticCodes @TcRnMessage = ... `Map.union` constructorCodes "TcRnMessageWithInfo"
constructorCodes "TcRnMessageWithInfo" = diagnosticCodes @TcRnMessage
This would cause an infinite loop. We thus keep track of a list of types we
have already encountered, and when we recur into a type we have already
encountered, we simply skip taking that union (see (**)).
Note that 'constructorCodes' starts by marking the initial type itself as "seen",
which precisely avoids the loop above when calling 'constructorCodes @TcRnMessage'.
-}
type Seen :: [Type] -> Type -> Constraint
class Seen seen ty where
wasSeen :: Bool
instance Seen '[] ty where
wasSeen = False
instance {-# OVERLAPPING #-} Seen (ty ': tys) ty where
wasSeen = True
instance Seen tys ty => Seen (ty' ': tys) ty where
wasSeen = wasSeen @tys @ty
type Insert :: Type -> [Type] -> [Type]
type family Insert ty tys where
Insert ty '[] = '[ty]
Insert ty (ty ': tys) = ty ': tys
Insert ty (ty' ': tys) = ty' ': Insert ty tys
{- *********************************************************************
* *
Custom type errors for diagnostic codes
* *
********************************************************************* -}
-- (ERR1) Improve error messages for recurring into an argument.
instance {-# OVERLAPPABLE #-}
TypeError
( 'Text "The constructor '" ':<>: 'Text orig ':<>: 'Text "'"
':$$: 'Text "does not have any argument of type '" ':<>: 'ShowType ty ':<>: 'Text "'."
':$$: 'Text ""
':$$: 'Text "This is likely due to an incorrect type family equation:"
':$$: 'Text " ConRecursIntoFor " ':<>: 'ShowType namespace ':<>: Text " \"" ':<>: 'Text orig ':<>: 'Text "\" = " ':<>: 'ShowType ty )
=> HasType namespace ty orig f where
getType = panic "getType: unreachable"
-- (ERR2) Improve error messages for missing 'GhcDiagnosticCode' equations.
type KnownConstructor :: Type -> Symbol -> Constraint
type family KnownConstructor namespace con where
KnownConstructor namespace con =
KnownNatOrErr
( TypeError
( 'Text "Missing " ':<>: 'ShowType namespace ':<>: Text " diagnostic code for constructor "
':<>: 'Text "'" ':<>: 'Text con ':<>: 'Text "'."
':$$: 'Text ""
':$$: 'Text "Note [Diagnostic codes] in GHC.Types.Error.Codes"
':$$: 'Text "contains instructions for adding a new diagnostic code."
)
)
(DiagnosticCodeFor namespace con)
type KnownNatOrErr :: Constraint -> Nat -> Constraint
type KnownNatOrErr err n = (Assert err n, KnownNat n)
-- (ERR3) Improve error messages for invalid namespaces.
type KnownNameSpace :: Type -> Constraint
type family KnownNameSpace namespace where
KnownNameSpace namespace =
ValidNameSpaceOrErr
( TypeError
( 'Text "Please provide a 'DiagnosticCodeNameSpace' instance for " ':<>: 'ShowType namespace ':<>: Text ","
':$$: 'Text "including an associated type family equation for 'NameSpaceTag'."
)
)
(NameSpaceTag namespace)
type ValidNameSpaceOrErr :: Constraint -> Symbol -> Constraint
type ValidNameSpaceOrErr err s = (Assert err s, KnownSymbol s)
-- Detecting a stuck type family using a data family.
-- See https://blog.csongor.co.uk/report-stuck-families/.
type Assert :: Constraint -> k -> Constraint
type family Assert err n where
Assert _ Dummy = Dummy
Assert _ n = ()
data family Dummy :: k