    {-
    (c) The University of Glasgow 2006
    (c) The AQUA Project, Glasgow University, 1996-1998

    -}

    {-# LANGUAGE CPP #-}
    {-# LANGUAGE TupleSections, ScopedTypeVariables, MultiWayIf #-}
    {-# LANGUAGE TypeFamilies #-}
    {-# LANGUAGE ViewPatterns #-}
    {-# LANGUAGE LambdaCase #-}

    {-# OPTIONS_GHC -Wno-incomplete-uni-patterns #-}

    -- | Typecheck type and class declarations
    module GHC.Tc.TyCl (
            tcTyAndClassDecls,

            -- Functions used by GHC.Tc.TyCl.Instance to check
            -- data/type family instance declarations
            kcConDecls, tcConDecls, DataDeclInfo(..),
            dataDeclChecks, checkValidTyCon,
            tcFamTyPats, tcTyFamInstEqn,
            tcAddTyFamInstCtxt, tcMkDataFamInstCtxt, tcAddDataFamInstCtxt,
            unravelFamInstPats, addConsistencyConstraints,
            checkFamTelescope
        ) where

    import GHC.Prelude

    import GHC.Driver.Env
    import GHC.Driver.DynFlags
    import GHC.Driver.Config.HsToCore

    import GHC.Hs

    import GHC.Tc.Errors.Types
    import GHC.Tc.TyCl.Build
    import GHC.Tc.Solver( pushLevelAndSolveEqualities, pushLevelAndSolveEqualitiesX
                        , reportUnsolvedEqualities )
    import GHC.Tc.Utils.Monad
    import GHC.Tc.Utils.Env
    import GHC.Tc.Utils.Unify( unifyType, emitResidualTvConstraint )
    import GHC.Tc.Types.Constraint( emptyWC )
    import GHC.Tc.Validity
    import GHC.Tc.Zonk.Type
    import GHC.Tc.Zonk.TcType
    import GHC.Tc.TyCl.Utils
    import GHC.Tc.TyCl.Class
    import {-# SOURCE #-} GHC.Tc.TyCl.Instance( tcInstDecls1 )
    import {-# SOURCE #-} GHC.Tc.Module( checkBootDeclM )
    import GHC.Tc.Deriv (DerivInfo(..))
    import GHC.Tc.Gen.HsType
    import GHC.Tc.Instance.Class( AssocInstInfo(..) )
    import GHC.Tc.Utils.TcMType
    import GHC.Tc.Utils.TcType
    import GHC.Tc.Instance.Family
    import GHC.Tc.Types.Origin
    import GHC.Tc.Types.LclEnv

    import GHC.Builtin.Types (oneDataConTy,  unitTy, makeRecoveryTyCon )

    import GHC.Rename.Env( lookupConstructorFields )

    import GHC.Core.Multiplicity
    import GHC.Core.FamInstEnv ( mkBranchedCoAxiom, mkCoAxBranch )
    import GHC.Core.Coercion
    import GHC.Core.Type
    import GHC.Core.TyCo.Rep   -- for checkValidRoles
    import GHC.Core.TyCo.Ppr( pprTyVars )
    import GHC.Core.Class
    import GHC.Core.Coercion.Axiom
    import GHC.Core.TyCon
    import GHC.Core.DataCon
    import GHC.Core.Unify

    import GHC.Types.Error
    import GHC.Types.Id
    import GHC.Types.Id.Make
    import GHC.Types.Var
    import GHC.Types.Var.Env
    import GHC.Types.Var.Set
    import GHC.Types.Name
    import GHC.Types.Name.Set
    import GHC.Types.Name.Env
    import GHC.Types.SrcLoc
    import GHC.Types.SourceFile
    import GHC.Types.TypeEnv
    import GHC.Types.Unique
    import GHC.Types.Basic
    import qualified GHC.LanguageExtensions as LangExt

    import GHC.Data.FastString
    import GHC.Data.Maybe
    import GHC.Data.List.SetOps( minusList, equivClasses )

    import GHC.Unit
    import GHC.Unit.Module.ModDetails

    import GHC.Utils.Outputable
    import GHC.Utils.Panic
    import GHC.Utils.Constants (debugIsOn)
    import GHC.Utils.Misc

    import Language.Haskell.Syntax.Basic (FieldLabelString(..))

    import Control.Monad
    import Data.Foldable ( toList, traverse_ )
    import Data.Functor.Identity
    import Data.List ( partition)
    import Data.List.NonEmpty ( NonEmpty(..) )
    import qualified Data.List.NonEmpty as NE
    import Data.Traversable ( for )
    import Data.Tuple( swap )

    {-
    ************************************************************************
    *                                                                      *
    \subsection{Type checking for type and class declarations}
    *                                                                      *
    ************************************************************************

    Note [Grouping of type and class declarations]
    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    tcTyAndClassDecls is called on a list of `TyClGroup`s. Each group is a strongly
    connected component of mutually dependent types and classes. We kind check and
    type check each group separately to enhance kind polymorphism. Take the
    following example:

      type Id a = a
      data X = X (Id Int)

    If we were to kind check the two declarations together, we would give Id the
    kind * -> *, since we apply it to an Int in the definition of X. But we can do
    better than that, since Id really is kind polymorphic, and should get kind
    forall (k::*). k -> k. Since it does not depend on anything else, it can be
    kind-checked by itself, hence getting the most general kind. We then kind check
    X, which works fine because we then know the polymorphic kind of Id, and simply
    instantiate k to *.

    Note [Check role annotations in a second pass]
    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    Role inference potentially depends on the types of all of the datacons declared
    in a mutually recursive group. The validity of a role annotation, in turn,
    depends on the result of role inference. Because the types of datacons might
    be ill-formed (see #7175 and Note [rejigConRes]) we must check
    *all* the tycons in a group for validity before checking *any* of the roles.
    Thus, we take two passes over the resulting tycons, first checking for general
    validity and then checking for valid role annotations.
    -}

    tcTyAndClassDecls :: [TyClGroup GhcRn]      -- Mutually-recursive groups in
                                                -- dependency order
                      -> TcM ( TcGblEnv         -- Input env extended by types and
                                                -- classes
                                                -- and their implicit Ids,DataCons
                             , [InstInfo GhcRn] -- Source-code instance decls info
                             , [DerivInfo]      -- Deriving info
                             , ThBindEnv        -- TH binding levels
                             )
    -- Fails if there are any errors
    tcTyAndClassDecls :: [TyClGroup GhcRn]
    -> TcM (TcGblEnv, [InstInfo GhcRn], [DerivInfo], ThBindEnv)
    tcTyAndClassDecls [TyClGroup GhcRn]
    tyclds_s
      -- The code recovers internally, but if anything gave rise to
      -- an error we'd better stop now, to avoid a cascade
      -- Type check each group in dependency order folding the global env
      = TcM (TcGblEnv, [InstInfo GhcRn], [DerivInfo], ThBindEnv)
    -> TcM (TcGblEnv, [InstInfo GhcRn], [DerivInfo], ThBindEnv)
    forall r. TcM r -> TcM r
    checkNoErrs (TcM (TcGblEnv, [InstInfo GhcRn], [DerivInfo], ThBindEnv)
     -> TcM (TcGblEnv, [InstInfo GhcRn], [DerivInfo], ThBindEnv))
    -> TcM (TcGblEnv, [InstInfo GhcRn], [DerivInfo], ThBindEnv)
    -> TcM (TcGblEnv, [InstInfo GhcRn], [DerivInfo], ThBindEnv)
    forall a b. (a -> b) -> a -> b
    $ [InstInfo GhcRn]
    -> [DerivInfo]
    -> ThBindEnv
    -> [TyClGroup GhcRn]
    -> TcM (TcGblEnv, [InstInfo GhcRn], [DerivInfo], ThBindEnv)
    fold_env [] [] ThBindEnv
    forall a. NameEnv a
    emptyNameEnv [TyClGroup GhcRn]
    tyclds_s
      where
        fold_env :: [InstInfo GhcRn]
                 -> [DerivInfo]
                 -> ThBindEnv
                 -> [TyClGroup GhcRn]
                 -> TcM (TcGblEnv, [InstInfo GhcRn], [DerivInfo], ThBindEnv)
        fold_env :: [InstInfo GhcRn]
    -> [DerivInfo]
    -> ThBindEnv
    -> [TyClGroup GhcRn]
    -> TcM (TcGblEnv, [InstInfo GhcRn], [DerivInfo], ThBindEnv)
    fold_env [InstInfo GhcRn]
    inst_info [DerivInfo]
    deriv_info ThBindEnv
    th_bndrs []
          = do { gbl_env <- TcRnIf TcGblEnv TcLclEnv TcGblEnv
    forall gbl lcl. TcRnIf gbl lcl gbl
    getGblEnv
               ; return (gbl_env, inst_info, deriv_info, th_bndrs) }
        fold_env [InstInfo GhcRn]
    inst_info [DerivInfo]
    deriv_info ThBindEnv
    th_bndrs (TyClGroup GhcRn
    tyclds:[TyClGroup GhcRn]
    tyclds_s)
          = do { (tcg_env, inst_info', deriv_info', th_bndrs')
                   <- TyClGroup GhcRn
    -> TcM (TcGblEnv, [InstInfo GhcRn], [DerivInfo], ThBindEnv)
    tcTyClGroup TyClGroup GhcRn
    tyclds
               ; setGblEnv tcg_env $
                   -- remaining groups are typechecked in the extended global env.
                 fold_env (inst_info' ++ inst_info)
                          (deriv_info' ++ deriv_info)
                          (th_bndrs' `plusNameEnv` th_bndrs)
                          tyclds_s }

    tcTyClGroup :: TyClGroup GhcRn
                -> TcM (TcGblEnv, [InstInfo GhcRn], [DerivInfo], ThBindEnv)
    -- Typecheck one strongly-connected component of type, class, and instance decls
    -- See Note [TyClGroups and dependency analysis] in GHC.Hs.Decls
    tcTyClGroup :: TyClGroup GhcRn
    -> TcM (TcGblEnv, [InstInfo GhcRn], [DerivInfo], ThBindEnv)
    tcTyClGroup (TyClGroup { group_tyclds :: forall pass. TyClGroup pass -> [LTyClDecl pass]
    group_tyclds = [LTyClDecl GhcRn]
    tyclds
                           , group_roles :: forall pass. TyClGroup pass -> [LRoleAnnotDecl pass]
    group_roles  = [LRoleAnnotDecl GhcRn]
    roles
                           , group_kisigs :: forall pass. TyClGroup pass -> [LStandaloneKindSig pass]
    group_kisigs = [LStandaloneKindSig GhcRn]
    kisigs
                           , group_instds :: forall pass. TyClGroup pass -> [LInstDecl pass]
    group_instds = [LInstDecl GhcRn]
    instds })
      = do { let role_annots :: RoleAnnotEnv
    role_annots = [LRoleAnnotDecl GhcRn] -> RoleAnnotEnv
    mkRoleAnnotEnv [LRoleAnnotDecl GhcRn]
    roles

               -- Step 1: Typecheck the standalone kind signatures and type/class declarations
           ; String -> SDoc -> TcRn ()
    traceTc String
    "---- tcTyClGroup ---- {" SDoc
    forall doc. IsOutput doc => doc
    empty
           ; String -> SDoc -> TcRn ()
    traceTc String
    "Decls for" ([IdGhcP 'Renamed] -> SDoc
    forall a. Outputable a => a -> SDoc
    ppr ((GenLocated SrcSpanAnnA (TyClDecl GhcRn) -> IdGhcP 'Renamed)
    -> [GenLocated SrcSpanAnnA (TyClDecl GhcRn)] -> [IdGhcP 'Renamed]
    forall a b. (a -> b) -> [a] -> [b]
    map (TyClDecl GhcRn -> IdP GhcRn
    TyClDecl GhcRn -> IdGhcP 'Renamed
    forall (p :: Pass).
    (Anno (IdGhcP p) ~ SrcSpanAnnN) =>
    TyClDecl (GhcPass p) -> IdP (GhcPass p)
    tcdName (TyClDecl GhcRn -> IdGhcP 'Renamed)
    -> (GenLocated SrcSpanAnnA (TyClDecl GhcRn) -> TyClDecl GhcRn)
    -> GenLocated SrcSpanAnnA (TyClDecl GhcRn)
    -> IdGhcP 'Renamed
    forall b c a. (b -> c) -> (a -> b) -> a -> c
    . GenLocated SrcSpanAnnA (TyClDecl GhcRn) -> TyClDecl GhcRn
    forall l e. GenLocated l e -> e
    unLoc) [LTyClDecl GhcRn]
    [GenLocated SrcSpanAnnA (TyClDecl GhcRn)]
    tyclds))
           ; (tyclss_with_validity_infos, data_deriv_info, kindless) <-
               NameEnv TcTyThing
    -> TcM ([(TyCon, [TyFamEqnValidityInfo])], [DerivInfo], NameSet)
    -> TcM ([(TyCon, [TyFamEqnValidityInfo])], [DerivInfo], NameSet)
    forall r. NameEnv TcTyThing -> TcM r -> TcM r
    tcExtendKindEnv ([LTyClDecl GhcRn] -> NameEnv TcTyThing
    mkPromotionErrorEnv [LTyClDecl GhcRn]
    tyclds) (TcM ([(TyCon, [TyFamEqnValidityInfo])], [DerivInfo], NameSet)
     -> TcM ([(TyCon, [TyFamEqnValidityInfo])], [DerivInfo], NameSet))
    -> TcM ([(TyCon, [TyFamEqnValidityInfo])], [DerivInfo], NameSet)
    -> TcM ([(TyCon, [TyFamEqnValidityInfo])], [DerivInfo], NameSet)
    forall a b. (a -> b) -> a -> b
    $ -- See Note [Type environment evolution]
               do { kisig_env <- [(Name, Type)] -> NameEnv Type
    forall a. [(Name, a)] -> NameEnv a
    mkNameEnv ([(Name, Type)] -> NameEnv Type)
    -> IOEnv (Env TcGblEnv TcLclEnv) [(Name, Type)]
    -> IOEnv (Env TcGblEnv TcLclEnv) (NameEnv Type)
    forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
    <$> (GenLocated SrcSpanAnnA (StandaloneKindSig GhcRn)
     -> IOEnv (Env TcGblEnv TcLclEnv) (Name, Type))
    -> [GenLocated SrcSpanAnnA (StandaloneKindSig GhcRn)]
    -> IOEnv (Env TcGblEnv TcLclEnv) [(Name, Type)]
    forall (t :: * -> *) (f :: * -> *) a b.
    (Traversable t, Applicative f) =>
    (a -> f b) -> t a -> f (t b)
    forall (f :: * -> *) a b.
    Applicative f =>
    (a -> f b) -> [a] -> f [b]
    traverse LStandaloneKindSig GhcRn
    -> IOEnv (Env TcGblEnv TcLclEnv) (Name, Type)
    GenLocated SrcSpanAnnA (StandaloneKindSig GhcRn)
    -> IOEnv (Env TcGblEnv TcLclEnv) (Name, Type)
    tcStandaloneKindSig [LStandaloneKindSig GhcRn]
    [GenLocated SrcSpanAnnA (StandaloneKindSig GhcRn)]
    kisigs
                  ; tcTyClDecls tyclds kisig_env role_annots }
           ; let tyclss = ((TyCon, [TyFamEqnValidityInfo]) -> TyCon)
    -> [(TyCon, [TyFamEqnValidityInfo])] -> [TyCon]
    forall a b. (a -> b) -> [a] -> [b]
    map (TyCon, [TyFamEqnValidityInfo]) -> TyCon
    forall a b. (a, b) -> a
    fst [(TyCon, [TyFamEqnValidityInfo])]
    tyclss_with_validity_infos
               -- Step 1.5: Make sure we don't have any type synonym cycles

           ; traceTc "Starting synonym cycle check" (ppr tyclss)
           ; home_unit <- hsc_home_unit <$> getTopEnv
           ; checkSynCycles (homeUnitAsUnit home_unit) tyclss tyclds
           ; traceTc "Done synonym cycle check" (ppr tyclss)

               -- Step 2: Perform the validity check on those types/classes
               -- We can do this now because we are done with the recursive knot
               -- Do it before Step 3 (adding implicit things) because the latter
               -- expects well-formed TyCons
           ; traceTc "Starting validity check" (ppr tyclss)
           ; tyclss <- tcExtendTyConEnv tyclss $
               -- NB: put the TyCons in the environment for validity checking,
               -- as we might look them up in checkTyConConsistentWithBoot.
               -- See Note [TyCon boot consistency checking].
              fmap concat . for tyclss_with_validity_infos $ \ (TyCon
    tycls, [TyFamEqnValidityInfo]
    ax_validity_infos) ->
              do { SDoc -> Name -> TcRn () -> TcRn ()
    forall a. SDoc -> Name -> TcM a -> TcM a
    tcAddFamInstCtxt (String -> SDoc
    forall doc. IsLine doc => String -> doc
    text String
    "type family") (TyCon -> Name
    tyConName TyCon
    tycls) (TcRn () -> TcRn ()) -> TcRn () -> TcRn ()
    forall a b. (a -> b) -> a -> b
    $
                   TyCon -> TcRn () -> TcRn ()
    forall a. TyCon -> TcM a -> TcM a
    tcAddClosedTypeFamilyDeclCtxt TyCon
    tycls (TcRn () -> TcRn ()) -> TcRn () -> TcRn ()
    forall a b. (a -> b) -> a -> b
    $
                     (TyFamEqnValidityInfo -> TcRn ())
    -> [TyFamEqnValidityInfo] -> TcRn ()
    forall (t :: * -> *) (m :: * -> *) a b.
    (Foldable t, Monad m) =>
    (a -> m b) -> t a -> m ()
    mapM_ (TyCon -> TyFamEqnValidityInfo -> TcRn ()
    checkTyFamEqnValidityInfo TyCon
    tycls) [TyFamEqnValidityInfo]
    ax_validity_infos
                 ; TyCon -> TcM [TyCon]
    checkValidTyCl TyCon
    tycls }

           ; traceTc "Done validity check" (ppr tyclss)
           ; mapM_ (recoverM (return ()) . checkValidRoleAnnots role_annots) tyclss
               -- See Note [Check role annotations in a second pass]

           ; traceTc "---- end tcTyClGroup ---- }" empty

               -- Step 3: Add the implicit things;
               -- we want them in the environment because
               -- they may be mentioned in interface files
           ; (gbl_env, th_bndrs) <- addTyConsToGblEnv tyclss

               -- Step 4: check instance declarations
           ; (gbl_env', inst_info, datafam_deriv_info, th_bndrs') <-
             setGblEnv gbl_env $
             tcInstDecls1 instds

           ; let deriv_info = [DerivInfo]
    datafam_deriv_info [DerivInfo] -> [DerivInfo] -> [DerivInfo]
    forall a. [a] -> [a] -> [a]
    ++ [DerivInfo]
    data_deriv_info
           ; let gbl_env'' = TcGblEnv
    gbl_env'
                    { tcg_ksigs = tcg_ksigs gbl_env' `unionNameSet` kindless }
           ; return (gbl_env'', inst_info, deriv_info,
                     th_bndrs' `plusNameEnv` th_bndrs) }

    -- Gives the kind for every TyCon that has a standalone kind signature
    type KindSigEnv = NameEnv Kind

    tcTyClDecls
      :: [LTyClDecl GhcRn]
      -> KindSigEnv
      -> RoleAnnotEnv
      -> TcM ([(TyCon, [TyFamEqnValidityInfo])], [DerivInfo], NameSet)
    tcTyClDecls :: [LTyClDecl GhcRn]
    -> NameEnv Type
    -> RoleAnnotEnv
    -> TcM ([(TyCon, [TyFamEqnValidityInfo])], [DerivInfo], NameSet)
    tcTyClDecls [LTyClDecl GhcRn]
    tyclds NameEnv Type
    kisig_env RoleAnnotEnv
    role_annots
      = do {    -- Step 1: kind-check this group and returns the final
                -- (possibly-polymorphic) kind of each TyCon and Class
                -- See Note [Kind checking for type and class decls]
             (tc_tycons, kindless) <- TcM ([TyCon], NameSet) -> TcM ([TyCon], NameSet)
    forall r. TcM r -> TcM r
    checkNoErrs (TcM ([TyCon], NameSet) -> TcM ([TyCon], NameSet))
    -> TcM ([TyCon], NameSet) -> TcM ([TyCon], NameSet)
    forall a b. (a -> b) -> a -> b
    $
                                      NameEnv Type -> [LTyClDecl GhcRn] -> TcM ([TyCon], NameSet)
    kcTyClGroup NameEnv Type
    kisig_env [LTyClDecl GhcRn]
    tyclds
                -- checkNoErrs: If the TyCons are ill-kinded, stop now.  Else we
                -- can get follow-on errors. Example: #23252, where the TyCon
                -- had an ill-scoped kind forall (d::k) k (a::k). blah
                -- and that ill-scoped kind made role inference fall over.

           ; traceTc "tcTyAndCl generalized kinds" (vcat (map ppr_tc_tycon tc_tycons))

                -- Step 2: type-check all groups together, returning
                -- the final TyCons and Classes
                --
                -- NB: We have to be careful here to NOT eagerly unfold
                -- type synonyms, as we have not tested for type synonym
                -- loops yet and could fall into a black hole.
           ; fixM $ \ ~([(TyCon, [TyFamEqnValidityInfo])]
    rec_tyclss_with_validity_infos, [DerivInfo]
    _, NameSet
    _) -> do
               { tcg_env <- TcRnIf TcGblEnv TcLclEnv TcGblEnv
    forall gbl lcl. TcRnIf gbl lcl gbl
    getGblEnv
                     -- Forced so we don't retain a reference to the TcGblEnv
               ; let !src  = TcGblEnv -> HscSource
    tcg_src TcGblEnv
    tcg_env
                     rec_tyclss = ((TyCon, [TyFamEqnValidityInfo]) -> TyCon)
    -> [(TyCon, [TyFamEqnValidityInfo])] -> [TyCon]
    forall a b. (a -> b) -> [a] -> [b]
    map (TyCon, [TyFamEqnValidityInfo]) -> TyCon
    forall a b. (a, b) -> a
    fst [(TyCon, [TyFamEqnValidityInfo])]
    rec_tyclss_with_validity_infos
                     roles = HscSource -> RoleAnnotEnv -> [TyCon] -> Name -> [Role]
    inferRoles HscSource
    src RoleAnnotEnv
    role_annots [TyCon]
    rec_tyclss

                     -- Populate environment with knot-tied ATyCon for TyCons
                     -- NB: if the decls mention any ill-staged data cons
                     -- (see Note [Recursion and promoting data constructors])
                     -- we will have failed already in kcTyClGroup, so no worries here
               ; (tycons, data_deriv_infos) <-
                 tcExtendRecEnv (zipRecTyClss tc_tycons rec_tyclss) $

                     -- Also extend the local type envt with bindings giving
                     -- a TcTyCon for each knot-tied TyCon or Class
                     -- See Note [Type checking recursive type and class declarations]
                     -- and Note [Type environment evolution]
                 tcExtendKindEnvWithTyCons tc_tycons $

                     -- Kind and type check declarations for this group
                   mapAndUnzipM (tcTyClDecl roles) tyclds
               ; return (tycons, concat data_deriv_infos, kindless)
               } }
      where
        ppr_tc_tycon :: TyCon -> SDoc
    ppr_tc_tycon TyCon
    tc = SDoc -> SDoc
    forall doc. IsLine doc => doc -> doc
    parens ([SDoc] -> SDoc
    forall doc. IsLine doc => [doc] -> doc
    sep [ Name -> SDoc
    forall a. Outputable a => a -> SDoc
    ppr (TyCon -> Name
    tyConName TyCon
    tc) SDoc -> SDoc -> SDoc
    forall doc. IsLine doc => doc -> doc -> doc
    <> SDoc
    forall doc. IsLine doc => doc
    comma
                                      , [TyConBinder] -> SDoc
    forall a. Outputable a => a -> SDoc
    ppr (TyCon -> [TyConBinder]
    tyConBinders TyCon
    tc) SDoc -> SDoc -> SDoc
    forall doc. IsLine doc => doc -> doc -> doc
    <> SDoc
    forall doc. IsLine doc => doc
    comma
                                      , Type -> SDoc
    forall a. Outputable a => a -> SDoc
    ppr (TyCon -> Type
    tyConResKind TyCon
    tc)
                                      , Bool -> SDoc
    forall a. Outputable a => a -> SDoc
    ppr (TyCon -> Bool
    isTcTyCon TyCon
    tc) ])

    zipRecTyClss :: [TcTyCon]
                 -> [TyCon]           -- Knot-tied
                 -> [(Name,TyThing)]
    -- Build a name-TyThing mapping for the TyCons bound by decls
    -- being careful not to look at the knot-tied [TyThing]
    -- The TyThings in the result list must have a visible ATyCon,
    -- because typechecking types (in, say, tcTyClDecl) looks at
    -- this outer constructor
    zipRecTyClss :: [TyCon] -> [TyCon] -> [(Name, TyThing)]
    zipRecTyClss [TyCon]
    tc_tycons [TyCon]
    rec_tycons
      = [ (Name
    name, TyCon -> TyThing
    ATyCon (Name -> TyCon
    get Name
    name)) | TyCon
    tc_tycon <- [TyCon]
    tc_tycons, let name :: Name
    name = TyCon -> Name
    forall a. NamedThing a => a -> Name
    getName TyCon
    tc_tycon ]
      where
        rec_tc_env :: NameEnv TyCon
        rec_tc_env :: NameEnv TyCon
    rec_tc_env = (TyCon -> NameEnv TyCon -> NameEnv TyCon)
    -> NameEnv TyCon -> [TyCon] -> NameEnv TyCon
    forall a b. (a -> b -> b) -> b -> [a] -> b
    forall (t :: * -> *) a b.
    Foldable t =>
    (a -> b -> b) -> b -> t a -> b
    foldr TyCon -> NameEnv TyCon -> NameEnv TyCon
    add_tc NameEnv TyCon
    forall a. NameEnv a
    emptyNameEnv [TyCon]
    rec_tycons

        add_tc :: TyCon -> NameEnv TyCon -> NameEnv TyCon
        add_tc :: TyCon -> NameEnv TyCon -> NameEnv TyCon
    add_tc TyCon
    tc NameEnv TyCon
    env = (TyCon -> NameEnv TyCon -> NameEnv TyCon)
    -> NameEnv TyCon -> [TyCon] -> NameEnv TyCon
    forall a b. (a -> b -> b) -> b -> [a] -> b
    forall (t :: * -> *) a b.
    Foldable t =>
    (a -> b -> b) -> b -> t a -> b
    foldr TyCon -> NameEnv TyCon -> NameEnv TyCon
    add_one_tc NameEnv TyCon
    env (TyCon
    tc TyCon -> [TyCon] -> [TyCon]
    forall a. a -> [a] -> [a]
    : TyCon -> [TyCon]
    tyConATs TyCon
    tc)

        add_one_tc :: TyCon -> NameEnv TyCon -> NameEnv TyCon
        add_one_tc :: TyCon -> NameEnv TyCon -> NameEnv TyCon
    add_one_tc TyCon
    tc NameEnv TyCon
    env = NameEnv TyCon -> Name -> TyCon -> NameEnv TyCon
    forall a. NameEnv a -> Name -> a -> NameEnv a
    extendNameEnv NameEnv TyCon
    env (TyCon -> Name
    tyConName TyCon
    tc) TyCon
    tc

        get :: Name -> TyCon
    get Name
    name = case NameEnv TyCon -> Name -> Maybe TyCon
    forall a. NameEnv a -> Name -> Maybe a
    lookupNameEnv NameEnv TyCon
    rec_tc_env Name
    name of
                     Just TyCon
    tc -> TyCon
    tc
                     Maybe TyCon
    other   -> String -> SDoc -> TyCon
    forall a. HasCallStack => String -> SDoc -> a
    pprPanic String
    "zipRecTyClss" (Name -> SDoc
    forall a. Outputable a => a -> SDoc
    ppr Name
    name SDoc -> SDoc -> SDoc
    forall doc. IsLine doc => doc -> doc -> doc
    <+> Maybe TyCon -> SDoc
    forall a. Outputable a => a -> SDoc
    ppr Maybe TyCon
    other)

    {-
    ************************************************************************
    *                                                                      *
                    Kind checking
    *                                                                      *
    ************************************************************************

    Note [Kind checking for type and class decls]
    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    Kind checking is done thus:

       1. Make up a kind variable for each parameter of the declarations,
          and extend the kind environment (which is in the TcLclEnv)

       2. Kind check the declarations

    We need to kind check all types in the mutually recursive group
    before we know the kind of the type variables.  For example:

      class C a where
         op :: D b => a -> b -> b

      class D c where
         bop :: (Monad c) => ...

    Here, the kind of the locally-polymorphic type variable "b"
    depends on *all the uses of class D*.  For example, the use of
    Monad c in bop's type signature means that D must have kind Type->Type.

    Note: we don't treat type synonyms specially (we used to, in the past);
    in particular, even if we have a type synonym cycle, we still kind check
    it normally, and test for cycles later (checkSynCycles).  The reason
    we can get away with this is because we have more systematic TYPE r
    inference, which means that we can do unification between kinds that
    aren't lifted (this historically was not true.)

    The downside of not directly reading off the kinds of the RHS of
    type synonyms in topological order is that we don't transparently
    support making synonyms of types with higher-rank kinds.  But
    you can always specify a CUSK directly to make this work out.
    See tc269 for an example.

    Note [TcTyCon, MonoTcTyCon, and PolyTcTyCon]
    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    A TcTyCon is one of the variants of TyCon.  First, here are its invariants:

    * TcTyCon: a TyCon built with the TcTyCon constructor
      A TcTyCon contains TcTyVars in its binders and kind

    * TcTyConBinder: a TyConBinder with a TcTyVar inside (not a TyVar)

    * MonoTcTyCon: a form of TcTyCon
      - Flag tcTyConIsPoly = False

      - tyConBinders are TcTyConBinders: they contain TcTyVars, which are
        unification variables (TyVarTv), and whose kinds may contain
        unification variables.

      - tyConKind: the Monomorphic Recursion Principle:
           a MonoTcTyCon has a /monomorphic kind/.
        See Note [No polymorphic recursion in type decls].
        But the tyConKind may contain free unification variables.

      - tyConScopedTyVars is important; maps a Name to a TyVarTv unification variable
        The order matters: Specified then Required variables.
        E.g. in
            data T a (b :: k) = ...
        the order will be [k, a, b].

        We do not allow @k-binders in inference mode, so we do not need to worry about
           data T a @k (b :: k) = ...
        where we would have to put `k` (Specified) after `a` (Required)

        NB: There are no Inferred binders in tyConScopedTyVars; 'a' may
        also be poly-kinded, but that kind variable will be added by
        generaliseTcTyCon, in the passage to a PolyTcTyCon.

      - tyConBinders are irrelevant; we just use tcTyConScopedTyVars
        Well not /quite/ irrelevant:
          * its length gives the number of explicit binders, and so allows us to
            distinguish between the implicit and explicit elements of
            tyConScopedTyVars.
          * at construction time (mkTcTyCon) for a MonoTcTyCon (the call to mkTcTyCon
            in GHC.Tc.Gen.HsType.kcInferDeclHeader) the tyConBinders are used to
            construct the tyConKind; all must have AnonTCB visiblity so we we get
            a monokind.

    * PolyTcTyCon: a form of TcTyCon
      - Flag tcTyConIsPoly = True; this is used only to short-cut zonking

      - tyConBinders are still TcTyConBinders, but they are /skolem/ TcTyVars,
        with fixed kinds, and accurate skolem info: no unification variables here

        tyConBinders includes the Inferred binders if any

        tyConBinders uses the Names from the original, renamed program.

      - tcTyConScopedTyVars is irrelevant: just use (binderVars tyConBinders)
        All the types have been swizzled back to use the original Names
        See Note [tyConBinders and lexical scoping] in GHC.Core.TyCon

    The main purpose of these TcTyCons is during kind-checking of
    type/class declarations (in GHC.Tc.TyCl).  During kind checking we
    come upon knowledge of the eventual tycon in bits and pieces, and we
    use a TcTyCon to record what we know before we are ready to build the
    final TyCon.  Here is the plan:

    * Step 1 (inferInitialKinds, called from kcTyClGroup
              inference only, skipped for checking):
      Make a MonoTcTyCon whose binders are TcTyVars,
      that may contain free unification variables.
      See Note [No polymorphic recursion in type decls]

    * Step 2 (kcTyClDecl, called from kcTyClGroup)
      Kind-check the declarations of the group; this step just does
      unifications that affect the unification variables created in
      Step 1

    * Step 3 (generaliseTcTyCon, called from kcTyClGroup)
      Generalise that MonoTcTyCon to make a PolyTcTyCon
      Its binders are skolem TcTyVars, with accurate SkolemInfo

    * Step 4 (tcTyClDecl, called from tcTyClDecls)
      Typecheck the type and class decls to produce a final TyCon
      Its binders are final TyVars, not TcTyVars

    Note that a MonoTcTyCon can contain unification variables, but a
    PolyTcTyCon does not: only skolem TcTyVars.  See the invariants above.

    More details about /kind inference/:

    S1) In kcTyClGroup, we use inferInitialKinds to look over the
        declaration of any TyCon that lacks a kind signature or
        CUSK, to determine its "shape"; for example, the number of
        parameters, and any kind signatures.

        We record that shape record that shape in a MonoTcTyCon; it is
        "mono" because it has not been been generalised, and its binders
        and result kind may have free unification variables.

    S2) Still in kcTyClGroup, we use kcLTyClDecl to kind-check the
        body (class methods, data constructors, etc.) of each of
        these MonoTcTyCons, which has the effect of filling in the
        metavariables in the tycon's initial kind.

    S3) Still in kcTyClGroup, we use generaliseTyClDecl to generalize
        each MonoTcTyCon to get a PolyTcTyCon, with skolem TcTyVars in it,
        and a final, fixed kind.

    S4) Finally, back in tcTyClDecls, we extend the environment with
        the PolyTcTyCons, and typecheck each declaration (regardless
        of kind signatures etc) to get final TyCon.

    More details about /kind checking/

    S5) In kcTyClGroup, we use checkInitialKinds to get the
        utterly-final Kind of all TyCons in the group that
          (a) have a standalone kind signature or
          (b) have a CUSK.
        This produces a PolyTcTyCon, that is, a TcTyCon in which the binders
        and result kind are full of TyVars (not TcTyVars).  No unification
        variables here; everything is in its final form.

    Wrinkles:

    (W1) When recovering from a type error in a type declaration,
         we want to put the erroneous TyCon in the environment in a
         way that won't lead to more errors.  We use a PolyTcTyCon for this;
         see makeRecoveryTyCon.

    (W2) tyConScopedTyVars.  A challenging piece in all of this is that we
         end up taking three separate passes over every declaration:
           - one in inferInitialKind (this pass look only at the head, not the body)
           - one in kcTyClDecls (to kind-check the body)
           - a final one in tcTyClDecls (to desugar)

         In the latter two passes, we need to connect the user-written type
         variables in an LHsQTyVars with the variables in the tycon's
         inferred kind. Because the tycon might not have a CUSK, this
         matching up is, in general, quite hard to do.  (Look through the
         git history between Dec 2015 and Apr 2016 for
         GHC.Tc.Gen.HsType.splitTelescopeTvs!)

         Instead of trying, we just store the list of type variables to
         bring into scope, in the tyConScopedTyVars field of a MonoTcTyCon.
         These tyvars are brought into scope by the calls to
            tcExtendNameTyVarEnv (tcTyConScopedTyVars tycon)
         in kcTyClDecl.

         In a TcTyCon, why is tyConScopedTyVars :: [(Name,TcTyVar)] rather
         than just [TcTyVar]?  Consider these mutually-recursive decls
            data T (a :: k1) b = MkT (S a b)
            data S (c :: k2) d = MkS (T c d)
         We start with k1 bound to kappa1, and k2 to kappa2; so initially
         in the (Name,TcTyVar) pairs the Name is that of the TcTyVar. But
         then kappa1 and kappa2 get unified; so after the zonking in
         'generalise' in 'kcTyClGroup' the Name and TcTyVar may differ.

    See also Note [Type checking recursive type and class declarations].

    Note [No polymorphic recursion in type decls]
    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    In GHC.Tc.HsType.kcInferDeclHeader we use mkAnonTyConBinders to make
    the TyConBinders for the MonoTcTyCon.  Here is why.

    Should this kind-check (cf #16344)?
      data T ka (a::ka) b  = MkT (T Type           Int   Bool)
                                 (T (Type -> Type) Maybe Bool)

    Notice that T is used at two different kinds in its RHS.  No!
    This should not kind-check.  Polymorphic recursion is known to
    be a tough nut.

    Many moons ago, we laboriously (with help from the renamer) tried to give T
    the polymorphic kind
       T :: forall ka -> ka -> kappa -> Type
    where kappa is a unification variable, even in the inferInitialKinds phase
    (which is what kcInferDeclHeader is all about).  But that is dangerously
    fragile (see #16344), because `kappa` might get unified with `ka`, and
    depending on just /when/ that unification happens, the instantiation of T's
    kind would vary between different call sites of T.

    We encountered similar trickiness with invisible binders in type
    declarations: see Note [No inference for invisible binders in type decls]

    Solution: the Monomorphic Recursion Principle:

        A MonoTcTyCon has a monomoprhic kind (no foralls!)

    See the invariants on MonoTcTyCon in Note [TcTyCon, MonoTcTyCon, and PolyTcTyCon].

    So kcInferDeclHeader gives T a straightforward monomorphic kind, with no
    quantification whatsoever. That's why we always use mkAnonTyConBinder for
    all arguments when figuring out tc_binders.

    But notice that (#16344 comment:3)

    * Consider this declaration:
        data T2 ka (a::ka) = MkT2 (T2 Type a)

      Starting with inferInitialKinds
      (Step 1 of Note [TcTyCon, MonoTcTyCon, and PolyTcTyCon]):
        MonoTcTyCon binders:
          ka[tyv] :: (kappa1[tau] :: Type)
           a[tyv] :: (ka[tyv]     :: Type)
        MonoTcTyCon kind:
          T2 :: kappa1[tau] -> ka[tyv] -> Type

      Given this kind for T2, in Step 2 we kind-check (T2 Type a)
      from where we see
        T2's first arg:  (kappa1 ~ Type)
        T2's second arg: (ka ~ ka)
      These constraints are soluble by (kappa1 := Type)
      so generaliseTcTyCon (Step 3) gives
        T2 :: forall (k::Type) -> k -> *

      But now the /typechecking/ (Step 4, aka desugaring, tcTyClDecl)
      phase fails, because the call (T2 Type a) in the RHS is ill-kinded.

      We'd really prefer all errors to show up in the kind checking phase.

    * This algorithm still accepts (in all phases)
         data T3 ka (a::ka) = forall b. MkT3 (T3 Type b)
      although T3 is really polymorphic-recursive too.
      Perhaps we should somehow reject that.

    Note [No inference for invisible binders in type decls]
    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    Suppose we have (#22560):
       data T @k (a::k) = MkT (...(T ty)...)
    What monokind can we give to T after step 1 of the kind inference
    algorithm described in Note [TcTyCon, MonoTcTyCon, and PolyTcTyCon]?
    Remember: Step 1 generates a MonoTcTyCon.

    It can't be
      T :: kappa1 -> kappa2 -> Type
    because the invocation `(T ty)` doesn't have a visible argument for `kappa`.
    Nor can it be
      T :: forall k. kappa2 -> Type
    because that breaks the Monomorphic Recursion Principle: MonoTcTyCons have
    monomorphic kinds; see Note [No polymorphic recursion in type decls]. It could be
      T :: kappa1 ->. kappa2 -> type
    where `->.` is a new kind of arrow in kinds, which (like a type-class argument
    in terms) is invisibly instantiated.  Or we could fake it with
      T :: forall _. kappa2 -> Type
    where `_` is a completely fresh variable, but that seems very smelly and makes it
    harder to talk about the Monomorphic Recursion Principle.  Moreover we'd need
    some extra fancy types in TyConBinders to record this extra information.

    Note that in *terms* we do not allow
      f @a (x::a) = rhs
    unless `f` has a type signature.  So we do the same for types:

      We allow `@` binders in data type declarations ONLY if the
      type constructor has a standalone kind signature (or a CUSK).

    That means that GHC.Tc.Gen.HsType.kcInferDeclHeader, which is used when we
    don't have a kind signature or CUSK, and builds a MonoTcTyCon, we can simply
    reject invisible binders outright (GHC.Tc.Gen.HsType.rejectInvisibleBinders);
    and continue to use mkAnonTyConBinders as described in
    Note [No polymorphic recursion in type decls].

    If we get cries of pain we can revist this decision.

    Note [CUSKs and PolyKinds]
    ~~~~~~~~~~~~~~~~~~~~~~~~~~
    Consider

        data T (a :: *) = MkT (S a)   -- Has CUSK
        data S a = MkS (T Int) (S a)  -- No CUSK

    Via inferInitialKinds we get
      T :: * -> *
      S :: kappa -> *

    Then we call kcTyClDecl on each decl in the group, to constrain the
    kind unification variables.  BUT we /skip/ the RHS of any decl with
    a CUSK.  Here we skip the RHS of T, so we eventually get
      S :: forall k. k -> *

    This gets us more polymorphism than we would otherwise get, similar
    (but implemented strangely differently from) the treatment of type
    signatures in value declarations.

    However, we only want to do so when we have PolyKinds.
    When we have NoPolyKinds, we don't skip those decls, because we have defaulting
    (#16609). Skipping won't bring us more polymorphism when we have defaulting.
    Consider

      data T1 a = MkT1 T2        -- No CUSK
      data T2 = MkT2 (T1 Maybe)  -- Has CUSK

    If we skip the rhs of T2 during kind-checking, the kind of a remains unsolved.
    With PolyKinds, we do generalization to get T1 :: forall a. a -> *. And the
    program type-checks.
    But with NoPolyKinds, we do defaulting to get T1 :: * -> *. Defaulting happens
    in quantifyTyVars, which is called from generaliseTcTyCon. Then type-checking
    (T1 Maybe) will throw a type error.

    Summary: with PolyKinds, we must skip; with NoPolyKinds, we must /not/ skip.

    Open type families
    ~~~~~~~~~~~~~~~~~~
    This treatment of type synonyms only applies to Haskell 98-style synonyms.
    General type functions can be recursive, and hence, appear in `alg_decls'.

    The kind of an open type family is solely determined by its kind signature;
    hence, only kind signatures participate in the construction of the initial
    kind environment (as constructed by `inferInitialKind'). In fact, we ignore
    instances of families altogether in the following. However, we need to include
    the kinds of *associated* families into the construction of the initial kind
    environment. (This is handled by `allDecls').

    See also Note [Kind checking recursive type and class declarations]

    Note [Swizzling the tyvars before generaliseTcTyCon]
    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    This Note only applies when /inferring/ the kind of a TyCon.
    If there is a separate kind signature, or a CUSK, we take an entirely
    different code path.

    For inference, consider
       class C (f :: k) x where
          type T f
          op :: D f => blah
       class D (g :: j) y where
          op :: C g => y -> blah

    Here C and D are considered mutually recursive.  Neither has a CUSK.
    Just before generalisation we have the (un-quantified) kinds
       C :: k1 -> k2 -> Constraint
       T :: k1 -> Type
       D :: k1 -> Type -> Constraint
    Notice that f's kind and g's kind have been unified to 'k1'. We say
    that k1 is the "representative" of k in C's decl, and of j in D's decl.

    Now when quantifying, we'd like to end up with
       C :: forall {k2}. forall k. k -> k2 -> Constraint
       T :: forall k. k -> Type
       D :: forall j. j -> Type -> Constraint

    That is, we want to swizzle the representative to have the Name given
    by the user. Partly this is to improve error messages and the output of
    :info in GHCi.  But it is /also/ important because the code for a
    default method may mention the class variable(s), but at that point
    (tcClassDecl2), we only have the final class tyvars available.
    (Alternatively, we could record the scoped type variables in the
    TyCon, but it's a nuisance to do so.)

    Notes:

    * On the input to generaliseTyClDecl, the mapping between the
      user-specified Name and the representative TyVar is recorded in the
      tyConScopedTyVars of the TcTyCon.  NB: you first need to zonk to see
      this representative TyVar.

    * The swizzling is actually performed by swizzleTcTyConBndrs

    * We must do the swizzling across the whole class decl. Consider
         class C f where
           type S (f :: k)
           type T f
      Here f's kind k is a parameter of C, and its identity is shared
      with S and T.  So if we swizzle the representative k at all, we
      must do so consistently for the entire declaration.

      Hence the call to check_duplicate_tc_binders is in generaliseTyClDecl,
      rather than in generaliseTcTyCon.

    There are errors to catch here.  Suppose we had
       class E (f :: j) (g :: k) where
         op :: SameKind f g -> blah

    Then, just before generalisation we will have the (unquantified)
       E :: k1 -> k1 -> Constraint

    That's bad!  Two distinctly-named tyvars (j and k) have ended up with
    the same representative k1.  So when swizzling, we check (in
    check_duplicate_tc_binders) that two distinct source names map
    to the same representative.

    Here's an interesting case:
        class C1 f where
          type S (f :: k1)
          type T (f :: k2)
    Here k1 and k2 are different Names, but they end up mapped to the
    same representative TyVar.  To make the swizzling consistent (remember
    we must have a single k across C1, S and T) we reject the program.

    Another interesting case
        class C2 f where
          type S (f :: k) (p::Type)
          type T (f :: k) (p::Type->Type)

    Here the two k's (and the two p's) get distinct Uniques, because they
    are seen by the renamer as locally bound in S and T resp.  But again
    the two (distinct) k's end up bound to the same representative TyVar.
    You might argue that this should be accepted, but it's definitely
    rejected (via an entirely different code path) if you add a kind sig:
        type C2' :: j -> Constraint
        class C2' f where
          type S (f :: k) (p::Type)
    We get
        • Expected kind ‘j’, but ‘f’ has kind ‘k’
        • In the associated type family declaration for ‘S’

    So we reject C2 too, even without the kind signature.  We have
    to do a bit of work to get a good error message, since both k's
    look the same to the user.

    Another case
        class C3 (f :: k1) where
          type S (f :: k2)

    This will be rejected too.

    Note [Type environment evolution]
    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    As we typecheck a group of declarations the type environment evolves.
    Consider for example:
      data B (a :: Type) = MkB (Proxy 'MkB)

    We do the following steps:

      1. Start of tcTyClDecls: use mkPromotionErrorEnv to initialise the
         type env with promotion errors
                B   :-> TyConPE
                MkB :-> DataConPE

      2. kcTyCLGroup
          - Do inferInitialKinds, which will signal a promotion
            error if B is used in any of the kinds needed to initialise
            B's kind (e.g. (a :: Type)) here

          - Extend the type env with these initial kinds (monomorphic for
            decls that lack a CUSK)
                B :-> TcTyCon <initial kind>
            (thereby overriding the B :-> TyConPE binding)
            and do kcLTyClDecl on each decl to get equality constraints on
            all those initial kinds

          - Generalise the initial kind, making a poly-kinded TcTyCon

      3. Back in tcTyDecls, extend the envt with bindings of the poly-kinded
         TcTyCons, again overriding the promotion-error bindings.

         But note that the data constructor promotion errors are still in place
         so that (in our example) a use of MkB will still be signalled as
         an error.

      4. Typecheck the decls.

      5. In tcTyClGroup, extend the envt with bindings for TyCon and DataCons

    Note [Missed opportunity to retain higher-rank kinds]
    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    In 'kcTyClGroup', there is a missed opportunity to make kind
    inference work in a few more cases.  The idea is analogous
    to Note [Special case for non-recursive function bindings]:

         * If we have an SCC with a single decl, which is non-recursive,
           instead of creating a unification variable representing the
           kind of the decl and unifying it with the rhs, we can just
           read the type directly of the rhs.

         * Furthermore, we can update our SCC analysis to ignore
           dependencies on declarations which have CUSKs: we don't
           have to kind-check these all at once, since we can use
           the CUSK to initialize the kind environment.

    Unfortunately this requires reworking a bit of the code in
    'kcLTyClDecl' so I've decided to punt unless someone shouts about it.

    Note [Don't process associated types in getInitialKind]
    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    Previously, we processed associated types in the thing_inside in getInitialKind,
    but this was wrong -- we want to do ATs separately.
    The consequence for not doing it this way is #15142:

      class ListTuple (tuple :: Type) (as :: [(k, Type)]) where
        type ListToTuple as :: Type

    We assign k a kind kappa[1]. When checking the tuple (k, Type), we try to unify
    kappa ~ Type, but this gets deferred because we bumped the TcLevel as we bring
    `tuple` into scope. Thus, when we check ListToTuple, kappa[1] still hasn't
    unified with Type. And then, when we generalize the kind of ListToTuple (which
    indeed has a CUSK, according to the rules), we skolemize the free metavariable
    kappa. Note that we wouldn't skolemize kappa when generalizing the kind of ListTuple,
    because the solveEqualities in kcInferDeclHeader is at TcLevel 1 and so kappa[1]
    will unify with Type.

    Bottom line: as associated types should have no effect on a CUSK enclosing class,
    we move processing them to a separate action, run after the outer kind has
    been generalized.

    -}

    kcTyClGroup :: KindSigEnv -> [LTyClDecl GhcRn] -> TcM ([PolyTcTyCon], NameSet)

    -- Kind check this group, kind generalize, and return the resulting local env
    -- This binds the TyCons and Classes of the group, but not the DataCons
    -- See Note [Kind checking for type and class decls]
    -- and Note [Inferring kinds for type declarations]
    --
    -- The NameSet returned contains kindless tycon names, without CUSK or SAKS.
    kcTyClGroup :: NameEnv Type -> [LTyClDecl GhcRn] -> TcM ([TyCon], NameSet)
    kcTyClGroup NameEnv Type
    kisig_env [LTyClDecl GhcRn]
    decls
      = do  { mod <- IOEnv (Env TcGblEnv TcLclEnv) Module
    forall (m :: * -> *). HasModule m => m Module
    getModule
            ; traceTc "---- kcTyClGroup ---- {"
                      (text "module" <+> ppr mod $$ vcat (map ppr decls))

              -- Kind checking;
              --    1. Bind kind variables for decls
              --    2. Kind-check decls
              --    3. Generalise the inferred kinds
              -- See Note [Kind checking for type and class decls]

            ; cusks_enabled <- xoptM LangExt.CUSKs <&&> xoptM LangExt.PolyKinds
                        -- See Note [CUSKs and PolyKinds]
            ; let (kindless_decls, kinded_decls) = partitionWith get_kind decls
                  kindless_names = [Name] -> NameSet
    mkNameSet ([Name] -> NameSet) -> [Name] -> NameSet
    forall a b. (a -> b) -> a -> b
    $ (GenLocated SrcSpanAnnA (TyClDecl GhcRn) -> Name)
    -> [GenLocated SrcSpanAnnA (TyClDecl GhcRn)] -> [Name]
    forall a b. (a -> b) -> [a] -> [b]
    map GenLocated SrcSpanAnnA (TyClDecl GhcRn) -> Name
    GenLocated SrcSpanAnnA (TyClDecl GhcRn) -> IdGhcP 'Renamed
    forall {p :: Pass} {l}.
    (Anno (IdGhcP p) ~ SrcSpanAnnN) =>
    GenLocated l (TyClDecl (GhcPass p)) -> IdGhcP p
    get_name [GenLocated SrcSpanAnnA (TyClDecl GhcRn)]
    kindless_decls

                  get_name GenLocated l (TyClDecl (GhcPass p))
    d = TyClDecl (GhcPass p) -> IdP (GhcPass p)
    forall (p :: Pass).
    (Anno (IdGhcP p) ~ SrcSpanAnnN) =>
    TyClDecl (GhcPass p) -> IdP (GhcPass p)
    tcdName (GenLocated l (TyClDecl (GhcPass p)) -> TyClDecl (GhcPass p)
    forall l e. GenLocated l e -> e
    unLoc GenLocated l (TyClDecl (GhcPass p))
    d)

                  get_kind GenLocated SrcSpanAnnA (TyClDecl GhcRn)
    d
                    | Just Type
    ki <- NameEnv Type -> Name -> Maybe Type
    forall a. NameEnv a -> Name -> Maybe a
    lookupNameEnv NameEnv Type
    kisig_env (GenLocated SrcSpanAnnA (TyClDecl GhcRn) -> IdGhcP 'Renamed
    forall {p :: Pass} {l}.
    (Anno (IdGhcP p) ~ SrcSpanAnnN) =>
    GenLocated l (TyClDecl (GhcPass p)) -> IdGhcP p
    get_name GenLocated SrcSpanAnnA (TyClDecl GhcRn)
    d)
                    = (GenLocated SrcSpanAnnA (TyClDecl GhcRn), SAKS_or_CUSK)
    -> Either
         (GenLocated SrcSpanAnnA (TyClDecl GhcRn))
         (GenLocated SrcSpanAnnA (TyClDecl GhcRn), SAKS_or_CUSK)
    forall a b. b -> Either a b
    Right (GenLocated SrcSpanAnnA (TyClDecl GhcRn)
    d, Type -> SAKS_or_CUSK
    SAKS Type
    ki)

                    | Bool
    cusks_enabled Bool -> Bool -> Bool
    && TyClDecl GhcRn -> Bool
    hsDeclHasCusk (GenLocated SrcSpanAnnA (TyClDecl GhcRn) -> TyClDecl GhcRn
    forall l e. GenLocated l e -> e
    unLoc GenLocated SrcSpanAnnA (TyClDecl GhcRn)
    d)
                    = (GenLocated SrcSpanAnnA (TyClDecl GhcRn), SAKS_or_CUSK)
    -> Either
         (GenLocated SrcSpanAnnA (TyClDecl GhcRn))
         (GenLocated SrcSpanAnnA (TyClDecl GhcRn), SAKS_or_CUSK)
    forall a b. b -> Either a b
    Right (GenLocated SrcSpanAnnA (TyClDecl GhcRn)
    d, SAKS_or_CUSK
    CUSK)

                    | Bool
    otherwise = GenLocated SrcSpanAnnA (TyClDecl GhcRn)
    -> Either
         (GenLocated SrcSpanAnnA (TyClDecl GhcRn))
         (GenLocated SrcSpanAnnA (TyClDecl GhcRn), SAKS_or_CUSK)
    forall a b. a -> Either a b
    Left GenLocated SrcSpanAnnA (TyClDecl GhcRn)
    d

            ; checked_tcs <- checkNoErrs $
                             checkInitialKinds kinded_decls
                             -- checkNoErrs because we are about to extend
                             -- the envt with these tycons, and we get
                             -- knock-on errors if we have tycons with
                             -- malformed kinds

            ; inferred_tcs
                <- tcExtendKindEnvWithTyCons checked_tcs  $
                   pushLevelAndSolveEqualities unkSkolAnon [] $
                         -- We are going to kind-generalise, so unification
                         -- variables in here must be one level in
                   do {  -- Step 1: Bind kind variables for all decls
                        mono_tcs <- inferInitialKinds kindless_decls

                      ; traceTc "kcTyClGroup: initial kinds" $
                        ppr_tc_kinds mono_tcs

                        -- Step 2: Set extended envt, kind-check the decls
                        -- NB: the environment extension overrides the tycon
                        --     promotion-errors bindings
                        --     See Note [Type environment evolution]
                      ; checkNoErrs $
                        tcExtendKindEnvWithTyCons mono_tcs $
                        mapM_ kcLTyClDecl kindless_decls

                      ; return mono_tcs }

            -- Step 3: generalisation
            -- Finally, go through each tycon and give it its final kind,
            -- with all the required, specified, and inferred variables
            -- in order.
            ; let inferred_tc_env = [(Name, TyCon)] -> NameEnv TyCon
    forall a. [(Name, a)] -> NameEnv a
    mkNameEnv ([(Name, TyCon)] -> NameEnv TyCon)
    -> [(Name, TyCon)] -> NameEnv TyCon
    forall a b. (a -> b) -> a -> b
    $
                                    (TyCon -> (Name, TyCon)) -> [TyCon] -> [(Name, TyCon)]
    forall a b. (a -> b) -> [a] -> [b]
    map (\TyCon
    tc -> (TyCon -> Name
    tyConName TyCon
    tc, TyCon
    tc)) [TyCon]
    inferred_tcs
            ; generalized_tcs <- concatMapM (generaliseTyClDecl inferred_tc_env)
                                            kindless_decls

            ; let poly_tcs = [TyCon]
    checked_tcs [TyCon] -> [TyCon] -> [TyCon]
    forall a. [a] -> [a] -> [a]
    ++ [TyCon]
    generalized_tcs
            ; traceTc "---- kcTyClGroup end ---- }" (ppr_tc_kinds poly_tcs)
            ; return (poly_tcs, kindless_names) }
      where
        ppr_tc_kinds :: [TyCon] -> SDoc
    ppr_tc_kinds [TyCon]
    tcs = [SDoc] -> SDoc
    forall doc. IsDoc doc => [doc] -> doc
    vcat ((TyCon -> SDoc) -> [TyCon] -> [SDoc]
    forall a b. (a -> b) -> [a] -> [b]
    map TyCon -> SDoc
    pp_tc [TyCon]
    tcs)
        pp_tc :: TyCon -> SDoc
    pp_tc TyCon
    tc = Name -> SDoc
    forall a. Outputable a => a -> SDoc
    ppr (TyCon -> Name
    tyConName TyCon
    tc) SDoc -> SDoc -> SDoc
    forall doc. IsLine doc => doc -> doc -> doc
    <+> SDoc
    dcolon SDoc -> SDoc -> SDoc
    forall doc. IsLine doc => doc -> doc -> doc
    <+> Type -> SDoc
    forall a. Outputable a => a -> SDoc
    ppr (TyCon -> Type
    tyConKind TyCon
    tc)

    type ScopedPairs = [(Name, TcTyVar)]
      -- The ScopedPairs for a TcTyCon are precisely
      --    specified-tvs ++ required-tvs
      -- You can distinguish them because there are tyConArity required-tvs

    generaliseTyClDecl :: NameEnv MonoTcTyCon -> LTyClDecl GhcRn -> TcM [PolyTcTyCon]
    -- See Note [Swizzling the tyvars before generaliseTcTyCon]
    generaliseTyClDecl :: NameEnv TyCon -> LTyClDecl GhcRn -> TcM [TyCon]
    generaliseTyClDecl NameEnv TyCon
    inferred_tc_env (L SrcSpanAnnA
    _ TyClDecl GhcRn
    decl)
      = do { let names_in_this_decl :: [Name]
                 names_in_this_decl :: [Name]
    names_in_this_decl = TyClDecl GhcRn -> [Name]
    tycld_names TyClDecl GhcRn
    decl

           ; tc_infos <- ZonkM [(TyCon, SkolemInfo, [(Name, Var)], Type)]
    -> TcM [(TyCon, SkolemInfo, [(Name, Var)], Type)]
    forall a. ZonkM a -> TcM a
    liftZonkM (ZonkM [(TyCon, SkolemInfo, [(Name, Var)], Type)]
     -> TcM [(TyCon, SkolemInfo, [(Name, Var)], Type)])
    -> ZonkM [(TyCon, SkolemInfo, [(Name, Var)], Type)]
    -> TcM [(TyCon, SkolemInfo, [(Name, Var)], Type)]
    forall a b. (a -> b) -> a -> b
    $
             do { -- Extract the specified/required binders and skolemise them
                ; tc_with_tvs  <- (Name -> ZonkM (TyCon, SkolemInfo, [(Name, Var)]))
    -> [Name] -> ZonkM [(TyCon, SkolemInfo, [(Name, Var)])]
    forall (t :: * -> *) (m :: * -> *) a b.
    (Traversable t, Monad m) =>
    (a -> m b) -> t a -> m (t b)
    forall (m :: * -> *) a b. Monad m => (a -> m b) -> [a] -> m [b]
    mapM Name -> ZonkM (TyCon, SkolemInfo, [(Name, Var)])
    skolemise_tc_tycon [Name]
    names_in_this_decl

                -- Zonk, to manifest the side-effects of skolemisation to the swizzler
                -- NB: it's important to skolemise them all before this step. E.g.
                --         class C f where { type T (f :: k) }
                --     We only skolemise k when looking at T's binders,
                --     but k appears in f's kind in C's binders.
                ; mapM zonk_tc_tycon tc_with_tvs }

           -- Swizzle
           ; swizzled_infos <- tcAddDeclCtxt decl (swizzleTcTyConBndrs tc_infos)

           -- And finally generalise
           ; mapAndReportM generaliseTcTyCon swizzled_infos }
      where
        tycld_names :: TyClDecl GhcRn -> [Name]
        tycld_names :: TyClDecl GhcRn -> [Name]
    tycld_names TyClDecl GhcRn
    decl = TyClDecl GhcRn -> IdP GhcRn
    forall (p :: Pass).
    (Anno (IdGhcP p) ~ SrcSpanAnnN) =>
    TyClDecl (GhcPass p) -> IdP (GhcPass p)
    tcdName TyClDecl GhcRn
    decl Name -> [Name] -> [Name]
    forall a. a -> [a] -> [a]
    : TyClDecl GhcRn -> [Name]
    at_names TyClDecl GhcRn
    decl

        at_names :: TyClDecl GhcRn -> [Name]
        at_names :: TyClDecl GhcRn -> [Name]
    at_names (ClassDecl { tcdATs :: forall pass. TyClDecl pass -> [LFamilyDecl pass]
    tcdATs = [LFamilyDecl GhcRn]
    ats }) = (GenLocated SrcSpanAnnA (FamilyDecl GhcRn) -> Name)
    -> [GenLocated SrcSpanAnnA (FamilyDecl GhcRn)] -> [Name]
    forall a b. (a -> b) -> [a] -> [b]
    map (FamilyDecl GhcRn -> IdP GhcRn
    FamilyDecl GhcRn -> Name
    forall (p :: Pass). FamilyDecl (GhcPass p) -> IdP (GhcPass p)
    familyDeclName (FamilyDecl GhcRn -> Name)
    -> (GenLocated SrcSpanAnnA (FamilyDecl GhcRn) -> FamilyDecl GhcRn)
    -> GenLocated SrcSpanAnnA (FamilyDecl GhcRn)
    -> Name
    forall b c a. (b -> c) -> (a -> b) -> a -> c
    . GenLocated SrcSpanAnnA (FamilyDecl GhcRn) -> FamilyDecl GhcRn
    forall l e. GenLocated l e -> e
    unLoc) [LFamilyDecl GhcRn]
    [GenLocated SrcSpanAnnA (FamilyDecl GhcRn)]
    ats
        at_names TyClDecl GhcRn
    _ = []  -- Only class decls have associated types

        skolemise_tc_tycon :: Name -> ZonkM (TcTyCon, SkolemInfo, ScopedPairs)
        -- Zonk and skolemise the Specified and Required binders
        skolemise_tc_tycon :: Name -> ZonkM (TyCon, SkolemInfo, [(Name, Var)])
    skolemise_tc_tycon Name
    tc_name
          = do { let tc :: TyCon
    tc = NameEnv TyCon -> Name -> TyCon
    forall a. NameEnv a -> Name -> a
    lookupNameEnv_NF NameEnv TyCon
    inferred_tc_env Name
    tc_name
                          -- This lookup should not fail
               ; skol_info <- SkolemInfoAnon -> ZonkM SkolemInfo
    forall (m :: * -> *). MonadIO m => SkolemInfoAnon -> m SkolemInfo
    mkSkolemInfo (TyConFlavour TyCon -> Name -> SkolemInfoAnon
    TyConSkol (TyCon -> TyConFlavour TyCon
    tyConFlavour TyCon
    tc) Name
    tc_name )
               ; scoped_prs <- mapSndM (zonkAndSkolemise skol_info) (tcTyConScopedTyVars tc)
               ; return (tc, skol_info, scoped_prs) }

        zonk_tc_tycon :: (TcTyCon, SkolemInfo, ScopedPairs)
                      -> ZonkM (TcTyCon, SkolemInfo, ScopedPairs, TcKind)
        zonk_tc_tycon :: (TyCon, SkolemInfo, [(Name, Var)])
    -> ZonkM (TyCon, SkolemInfo, [(Name, Var)], Type)
    zonk_tc_tycon (TyCon
    tc, SkolemInfo
    skol_info, [(Name, Var)]
    scoped_prs)
          = do { scoped_prs <- (Var -> ZonkM Var) -> [(Name, Var)] -> ZonkM [(Name, Var)]
    forall (m :: * -> *) (f :: * -> *) b c a.
    (Applicative m, Traversable f) =>
    (b -> m c) -> f (a, b) -> m (f (a, c))
    mapSndM HasDebugCallStack => Var -> ZonkM Var
    Var -> ZonkM Var
    zonkTcTyVarToTcTyVar [(Name, Var)]
    scoped_prs
                               -- We really have to do this again, even though
                               -- we have just done zonkAndSkolemise, so that
                               -- occurrences in the /kinds/ get zonked to the skolem
               ; res_kind   <- zonkTcType (tyConResKind tc)
               ; return (tc, skol_info, scoped_prs, res_kind) }

    swizzleTcTyConBndrs :: [(TcTyCon, SkolemInfo, ScopedPairs, TcKind)]
                    -> TcM [(TcTyCon, SkolemInfo, ScopedPairs, TcKind)]
    swizzleTcTyConBndrs :: [(TyCon, SkolemInfo, [(Name, Var)], Type)]
    -> TcM [(TyCon, SkolemInfo, [(Name, Var)], Type)]
    swizzleTcTyConBndrs [(TyCon, SkolemInfo, [(Name, Var)], Type)]
    tc_infos
      | ((Name, Var) -> Bool) -> [(Name, Var)] -> Bool
    forall (t :: * -> *) a. Foldable t => (a -> Bool) -> t a -> Bool
    all (Name, Var) -> Bool
    no_swizzle [(Name, Var)]
    swizzle_prs
        -- This fast path happens almost all the time
        -- See Note [Cloning for type variable binders] in GHC.Tc.Gen.HsType
        -- "Almost all the time" means not the case of mutual recursion with
        -- polymorphic kinds.
      = do { String -> SDoc -> TcRn ()
    traceTc String
    "Skipping swizzleTcTyConBndrs for" ([(TyCon, SkolemInfo, [(Name, Var)], Type)] -> SDoc
    forall {a} {b} {a} {d}.
    Outputable a =>
    [(a, b, [(a, Var)], d)] -> SDoc
    ppr_infos [(TyCon, SkolemInfo, [(Name, Var)], Type)]
    tc_infos)
           ; [(TyCon, SkolemInfo, [(Name, Var)], Type)]
    -> TcM [(TyCon, SkolemInfo, [(Name, Var)], Type)]
    forall a. a -> IOEnv (Env TcGblEnv TcLclEnv) a
    forall (m :: * -> *) a. Monad m => a -> m a
    return [(TyCon, SkolemInfo, [(Name, Var)], Type)]
    tc_infos }

      | Bool
    otherwise
      = do { [(Name, Var)] -> TcRn ()
    checkForDuplicateScopedTyVars [(Name, Var)]
    swizzle_prs

           ; String -> SDoc -> TcRn ()
    traceTc String
    "swizzleTcTyConBndrs" (SDoc -> TcRn ()) -> SDoc -> TcRn ()
    forall a b. (a -> b) -> a -> b
    $
             [SDoc] -> SDoc
    forall doc. IsDoc doc => [doc] -> doc
    vcat [ String -> SDoc
    forall doc. IsLine doc => String -> doc
    text String
    "before" SDoc -> SDoc -> SDoc
    forall doc. IsLine doc => doc -> doc -> doc
    <+> [(TyCon, SkolemInfo, [(Name, Var)], Type)] -> SDoc
    forall {a} {b} {a} {d}.
    Outputable a =>
    [(a, b, [(a, Var)], d)] -> SDoc
    ppr_infos [(TyCon, SkolemInfo, [(Name, Var)], Type)]
    tc_infos
                  , String -> SDoc
    forall doc. IsLine doc => String -> doc
    text String
    "swizzle_prs" SDoc -> SDoc -> SDoc
    forall doc. IsLine doc => doc -> doc -> doc
    <+> [(Name, Var)] -> SDoc
    forall a. Outputable a => a -> SDoc
    ppr [(Name, Var)]
    swizzle_prs
                  , String -> SDoc
    forall doc. IsLine doc => String -> doc
    text String
    "after" SDoc -> SDoc -> SDoc
    forall doc. IsLine doc => doc -> doc -> doc
    <+> [(TyCon, SkolemInfo, [(Name, Var)], Type)] -> SDoc
    forall {a} {b} {a} {d}.
    Outputable a =>
    [(a, b, [(a, Var)], d)] -> SDoc
    ppr_infos [(TyCon, SkolemInfo, [(Name, Var)], Type)]
    swizzled_infos ]

           ; [(TyCon, SkolemInfo, [(Name, Var)], Type)]
    -> TcM [(TyCon, SkolemInfo, [(Name, Var)], Type)]
    forall a. a -> IOEnv (Env TcGblEnv TcLclEnv) a
    forall (m :: * -> *) a. Monad m => a -> m a
    return [(TyCon, SkolemInfo, [(Name, Var)], Type)]
    swizzled_infos }

      where
        swizzled_infos :: [(TyCon, SkolemInfo, [(Name, Var)], Type)]
    swizzled_infos =  [ (TyCon
    tc, SkolemInfo
    skol_info, (Var -> Var) -> [(Name, Var)] -> [(Name, Var)]
    forall (f :: * -> *) b c a.
    Functor f =>
    (b -> c) -> f (a, b) -> f (a, c)
    mapSnd Var -> Var
    swizzle_var [(Name, Var)]
    scoped_prs, Type -> Type
    swizzle_ty Type
    kind)
                          | (TyCon
    tc, SkolemInfo
    skol_info, [(Name, Var)]
    scoped_prs, Type
    kind) <- [(TyCon, SkolemInfo, [(Name, Var)], Type)]
    tc_infos ]

        swizzle_prs :: [(Name,TyVar)]
        -- Pairs the user-specified Name with its representative TyVar
        -- See Note [Swizzling the tyvars before generaliseTcTyCon]
        swizzle_prs :: [(Name, Var)]
    swizzle_prs = [ (Name, Var)
    pr | (TyCon
    _, SkolemInfo
    _, [(Name, Var)]
    prs, Type
    _) <- [(TyCon, SkolemInfo, [(Name, Var)], Type)]
    tc_infos, (Name, Var)
    pr <- [(Name, Var)]
    prs ]

        no_swizzle :: (Name,TyVar) -> Bool
        no_swizzle :: (Name, Var) -> Bool
    no_swizzle (Name
    nm, Var
    tv) = Name
    nm Name -> Name -> Bool
    forall a. Eq a => a -> a -> Bool
    == Var -> Name
    tyVarName Var
    tv

        ppr_infos :: [(a, b, [(a, Var)], d)] -> SDoc
    ppr_infos [(a, b, [(a, Var)], d)]
    infos = [SDoc] -> SDoc
    forall doc. IsDoc doc => [doc] -> doc
    vcat [ a -> SDoc
    forall a. Outputable a => a -> SDoc
    ppr a
    tc SDoc -> SDoc -> SDoc
    forall doc. IsLine doc => doc -> doc -> doc
    <+> [Var] -> SDoc
    pprTyVars (((a, Var) -> Var) -> [(a, Var)] -> [Var]
    forall a b. (a -> b) -> [a] -> [b]
    map (a, Var) -> Var
    forall a b. (a, b) -> b
    snd [(a, Var)]
    prs)
                               | (a
    tc, b
    _, [(a, Var)]
    prs, d
    _) <- [(a, b, [(a, Var)], d)]
    infos ]

        -------------- The swizzler ------------
        -- This does a deep traverse, simply doing a
        -- Name-to-Name change, governed by swizzle_env
        -- The 'swap' is what gets from the representative TyVar
        -- back to the original user-specified Name
        swizzle_env :: VarEnv Name
    swizzle_env = [(Var, Name)] -> VarEnv Name
    forall a. [(Var, a)] -> VarEnv a
    mkVarEnv (((Name, Var) -> (Var, Name)) -> [(Name, Var)] -> [(Var, Name)]
    forall a b. (a -> b) -> [a] -> [b]
    map (Name, Var) -> (Var, Name)
    forall a b. (a, b) -> (b, a)
    swap [(Name, Var)]
    swizzle_prs)

        swizzleMapper :: TyCoMapper () Identity
        swizzleMapper :: TyCoMapper () Identity
    swizzleMapper = TyCoMapper { tcm_tyvar :: () -> Var -> Identity Type
    tcm_tyvar = () -> Var -> Identity Type
    forall {m :: * -> *} {p}. Monad m => p -> Var -> m Type
    swizzle_tv
                                   , tcm_covar :: () -> Var -> Identity Coercion
    tcm_covar = () -> Var -> Identity Coercion
    forall {m :: * -> *} {p}. Monad m => p -> Var -> m Coercion
    swizzle_cv
                                   , tcm_hole :: () -> CoercionHole -> Identity Coercion
    tcm_hole  = () -> CoercionHole -> Identity Coercion
    forall {a} {p} {a}. Outputable a => p -> a -> a
    swizzle_hole
                                   , tcm_tycobinder :: forall r.
    ()
    -> Var -> ForAllTyFlag -> (() -> Var -> Identity r) -> Identity r
    tcm_tycobinder = ()
    -> Var -> ForAllTyFlag -> (() -> Var -> Identity r) -> Identity r
    forall r.
    ()
    -> Var -> ForAllTyFlag -> (() -> Var -> Identity r) -> Identity r
    swizzle_bndr
                                   , tcm_tycon :: TyCon -> Identity TyCon
    tcm_tycon      = TyCon -> Identity TyCon
    forall {a} {a}. Outputable a => a -> a
    swizzle_tycon }
        swizzle_hole :: p -> a -> a
    swizzle_hole  p
    _ a
    hole = String -> SDoc -> a
    forall a. HasCallStack => String -> SDoc -> a
    pprPanic String
    "swizzle_hole" (a -> SDoc
    forall a. Outputable a => a -> SDoc
    ppr a
    hole)
           -- These types are pre-zonked
        swizzle_tycon :: a -> a
    swizzle_tycon a
    tc = String -> SDoc -> a
    forall a. HasCallStack => String -> SDoc -> a
    pprPanic String
    "swizzle_tc" (a -> SDoc
    forall a. Outputable a => a -> SDoc
    ppr a
    tc)
           -- TcTyCons can't appear in kinds (yet)
        swizzle_tv :: p -> Var -> m Type
    swizzle_tv p
    _ Var
    tv = Type -> m Type
    forall a. a -> m a
    forall (m :: * -> *) a. Monad m => a -> m a
    return (Var -> Type
    mkTyVarTy (Var -> Var
    swizzle_var Var
    tv))
        swizzle_cv :: p -> Var -> m Coercion
    swizzle_cv p
    _ Var
    cv = Coercion -> m Coercion
    forall a. a -> m a
    forall (m :: * -> *) a. Monad m => a -> m a
    return (Var -> Coercion
    mkCoVarCo (Var -> Var
    swizzle_var Var
    cv))

        swizzle_bndr :: ()
          -> TyCoVar
          -> ForAllTyFlag
          -> (() -> TyCoVar -> Identity r)
          -> Identity r
        swizzle_bndr :: forall r.
    ()
    -> Var -> ForAllTyFlag -> (() -> Var -> Identity r) -> Identity r
    swizzle_bndr ()
    _ Var
    tcv ForAllTyFlag
    _ () -> Var -> Identity r
    k
          = () -> Var -> Identity r
    k () (Var -> Var
    swizzle_var Var
    tcv)

        swizzle_var :: Var -> Var
        swizzle_var :: Var -> Var
    swizzle_var Var
    v
          | Just Name
    nm <- VarEnv Name -> Var -> Maybe Name
    forall a. VarEnv a -> Var -> Maybe a
    lookupVarEnv VarEnv Name
    swizzle_env Var
    v
          = (Type -> Type) -> Var -> Var
    updateVarType Type -> Type
    swizzle_ty (Var
    v Var -> Name -> Var
    `setVarName` Name
    nm)
          | Bool
    otherwise
          = (Type -> Type) -> Var -> Var
    updateVarType Type -> Type
    swizzle_ty Var
    v

        (Type -> Identity Type
    map_type, ThetaType -> Identity ThetaType
    _, Coercion -> Identity Coercion
    _, [Coercion] -> Identity [Coercion]
    _) = TyCoMapper () Identity
    -> (Type -> Identity Type, ThetaType -> Identity ThetaType,
        Coercion -> Identity Coercion, [Coercion] -> Identity [Coercion])
    forall (m :: * -> *).
    Monad m =>
    TyCoMapper () m
    -> (Type -> m Type, ThetaType -> m ThetaType,
        Coercion -> m Coercion, [Coercion] -> m [Coercion])
    mapTyCo TyCoMapper () Identity
    swizzleMapper
        swizzle_ty :: Type -> Type
    swizzle_ty Type
    ty = Identity Type -> Type
    forall a. Identity a -> a
    runIdentity (Type -> Identity Type
    map_type Type
    ty)

    generaliseTcTyCon :: (MonoTcTyCon, SkolemInfo, ScopedPairs, TcKind) -> TcM PolyTcTyCon
    generaliseTcTyCon :: (TyCon, SkolemInfo, [(Name, Var)], Type) -> TcRn TyCon
    generaliseTcTyCon (TyCon
    tc, SkolemInfo
    skol_info, [(Name, Var)]
    scoped_prs, Type
    tc_res_kind)
      -- The scoped_prs are fully zonked skolem TcTyVars
      -- And tc_res_kind is fully zonked too
      -- See Note [Required, Specified, and Inferred for types]
      = SrcSpan -> TcRn TyCon -> TcRn TyCon
    forall a. SrcSpan -> TcRn a -> TcRn a
    setSrcSpan (TyCon -> SrcSpan
    forall a. NamedThing a => a -> SrcSpan
    getSrcSpan TyCon
    tc) (TcRn TyCon -> TcRn TyCon) -> TcRn TyCon -> TcRn TyCon
    forall a b. (a -> b) -> a -> b
    $
        TyCon -> TcRn TyCon -> TcRn TyCon
    forall a. TyCon -> TcM a -> TcM a
    addTyConCtxt TyCon
    tc (TcRn TyCon -> TcRn TyCon) -> TcRn TyCon -> TcRn TyCon
    forall a b. (a -> b) -> a -> b
    $
        do { -- Step 1: Separate Specified from Required variables
             -- NB: spec_req_tvs = spec_tvs ++ req_tvs
             --     And req_tvs is 1-1 with tyConTyVars
             --     See Note [Scoped tyvars in a TcTyCon] in GHC.Core.TyCon
           ; let spec_req_tvs :: [Var]
    spec_req_tvs        = ((Name, Var) -> Var) -> [(Name, Var)] -> [Var]
    forall a b. (a -> b) -> [a] -> [b]
    map (Name, Var) -> Var
    forall a b. (a, b) -> b
    snd [(Name, Var)]
    scoped_prs
                 n_spec :: Int
    n_spec              = [Var] -> Int
    forall a. [a] -> Int
    forall (t :: * -> *) a. Foldable t => t a -> Int
    length [Var]
    spec_req_tvs Int -> Int -> Int
    forall a. Num a => a -> a -> a
    - TyCon -> Int
    tyConArity TyCon
    tc
                 ([Var]
    spec_tvs, [Var]
    req_tvs) = Int -> [Var] -> ([Var], [Var])
    forall a. Int -> [a] -> ([a], [a])
    splitAt Int
    n_spec [Var]
    spec_req_tvs
                 sorted_spec_tvs :: [Var]
    sorted_spec_tvs     = [Var] -> [Var]
    scopedSort [Var]
    spec_tvs
                     -- NB: We can't do the sort until we've zonked
                     --     Maintain the L-R order of scoped_tvs

           -- Step 2a: find all the Inferred variables we want to quantify over
           ; dvs1 <- ThetaType -> TcM CandidatesQTvs
    candidateQTyVarsOfKinds (ThetaType -> TcM CandidatesQTvs)
    -> ThetaType -> TcM CandidatesQTvs
    forall a b. (a -> b) -> a -> b
    $
                     (Type
    tc_res_kind Type -> ThetaType -> ThetaType
    forall a. a -> [a] -> [a]
    : (Var -> Type) -> [Var] -> ThetaType
    forall a b. (a -> b) -> [a] -> [b]
    map Var -> Type
    tyVarKind [Var]
    spec_req_tvs)
           ; let dvs2 = CandidatesQTvs
    dvs1 CandidatesQTvs -> [Var] -> CandidatesQTvs
    `delCandidates` [Var]
    spec_req_tvs

           -- Step 2b: quantify, mainly meaning skolemise the free variables
           -- Returned 'inferred' are scope-sorted and skolemised
           ; inferred <- quantifyTyVars skol_info DefaultNonStandardTyVars dvs2

           ; traceTc "generaliseTcTyCon: pre zonk"
               (vcat [ text "tycon =" <+> ppr tc
                     , text "spec_req_tvs =" <+> pprTyVars spec_req_tvs
                     , text "tc_res_kind =" <+> ppr tc_res_kind
                     , text "dvs1 =" <+> ppr dvs1
                     , text "inferred =" <+> pprTyVars inferred ])

           -- Step 3: Final zonk: quantifyTyVars may have done some defaulting
           ; (inferred, sorted_spec_tvs,req_tvs,tc_res_kind) <- liftZonkM $
              do { inferred        <- zonkTcTyVarsToTcTyVars inferred
                 ; sorted_spec_tvs <- zonkTcTyVarsToTcTyVars sorted_spec_tvs
                 ; req_tvs         <- zonkTcTyVarsToTcTyVars req_tvs
                 ; tc_res_kind     <- zonkTcType             tc_res_kind
                 ; return (inferred, sorted_spec_tvs, req_tvs, tc_res_kind) }

           ; traceTc "generaliseTcTyCon: post zonk" $
             vcat [ text "tycon =" <+> ppr tc
                  , text "inferred =" <+> pprTyVars inferred
                  , text "spec_req_tvs =" <+> pprTyVars spec_req_tvs
                  , text "sorted_spec_tvs =" <+> pprTyVars sorted_spec_tvs
                  , text "req_tvs =" <+> ppr req_tvs ]

           -- Step 4: Make the TyConBinders.
           ; let dep_fv_set     = CandidatesQTvs -> VarSet
    candidateKindVars CandidatesQTvs
    dvs1
                 inferred_tcbs  = ForAllTyFlag -> [Var] -> [TyConBinder]
    mkNamedTyConBinders ForAllTyFlag
    Inferred [Var]
    inferred
                 specified_tcbs = ForAllTyFlag -> [Var] -> [TyConBinder]
    mkNamedTyConBinders ForAllTyFlag
    Specified [Var]
    sorted_spec_tvs
                 required_tcbs  = (Var -> TyConBinder) -> [Var] -> [TyConBinder]
    forall a b. (a -> b) -> [a] -> [b]
    map (VarSet -> Var -> TyConBinder
    mkRequiredTyConBinder VarSet
    dep_fv_set) [Var]
    req_tvs

           -- Step 5: Assemble the final list.
                 all_tcbs = [[TyConBinder]] -> [TyConBinder]
    forall (t :: * -> *) a. Foldable t => t [a] -> [a]
    concat [ [TyConBinder]
    inferred_tcbs
                                   , [TyConBinder]
    specified_tcbs
                                   , [TyConBinder]
    required_tcbs ]
                 flav = TyCon -> TyConFlavour TyCon
    tyConFlavour TyCon
    tc

           -- Eta expand
           ; (eta_tcbs, tc_res_kind) <- etaExpandAlgTyCon flav skol_info all_tcbs tc_res_kind

           -- Step 6: Make the result TcTyCon
           ; let final_tcbs = [TyConBinder]
    all_tcbs [TyConBinder] -> [TyConBinder] -> [TyConBinder]
    forall a. [a] -> [a] -> [a]
    `chkAppend` [TyConBinder]
    eta_tcbs
                 tycon = Name
    -> [TyConBinder]
    -> Type
    -> [(Name, Var)]
    -> Bool
    -> TyConFlavour TyCon
    -> TyCon
    mkTcTyCon (TyCon -> Name
    tyConName TyCon
    tc)
                                   [TyConBinder]
    final_tcbs Type
    tc_res_kind
                                   ([Var] -> [(Name, Var)]
    mkTyVarNamePairs ([Var]
    sorted_spec_tvs [Var] -> [Var] -> [Var]
    forall a. [a] -> [a] -> [a]
    ++ [Var]
    req_tvs))
                                   Bool
    True {- it's generalised now -}
                                   TyConFlavour TyCon
    flav

           ; traceTc "generaliseTcTyCon done" $
             vcat [ text "tycon =" <+> ppr tc
                  , text "tc_res_kind =" <+> ppr tc_res_kind
                  , text "dep_fv_set =" <+> ppr dep_fv_set
                  , text "inferred_tcbs =" <+> ppr inferred_tcbs
                  , text "specified_tcbs =" <+> ppr specified_tcbs
                  , text "required_tcbs =" <+> ppr required_tcbs
                  , text "final_tcbs =" <+> ppr final_tcbs ]

           -- Step 7: Check for validity.
           -- We do this here because we're about to put the tycon into the
           -- the environment, and we don't want anything malformed there
           ; checkTyConTelescope tycon

           ; return tycon }

    {- Note [Required, Specified, and Inferred for types]
    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    Each forall'd type variable in a type or kind is one of

      * Required: an argument must be provided at every call site

      * Specified: the argument can be inferred at call sites, but
        may be instantiated with visible type/kind application

      * Inferred: the argument must be inferred at call sites; it
        is unavailable for use with visible type/kind application.

    Why have Inferred at all? Because we just can't make user-facing
    promises about the ordering of some variables. These might swizzle
    around even between minor released. By forbidding visible type
    application, we ensure users aren't caught unawares.

    Go read Note [VarBndrs, ForAllTyBinders, TyConBinders, and visibility] in GHC.Core.TyCo.Rep.

    The question for this Note is this:
       given a TyClDecl, how are its quantified type variables classified?
    Much of the debate is memorialized in #15743.

    Here is our design choice. When inferring the ordering of variables
    for a TyCl declaration (that is, for those variables that the user
    has not specified the order with an explicit `forall`), we use the
    following order:

     1. Inferred variables
     2. Specified variables; in the left-to-right order in which
        the user wrote them, modified by scopedSort (see below)
        to put them in dependency order.
     3. Required variables before a top-level ::
     4. All variables after a top-level ::

    If this ordering does not make a valid telescope, we reject the definition.

    Example:
      data SameKind :: k -> k -> *
      data Bad a (c :: Proxy b) (d :: Proxy a) (x :: SameKind b d)

    For Bad:
      - a, c, d, x are Required; they are explicitly listed by the user
        as the positional arguments of Bad
      - b is Specified; it appears explicitly in a kind signature
      - k, the kind of a, is Inferred; it is not mentioned explicitly at all

    Putting variables in the order Inferred, Specified, Required
    gives us this telescope:
      Inferred:  k
      Specified: b : Proxy a
      Required : (a : k) (c : Proxy b) (d : Proxy a) (x : SameKind b d)

    But this order is ill-scoped, because b's kind mentions a, which occurs
    after b in the telescope. So we reject Bad.

    Associated types
    ~~~~~~~~~~~~~~~~
    For associated types everything above is determined by the
    associated-type declaration alone, ignoring the class header.
    Here is an example (#15592)
      class C (a :: k) b where
        type F (x :: b a)

    In the kind of C, 'k' is Specified.  But what about F?
    In the kind of F,

     * Should k be Inferred or Specified?  It's Specified for C,
       but not mentioned in F's declaration.

     * In which order should the Specified variables a and b occur?
       It's clearly 'a' then 'b' in C's declaration, but the L-R ordering
       in F's declaration is 'b' then 'a'.

    In both cases we make the choice by looking at F's declaration alone,
    so it gets the kind
       F :: forall {k}. forall b a. b a -> Type

    How it works
    ~~~~~~~~~~~~
    These design choices are implemented by two completely different code
    paths for

      * Declarations with a standalone kind signature or a complete user-specified
        kind signature (CUSK). Handled by the kcCheckDeclHeader.

      * Declarations without a kind signature (standalone or CUSK) are handled by
        kcInferDeclHeader; see Note [Inferring kinds for type declarations].

    Note that neither code path worries about point (4) above, as this
    is nicely handled by not mangling the res_kind. (Mangling res_kinds is done
    *after* all this stuff, in tcDataDefn's call to etaExpandAlgTyCon.)

    We can tell Inferred apart from Specified by looking at the scoped
    tyvars; Specified are always included there.

    Design alternatives
    ~~~~~~~~~~~~~~~~~~~
    * For associated types we considered putting the class variables
      before the local variables, in a nod to the treatment for class
      methods. But it got too complicated; see #15592, comment:21ff.

    * We rigidly require the ordering above, even though we could be much more
      permissive. Relevant musings are at
      https://gitlab.haskell.org/ghc/ghc/issues/15743#note_161623
      The bottom line conclusion is that, if the user wants a different ordering,
      then can specify it themselves, and it is better to be predictable and dumb
      than clever and capricious.

      I (Richard) conjecture we could be fully permissive, allowing all classes
      of variables to intermix. We would have to augment ScopedSort to refuse to
      reorder Required variables (or check that it wouldn't have). But this would
      allow more programs. See #15743 for examples. Interestingly, Idris seems
      to allow this intermixing. The intermixing would be fully specified, in that
      we can be sure that inference wouldn't change between versions. However,
      would users be able to predict it? That I cannot answer.

    Test cases (and tickets) relevant to these design decisions
    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
      T15591*
      T15592*
      T15743*

    Note [Inferring kinds for type declarations]
    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    This note deals with /inference/ for type declarations
    that do not have a CUSK or a SAKS.  Consider
      data T (a :: k1) k2 (x :: k2) = MkT (S a k2 x)
      data S (b :: k3) k4 (y :: k4) = MkS (T b k4 y)

    We do kind inference as follows:

    * Step 1: inferInitialKinds, and in particular kcInferDeclHeader.
      Make a unification variable for each of the Required and Specified
      type variables in the header.

      Record the connection between the Names the user wrote and the
      fresh unification variables in the tcTyConScopedTyVars field
      of the TcTyCon we are making
          [ (a,  aa)
          , (k1, kk1)
          , (k2, kk2)
          , (x,  xx) ]
      (I'm using the convention that double letter like 'aa' or 'kk'
      mean a unification variable.)

      These unification variables
        - Are TyVarTvs: that is, unification variables that can
          unify only with other type variables.
          See Note [TyVarTv] in GHC.Tc.Utils.TcMType

        - Have complete fresh Names; see GHC.Tc.Utils.TcMType
          Note [Unification variables need fresh Names]

      Assign initial monomorphic kinds to S, T
              T :: kk1 -> * -> kk2 -> *
              S :: kk3 -> * -> kk4 -> *

    * Step 2: kcTyClDecl. Extend the environment with a TcTyCon for S and
      T, with these monomorphic kinds.  Now kind-check the declarations,
      and solve the resulting equalities.  The goal here is to discover
      constraints on all these unification variables.

      Here we find that kk1 := kk3, and kk2 := kk4.

      This is why we can't use skolems for kk1 etc; they have to
      unify with each other.

    * Step 3: generaliseTcTyCon. Generalise each TyCon in turn.
      We find the free variables of the kind, skolemise them,
      sort them out into Inferred/Required/Specified (see the above
      Note [Required, Specified, and Inferred for types]),
      and perform some validity checks.

      This makes the utterly-final TyConBinders for the TyCon.

      All this is very similar at the level of terms: see GHC.Tc.Gen.Bind
      Note [Quantified variables in partial type signatures]

      But there are some tricky corners: Note [Tricky scoping in generaliseTcTyCon]

    * Step 4.  Extend the type environment with a TcTyCon for S and T, now
      with their utterly-final polymorphic kinds (needed for recursive
      occurrences of S, T).  Now typecheck the declarations, and build the
      final AlgTyCon for S and T resp.

    The first three steps are in kcTyClGroup; the fourth is in
    tcTyClDecls.

    There are some wrinkles

    * Do not default TyVarTvs.  We always want to kind-generalise over
      TyVarTvs, and /not/ default them to Type. By definition a TyVarTv is
      not allowed to unify with a type; it must stand for a type
      variable. Hence the check in GHC.Tc.Solver.defaultTyVarTcS, and
      GHC.Tc.Utils.TcMType.defaultTyVar.  Here's another example (#14555):
         data Exp :: [TYPE rep] -> TYPE rep -> Type where
            Lam :: Exp (a:xs) b -> Exp xs (a -> b)
      We want to kind-generalise over the 'rep' variable.
      #14563 is another example.

    * Duplicate type variables. Consider #11203
        data SameKind :: k -> k -> *
        data Q (a :: k1) (b :: k2) c = MkQ (SameKind a b)
      Here we will unify k1 with k2, but this time doing so is an error,
      because k1 and k2 are bound in the same declaration.

      We spot this during validity checking (checkForDuplicateScopeTyVars),
      in generaliseTcTyCon.

    * Required arguments.  Even the Required arguments should be made
      into TyVarTvs, not skolems.  Consider
        data T k (a :: k)
      Here, k is a Required, dependent variable. For uniformity, it is helpful
      to have k be a TyVarTv, in parallel with other dependent variables.

    * Duplicate skolemisation is expected.  When generalising in Step 3,
      we may find that one of the variables we want to quantify has
      already been skolemised.  For example, suppose we have already
      generalise S. When we come to T we'll find that kk1 (now the same as
      kk3) has already been skolemised.

      That's fine -- but it means that
        a) when collecting quantification candidates, in
           candidateQTyVarsOfKind, we must collect skolems
        b) quantifyTyVars should be a no-op on such a skolem

    Note [Tricky scoping in generaliseTcTyCon]
    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    Consider #16342
      class C (a::ka) x where
        cop :: D a x => x -> Proxy a -> Proxy a
        cop _ x = x :: Proxy (a::ka)

      class D (b::kb) y where
        dop :: C b y => y -> Proxy b -> Proxy b
        dop _ x = x :: Proxy (b::kb)

    C and D are mutually recursive, by the time we get to
    generaliseTcTyCon we'll have unified kka := kkb.

    But when typechecking the default declarations for 'cop' and 'dop' in
    tcDlassDecl2 we need {a, ka} and {b, kb} respectively to be in scope.
    But at that point all we have is the utterly-final Class itself.

    Conclusion: the classTyVars of a class must have the same Name as
    that originally assigned by the user.  In our example, C must have
    classTyVars {a, ka, x} while D has classTyVars {a, kb, y}.  Despite
    the fact that kka and kkb got unified!

    We achieve this sleight of hand in generaliseTcTyCon, using
    the specialised function zonkRecTyVarBndrs.  We make the call
       zonkRecTyVarBndrs [ka,a,x] [kkb,aa,xxx]
    where the [ka,a,x] are the Names originally assigned by the user, and
    [kkb,aa,xx] are the corresponding (post-zonking, skolemised) TcTyVars.
    zonkRecTyVarBndrs builds a recursive ZonkEnv that binds
       kkb :-> (ka :: <zonked kind of kkb>)
       aa  :-> (a  :: <konked kind of aa>)
       etc
    That is, it maps each skolemised TcTyVars to the utterly-final
    TyVar to put in the class, with its correct user-specified name.
    When generalising D we'll do the same thing, but the ZonkEnv will map
       kkb :-> (kb :: <zonked kind of kkb>)
       bb  :-> (b  :: <konked kind of bb>)
       etc
    Note that 'kkb' again appears in the domain of the mapping, but this
    time mapped to 'kb'.  That's how C and D end up with differently-named
    final TyVars despite the fact that we unified kka:=kkb

    zonkRecTyVarBndrs we need to do knot-tying because of the need to
    apply this same substitution to the kind of each.

    Note [Inferring visible dependent quantification]
    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    Consider

      data T k :: k -> Type where
        MkT1 :: T Type Int
        MkT2 :: T (Type -> Type) Maybe

    This looks like it should work. However, it is polymorphically recursive,
    as the uses of T in the constructor types specialize the k in the kind
    of T. This trips up our dear users (#17131, #17541), and so we add
    a "landmark" context (which cannot be suppressed) whenever we
    spot inferred visible dependent quantification (VDQ).

    It's hard to know when we've actually been tripped up by polymorphic recursion
    specifically, so we just include a note to users whenever we infer VDQ. The
    testsuite did not show up a single spurious inclusion of this message.

    The context is added in addVDQNote, which looks for a visible
    TyConBinder that also appears in the TyCon's kind. (I first looked at
    the kind for a visible, dependent quantifier, but
      Note [No polymorphic recursion in type decls]
    in GHC.Tc.Gen.HsType defeats that approach.) addVDQNote is used in
    kcTyClDecl, which is used only when inferring the kind of a tycon
    (never with a CUSK or SAKS).

    Once upon a time, I (Richard E) thought that the tycon-kind could
    not be a forall-type. But this is wrong: data T :: forall k. k -> Type
    (with -XNoCUSKs) could end up here. And this is all OK.
    -}

    --------------
    tcExtendKindEnvWithTyCons :: [TcTyCon] -> TcM a -> TcM a
    tcExtendKindEnvWithTyCons :: forall r. [TyCon] -> TcM r -> TcM r
    tcExtendKindEnvWithTyCons [TyCon]
    tcs
      = [(Name, TcTyThing)] -> TcM a -> TcM a
    forall r. [(Name, TcTyThing)] -> TcM r -> TcM r
    tcExtendKindEnvList [ (TyCon -> Name
    tyConName TyCon
    tc, TyCon -> TcTyThing
    ATcTyCon TyCon
    tc) | TyCon
    tc <- [TyCon]
    tcs ]

    --------------
    mkPromotionErrorEnv :: [LTyClDecl GhcRn] -> TcTypeEnv
    -- Maps each tycon/datacon to a suitable promotion error
    --    tc :-> APromotionErr TyConPE
    --    dc :-> APromotionErr RecDataConPE
    --    See Note [Recursion and promoting data constructors]

    mkPromotionErrorEnv :: [LTyClDecl GhcRn] -> NameEnv TcTyThing
    mkPromotionErrorEnv [LTyClDecl GhcRn]
    decls
      = (GenLocated SrcSpanAnnA (TyClDecl GhcRn)
     -> NameEnv TcTyThing -> NameEnv TcTyThing)
    -> NameEnv TcTyThing
    -> [GenLocated SrcSpanAnnA (TyClDecl GhcRn)]
    -> NameEnv TcTyThing
    forall a b. (a -> b -> b) -> b -> [a] -> b
    forall (t :: * -> *) a b.
    Foldable t =>
    (a -> b -> b) -> b -> t a -> b
    foldr (NameEnv TcTyThing -> NameEnv TcTyThing -> NameEnv TcTyThing
    forall a. NameEnv a -> NameEnv a -> NameEnv a
    plusNameEnv (NameEnv TcTyThing -> NameEnv TcTyThing -> NameEnv TcTyThing)
    -> (GenLocated SrcSpanAnnA (TyClDecl GhcRn) -> NameEnv TcTyThing)
    -> GenLocated SrcSpanAnnA (TyClDecl GhcRn)
    -> NameEnv TcTyThing
    -> NameEnv TcTyThing
    forall b c a. (b -> c) -> (a -> b) -> a -> c
    . TyClDecl GhcRn -> NameEnv TcTyThing
    mk_prom_err_env (TyClDecl GhcRn -> NameEnv TcTyThing)
    -> (GenLocated SrcSpanAnnA (TyClDecl GhcRn) -> TyClDecl GhcRn)
    -> GenLocated SrcSpanAnnA (TyClDecl GhcRn)
    -> NameEnv TcTyThing
    forall b c a. (b -> c) -> (a -> b) -> a -> c
    . GenLocated SrcSpanAnnA (TyClDecl GhcRn) -> TyClDecl GhcRn
    forall l e. GenLocated l e -> e
    unLoc)
              NameEnv TcTyThing
    forall a. NameEnv a
    emptyNameEnv [LTyClDecl GhcRn]
    [GenLocated SrcSpanAnnA (TyClDecl GhcRn)]
    decls

    mk_prom_err_env :: TyClDecl GhcRn -> TcTypeEnv
    mk_prom_err_env :: TyClDecl GhcRn -> NameEnv TcTyThing
    mk_prom_err_env (ClassDecl { tcdLName :: forall pass. TyClDecl pass -> LIdP pass
    tcdLName = L SrcSpanAnnN
    _ Name
    nm, tcdATs :: forall pass. TyClDecl pass -> [LFamilyDecl pass]
    tcdATs = [LFamilyDecl GhcRn]
    ats })
      = Name -> TcTyThing -> NameEnv TcTyThing
    forall a. Name -> a -> NameEnv a
    unitNameEnv Name
    nm (PromotionErr -> TcTyThing
    APromotionErr PromotionErr
    ClassPE)
        NameEnv TcTyThing -> NameEnv TcTyThing -> NameEnv TcTyThing
    forall a. NameEnv a -> NameEnv a -> NameEnv a
    `plusNameEnv`
        [(Name, TcTyThing)] -> NameEnv TcTyThing
    forall a. [(Name, a)] -> NameEnv a
    mkNameEnv [ (FamilyDecl GhcRn -> IdP GhcRn
    forall (p :: Pass). FamilyDecl (GhcPass p) -> IdP (GhcPass p)
    familyDeclName FamilyDecl GhcRn
    at, PromotionErr -> TcTyThing
    APromotionErr PromotionErr
    TyConPE)
                  | L SrcSpanAnnA
    _ FamilyDecl GhcRn
    at <- [LFamilyDecl GhcRn]
    [GenLocated SrcSpanAnnA (FamilyDecl GhcRn)]
    ats ]

    mk_prom_err_env (DataDecl { tcdLName :: forall pass. TyClDecl pass -> LIdP pass
    tcdLName = L SrcSpanAnnN
    _ Name
    name
                              , tcdDataDefn :: forall pass. TyClDecl pass -> HsDataDefn pass
    tcdDataDefn = HsDataDefn { dd_cons :: forall pass. HsDataDefn pass -> DataDefnCons (LConDecl pass)
    dd_cons = DataDefnCons (LConDecl GhcRn)
    cons } })
      = Name -> TcTyThing -> NameEnv TcTyThing
    forall a. Name -> a -> NameEnv a
    unitNameEnv Name
    name (PromotionErr -> TcTyThing
    APromotionErr PromotionErr
    TyConPE)
        NameEnv TcTyThing -> NameEnv TcTyThing -> NameEnv TcTyThing
    forall a. NameEnv a -> NameEnv a -> NameEnv a
    `plusNameEnv`
        [(Name, TcTyThing)] -> NameEnv TcTyThing
    forall a. [(Name, a)] -> NameEnv a
    mkNameEnv [ (Name
    con, PromotionErr -> TcTyThing
    APromotionErr PromotionErr
    conPE)
                  | L SrcSpanAnnA
    _ ConDecl GhcRn
    con' <- DataDefnCons (GenLocated SrcSpanAnnA (ConDecl GhcRn))
    -> [GenLocated SrcSpanAnnA (ConDecl GhcRn)]
    forall a. DataDefnCons a -> [a]
    forall (t :: * -> *) a. Foldable t => t a -> [a]
    toList DataDefnCons (LConDecl GhcRn)
    DataDefnCons (GenLocated SrcSpanAnnA (ConDecl GhcRn))
    cons
                  , L SrcSpanAnnN
    _ Name
    con  <- ConDecl GhcRn -> [LocatedN Name]
    getConNames ConDecl GhcRn
    con' ]
      where
        -- In a "type data" declaration, the constructors are at the type level.
        -- See Note [Type data declarations] in GHC.Rename.Module.
        conPE :: PromotionErr
    conPE
          | DataDefnCons (GenLocated SrcSpanAnnA (ConDecl GhcRn)) -> Bool
    forall a. DataDefnCons a -> Bool
    isTypeDataDefnCons DataDefnCons (LConDecl GhcRn)
    DataDefnCons (GenLocated SrcSpanAnnA (ConDecl GhcRn))
    cons = PromotionErr
    TyConPE
          | Bool
    otherwise = PromotionErr
    RecDataConPE

    mk_prom_err_env TyClDecl GhcRn
    decl
      = Name -> TcTyThing -> NameEnv TcTyThing
    forall a. Name -> a -> NameEnv a
    unitNameEnv (TyClDecl GhcRn -> IdP GhcRn
    forall (p :: Pass).
    (Anno (IdGhcP p) ~ SrcSpanAnnN) =>
    TyClDecl (GhcPass p) -> IdP (GhcPass p)
    tcdName TyClDecl GhcRn
    decl) (PromotionErr -> TcTyThing
    APromotionErr PromotionErr
    TyConPE)
        -- Works for family declarations too

    --------------
    inferInitialKinds :: [LTyClDecl GhcRn] -> TcM [MonoTcTyCon]
    -- Returns a TcTyCon for each TyCon bound by the decls,
    -- each with its initial kind

    inferInitialKinds :: [LTyClDecl GhcRn] -> TcM [TyCon]
    inferInitialKinds [LTyClDecl GhcRn]
    decls
      = do { String -> SDoc -> TcRn ()
    traceTc String
    "inferInitialKinds {" (SDoc -> TcRn ()) -> SDoc -> TcRn ()
    forall a b. (a -> b) -> a -> b
    $ [IdGhcP 'Renamed] -> SDoc
    forall a. Outputable a => a -> SDoc
    ppr ((GenLocated SrcSpanAnnA (TyClDecl GhcRn) -> IdGhcP 'Renamed)
    -> [GenLocated SrcSpanAnnA (TyClDecl GhcRn)] -> [IdGhcP 'Renamed]
    forall a b. (a -> b) -> [a] -> [b]
    map (TyClDecl GhcRn -> IdP GhcRn
    TyClDecl GhcRn -> IdGhcP 'Renamed
    forall (p :: Pass).
    (Anno (IdGhcP p) ~ SrcSpanAnnN) =>
    TyClDecl (GhcPass p) -> IdP (GhcPass p)
    tcdName (TyClDecl GhcRn -> IdGhcP 'Renamed)
    -> (GenLocated SrcSpanAnnA (TyClDecl GhcRn) -> TyClDecl GhcRn)
    -> GenLocated SrcSpanAnnA (TyClDecl GhcRn)
    -> IdGhcP 'Renamed
    forall b c a. (b -> c) -> (a -> b) -> a -> c
    . GenLocated SrcSpanAnnA (TyClDecl GhcRn) -> TyClDecl GhcRn
    forall l e. GenLocated l e -> e
    unLoc) [LTyClDecl GhcRn]
    [GenLocated SrcSpanAnnA (TyClDecl GhcRn)]
    decls)
           ; tcs <- (GenLocated SrcSpanAnnA (TyClDecl GhcRn) -> TcM [TyCon])
    -> [GenLocated SrcSpanAnnA (TyClDecl GhcRn)] -> TcM [TyCon]
    forall (m :: * -> *) (f :: * -> *) a b.
    (Monad m, Traversable f) =>
    (a -> m [b]) -> f a -> m [b]
    concatMapM GenLocated SrcSpanAnnA (TyClDecl GhcRn) -> TcM [TyCon]
    infer_initial_kind [LTyClDecl GhcRn]
    [GenLocated SrcSpanAnnA (TyClDecl GhcRn)]
    decls
           ; traceTc "inferInitialKinds done }" empty
           ; return tcs }
      where
        infer_initial_kind :: GenLocated SrcSpanAnnA (TyClDecl GhcRn) -> TcM [TyCon]
    infer_initial_kind = (TyClDecl GhcRn -> TcM [TyCon])
    -> GenLocated SrcSpanAnnA (TyClDecl GhcRn) -> TcM [TyCon]
    forall t a b. HasLoc t => (a -> TcM b) -> GenLocated t a -> TcM b
    addLocM (InitialKindStrategy -> TyClDecl GhcRn -> TcM [TyCon]
    getInitialKind InitialKindStrategy
    InitialKindInfer)

    -- Check type/class declarations against their standalone kind signatures or
    -- CUSKs, producing a generalized TcTyCon for each.
    checkInitialKinds :: [(LTyClDecl GhcRn, SAKS_or_CUSK)] -> TcM [PolyTcTyCon]
    checkInitialKinds :: [(LTyClDecl GhcRn, SAKS_or_CUSK)] -> TcM [TyCon]
    checkInitialKinds [(LTyClDecl GhcRn, SAKS_or_CUSK)]
    decls
      = do { String -> SDoc -> TcRn ()
    traceTc String
    "checkInitialKinds {" (SDoc -> TcRn ()) -> SDoc -> TcRn ()
    forall a b. (a -> b) -> a -> b
    $ [(IdGhcP 'Renamed, SAKS_or_CUSK)] -> SDoc
    forall a. Outputable a => a -> SDoc
    ppr ((GenLocated SrcSpanAnnA (TyClDecl GhcRn) -> IdGhcP 'Renamed)
    -> [(GenLocated SrcSpanAnnA (TyClDecl GhcRn), SAKS_or_CUSK)]
    -> [(IdGhcP 'Renamed, SAKS_or_CUSK)]
    forall (f :: * -> *) a c b.
    Functor f =>
    (a -> c) -> f (a, b) -> f (c, b)
    mapFst (TyClDecl GhcRn -> IdP GhcRn
    TyClDecl GhcRn -> IdGhcP 'Renamed
    forall (p :: Pass).
    (Anno (IdGhcP p) ~ SrcSpanAnnN) =>
    TyClDecl (GhcPass p) -> IdP (GhcPass p)
    tcdName (TyClDecl GhcRn -> IdGhcP 'Renamed)
    -> (GenLocated SrcSpanAnnA (TyClDecl GhcRn) -> TyClDecl GhcRn)
    -> GenLocated SrcSpanAnnA (TyClDecl GhcRn)
    -> IdGhcP 'Renamed
    forall b c a. (b -> c) -> (a -> b) -> a -> c
    . GenLocated SrcSpanAnnA (TyClDecl GhcRn) -> TyClDecl GhcRn
    forall l e. GenLocated l e -> e
    unLoc) [(LTyClDecl GhcRn, SAKS_or_CUSK)]
    [(GenLocated SrcSpanAnnA (TyClDecl GhcRn), SAKS_or_CUSK)]
    decls)
           ; tcs <- ((GenLocated SrcSpanAnnA (TyClDecl GhcRn), SAKS_or_CUSK)
     -> TcM [TyCon])
    -> [(GenLocated SrcSpanAnnA (TyClDecl GhcRn), SAKS_or_CUSK)]
    -> TcM [TyCon]
    forall (m :: * -> *) (f :: * -> *) a b.
    (Monad m, Traversable f) =>
    (a -> m [b]) -> f a -> m [b]
    concatMapM (GenLocated SrcSpanAnnA (TyClDecl GhcRn), SAKS_or_CUSK)
    -> TcM [TyCon]
    forall {t}.
    HasLoc t =>
    (GenLocated t (TyClDecl GhcRn), SAKS_or_CUSK) -> TcM [TyCon]
    check_initial_kind [(LTyClDecl GhcRn, SAKS_or_CUSK)]
    [(GenLocated SrcSpanAnnA (TyClDecl GhcRn), SAKS_or_CUSK)]
    decls
           ; traceTc "checkInitialKinds done }" empty
           ; return tcs }
      where
        check_initial_kind :: (GenLocated t (TyClDecl GhcRn), SAKS_or_CUSK) -> TcM [TyCon]
    check_initial_kind (GenLocated t (TyClDecl GhcRn)
    ldecl, SAKS_or_CUSK
    msig) =
          (TyClDecl GhcRn -> TcM [TyCon])
    -> GenLocated t (TyClDecl GhcRn) -> TcM [TyCon]
    forall t a b. HasLoc t => (a -> TcM b) -> GenLocated t a -> TcM b
    addLocM (InitialKindStrategy -> TyClDecl GhcRn -> TcM [TyCon]
    getInitialKind (SAKS_or_CUSK -> InitialKindStrategy
    InitialKindCheck SAKS_or_CUSK
    msig)) GenLocated t (TyClDecl GhcRn)
    ldecl

    -- | Get the initial kind of a TyClDecl, either generalized or non-generalized,
    -- depending on the 'InitialKindStrategy'.
    getInitialKind :: InitialKindStrategy -> TyClDecl GhcRn -> TcM [TcTyCon]

    -- Allocate a fresh kind variable for each TyCon and Class
    -- For each tycon, return a TcTyCon with kind k
    -- where k is the kind of tc, derived from the LHS
    --         of the definition (and probably including
    --         kind unification variables)
    --      Example: data T a b = ...
    --      return (T, kv1 -> kv2 -> kv3)
    --
    -- This pass deals with (ie incorporates into the kind it produces)
    --   * The kind signatures on type-variable binders
    --   * The result kinds signature on a TyClDecl
    --
    -- No family instances are passed to checkInitialKinds/inferInitialKinds
    getInitialKind :: InitialKindStrategy -> TyClDecl GhcRn -> TcM [TyCon]
    getInitialKind InitialKindStrategy
    strategy
        (ClassDecl { tcdLName :: forall pass. TyClDecl pass -> LIdP pass
    tcdLName = L SrcSpanAnnN
    _ Name
    name
                   , tcdTyVars :: forall pass. TyClDecl pass -> LHsQTyVars pass
    tcdTyVars = LHsQTyVars GhcRn
    ktvs
                   , tcdATs :: forall pass. TyClDecl pass -> [LFamilyDecl pass]
    tcdATs = [LFamilyDecl GhcRn]
    ats })
      = do { cls_tc <- InitialKindStrategy
    -> Name
    -> TyConFlavour TyCon
    -> LHsQTyVars GhcRn
    -> TcM ContextKind
    -> TcRn TyCon
    kcDeclHeader InitialKindStrategy
    strategy Name
    name TyConFlavour TyCon
    forall tc. TyConFlavour tc
    ClassFlavour LHsQTyVars GhcRn
    ktvs (TcM ContextKind -> TcRn TyCon) -> TcM ContextKind -> TcRn TyCon
    forall a b. (a -> b) -> a -> b
    $
                    ContextKind -> TcM ContextKind
    forall a. a -> IOEnv (Env TcGblEnv TcLclEnv) a
    forall (m :: * -> *) a. Monad m => a -> m a
    return (Type -> ContextKind
    TheKind Type
    constraintKind)
                -- See Note [Don't process associated types in getInitialKind]

           ; at_tcs <- tcExtendTyVarEnv (tyConTyVars cls_tc) $
                          mapM (addLocM (getAssocFamInitialKind cls_tc)) ats
           ; return (cls_tc : at_tcs) }
      where
        getAssocFamInitialKind :: TyCon -> FamilyDecl GhcRn -> TcRn TyCon
    getAssocFamInitialKind TyCon
    cls =
          case InitialKindStrategy
    strategy of
            InitialKindStrategy
    InitialKindInfer   -> Maybe TyCon -> FamilyDecl GhcRn -> TcRn TyCon
    get_fam_decl_initial_kind (TyCon -> Maybe TyCon
    forall a. a -> Maybe a
    Just TyCon
    cls)
            InitialKindCheck SAKS_or_CUSK
    _ -> TyCon -> FamilyDecl GhcRn -> TcRn TyCon
    check_initial_kind_assoc_fam TyCon
    cls

    getInitialKind InitialKindStrategy
    strategy
        (DataDecl { tcdLName :: forall pass. TyClDecl pass -> LIdP pass
    tcdLName = L SrcSpanAnnN
    _ Name
    name
                  , tcdTyVars :: forall pass. TyClDecl pass -> LHsQTyVars pass
    tcdTyVars = LHsQTyVars GhcRn
    ktvs
                  , tcdDataDefn :: forall pass. TyClDecl pass -> HsDataDefn pass
    tcdDataDefn = HsDataDefn { dd_kindSig :: forall pass. HsDataDefn pass -> Maybe (LHsKind pass)
    dd_kindSig = Maybe (LHsKind GhcRn)
    m_sig, dd_cons :: forall pass. HsDataDefn pass -> DataDefnCons (LConDecl pass)
    dd_cons = DataDefnCons (LConDecl GhcRn)
    cons } })
      = do  { let flav :: TyConFlavour TyCon
    flav = NewOrData -> TyConFlavour TyCon
    forall tc. NewOrData -> TyConFlavour tc
    newOrDataToFlavour (DataDefnCons (GenLocated SrcSpanAnnA (ConDecl GhcRn)) -> NewOrData
    forall a. DataDefnCons a -> NewOrData
    dataDefnConsNewOrData DataDefnCons (LConDecl GhcRn)
    DataDefnCons (GenLocated SrcSpanAnnA (ConDecl GhcRn))
    cons)
                  ctxt :: UserTypeCtxt
    ctxt = Name -> UserTypeCtxt
    DataKindCtxt Name
    name
            ; tc <- InitialKindStrategy
    -> Name
    -> TyConFlavour TyCon
    -> LHsQTyVars GhcRn
    -> TcM ContextKind
    -> TcRn TyCon
    kcDeclHeader InitialKindStrategy
    strategy Name
    name TyConFlavour TyCon
    flav LHsQTyVars GhcRn
    ktvs (TcM ContextKind -> TcRn TyCon) -> TcM ContextKind -> TcRn TyCon
    forall a b. (a -> b) -> a -> b
    $
                    case Maybe (LHsKind GhcRn)
    m_sig of
                      Just LHsKind GhcRn
    ksig -> Type -> ContextKind
    TheKind (Type -> ContextKind)
    -> IOEnv (Env TcGblEnv TcLclEnv) Type -> TcM ContextKind
    forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
    <$> UserTypeCtxt -> LHsKind GhcRn -> IOEnv (Env TcGblEnv TcLclEnv) Type
    tcLHsKindSig UserTypeCtxt
    ctxt LHsKind GhcRn
    ksig
                      Maybe (LHsKind GhcRn)
    Nothing   -> ContextKind -> TcM ContextKind
    forall a. a -> IOEnv (Env TcGblEnv TcLclEnv) a
    forall (m :: * -> *) a. Monad m => a -> m a
    return (ContextKind -> TcM ContextKind) -> ContextKind -> TcM ContextKind
    forall a b. (a -> b) -> a -> b
    $ InitialKindStrategy -> NewOrData -> ContextKind
    dataDeclDefaultResultKind InitialKindStrategy
    strategy (DataDefnCons (GenLocated SrcSpanAnnA (ConDecl GhcRn)) -> NewOrData
    forall a. DataDefnCons a -> NewOrData
    dataDefnConsNewOrData DataDefnCons (LConDecl GhcRn)
    DataDefnCons (GenLocated SrcSpanAnnA (ConDecl GhcRn))
    cons)
            ; return [tc] }

    getInitialKind InitialKindStrategy
    InitialKindInfer (FamDecl { tcdFam :: forall pass. TyClDecl pass -> FamilyDecl pass
    tcdFam = FamilyDecl GhcRn
    decl })
      = do { tc <- Maybe TyCon -> FamilyDecl GhcRn -> TcRn TyCon
    get_fam_decl_initial_kind Maybe TyCon
    forall a. Maybe a
    Nothing FamilyDecl GhcRn
    decl
           ; return [tc] }

    getInitialKind (InitialKindCheck SAKS_or_CUSK
    msig) (FamDecl { tcdFam :: forall pass. TyClDecl pass -> FamilyDecl pass
    tcdFam =
      FamilyDecl { fdLName :: forall pass. FamilyDecl pass -> LIdP pass
    fdLName     = LIdP GhcRn -> Name
    LocatedN Name -> Name
    forall l e. GenLocated l e -> e
    unLoc -> Name
    name
                 , fdTyVars :: forall pass. FamilyDecl pass -> LHsQTyVars pass
    fdTyVars    = LHsQTyVars GhcRn
    ktvs
                 , fdResultSig :: forall pass. FamilyDecl pass -> LFamilyResultSig pass
    fdResultSig = LFamilyResultSig GhcRn -> FamilyResultSig GhcRn
    GenLocated EpAnnCO (FamilyResultSig GhcRn) -> FamilyResultSig GhcRn
    forall l e. GenLocated l e -> e
    unLoc -> FamilyResultSig GhcRn
    resultSig
                 , fdInfo :: forall pass. FamilyDecl pass -> FamilyInfo pass
    fdInfo      = FamilyInfo GhcRn
    info } } )
      = do { let flav :: TyConFlavour TyCon
    flav = Maybe TyCon -> FamilyInfo GhcRn -> TyConFlavour TyCon
    forall tc pass. Maybe tc -> FamilyInfo pass -> TyConFlavour tc
    familyInfoTyConFlavour Maybe TyCon
    forall a. Maybe a
    Nothing FamilyInfo GhcRn
    info
                 ctxt :: UserTypeCtxt
    ctxt = Name -> UserTypeCtxt
    TyFamResKindCtxt Name
    name
           ; tc <- InitialKindStrategy
    -> Name
    -> TyConFlavour TyCon
    -> LHsQTyVars GhcRn
    -> TcM ContextKind
    -> TcRn TyCon
    kcDeclHeader (SAKS_or_CUSK -> InitialKindStrategy
    InitialKindCheck SAKS_or_CUSK
    msig) Name
    name TyConFlavour TyCon
    flav LHsQTyVars GhcRn
    ktvs (TcM ContextKind -> TcRn TyCon) -> TcM ContextKind -> TcRn TyCon
    forall a b. (a -> b) -> a -> b
    $
                   case FamilyResultSig GhcRn -> Maybe (LHsKind GhcRn)
    forall (p :: Pass).
    FamilyResultSig (GhcPass p) -> Maybe (LHsKind (GhcPass p))
    famResultKindSignature FamilyResultSig GhcRn
    resultSig of
                     Just LHsKind GhcRn
    ksig -> Type -> ContextKind
    TheKind (Type -> ContextKind)
    -> IOEnv (Env TcGblEnv TcLclEnv) Type -> TcM ContextKind
    forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
    <$> UserTypeCtxt -> LHsKind GhcRn -> IOEnv (Env TcGblEnv TcLclEnv) Type
    tcLHsKindSig UserTypeCtxt
    ctxt LHsKind GhcRn
    ksig
                     Maybe (LHsKind GhcRn)
    Nothing ->
                       case SAKS_or_CUSK
    msig of
                         SAKS_or_CUSK
    CUSK -> ContextKind -> TcM ContextKind
    forall a. a -> IOEnv (Env TcGblEnv TcLclEnv) a
    forall (m :: * -> *) a. Monad m => a -> m a
    return (Type -> ContextKind
    TheKind Type
    liftedTypeKind)
                         SAKS Type
    _ -> ContextKind -> TcM ContextKind
    forall a. a -> IOEnv (Env TcGblEnv TcLclEnv) a
    forall (m :: * -> *) a. Monad m => a -> m a
    return ContextKind
    AnyKind
           ; return [tc] }

    getInitialKind InitialKindStrategy
    strategy
        (SynDecl { tcdLName :: forall pass. TyClDecl pass -> LIdP pass
    tcdLName = L SrcSpanAnnN
    _ Name
    name
                 , tcdTyVars :: forall pass. TyClDecl pass -> LHsQTyVars pass
    tcdTyVars = LHsQTyVars GhcRn
    ktvs
                 , tcdRhs :: forall pass. TyClDecl pass -> LHsType pass
    tcdRhs = LHsKind GhcRn
    rhs })
      = do { let ctxt :: UserTypeCtxt
    ctxt = Name -> UserTypeCtxt
    TySynKindCtxt Name
    name
           ; tc <- InitialKindStrategy
    -> Name
    -> TyConFlavour TyCon
    -> LHsQTyVars GhcRn
    -> TcM ContextKind
    -> TcRn TyCon
    kcDeclHeader InitialKindStrategy
    strategy Name
    name TyConFlavour TyCon
    forall tc. TyConFlavour tc
    TypeSynonymFlavour LHsQTyVars GhcRn
    ktvs (TcM ContextKind -> TcRn TyCon) -> TcM ContextKind -> TcRn TyCon
    forall a b. (a -> b) -> a -> b
    $
                   case LHsKind GhcRn -> Maybe (LHsKind GhcRn)
    forall (p :: Pass).
    LHsType (GhcPass p) -> Maybe (LHsType (GhcPass p))
    hsTyKindSig LHsKind GhcRn
    rhs of
                     Just LHsKind GhcRn
    rhs_sig -> Type -> ContextKind
    TheKind (Type -> ContextKind)
    -> IOEnv (Env TcGblEnv TcLclEnv) Type -> TcM ContextKind
    forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
    <$> UserTypeCtxt -> LHsKind GhcRn -> IOEnv (Env TcGblEnv TcLclEnv) Type
    tcLHsKindSig UserTypeCtxt
    ctxt LHsKind GhcRn
    rhs_sig
                     Maybe (LHsKind GhcRn)
    Nothing -> ContextKind -> TcM ContextKind
    forall a. a -> IOEnv (Env TcGblEnv TcLclEnv) a
    forall (m :: * -> *) a. Monad m => a -> m a
    return ContextKind
    AnyKind
           ; return [tc] }

    get_fam_decl_initial_kind
      :: Maybe TcTyCon -- ^ Just cls <=> this is an associated family of class cls
      -> FamilyDecl GhcRn
      -> TcM TcTyCon
    get_fam_decl_initial_kind :: Maybe TyCon -> FamilyDecl GhcRn -> TcRn TyCon
    get_fam_decl_initial_kind Maybe TyCon
    mb_parent_tycon
        FamilyDecl { fdLName :: forall pass. FamilyDecl pass -> LIdP pass
    fdLName     = L SrcSpanAnnN
    _ Name
    name
                   , fdTyVars :: forall pass. FamilyDecl pass -> LHsQTyVars pass
    fdTyVars    = LHsQTyVars GhcRn
    ktvs
                   , fdResultSig :: forall pass. FamilyDecl pass -> LFamilyResultSig pass
    fdResultSig = L EpAnnCO
    _ FamilyResultSig GhcRn
    resultSig
                   , fdInfo :: forall pass. FamilyDecl pass -> FamilyInfo pass
    fdInfo      = FamilyInfo GhcRn
    info }
      = InitialKindStrategy
    -> Name
    -> TyConFlavour TyCon
    -> LHsQTyVars GhcRn
    -> TcM ContextKind
    -> TcRn TyCon
    kcDeclHeader InitialKindStrategy
    InitialKindInfer Name
    name TyConFlavour TyCon
    flav LHsQTyVars GhcRn
    ktvs (TcM ContextKind -> TcRn TyCon) -> TcM ContextKind -> TcRn TyCon
    forall a b. (a -> b) -> a -> b
    $
        case FamilyResultSig GhcRn
    resultSig of
          KindSig XCKindSig GhcRn
    _ LHsKind GhcRn
    ki                            -> Type -> ContextKind
    TheKind (Type -> ContextKind)
    -> IOEnv (Env TcGblEnv TcLclEnv) Type -> TcM ContextKind
    forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
    <$> UserTypeCtxt -> LHsKind GhcRn -> IOEnv (Env TcGblEnv TcLclEnv) Type
    tcLHsKindSig UserTypeCtxt
    ctxt LHsKind GhcRn
    ki
          TyVarSig XTyVarSig GhcRn
    _ (L SrcSpanAnnA
    _ (KindedTyVar XKindedTyVar GhcRn
    _ ()
    _ LIdP GhcRn
    _ LHsKind GhcRn
    ki)) -> Type -> ContextKind
    TheKind (Type -> ContextKind)
    -> IOEnv (Env TcGblEnv TcLclEnv) Type -> TcM ContextKind
    forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
    <$> UserTypeCtxt -> LHsKind GhcRn -> IOEnv (Env TcGblEnv TcLclEnv) Type
    tcLHsKindSig UserTypeCtxt
    ctxt LHsKind GhcRn
    ki
          FamilyResultSig GhcRn
    _ -- open type families have * return kind by default
            | TyConFlavour TyCon -> Bool
    forall tc. TyConFlavour tc -> Bool
    tcFlavourIsOpen TyConFlavour TyCon
    flav              -> ContextKind -> TcM ContextKind
    forall a. a -> IOEnv (Env TcGblEnv TcLclEnv) a
    forall (m :: * -> *) a. Monad m => a -> m a
    return (Type -> ContextKind
    TheKind Type
    liftedTypeKind)
                   -- closed type families have their return kind inferred
                   -- by default
            | Bool
    otherwise                         -> ContextKind -> TcM ContextKind
    forall a. a -> IOEnv (Env TcGblEnv TcLclEnv) a
    forall (m :: * -> *) a. Monad m => a -> m a
    return ContextKind
    AnyKind
      where
        flav :: TyConFlavour TyCon
    flav = Maybe TyCon -> FamilyInfo GhcRn -> TyConFlavour TyCon
    forall tc pass. Maybe tc -> FamilyInfo pass -> TyConFlavour tc
    familyInfoTyConFlavour Maybe TyCon
    mb_parent_tycon FamilyInfo GhcRn
    info
        ctxt :: UserTypeCtxt
    ctxt = Name -> UserTypeCtxt
    TyFamResKindCtxt Name
    name

    -- See Note [Standalone kind signatures for associated types]
    check_initial_kind_assoc_fam
      :: TcTyCon -- parent class
      -> FamilyDecl GhcRn
      -> TcM TcTyCon
    check_initial_kind_assoc_fam :: TyCon -> FamilyDecl GhcRn -> TcRn TyCon
    check_initial_kind_assoc_fam TyCon
    cls
      FamilyDecl
        { fdLName :: forall pass. FamilyDecl pass -> LIdP pass
    fdLName     = LIdP GhcRn -> Name
    LocatedN Name -> Name
    forall l e. GenLocated l e -> e
    unLoc -> Name
    name
        , fdTyVars :: forall pass. FamilyDecl pass -> LHsQTyVars pass
    fdTyVars    = LHsQTyVars GhcRn
    ktvs
        , fdResultSig :: forall pass. FamilyDecl pass -> LFamilyResultSig pass
    fdResultSig = LFamilyResultSig GhcRn -> FamilyResultSig GhcRn
    GenLocated EpAnnCO (FamilyResultSig GhcRn) -> FamilyResultSig GhcRn
    forall l e. GenLocated l e -> e
    unLoc -> FamilyResultSig GhcRn
    resultSig
        , fdInfo :: forall pass. FamilyDecl pass -> FamilyInfo pass
    fdInfo      = FamilyInfo GhcRn
    info }
      = InitialKindStrategy
    -> Name
    -> TyConFlavour TyCon
    -> LHsQTyVars GhcRn
    -> TcM ContextKind
    -> TcRn TyCon
    kcDeclHeader (SAKS_or_CUSK -> InitialKindStrategy
    InitialKindCheck SAKS_or_CUSK
    CUSK) Name
    name TyConFlavour TyCon
    flav LHsQTyVars GhcRn
    ktvs (TcM ContextKind -> TcRn TyCon) -> TcM ContextKind -> TcRn TyCon
    forall a b. (a -> b) -> a -> b
    $
        case FamilyResultSig GhcRn -> Maybe (LHsKind GhcRn)
    forall (p :: Pass).
    FamilyResultSig (GhcPass p) -> Maybe (LHsKind (GhcPass p))
    famResultKindSignature FamilyResultSig GhcRn
    resultSig of
          Just LHsKind GhcRn
    ksig -> Type -> ContextKind
    TheKind (Type -> ContextKind)
    -> IOEnv (Env TcGblEnv TcLclEnv) Type -> TcM ContextKind
    forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
    <$> UserTypeCtxt -> LHsKind GhcRn -> IOEnv (Env TcGblEnv TcLclEnv) Type
    tcLHsKindSig UserTypeCtxt
    ctxt LHsKind GhcRn
    ksig
          Maybe (LHsKind GhcRn)
    Nothing -> ContextKind -> TcM ContextKind
    forall a. a -> IOEnv (Env TcGblEnv TcLclEnv) a
    forall (m :: * -> *) a. Monad m => a -> m a
    return (Type -> ContextKind
    TheKind Type
    liftedTypeKind)
      where
        ctxt :: UserTypeCtxt
    ctxt = Name -> UserTypeCtxt
    TyFamResKindCtxt Name
    name
        flav :: TyConFlavour TyCon
    flav = Maybe TyCon -> FamilyInfo GhcRn -> TyConFlavour TyCon
    forall tc pass. Maybe tc -> FamilyInfo pass -> TyConFlavour tc
    familyInfoTyConFlavour (TyCon -> Maybe TyCon
    forall a. a -> Maybe a
    Just TyCon
    cls) FamilyInfo GhcRn
    info

    {- Note [Standalone kind signatures for associated types]
    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

    If associated types had standalone kind signatures, would they wear them

    ---------------------------+------------------------------
      like this? (OUT)         |   or like this? (IN)
    ---------------------------+------------------------------
      type T :: Type -> Type   |   class C a where
      class C a where          |     type T :: Type -> Type
        type T a               |     type T a

    The (IN) variant is syntactically ambiguous:

      class C a where
        type T :: a   -- standalone kind signature?
        type T :: a   -- declaration header?

    The (OUT) variant does not suffer from this issue, but it might not be the
    direction in which we want to take Haskell: we seek to unify type families and
    functions, and, by extension, associated types with class methods. And yet we
    give class methods their signatures inside the class, not outside. Neither do
    we have the counterpart of InstanceSigs for StandaloneKindSignatures.

    For now, we dodge the question by using CUSKs for associated types instead of
    standalone kind signatures. This is a simple addition to the rule we used to
    have before standalone kind signatures:

      old rule:  associated type has a CUSK iff its parent class has a CUSK
      new rule:  associated type has a CUSK iff its parent class has a CUSK or a standalone kind signature

    -}

    -- See Note [Data declaration default result kind]
    dataDeclDefaultResultKind :: InitialKindStrategy ->  NewOrData -> ContextKind
    dataDeclDefaultResultKind :: InitialKindStrategy -> NewOrData -> ContextKind
    dataDeclDefaultResultKind InitialKindStrategy
    strategy NewOrData
    new_or_data
      | NewOrData
    NewType <- NewOrData
    new_or_data
      = ContextKind
    OpenKind -- See Note [Implementation of UnliftedNewtypes], point <Error Messages>.
      | NewOrData
    DataType <- NewOrData
    new_or_data
      , InitialKindCheck (SAKS Type
    _) <- InitialKindStrategy
    strategy
      = ContextKind
    OpenKind -- See Note [Implementation of UnliftedDatatypes]
      | Bool
    otherwise
      = Type -> ContextKind
    TheKind Type
    liftedTypeKind

    {- Note [Data declaration default result kind]
    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    When the user has not written an inline result kind annotation on a data
    declaration, we assume it to be 'Type'. That is, the following declarations
    D1 and D2 are considered equivalent:

      data D1         where ...
      data D2 :: Type where ...

    The consequence of this assumption is that we reject D3 even though we
    accept D4:

      data D3 where
        MkD3 :: ... -> D3 param

      data D4 :: Type -> Type where
        MkD4 :: ... -> D4 param

    However, there are two twists:

      * For unlifted newtypes, we must relax the assumed result kind to (TYPE r):

          newtype D5 where
            MkD5 :: Int# -> D5

        See Note [Implementation of UnliftedNewtypes], STEP 1 and it's sub-note
        <Error Messages>.

      * For unlifted datatypes, we must relax the assumed result kind to
        (TYPE (BoxedRep l)) in the presence of a SAKS:

          type D6 :: Type -> TYPE (BoxedRep Unlifted)
          data D6 a = MkD6 a

        Otherwise, it would be impossible to declare unlifted data types in H98
        syntax (which doesn't allow specification of a result kind).

    -}

    ------------------------------------------------------------------------
    kcLTyClDecl :: LTyClDecl GhcRn -> TcM ()
      -- See Note [Kind checking for type and class decls]
      -- Called only for declarations without a signature (no CUSKs or SAKs here)
    kcLTyClDecl :: LTyClDecl GhcRn -> TcRn ()
    kcLTyClDecl (L SrcSpanAnnA
    loc TyClDecl GhcRn
    decl)
      = SrcSpanAnnA -> TcRn () -> TcRn ()
    forall ann a. EpAnn ann -> TcRn a -> TcRn a
    setSrcSpanA SrcSpanAnnA
    loc (TcRn () -> TcRn ()) -> TcRn () -> TcRn ()
    forall a b. (a -> b) -> a -> b
    $
        do { tycon <- HasDebugCallStack => Name -> TcRn TyCon
    Name -> TcRn TyCon
    tcLookupTcTyCon IdP GhcRn
    Name
    tc_name   -- Always a MonoTcTyCon
           ; traceTc "kcTyClDecl {" (ppr tc_name)
           ; addVDQNote tycon $   -- See Note [Inferring visible dependent quantification]
             addErrCtxt (tcMkDeclCtxt decl) $
             kcTyClDecl decl tycon
           ; traceTc "kcTyClDecl done }" (ppr tc_name) }
      where
        tc_name :: IdP GhcRn
    tc_name = TyClDecl GhcRn -> IdP GhcRn
    forall (p :: Pass).
    (Anno (IdGhcP p) ~ SrcSpanAnnN) =>
    TyClDecl (GhcPass p) -> IdP (GhcPass p)
    tcdName TyClDecl GhcRn
    decl

    kcTyClDecl :: TyClDecl GhcRn -> MonoTcTyCon -> TcM ()
    -- This function is used solely for its side effect on kind variables
    -- NB kind signatures on the type variables and
    --    result kind signature have already been dealt with
    --    by inferInitialKind, so we can ignore them here.

    -- NB these equations just extend the type environment with carefully constructed
    -- TcTyVars rather than create skolemised variables for the bound variables.
    -- - inferInitialKinds makes the TcTyCon where the  tyvars are TcTyVars
    -- - In this function, those TcTyVars are unified with other kind variables during
    --   kind inference (see GHC.Tc.TyCl Note [TcTyCon, MonoTcTyCon, and PolyTcTyCon])

    kcTyClDecl :: TyClDecl GhcRn -> TyCon -> TcRn ()
    kcTyClDecl (DataDecl { tcdLName :: forall pass. TyClDecl pass -> LIdP pass
    tcdLName    = (L SrcSpanAnnN
    _ Name
    _name), tcdDataDefn :: forall pass. TyClDecl pass -> HsDataDefn pass
    tcdDataDefn = HsDataDefn { dd_ctxt :: forall pass. HsDataDefn pass -> Maybe (LHsContext pass)
    dd_ctxt = Maybe (LHsContext GhcRn)
    ctxt, dd_cons :: forall pass. HsDataDefn pass -> DataDefnCons (LConDecl pass)
    dd_cons = DataDefnCons (LConDecl GhcRn)
    cons } }) TyCon
    tycon
      = [(Name, Var)] -> TcRn () -> TcRn ()
    forall r. [(Name, Var)] -> TcM r -> TcM r
    tcExtendNameTyVarEnv (TyCon -> [(Name, Var)]
    tcTyConScopedTyVars TyCon
    tycon) (TcRn () -> TcRn ()) -> TcRn () -> TcRn ()
    forall a b. (a -> b) -> a -> b
    $
           -- NB: binding these tyvars isn't necessary for GADTs, but it does no
           -- harm.  For GADTs, each data con brings its own tyvars into scope,
           -- and the ones from this bindTyClTyVars are either not mentioned or
           -- (conceivably) shadowed.
        do { String -> SDoc -> TcRn ()
    traceTc String
    "kcTyClDecl" (TyCon -> SDoc
    forall a. Outputable a => a -> SDoc
    ppr TyCon
    tycon SDoc -> SDoc -> SDoc
    forall doc. IsDoc doc => doc -> doc -> doc
    $$ [Var] -> SDoc
    forall a. Outputable a => a -> SDoc
    ppr (TyCon -> [Var]
    tyConTyVars TyCon
    tycon) SDoc -> SDoc -> SDoc
    forall doc. IsDoc doc => doc -> doc -> doc
    $$ Type -> SDoc
    forall a. Outputable a => a -> SDoc
    ppr (TyCon -> Type
    tyConResKind TyCon
    tycon))
           ; _ <- Maybe (LHsContext GhcRn) -> TcM ThetaType
    tcHsContext Maybe (LHsContext GhcRn)
    ctxt
           ; kcConDecls (dataDefnConsNewOrData cons) (tyConResKind tycon) cons
           }

    kcTyClDecl (SynDecl { tcdLName :: forall pass. TyClDecl pass -> LIdP pass
    tcdLName = L SrcSpanAnnN
    _ Name
    _name, tcdRhs :: forall pass. TyClDecl pass -> LHsType pass
    tcdRhs = LHsKind GhcRn
    rhs }) TyCon
    tycon
      = [(Name, Var)] -> TcRn () -> TcRn ()
    forall r. [(Name, Var)] -> TcM r -> TcM r
    tcExtendNameTyVarEnv (TyCon -> [(Name, Var)]
    tcTyConScopedTyVars TyCon
    tycon) (TcRn () -> TcRn ()) -> TcRn () -> TcRn ()
    forall a b. (a -> b) -> a -> b
    $
        let res_kind :: Type
    res_kind = TyCon -> Type
    tyConResKind TyCon
    tycon
        in IOEnv (Env TcGblEnv TcLclEnv) Type -> TcRn ()
    forall a. TcM a -> TcRn ()
    discardResult (IOEnv (Env TcGblEnv TcLclEnv) Type -> TcRn ())
    -> IOEnv (Env TcGblEnv TcLclEnv) Type -> TcRn ()
    forall a b. (a -> b) -> a -> b
    $ LHsKind GhcRn -> ContextKind -> IOEnv (Env TcGblEnv TcLclEnv) Type
    tcCheckLHsType LHsKind GhcRn
    rhs (Type -> ContextKind
    TheKind Type
    res_kind)
            -- NB: check against the result kind that we allocated
            -- in inferInitialKinds.

    kcTyClDecl (ClassDecl { tcdLName :: forall pass. TyClDecl pass -> LIdP pass
    tcdLName = L SrcSpanAnnN
    _ Name
    _name
                          , tcdCtxt :: forall pass. TyClDecl pass -> Maybe (LHsContext pass)
    tcdCtxt = Maybe (LHsContext GhcRn)
    ctxt, tcdSigs :: forall pass. TyClDecl pass -> [LSig pass]
    tcdSigs = [LSig GhcRn]
    sigs }) TyCon
    tycon
      = [(Name, Var)] -> TcRn () -> TcRn ()
    forall r. [(Name, Var)] -> TcM r -> TcM r
    tcExtendNameTyVarEnv (TyCon -> [(Name, Var)]
    tcTyConScopedTyVars TyCon
    tycon) (TcRn () -> TcRn ()) -> TcRn () -> TcRn ()
    forall a b. (a -> b) -> a -> b
    $
        do  { _ <- Maybe (LHsContext GhcRn) -> TcM ThetaType
    tcHsContext Maybe (LHsContext GhcRn)
    ctxt
            ; mapM_ (wrapLocMA_ kc_sig) sigs }
      where
        kc_sig :: Sig GhcRn -> TcRn ()
    kc_sig (ClassOpSig XClassOpSig GhcRn
    _ Bool
    _ [LIdP GhcRn]
    nms LHsSigType GhcRn
    op_ty) = [LocatedN Name] -> LHsSigType GhcRn -> TcRn ()
    kcClassSigType [LIdP GhcRn]
    [LocatedN Name]
    nms LHsSigType GhcRn
    op_ty
        kc_sig Sig GhcRn
    _                          = () -> TcRn ()
    forall a. a -> IOEnv (Env TcGblEnv TcLclEnv) a
    forall (m :: * -> *) a. Monad m => a -> m a
    return ()

    kcTyClDecl (FamDecl XFamDecl GhcRn
    _ (FamilyDecl { fdInfo :: forall pass. FamilyDecl pass -> FamilyInfo pass
    fdInfo   = FamilyInfo GhcRn
    fd_info })) TyCon
    fam_tc
    -- closed type families look at their equations, but other families don't
    -- do anything here
      = case FamilyInfo GhcRn
    fd_info of
          ClosedTypeFamily (Just [LTyFamInstEqn GhcRn]
    eqns) -> (GenLocated
       SrcSpanAnnA (FamEqn GhcRn (GenLocated SrcSpanAnnA (HsType GhcRn)))
     -> TcRn ())
    -> [GenLocated
          SrcSpanAnnA (FamEqn GhcRn (GenLocated SrcSpanAnnA (HsType GhcRn)))]
    -> TcRn ()
    forall (t :: * -> *) (m :: * -> *) a b.
    (Foldable t, Monad m) =>
    (a -> m b) -> t a -> m ()
    mapM_ (TyCon -> LTyFamInstEqn GhcRn -> TcRn ()
    kcTyFamInstEqn TyCon
    fam_tc) [LTyFamInstEqn GhcRn]
    [GenLocated
       SrcSpanAnnA (FamEqn GhcRn (GenLocated SrcSpanAnnA (HsType GhcRn)))]
    eqns
          FamilyInfo GhcRn
    _ -> () -> TcRn ()
    forall a. a -> IOEnv (Env TcGblEnv TcLclEnv) a
    forall (m :: * -> *) a. Monad m => a -> m a
    return ()

    -------------------

    -- Kind-check the types of the arguments to a data constructor.
    -- This includes doing kind unification if the type is a newtype.
    -- See Note [Implementation of UnliftedNewtypes] for why we need
    -- the first two arguments.
    kcConArgTys :: NewOrData -> TcKind -> [HsScaled GhcRn (LHsType GhcRn)] -> TcM ()
    kcConArgTys :: NewOrData -> Type -> [HsScaled GhcRn (LHsKind GhcRn)] -> TcRn ()
    kcConArgTys NewOrData
    new_or_data Type
    res_kind [HsScaled GhcRn (LHsKind GhcRn)]
    arg_tys = do
      { let exp_kind :: ContextKind
    exp_kind = NewOrData -> Type -> ContextKind
    getArgExpKind NewOrData
    new_or_data Type
    res_kind
      ; [HsScaled GhcRn (GenLocated SrcSpanAnnA (HsType GhcRn))]
    -> (HsScaled GhcRn (GenLocated SrcSpanAnnA (HsType GhcRn))
        -> IOEnv (Env TcGblEnv TcLclEnv) Type)
    -> TcRn ()
    forall (t :: * -> *) (m :: * -> *) a b.
    (Foldable t, Monad m) =>
    t a -> (a -> m b) -> m ()
    forM_ [HsScaled GhcRn (LHsKind GhcRn)]
    [HsScaled GhcRn (GenLocated SrcSpanAnnA (HsType GhcRn))]
    arg_tys (\(HsScaled HsArrow GhcRn
    mult GenLocated SrcSpanAnnA (HsType GhcRn)
    ty) -> do _ <- LHsKind GhcRn -> ContextKind -> IOEnv (Env TcGblEnv TcLclEnv) Type
    tcCheckLHsType (LHsKind GhcRn -> LHsKind GhcRn
    forall (p :: Pass). LHsType (GhcPass p) -> LHsType (GhcPass p)
    getBangType LHsKind GhcRn
    GenLocated SrcSpanAnnA (HsType GhcRn)
    ty) ContextKind
    exp_kind
                                                 tcMult mult)
        -- See Note [Implementation of UnliftedNewtypes], STEP 2
      }

    -- Kind-check the types of arguments to a Haskell98 data constructor.
    kcConH98Args :: NewOrData -> TcKind -> HsConDeclH98Details GhcRn -> TcM ()
    kcConH98Args :: NewOrData -> Type -> HsConDeclH98Details GhcRn -> TcRn ()
    kcConH98Args NewOrData
    new_or_data Type
    res_kind HsConDeclH98Details GhcRn
    con_args = case HsConDeclH98Details GhcRn
    con_args of
      PrefixCon [Void]
    _ [HsScaled GhcRn (LHsKind GhcRn)]
    tys   -> NewOrData -> Type -> [HsScaled GhcRn (LHsKind GhcRn)] -> TcRn ()
    kcConArgTys NewOrData
    new_or_data Type
    res_kind [HsScaled GhcRn (LHsKind GhcRn)]
    tys
      InfixCon HsScaled GhcRn (LHsKind GhcRn)
    ty1 HsScaled GhcRn (LHsKind GhcRn)
    ty2  -> NewOrData -> Type -> [HsScaled GhcRn (LHsKind GhcRn)] -> TcRn ()
    kcConArgTys NewOrData
    new_or_data Type
    res_kind [HsScaled GhcRn (LHsKind GhcRn)
    ty1, HsScaled GhcRn (LHsKind GhcRn)
    ty2]
      RecCon (L SrcSpanAnnL
    _ [GenLocated SrcSpanAnnA (ConDeclField GhcRn)]
    flds) -> NewOrData -> Type -> [HsScaled GhcRn (LHsKind GhcRn)] -> TcRn ()
    kcConArgTys NewOrData
    new_or_data Type
    res_kind ([HsScaled GhcRn (LHsKind GhcRn)] -> TcRn ())
    -> [HsScaled GhcRn (LHsKind GhcRn)] -> TcRn ()
    forall a b. (a -> b) -> a -> b
    $
                           (GenLocated SrcSpanAnnA (ConDeclField GhcRn)
     -> HsScaled GhcRn (GenLocated SrcSpanAnnA (HsType GhcRn)))
    -> [GenLocated SrcSpanAnnA (ConDeclField GhcRn)]
    -> [HsScaled GhcRn (GenLocated SrcSpanAnnA (HsType GhcRn))]
    forall a b. (a -> b) -> [a] -> [b]
    map (GenLocated SrcSpanAnnA (HsType GhcRn)
    -> HsScaled GhcRn (GenLocated SrcSpanAnnA (HsType GhcRn))
    forall (p :: Pass) a. IsPass p => a -> HsScaled (GhcPass p) a
    hsLinear (GenLocated SrcSpanAnnA (HsType GhcRn)
     -> HsScaled GhcRn (GenLocated SrcSpanAnnA (HsType GhcRn)))
    -> (GenLocated SrcSpanAnnA (ConDeclField GhcRn)
        -> GenLocated SrcSpanAnnA (HsType GhcRn))
    -> GenLocated SrcSpanAnnA (ConDeclField GhcRn)
    -> HsScaled GhcRn (GenLocated SrcSpanAnnA (HsType GhcRn))
    forall b c a. (b -> c) -> (a -> b) -> a -> c
    . ConDeclField GhcRn -> LHsKind GhcRn
    ConDeclField GhcRn -> GenLocated SrcSpanAnnA (HsType GhcRn)
    forall pass. ConDeclField pass -> LBangType pass
    cd_fld_type (ConDeclField GhcRn -> GenLocated SrcSpanAnnA (HsType GhcRn))
    -> (GenLocated SrcSpanAnnA (ConDeclField GhcRn)
        -> ConDeclField GhcRn)
    -> GenLocated SrcSpanAnnA (ConDeclField GhcRn)
    -> GenLocated SrcSpanAnnA (HsType GhcRn)
    forall b c a. (b -> c) -> (a -> b) -> a -> c
    . GenLocated SrcSpanAnnA (ConDeclField GhcRn) -> ConDeclField GhcRn
    forall l e. GenLocated l e -> e
    unLoc) [GenLocated SrcSpanAnnA (ConDeclField GhcRn)]
    flds

    -- Kind-check the types of arguments to a GADT data constructor.
    kcConGADTArgs :: NewOrData -> TcKind -> HsConDeclGADTDetails GhcRn -> TcM ()
    kcConGADTArgs :: NewOrData -> Type -> HsConDeclGADTDetails GhcRn -> TcRn ()
    kcConGADTArgs NewOrData
    new_or_data Type
    res_kind HsConDeclGADTDetails GhcRn
    con_args = case HsConDeclGADTDetails GhcRn
    con_args of
      PrefixConGADT XPrefixConGADT GhcRn
    _ [HsScaled GhcRn (LHsKind GhcRn)]
    tys     -> NewOrData -> Type -> [HsScaled GhcRn (LHsKind GhcRn)] -> TcRn ()
    kcConArgTys NewOrData
    new_or_data Type
    res_kind [HsScaled GhcRn (LHsKind GhcRn)]
    tys
      RecConGADT XRecConGADT GhcRn
    _ (L SrcSpanAnnL
    _ [GenLocated SrcSpanAnnA (ConDeclField GhcRn)]
    flds) -> NewOrData -> Type -> [HsScaled GhcRn (LHsKind GhcRn)] -> TcRn ()
    kcConArgTys NewOrData
    new_or_data Type
    res_kind ([HsScaled GhcRn (LHsKind GhcRn)] -> TcRn ())
    -> [HsScaled GhcRn (LHsKind GhcRn)] -> TcRn ()
    forall a b. (a -> b) -> a -> b
    $
                                 (GenLocated SrcSpanAnnA (ConDeclField GhcRn)
     -> HsScaled GhcRn (GenLocated SrcSpanAnnA (HsType GhcRn)))
    -> [GenLocated SrcSpanAnnA (ConDeclField GhcRn)]
    -> [HsScaled GhcRn (GenLocated SrcSpanAnnA (HsType GhcRn))]
    forall a b. (a -> b) -> [a] -> [b]
    map (GenLocated SrcSpanAnnA (HsType GhcRn)
    -> HsScaled GhcRn (GenLocated SrcSpanAnnA (HsType GhcRn))
    forall (p :: Pass) a. IsPass p => a -> HsScaled (GhcPass p) a
    hsLinear (GenLocated SrcSpanAnnA (HsType GhcRn)
     -> HsScaled GhcRn (GenLocated SrcSpanAnnA (HsType GhcRn)))
    -> (GenLocated SrcSpanAnnA (ConDeclField GhcRn)
        -> GenLocated SrcSpanAnnA (HsType GhcRn))
    -> GenLocated SrcSpanAnnA (ConDeclField GhcRn)
    -> HsScaled GhcRn (GenLocated SrcSpanAnnA (HsType GhcRn))
    forall b c a. (b -> c) -> (a -> b) -> a -> c
    . ConDeclField GhcRn -> LHsKind GhcRn
    ConDeclField GhcRn -> GenLocated SrcSpanAnnA (HsType GhcRn)
    forall pass. ConDeclField pass -> LBangType pass
    cd_fld_type (ConDeclField GhcRn -> GenLocated SrcSpanAnnA (HsType GhcRn))
    -> (GenLocated SrcSpanAnnA (ConDeclField GhcRn)
        -> ConDeclField GhcRn)
    -> GenLocated SrcSpanAnnA (ConDeclField GhcRn)
    -> GenLocated SrcSpanAnnA (HsType GhcRn)
    forall b c a. (b -> c) -> (a -> b) -> a -> c
    . GenLocated SrcSpanAnnA (ConDeclField GhcRn) -> ConDeclField GhcRn
    forall l e. GenLocated l e -> e
    unLoc) [GenLocated SrcSpanAnnA (ConDeclField GhcRn)]
    flds

    kcConDecls :: Foldable f
               => NewOrData
               -> TcKind             -- The result kind signature
                                   --   Used only in H98 case
               -> f (LConDecl GhcRn) -- The data constructors
               -> TcM ()
    -- See Note [kcConDecls: kind-checking data type decls]
    kcConDecls :: forall (f :: * -> *).
    Foldable f =>
    NewOrData -> Type -> f (LConDecl GhcRn) -> TcRn ()
    kcConDecls NewOrData
    new_or_data Type
    tc_res_kind = (GenLocated SrcSpanAnnA (ConDecl GhcRn) -> TcRn ())
    -> f (GenLocated SrcSpanAnnA (ConDecl GhcRn)) -> TcRn ()
    forall (t :: * -> *) (f :: * -> *) a b.
    (Foldable t, Applicative f) =>
    (a -> f b) -> t a -> f ()
    traverse_ ((ConDecl GhcRn -> TcRn ())
    -> GenLocated SrcSpanAnnA (ConDecl GhcRn) -> TcRn ()
    forall a. (a -> TcRn ()) -> LocatedA a -> TcRn ()
    wrapLocMA_ (NewOrData -> Type -> ConDecl GhcRn -> TcRn ()
    kcConDecl NewOrData
    new_or_data Type
    tc_res_kind))

    -- Kind check a data constructor. In additional to the data constructor,
    -- we also need to know about whether or not its corresponding type was
    -- declared with data or newtype, and we need to know the result kind of
    -- this type. See Note [Implementation of UnliftedNewtypes] for why
    -- we need the first two arguments.
    kcConDecl :: NewOrData
              -> TcKind  -- Result kind of the type constructor
                       -- Usually Type but can be TYPE UnliftedRep
                       -- or even TYPE r, in the case of unlifted newtype
                       -- Used only in H98 case
              -> ConDecl GhcRn
              -> TcM ()
    kcConDecl :: NewOrData -> Type -> ConDecl GhcRn -> TcRn ()
    kcConDecl NewOrData
    new_or_data Type
    tc_res_kind (ConDeclH98
      { con_name :: forall pass. ConDecl pass -> LIdP pass
    con_name = LIdP GhcRn
    name, con_ex_tvs :: forall pass. ConDecl pass -> [LHsTyVarBndr Specificity pass]
    con_ex_tvs = [LHsTyVarBndr Specificity GhcRn]
    ex_tvs
      , con_mb_cxt :: forall pass. ConDecl pass -> Maybe (LHsContext pass)
    con_mb_cxt = Maybe (LHsContext GhcRn)
    ex_ctxt, con_args :: forall pass. ConDecl pass -> HsConDeclH98Details pass
    con_args = HsConDeclH98Details GhcRn
    args })
      = SDoc -> TcRn () -> TcRn ()
    forall a. SDoc -> TcM a -> TcM a
    addErrCtxt (NonEmpty (LocatedN Name) -> SDoc
    dataConCtxt (LocatedN Name -> NonEmpty (LocatedN Name)
    forall a. a -> NonEmpty a
    NE.singleton LIdP GhcRn
    LocatedN Name
    name)) (TcRn () -> TcRn ()) -> TcRn () -> TcRn ()
    forall a b. (a -> b) -> a -> b
    $
        TcM ([VarBndr Var Specificity], ()) -> TcRn ()
    forall a. TcM a -> TcRn ()
    discardResult                   (TcM ([VarBndr Var Specificity], ()) -> TcRn ())
    -> TcM ([VarBndr Var Specificity], ()) -> TcRn ()
    forall a b. (a -> b) -> a -> b
    $
        [LHsTyVarBndr Specificity GhcRn]
    -> TcRn () -> TcM ([VarBndr Var Specificity], ())
    forall flag a.
    OutputableBndrFlag flag 'Renamed =>
    [LHsTyVarBndr flag GhcRn] -> TcM a -> TcM ([VarBndr Var flag], a)
    bindExplicitTKBndrs_Tv [LHsTyVarBndr Specificity GhcRn]
    ex_tvs (TcRn () -> TcM ([VarBndr Var Specificity], ()))
    -> TcRn () -> TcM ([VarBndr Var Specificity], ())
    forall a b. (a -> b) -> a -> b
    $
        do { _ <- Maybe (LHsContext GhcRn) -> TcM ThetaType
    tcHsContext Maybe (LHsContext GhcRn)
    ex_ctxt
           ; kcConH98Args new_or_data tc_res_kind args
             -- We don't need to check the telescope here,
             -- because that's done in tcConDecl
           }

    kcConDecl NewOrData
    new_or_data
              Type
    _tc_res_kind   -- Not used in GADT case (and doesn't make sense)
              (ConDeclGADT
        { con_names :: forall pass. ConDecl pass -> NonEmpty (LIdP pass)
    con_names = NonEmpty (LIdP GhcRn)
    names, con_bndrs :: forall pass. ConDecl pass -> XRec pass (HsOuterSigTyVarBndrs pass)
    con_bndrs = L SrcSpanAnnA
    _ HsOuterSigTyVarBndrs GhcRn
    outer_bndrs, con_mb_cxt :: forall pass. ConDecl pass -> Maybe (LHsContext pass)
    con_mb_cxt = Maybe (LHsContext GhcRn)
    cxt
        , con_g_args :: forall pass. ConDecl pass -> HsConDeclGADTDetails pass
    con_g_args = HsConDeclGADTDetails GhcRn
    args, con_res_ty :: forall pass. ConDecl pass -> LHsType pass
    con_res_ty = LHsKind GhcRn
    res_ty })
      = -- See Note [kcConDecls: kind-checking data type decls]
        SDoc -> TcRn () -> TcRn ()
    forall a. SDoc -> TcM a -> TcM a
    addErrCtxt (NonEmpty (LocatedN Name) -> SDoc
    dataConCtxt NonEmpty (LIdP GhcRn)
    NonEmpty (LocatedN Name)
    names) (TcRn () -> TcRn ()) -> TcRn () -> TcRn ()
    forall a b. (a -> b) -> a -> b
    $
        TcM (HsOuterSigTyVarBndrs GhcTc, ()) -> TcRn ()
    forall a. TcM a -> TcRn ()
    discardResult                      (TcM (HsOuterSigTyVarBndrs GhcTc, ()) -> TcRn ())
    -> TcM (HsOuterSigTyVarBndrs GhcTc, ()) -> TcRn ()
    forall a b. (a -> b) -> a -> b
    $
        -- Not sure this is right, should just extend rather than skolemise but no test
        HsOuterSigTyVarBndrs GhcRn
    -> TcRn () -> TcM (HsOuterSigTyVarBndrs GhcTc, ())
    forall a.
    HsOuterSigTyVarBndrs GhcRn
    -> TcM a -> TcM (HsOuterSigTyVarBndrs GhcTc, a)
    bindOuterSigTKBndrs_Tv HsOuterSigTyVarBndrs GhcRn
    outer_bndrs (TcRn () -> TcM (HsOuterSigTyVarBndrs GhcTc, ()))
    -> TcRn () -> TcM (HsOuterSigTyVarBndrs GhcTc, ())
    forall a b. (a -> b) -> a -> b
    $
            -- Why "_Tv"?  See Note [Using TyVarTvs for kind-checking GADTs]
        do { _ <- Maybe (LHsContext GhcRn) -> TcM ThetaType
    tcHsContext Maybe (LHsContext GhcRn)
    cxt
           ; traceTc "kcConDecl:GADT {" (ppr names $$ ppr res_ty)
           ; con_res_kind <- newOpenTypeKind
           ; _ <- tcCheckLHsType res_ty (TheKind con_res_kind)
           ; kcConGADTArgs new_or_data con_res_kind args
           ; traceTc "kcConDecl:GADT }" (ppr names $$ ppr con_res_kind)
           ; return () }

    {- Note [kcConDecls: kind-checking data type decls]
    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    kcConDecls is used when we are inferring the kind of the type
    constructor in a data type declaration.  E.g.
        data T f a = MkT (f a)
    we want to infer the kind of 'f' and 'a'. The basic plan is described
    in Note [Inferring kinds for type declarations]; here we are doing Step 2.

    In the GADT case we may have this:
       data T f a where
          MkT :: forall g b. g b -> T g b

    Notice that the variables f,a, and g,b are quite distinct.
    Nevertheless, the type signature for MkT must still influence the kind
    T which is (remember Step 1) something like
      T :: kappa1 -> kappa2 -> Type
    Otherwise we'd infer the bogus kind
      T :: forall k1 k2. k1 -> k2 -> Type.

    The type signature for MkT influences the kind of T simply by
    kind-checking the result type (T g b), which will force 'f' and 'g' to
    have the same kinds. This is the call to
        tcCheckLHsType res_ty (TheKind con_res_kind)
    Because this is the result type of an arrow, we know the kind must be
    of form (TYPE rr), and we get better error messages if we enforce that
    here (e.g. test gadt10).

    For unlifted newtypes only, we must ensure that the argument kind
    and result kind are the same:
    * In the H98 case, we need the result kind of the TyCon, to unify with
      the argument kind.

    * In GADT syntax, this unification happens via the result kind passed
      to kcConGADTArgs. The tycon's result kind is not used at all in the
      GADT case.

    Note [Using TyVarTvs for kind-checking GADTs]
    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    Consider

      data Proxy a where
        MkProxy1 :: forall k (b :: k). Proxy b
        MkProxy2 :: forall j (c :: j). Proxy c

    It seems reasonable that this should be accepted. But something very strange
    is going on here: when we're kind-checking this declaration, we need to unify
    the kind of `a` with k and j -- even though k and j's scopes are local to the type of
    MkProxy{1,2}.

    In effect, we are simply gathering constraints on the shape of Proxy's
    kind, with no skolemisation or implication constraints involved at all.

    The best approach we've come up with is to use TyVarTvs during the
    kind-checking pass, rather than ordinary skolems. This is why we use
    the "_Tv" variant, bindOuterSigTKBndrs_Tv.

    Our only goal is to gather constraints on the kind of the type constructor;
    we do not certify that the data declaration is well-kinded. For example:

      data SameKind :: k -> k -> Type
      data Bad a where
        MkBad :: forall k1 k2 (a :: k1) (b :: k2). Bad (SameKind a b)

    which would be accepted by kcConDecl because k1 and k2 are
    TyVarTvs. It is correctly rejected in the second pass, tcConDecl.
    (Test case: polykinds/TyVarTvKinds3)

    One drawback of this approach is sometimes it will accept a definition that
    a (hypothetical) declarative specification would likely reject. As a general
    rule, we don't want to allow polymorphic recursion without a CUSK. Indeed,
    the whole point of CUSKs is to allow polymorphic recursion. Yet, the TyVarTvs
    approach allows a limited form of polymorphic recursion *without* a CUSK.

    To wit:
      data T a = forall k (b :: k). MkT (T b) Int
      (test case: dependent/should_compile/T14066a)

    Note that this is polymorphically recursive, with the recursive occurrence
    of T used at a kind other than a's kind. The approach outlined here accepts
    this definition, because this kind is still a kind variable (and so the
    TyVarTvs unify). Stepping back, I (Richard) have a hard time envisioning a
    way to describe exactly what declarations will be accepted and which will
    be rejected (without a CUSK). However, the accepted definitions are indeed
    well-kinded and any rejected definitions would be accepted with a CUSK,
    and so this wrinkle need not cause anyone to lose sleep.

    Note [Recursion and promoting data constructors]
    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    We don't want to allow promotion in a strongly connected component
    when kind checking.

    Consider:
      data T f = K (f (K Any))

    When kind checking the `data T' declaration the local env contains the
    mappings:
      T -> ATcTyCon <some initial kind>
      K -> APromotionErr

    APromotionErr is only used for DataCons, and only used during type checking
    in tcTyClGroup.

    The same restriction applies constructors in to "type data" declarations.
    See Note [Type data declarations] in GHC.Rename.Module.

    ************************************************************************
    *                                                                      *
    \subsection{Type checking}
    *                                                                      *
    ************************************************************************

    Note [Type checking recursive type and class declarations]
    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    At this point we have completed *kind-checking* of a mutually
    recursive group of type/class decls (done in kcTyClGroup). However,
    we discarded the kind-checked types (eg RHSs of data type decls);
    note that kcTyClDecl returns ().  There are two reasons:

      * It's convenient, because we don't have to rebuild a
        kinded HsDecl (a fairly elaborate type)

      * It's necessary, because after kind-generalisation, the
        TyCons/Classes may now be kind-polymorphic, and hence need
        to be given kind arguments.

    Example:
           data T f a = MkT (f a) (T f a)
    During kind-checking, we give T the kind T :: k1 -> k2 -> *
    and figure out constraints on k1, k2 etc. Then we generalise
    to get   T :: forall k. (k->*) -> k -> *
    So now the (T f a) in the RHS must be elaborated to (T k f a).

    However, during tcTyClDecl of T (above) we will be in a recursive
    "knot". So we aren't allowed to look at the TyCon T itself; we are only
    allowed to put it (lazily) in the returned structures.  But when
    kind-checking the RHS of T's decl, we *do* need to know T's kind (so
    that we can correctly elaborate (T k f a).  How can we get T's kind
    without looking at T?  Delicate answer: during tcTyClDecl, we extend

      *Global* env with T -> ATyCon (the (not yet built) final TyCon for T)
      *Local*  env with T -> ATcTyCon (TcTyCon with the polymorphic kind of T)

    Then:

      * During GHC.Tc.Gen.HsType.tcTyVar we look in the *local* env, to get the
        fully-known, not knot-tied TcTyCon for T.

      * Then, in GHC.Tc.Zonk.Type.zonkTcTypeToType (and zonkTcTyCon in particular)
        we look in the *global* env to get the TyCon.

    This fancy footwork (with two bindings for T) is only necessary for the
    TyCons or Classes of this recursive group.  Earlier, finished groups,
    live in the global env only.

    See also Note [Kind checking recursive type and class declarations]

    Note [Kind checking recursive type and class declarations]
    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    Before we can type-check the decls, we must kind check them. This
    is done by establishing an "initial kind", which is a rather uninformed
    guess at a tycon's kind (by counting arguments, mainly) and then
    using this initial kind for recursive occurrences.

    The initial kind is stored in exactly the same way during
    kind-checking as it is during type-checking (Note [Type checking
    recursive type and class declarations]): in the *local* environment,
    with ATcTyCon. But we still must store *something* in the *global*
    environment. Even though we discard the result of kind-checking, we
    sometimes need to produce error messages. These error messages will
    want to refer to the tycons being checked, except that they don't
    exist yet, and it would be Terribly Annoying to get the error messages
    to refer back to HsSyn. So we create a TcTyCon and put it in the
    global env. This tycon can print out its name and knows its kind, but
    any other action taken on it will panic. Note that TcTyCons are *not*
    knot-tied, unlike the rather valid but knot-tied ones that occur
    during type-checking.

    Note [Declarations for wired-in things]
    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    For wired-in things we simply ignore the declaration
    and take the wired-in information.  That avoids complications.
    e.g. the need to make the data constructor worker name for
         a constraint tuple match the wired-in one

    Note [Datatype return kinds]
    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    There are several poorly lit corners around datatype/newtype return kinds.
    This Note explains these.  We cover data/newtype families and instances
    in Note [Data family/instance return kinds].

    data    T a :: <kind> where ...   -- See Point DT4
    newtype T a :: <kind> where ...   -- See Point DT5

    DT1 Where this applies: Only GADT syntax for data/newtype/instance declarations
        can have declared return kinds. This Note does not apply to Haskell98
        syntax.

    DT2 Where these kinds come from: The return kind is part of the TyCon kind, gotten either
         by checkInitialKind (standalone kind signature / CUSK) or
         inferInitialKind. It is extracted by bindTyClTyVars in tcTyClDecl1. It is
         then passed to tcDataDefn.

    DT3 Eta-expansion: Any forall-bound variables and function arguments in a result kind
        become parameters to the type. That is, when we say

         data T a :: Type -> Type where ...

        we really mean for T to have two parameters. The second parameter
        is produced by processing the return kind in etaExpandAlgTyCon,
        called in tcDataDefn.

        See also Note [splitTyConKind] in GHC.Tc.Gen.HsType.

    DT4 Datatype return kind restriction: A data type return kind must end
        in a type that, after type-synonym expansion, yields `TYPE LiftedRep`. By
        "end in", we mean we strip any foralls and function arguments off before
        checking.

        Examples:
          data T1 :: Type                          -- good
          data T2 :: Bool -> Type                  -- good
          data T3 :: Bool -> forall k. Type        -- strange, but still accepted
          data T4 :: forall k. k -> Type           -- good
          data T5 :: Bool                          -- bad
          data T6 :: Type -> Bool                  -- bad

        Exactly the same applies to data instance (but not data family)
        declarations.  Examples
          data instance D1 :: Type                 -- good
          data instance D2 :: Bool -> Type         -- good

        We can "look through" type synonyms
          type Star = Type
          data T7 :: Bool -> Star                  -- good (synonym expansion ok)
          type Arrow = (->)
          data T8 :: Arrow Bool Type               -- good (ditto)

        But we specifically do *not* do type family reduction here.
          type family ARROW where
            ARROW = (->)
          data T9 :: ARROW Bool Type               -- bad

          type family F a where
            F Int  = Bool
            F Bool = Type
          data T10 :: Bool -> F Bool               -- bad

        The /principle/ here is that in the TyCon for a data type or data instance,
        we must be able to lay out all the type-variable binders, one by one, until
        we reach (TYPE xx).  There is no place for a cast here.  We could add one,
        but let's not!

        This check is done in checkDataKindSig. For data declarations, this
        call is in tcDataDefn; for data instances, this call is in tcDataFamInstDecl.

    DT5 Newtype return kind restriction.
        If -XUnliftedNewtypes is not on, then newtypes are treated just
        like datatypes --- see (4) above.

        If -XUnliftedNewtypes is on, then a newtype return kind must end in
        TYPE xyz, for some xyz (after type synonym expansion). The "xyz"
        may include type families, but the TYPE part must be visible
        /without/ expanding type families (only synonyms).

        This kind is unified with the kind of the representation type (the
        type of the one argument to the one constructor). See also steps
        (2) and (3) of Note [Implementation of UnliftedNewtypes].

        The checks are done in the same places as for datatypes.
        Examples (assume -XUnliftedNewtypes):

          newtype N1 :: Type                       -- good
          newtype N2 :: Bool -> Type               -- good
          newtype N3 :: forall r. Bool -> TYPE r   -- good

          type family F (t :: Type) :: RuntimeRep
          newtype N4 :: forall t -> TYPE (F t)     -- good

          type family STAR where
            STAR = Type
          newtype N5 :: Bool -> STAR               -- bad

    Note [Data family/instance return kinds]
    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    Within this note, understand "instance" to mean data or newtype
    instance, and understand "family" to mean data family. No type
    families or classes here. Some examples:

    data family T a :: <kind>          -- See Point DF56

    data    instance T [a] :: <kind> where ...   -- See Point DF2
    newtype instance T [a] :: <kind> where ...   -- See Point DF2

    Here is the Plan for Data Families:

    DF0 Where these kinds come from:

        Families: The return kind is either written in a standalone signature
         or extracted from a family declaration in getInitialKind.
         If a family declaration is missing a result kind, it is assumed to be
         Type. This assumption is in getInitialKind for CUSKs or
         get_fam_decl_initial_kind for non-signature & non-CUSK cases.

       Instances: The data family already has a known kind. The return kind
         of an instance is then calculated by applying the data family tycon
         to the patterns provided, as computed by the typeKind lhs_ty in the
         end of tcDataFamInstHeader. In the case of an instance written in GADT
         syntax, there are potentially *two* return kinds: the one computed from
         applying the data family tycon to the patterns, and the one given by
         the user. This second kind is checked by the tc_kind_sig function within
         tcDataFamInstHeader. See also DF3, below.

    DF1 In a data/newtype instance, we treat the kind of the /data family/,
        once instantiated, as the "master kind" for the representation
        TyCon.  For example:
            data family T1 :: Type -> Type -> Type
            data instance T1 Int :: F Bool -> Type where ...
        The "master kind" for the representation TyCon R:T1Int comes
        from T1, not from the signature on the data instance.  It is as
        if we declared
            data R:T1Int :: Type -> Type where ...
         See Note [Liberalising data family return kinds] for an alternative
         plan.  But this current plan is simple, and ensures that all instances
         are simple instantiations of the master, without strange casts.

         An example with non-trivial instantiation:
            data family T2 :: forall k. Type -> k
            data instance T2 :: Type -> Type -> Type where ...
         Here 'k' gets instantiated with (Type -> Type), driven by
         the signature on the 'data instance'. (See also DT3 of
         Note [Datatype return kinds] about eta-expansion, which applies here,
         too; see tcDataFamInstDecl's call of etaExpandAlgTyCon.)

         A newtype example:

           data Color = Red | Blue
           type family Interpret (x :: Color) :: RuntimeRep where
             Interpret 'Red = 'IntRep
             Interpret 'Blue = 'WordRep
           data family Foo (x :: Color) :: TYPE (Interpret x)
           newtype instance Foo 'Red :: TYPE IntRep where
             FooRedC :: Int# -> Foo 'Red

        Here we get that Foo 'Red :: TYPE (Interpret Red), and our
        representation newtype looks like
             newtype R:FooRed :: TYPE (Interpret Red) where
                FooRedC :: Int# -> R:FooRed
        Remember: the master kind comes from the /family/ tycon.

    DF2 /After/ this instantiation, the return kind of the master kind
        must obey the usual rules for data/newtype return kinds (DT4, DT5)
        of Note [Datatype return kinds].  Examples:
            data family T3 k :: k
            data instance T3 Type where ...          -- OK
            data instance T3 (Type->Type) where ...  -- OK
            data instance T3 (F Int) where ...       -- Not OK

    DF3 Any kind signatures on the data/newtype instance are checked for
        equality with the master kind (and hence may guide instantiation)
        but are otherwise ignored. So in the T1 example above, we check
        that (F Int ~ Type) by unification; but otherwise ignore the
        user-supplied signature from the /family/ not the /instance/.

        We must be sure to instantiate any trailing invisible binders
        before doing this unification.  See the call to tcInstInvisibleBinders
        in tcDataFamInstHeader. For example:
           data family D :: forall k. k
           data instance D :: Type               -- forall k. k   <:  Type
           data instance D :: Type -> Type       -- forall k. k   <:  Type -> Type
             -- NB: these do not overlap
        we must instantiate D before unifying with the signature in the
        data instance declaration

    DF4 We also (redundantly) check that any user-specified return kind
        signature in the data instance also obeys DT4/DT5.  For example we
        reject
            data family T1 :: Type -> Type -> Type
            data instance T1 Int :: Type -> F Int
        even if (F Int ~ Type).  We could omit this check, because we
        use the master kind; but it seems more uniform to check it, again
        with checkDataKindSig.

    DF5 Data /family/ return kind restrictions. Consider
           data family D8 a :: F a
        where F is a type family.  No data/newtype instance can instantiate
        this so that it obeys the rules of DT4 or DT5.  So GHC proactively
        rejects the data /family/ declaration if it can never satisfy (DT4)/(DT5).
        Remember that a data family supports both data and newtype instances.

        More precisely, the return kind of a data family must be either
            * TYPE xyz (for some type xyz) or
            * a kind variable
        Only in these cases can a data/newtype instance possibly satisfy (DT4)/(DT5).
        This is checked by the call to checkDataKindSig in tcFamDecl1.  Examples:

          data family D1 :: Type              -- good
          data family D2 :: Bool -> Type      -- good
          data family D3 k :: k               -- good
          data family D4 :: forall k -> k     -- good
          data family D5 :: forall k. k -> k  -- good
          data family D6 :: forall r. TYPE r  -- good
          data family D7 :: Bool -> STAR      -- bad (see STAR from point 5)

    DF6 Two return kinds for instances: If an instance has two return kinds,
        one from the family declaration and one from the instance declaration
        (see point DF3 above), they are unified. More accurately, we make sure
        that the kind of the applied data family is a subkind of the user-written
        kind. GHC.Tc.Gen.HsType.checkExpectedKind normally does this check for types, but
        that's overkill for our needs here. Instead, we just instantiate any
        invisible binders in the (instantiated) kind of the data family
        (called lhs_kind in tcDataFamInstHeader) with tcInstInvisibleTyBinders
        and then unify the resulting kind with the kind written by the user.
        This unification naturally produces a coercion, which we can drop, as
        the kind annotation on the instance is redundant (except perhaps for
        effects of unification).

        This all is Wrinkle (3) in Note [Implementation of UnliftedNewtypes].

    Note [Liberalising data family return kinds]
    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    Could we allow this?
       type family F a where { F Int = Type }
       data family T a :: F a
       data instance T Int where
          MkT :: T Int

    In the 'data instance', T Int :: F Int, and F Int = Type, so all seems
    well.  But there are lots of complications:

    * The representation constructor R:TInt presumably has kind Type.
      So the axiom connecting the two would have to look like
           axTInt :: T Int ~ R:TInt |> sym axFInt
      and that doesn't match expectation in DataFamInstTyCon
      in AlgTyConFlav

    * The wrapper can't have type
         $WMkT :: Int -> T Int
      because T Int has the wrong kind.  It would have to be
         $WMkT :: Int -> (T Int) |> axFInt

    * The code for $WMkT would also be more complicated, needing
      two coherence coercions. Try it!

    * Code for pattern matching would be complicated in an
      exactly dual way.

    So yes, we could allow this, but we currently do not. That's
    why we have DF2 in Note [Data family/instance return kinds].

    Note [Implementation of UnliftedNewtypes]
    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    Expected behavior of UnliftedNewtypes:

    * Proposal: https://github.com/ghc-proposals/ghc-proposals/blob/master/proposals/0013-unlifted-newtypes.rst
    * Discussion: https://github.com/ghc-proposals/ghc-proposals/pull/98

    What follows is a high-level overview of the implementation of the
    proposal.

    STEP 1: Getting the initial kind, as done by inferInitialKind. We have
    two sub-cases:

    * With a SAK/CUSK: no change in kind-checking; the tycon is given the kind
      the user writes, whatever it may be.

    * Without a SAK/CUSK: If there is no kind signature, the tycon is given
      a kind `TYPE r`, for a fresh unification variable `r`. We do this even
      when -XUnliftedNewtypes is not on; see <Error Messages>, below.

    STEP 2: Kind-checking, as done by kcTyClDecl. This step is skipped for CUSKs.
    The key function here is kcConDecl, which looks at an individual constructor
    declaration. When we are processing a newtype (but whether or not -XUnliftedNewtypes
    is enabled; see <Error Messages>, below), we generate a correct ContextKind
    for the checking argument types: see getArgExpKind.

    Examples of newtypes affected by STEP 2, assuming -XUnliftedNewtypes is
    enabled (we use r0 to denote a unification variable):

    newtype Foo rep = MkFoo (forall (a :: TYPE rep). a)
    + kcConDecl unifies (TYPE r0) with (TYPE rep), where (TYPE r0)
      is the kind that inferInitialKind invented for (Foo rep).

    data Color = Red | Blue
    type family Interpret (x :: Color) :: RuntimeRep where
      Interpret 'Red = 'IntRep
      Interpret 'Blue = 'WordRep
    data family Foo (x :: Color) :: TYPE (Interpret x)
    newtype instance Foo 'Red = FooRedC Int#
    + kcConDecl unifies TYPE (Interpret 'Red) with TYPE 'IntRep

    Note that, in the GADT case, we might have a kind signature with arrows
    (newtype XYZ a b :: Type -> Type where ...). We want only the final
    component of the kind for checking in kcConDecl, so we call etaExpanAlgTyCon
    in kcTyClDecl.

    STEP 3: Type-checking (desugaring), as done by tcTyClDecl. The key function
    here is tcConDecl. Once again, we must use getArgExpKind to ensure that the
    representation type's kind matches that of the newtype, for two reasons:

      A. It is possible that a GADT has a CUSK. (Note that this is *not*
         possible for H98 types.) Recall that CUSK types don't go through
         kcTyClDecl, so we might not have done this kind check.
      B. We need to produce the coercion to put on the argument type
         if the kinds are different (for both H98 and GADT).

    Example of (B):

    type family F a where
      F Int = LiftedRep

    newtype N :: TYPE (F Int) where
      MkN :: Int -> N

    We really need to have the argument to MkN be (Int |> TYPE (sym axF)), where
    axF :: F Int ~ LiftedRep. That way, the argument kind is the same as the
    newtype kind, which is the principal correctness condition for newtypes.

    Wrinkle: Consider (#17021, typecheck/should_fail/T17021)

        type family Id (x :: a) :: a where
          Id x = x

        newtype T :: TYPE (Id LiftedRep) where
          MkT :: Int -> T

      In the type of MkT, we must end with (Int |> TYPE (sym axId)) -> T,
      never Int -> (T |> TYPE axId); otherwise, the result type of the
      constructor wouldn't match the datatype. However, type-checking the
      HsType T might reasonably result in (T |> hole). We thus must ensure
      that this cast is dropped, forcing the type-checker to add one to
      the Int instead.

      Why is it always safe to drop the cast? This result type is type-checked by
      tcHsOpenType, so its kind definitely looks like TYPE r, for some r. It is
      important that even after dropping the cast, the type's kind has the form
      TYPE r. This is guaranteed by restrictions on the kinds of datatypes.
      For example, a declaration like `newtype T :: Id Type` is rejected: a
      newtype's final kind always has the form TYPE r, just as we want.

    Note that this is possible in the H98 case only for a data family, because
    the H98 syntax doesn't permit a kind signature on the newtype itself.

    There are also some changes for dealing with families:

    1. In tcFamDecl1, we suppress a tcIsLiftedTypeKind check if
       UnliftedNewtypes is on. This allows us to write things like:
         data family Foo :: TYPE 'IntRep

    2. In a newtype instance (with -XUnliftedNewtypes), if the user does
       not write a kind signature, we want to allow the possibility that
       the kind is not Type, so we use newOpenTypeKind instead of liftedTypeKind.
       This is done in tcDataFamInstHeader in GHC.Tc.TyCl.Instance. Example:

           data family Bar (a :: RuntimeRep) :: TYPE a
           newtype instance Bar 'IntRep = BarIntC Int#
           newtype instance Bar 'WordRep :: TYPE 'WordRep where
             BarWordC :: Word# -> Bar 'WordRep

       The data instance corresponding to IntRep does not specify a kind signature,
       so tc_kind_sig just returns `TYPE r0` (where `r0` is a fresh metavariable).
       The data instance corresponding to WordRep does have a kind signature, so
       we use that kind signature.

    3. A data family and its newtype instance may be declared with slightly
       different kinds. See point DF6 in Note [Data family/instance return kinds]

    There's also a change in the renamer:

    * In GHC.RenameSource.rnTyClDecl, enabling UnliftedNewtypes changes what is means
      for a newtype to have a CUSK. This is necessary since UnliftedNewtypes
      means that, for newtypes without kind signatures, we must use the field
      inside the data constructor to determine the result kind.
      See Note [Unlifted Newtypes and CUSKs] for more detail.

    For completeness, it was also necessary to make coerce work on
    unlifted types, resolving #13595.

    <Error Messages>: It's tempting to think that the expected kind for a newtype
    constructor argument when -XUnliftedNewtypes is *not* enabled should just be Type.
    But this leads to difficulty in suggesting to enable UnliftedNewtypes. Here is
    an example:

      newtype A = MkA Int#

    If we expect the argument to MkA to have kind Type, then we get a kind-mismatch
    error. The problem is that there is no way to connect this mismatch error to
    -XUnliftedNewtypes, and suggest enabling the extension. So, instead, we allow
    the A to type-check, but then find the problem when doing validity checking (and
    where we get make a suitable error message). One potential worry is

      {-# LANGUAGE PolyKinds #-}
      newtype B a = MkB a

    This turns out OK, because unconstrained RuntimeReps default to LiftedRep, just
    as we would like. Another potential problem comes in a case like

      -- no UnliftedNewtypes

      data family D :: k
      newtype instance D = MkD Any

    Here, we want inference to tell us that k should be instantiated to Type in
    the instance. With the approach described here (checking for Type only in
    the validity checker), that will not happen. But I cannot think of a non-contrived
    example that will notice this lack of inference, so it seems better to improve
    error messages than be able to infer this instantiation.

    Note [Implementation of UnliftedDatatypes]
    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    Expected behavior of UnliftedDatatypes:

    * Proposal: https://github.com/ghc-proposals/ghc-proposals/blob/master/proposals/0265-unlifted-datatypes.rst
    * Discussion: https://github.com/ghc-proposals/ghc-proposals/pull/265

    The implementation heavily leans on Note [Implementation of UnliftedNewtypes].

    In the frontend, the following tweaks have been made in the typechecker:

    * STEP 1: In the inferInitialKinds phase, newExpectedKind gives data type
      constructors a result kind of `TYPE r` with a fresh unification variable
      `r :: RuntimeRep` when there is a SAKS. (Same as for UnliftedNewtypes.)
      Not needed with a CUSK, because it can't specify result kinds.
      If there's a GADTSyntax result kind signature, we keep on using that kind.

      Similarly, for data instances without a kind signature, we use
      `TYPE r` as the result kind, to support the following code:

        data family F a :: UnliftedType
        data instance F Int = TInt

      The omission of a kind signature for `F` should not mean a result kind
      of `Type` (and thus a kind error) here.

    * STEP 2: No change to kcTyClDecl.

    * STEP 3: In GHC.Tc.Gen.HsType.checkDataKindSig, we make sure that the result
      kind of the data declaration is actually `Type` or `TYPE (BoxedRep l)`,
      for some `l`. If UnliftedDatatypes is not activated, we emit an error with a
      suggestion in the latter case.

      Why not start out with `TYPE (BoxedRep l)` in the first place? Because then
      we get worse kind error messages in e.g. saks_fail010:

         -     Couldn't match expected kind: TYPE ('GHC.Types.BoxedRep t0)
         -                  with actual kind: * -> *
         +     Expected a type, but found something with kind ‘* -> *’
               In the data type declaration for ‘T’

      It seems `TYPE r` already has appropriate pretty-printing support.

    The changes to Core, STG and Cmm are of rather cosmetic nature.
    The IRs are already well-equipped to handle unlifted types, and unlifted
    datatypes are just a new sub-class thereof.
    -}

    tcTyClDecl :: RolesInfo -> LTyClDecl GhcRn -> TcM ((TyCon, [TyFamEqnValidityInfo]), [DerivInfo])
    tcTyClDecl :: (Name -> [Role])
    -> LTyClDecl GhcRn
    -> IOEnv
         (Env TcGblEnv TcLclEnv)
         ((TyCon, [TyFamEqnValidityInfo]), [DerivInfo])
    tcTyClDecl Name -> [Role]
    roles_info (L SrcSpanAnnA
    loc TyClDecl GhcRn
    decl)
      | Just TyThing
    thing <- Name -> Maybe TyThing
    wiredInNameTyThing_maybe (TyClDecl GhcRn -> IdP GhcRn
    forall (p :: Pass).
    (Anno (IdGhcP p) ~ SrcSpanAnnN) =>
    TyClDecl (GhcPass p) -> IdP (GhcPass p)
    tcdName TyClDecl GhcRn
    decl)
      = case TyThing
    thing of -- See Note [Declarations for wired-in things]
          ATyCon TyCon
    tc -> ((TyCon, [TyFamEqnValidityInfo]), [DerivInfo])
    -> IOEnv
         (Env TcGblEnv TcLclEnv)
         ((TyCon, [TyFamEqnValidityInfo]), [DerivInfo])
    forall a. a -> IOEnv (Env TcGblEnv TcLclEnv) a
    forall (m :: * -> *) a. Monad m => a -> m a
    return ((TyCon
    tc, []), TyCon -> TyClDecl GhcRn -> [DerivInfo]
    wiredInDerivInfo TyCon
    tc TyClDecl GhcRn
    decl)
          TyThing
    _ -> String
    -> SDoc
    -> IOEnv
         (Env TcGblEnv TcLclEnv)
         ((TyCon, [TyFamEqnValidityInfo]), [DerivInfo])
    forall a. HasCallStack => String -> SDoc -> a
    pprPanic String
    "tcTyClDecl" (TyThing -> SDoc
    forall a. Outputable a => a -> SDoc
    ppr TyThing
    thing)

      | Bool
    otherwise
      = SrcSpanAnnA
    -> IOEnv
         (Env TcGblEnv TcLclEnv)
         ((TyCon, [TyFamEqnValidityInfo]), [DerivInfo])
    -> IOEnv
         (Env TcGblEnv TcLclEnv)
         ((TyCon, [TyFamEqnValidityInfo]), [DerivInfo])
    forall ann a. EpAnn ann -> TcRn a -> TcRn a
    setSrcSpanA SrcSpanAnnA
    loc (IOEnv
       (Env TcGblEnv TcLclEnv)
       ((TyCon, [TyFamEqnValidityInfo]), [DerivInfo])
     -> IOEnv
          (Env TcGblEnv TcLclEnv)
          ((TyCon, [TyFamEqnValidityInfo]), [DerivInfo]))
    -> IOEnv
         (Env TcGblEnv TcLclEnv)
         ((TyCon, [TyFamEqnValidityInfo]), [DerivInfo])
    -> IOEnv
         (Env TcGblEnv TcLclEnv)
         ((TyCon, [TyFamEqnValidityInfo]), [DerivInfo])
    forall a b. (a -> b) -> a -> b
    $ TyClDecl GhcRn
    -> IOEnv
         (Env TcGblEnv TcLclEnv)
         ((TyCon, [TyFamEqnValidityInfo]), [DerivInfo])
    -> IOEnv
         (Env TcGblEnv TcLclEnv)
         ((TyCon, [TyFamEqnValidityInfo]), [DerivInfo])
    forall a. TyClDecl GhcRn -> TcM a -> TcM a
    tcAddDeclCtxt TyClDecl GhcRn
    decl (IOEnv
       (Env TcGblEnv TcLclEnv)
       ((TyCon, [TyFamEqnValidityInfo]), [DerivInfo])
     -> IOEnv
          (Env TcGblEnv TcLclEnv)
          ((TyCon, [TyFamEqnValidityInfo]), [DerivInfo]))
    -> IOEnv
         (Env TcGblEnv TcLclEnv)
         ((TyCon, [TyFamEqnValidityInfo]), [DerivInfo])
    -> IOEnv
         (Env TcGblEnv TcLclEnv)
         ((TyCon, [TyFamEqnValidityInfo]), [DerivInfo])
    forall a b. (a -> b) -> a -> b
    $
        do { String -> SDoc -> TcRn ()
    traceTc String
    "---- tcTyClDecl ---- {" (TyClDecl GhcRn -> SDoc
    forall a. Outputable a => a -> SDoc
    ppr TyClDecl GhcRn
    decl)
           ; (tc_vi@(tc, _), deriv_infos) <- Maybe Class
    -> (Name -> [Role])
    -> TyClDecl GhcRn
    -> IOEnv
         (Env TcGblEnv TcLclEnv)
         ((TyCon, [TyFamEqnValidityInfo]), [DerivInfo])
    tcTyClDecl1 Maybe Class
    forall a. Maybe a
    Nothing Name -> [Role]
    roles_info TyClDecl GhcRn
    decl
           ; traceTc "---- tcTyClDecl end ---- }" (ppr tc)
           ; return (tc_vi, deriv_infos) }

    noDerivInfos :: a -> (a, [DerivInfo])
    noDerivInfos :: forall a. a -> (a, [DerivInfo])
    noDerivInfos a
    a = (a
    a, [])

    noEqnValidityInfos :: a -> (a, [TyFamEqnValidityInfo])
    noEqnValidityInfos :: forall a. a -> (a, [TyFamEqnValidityInfo])
    noEqnValidityInfos a
    a = (a
    a, [])

    wiredInDerivInfo :: TyCon -> TyClDecl GhcRn -> [DerivInfo]
    wiredInDerivInfo :: TyCon -> TyClDecl GhcRn -> [DerivInfo]
    wiredInDerivInfo TyCon
    tycon TyClDecl GhcRn
    decl
      | DataDecl { tcdDataDefn :: forall pass. TyClDecl pass -> HsDataDefn pass
    tcdDataDefn = HsDataDefn GhcRn
    dataDefn } <- TyClDecl GhcRn
    decl
      , HsDataDefn { dd_derivs :: forall pass. HsDataDefn pass -> HsDeriving pass
    dd_derivs = HsDeriving GhcRn
    derivs } <- HsDataDefn GhcRn
    dataDefn
      = [ DerivInfo { di_rep_tc :: TyCon
    di_rep_tc = TyCon
    tycon
                    , di_scoped_tvs :: [(Name, Var)]
    di_scoped_tvs =
                        if TyCon -> Bool
    isPrimTyCon TyCon
    tycon
                           then []  -- no tyConTyVars
                           else [Var] -> [(Name, Var)]
    mkTyVarNamePairs (TyCon -> [Var]
    tyConTyVars TyCon
    tycon)
                    , di_clauses :: HsDeriving GhcRn
    di_clauses = HsDeriving GhcRn
    derivs
                    , di_ctxt :: SDoc
    di_ctxt = TyClDecl GhcRn -> SDoc
    tcMkDeclCtxt TyClDecl GhcRn
    decl } ]
    wiredInDerivInfo TyCon
    _ TyClDecl GhcRn
    _ = []

      -- "type family" declarations
    tcTyClDecl1 :: Maybe Class -> RolesInfo -> TyClDecl GhcRn -> TcM ((TyCon, [TyFamEqnValidityInfo]), [DerivInfo])
    tcTyClDecl1 :: Maybe Class
    -> (Name -> [Role])
    -> TyClDecl GhcRn
    -> IOEnv
         (Env TcGblEnv TcLclEnv)
         ((TyCon, [TyFamEqnValidityInfo]), [DerivInfo])
    tcTyClDecl1 Maybe Class
    parent Name -> [Role]
    _roles_info (FamDecl { tcdFam :: forall pass. TyClDecl pass -> FamilyDecl pass
    tcdFam = FamilyDecl GhcRn
    fd })
      = ((TyCon, [TyFamEqnValidityInfo])
     -> ((TyCon, [TyFamEqnValidityInfo]), [DerivInfo]))
    -> IOEnv (Env TcGblEnv TcLclEnv) (TyCon, [TyFamEqnValidityInfo])
    -> IOEnv
         (Env TcGblEnv TcLclEnv)
         ((TyCon, [TyFamEqnValidityInfo]), [DerivInfo])
    forall a b.
    (a -> b)
    -> IOEnv (Env TcGblEnv TcLclEnv) a
    -> IOEnv (Env TcGblEnv TcLclEnv) b
    forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
    fmap (TyCon, [TyFamEqnValidityInfo])
    -> ((TyCon, [TyFamEqnValidityInfo]), [DerivInfo])
    forall a. a -> (a, [DerivInfo])
    noDerivInfos (IOEnv (Env TcGblEnv TcLclEnv) (TyCon, [TyFamEqnValidityInfo])
     -> IOEnv
          (Env TcGblEnv TcLclEnv)
          ((TyCon, [TyFamEqnValidityInfo]), [DerivInfo]))
    -> IOEnv (Env TcGblEnv TcLclEnv) (TyCon, [TyFamEqnValidityInfo])
    -> IOEnv
         (Env TcGblEnv TcLclEnv)
         ((TyCon, [TyFamEqnValidityInfo]), [DerivInfo])
    forall a b. (a -> b) -> a -> b
    $
        Maybe Class
    -> FamilyDecl GhcRn
    -> IOEnv (Env TcGblEnv TcLclEnv) (TyCon, [TyFamEqnValidityInfo])
    tcFamDecl1 Maybe Class
    parent FamilyDecl GhcRn
    fd

      -- "type" synonym declaration
    tcTyClDecl1 Maybe Class
    _parent Name -> [Role]
    roles_info
                (SynDecl { tcdLName :: forall pass. TyClDecl pass -> LIdP pass
    tcdLName = L SrcSpanAnnN
    _ Name
    tc_name
                         , tcdRhs :: forall pass. TyClDecl pass -> LHsType pass
    tcdRhs   = LHsKind GhcRn
    rhs })
      = Bool
    -> ((TyCon -> ((TyCon, [TyFamEqnValidityInfo]), [DerivInfo]))
        -> TcRn TyCon
        -> IOEnv
             (Env TcGblEnv TcLclEnv)
             ((TyCon, [TyFamEqnValidityInfo]), [DerivInfo]))
    -> (TyCon -> ((TyCon, [TyFamEqnValidityInfo]), [DerivInfo]))
    -> TcRn TyCon
    -> IOEnv
         (Env TcGblEnv TcLclEnv)
         ((TyCon, [TyFamEqnValidityInfo]), [DerivInfo])
    forall a. HasCallStack => Bool -> a -> a
    assert (Maybe Class -> Bool
    forall a. Maybe a -> Bool
    isNothing Maybe Class
    _parent )
        (TyCon -> ((TyCon, [TyFamEqnValidityInfo]), [DerivInfo]))
    -> TcRn TyCon
    -> IOEnv
         (Env TcGblEnv TcLclEnv)
         ((TyCon, [TyFamEqnValidityInfo]), [DerivInfo])
    forall a b.
    (a -> b)
    -> IOEnv (Env TcGblEnv TcLclEnv) a
    -> IOEnv (Env TcGblEnv TcLclEnv) b
    forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
    fmap ( (TyCon, [TyFamEqnValidityInfo])
    -> ((TyCon, [TyFamEqnValidityInfo]), [DerivInfo])
    forall a. a -> (a, [DerivInfo])
    noDerivInfos ((TyCon, [TyFamEqnValidityInfo])
     -> ((TyCon, [TyFamEqnValidityInfo]), [DerivInfo]))
    -> (TyCon -> (TyCon, [TyFamEqnValidityInfo]))
    -> TyCon
    -> ((TyCon, [TyFamEqnValidityInfo]), [DerivInfo])
    forall b c a. (b -> c) -> (a -> b) -> a -> c
    . TyCon -> (TyCon, [TyFamEqnValidityInfo])
    forall a. a -> (a, [TyFamEqnValidityInfo])
    noEqnValidityInfos ) (TcRn TyCon
     -> IOEnv
          (Env TcGblEnv TcLclEnv)
          ((TyCon, [TyFamEqnValidityInfo]), [DerivInfo]))
    -> TcRn TyCon
    -> IOEnv
         (Env TcGblEnv TcLclEnv)
         ((TyCon, [TyFamEqnValidityInfo]), [DerivInfo])
    forall a b. (a -> b) -> a -> b
    $
        (Name -> [Role]) -> Name -> LHsKind GhcRn -> TcRn TyCon
    tcTySynRhs Name -> [Role]
    roles_info Name
    tc_name LHsKind GhcRn
    rhs

      -- "data/newtype" declaration
    tcTyClDecl1 Maybe Class
    _parent Name -> [Role]
    roles_info
                decl :: TyClDecl GhcRn
    decl@(DataDecl { tcdLName :: forall pass. TyClDecl pass -> LIdP pass
    tcdLName = L SrcSpanAnnN
    _ Name
    tc_name
                               , tcdDataDefn :: forall pass. TyClDecl pass -> HsDataDefn pass
    tcdDataDefn = HsDataDefn GhcRn
    defn })
      = Bool
    -> IOEnv
         (Env TcGblEnv TcLclEnv)
         ((TyCon, [TyFamEqnValidityInfo]), [DerivInfo])
    -> IOEnv
         (Env TcGblEnv TcLclEnv)
         ((TyCon, [TyFamEqnValidityInfo]), [DerivInfo])
    forall a. HasCallStack => Bool -> a -> a
    assert (Maybe Class -> Bool
    forall a. Maybe a -> Bool
    isNothing Maybe Class
    _parent) (IOEnv
       (Env TcGblEnv TcLclEnv)
       ((TyCon, [TyFamEqnValidityInfo]), [DerivInfo])
     -> IOEnv
          (Env TcGblEnv TcLclEnv)
          ((TyCon, [TyFamEqnValidityInfo]), [DerivInfo]))
    -> IOEnv
         (Env TcGblEnv TcLclEnv)
         ((TyCon, [TyFamEqnValidityInfo]), [DerivInfo])
    -> IOEnv
         (Env TcGblEnv TcLclEnv)
         ((TyCon, [TyFamEqnValidityInfo]), [DerivInfo])
    forall a b. (a -> b) -> a -> b
    $
        ((TyCon, [DerivInfo])
     -> ((TyCon, [TyFamEqnValidityInfo]), [DerivInfo]))
    -> IOEnv (Env TcGblEnv TcLclEnv) (TyCon, [DerivInfo])
    -> IOEnv
         (Env TcGblEnv TcLclEnv)
         ((TyCon, [TyFamEqnValidityInfo]), [DerivInfo])
    forall a b.
    (a -> b)
    -> IOEnv (Env TcGblEnv TcLclEnv) a
    -> IOEnv (Env TcGblEnv TcLclEnv) b
    forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
    fmap (\(TyCon
    tc, [DerivInfo]
    deriv_info) -> ((TyCon
    tc, []), [DerivInfo]
    deriv_info)) (IOEnv (Env TcGblEnv TcLclEnv) (TyCon, [DerivInfo])
     -> IOEnv
          (Env TcGblEnv TcLclEnv)
          ((TyCon, [TyFamEqnValidityInfo]), [DerivInfo]))
    -> IOEnv (Env TcGblEnv TcLclEnv) (TyCon, [DerivInfo])
    -> IOEnv
         (Env TcGblEnv TcLclEnv)
         ((TyCon, [TyFamEqnValidityInfo]), [DerivInfo])
    forall a b. (a -> b) -> a -> b
    $
        SDoc
    -> (Name -> [Role])
    -> Name
    -> HsDataDefn GhcRn
    -> IOEnv (Env TcGblEnv TcLclEnv) (TyCon, [DerivInfo])
    tcDataDefn (TyClDecl GhcRn -> SDoc
    tcMkDeclCtxt TyClDecl GhcRn
    decl) Name -> [Role]
    roles_info Name
    tc_name HsDataDefn GhcRn
    defn

    tcTyClDecl1 Maybe Class
    _parent Name -> [Role]
    roles_info
                (ClassDecl { tcdLName :: forall pass. TyClDecl pass -> LIdP pass
    tcdLName = L SrcSpanAnnN
    _ Name
    class_name
                           , tcdCtxt :: forall pass. TyClDecl pass -> Maybe (LHsContext pass)
    tcdCtxt = Maybe (LHsContext GhcRn)
    hs_ctxt
                           , tcdMeths :: forall pass. TyClDecl pass -> LHsBinds pass
    tcdMeths = LHsBinds GhcRn
    meths
                           , tcdFDs :: forall pass. TyClDecl pass -> [LHsFunDep pass]
    tcdFDs = [LHsFunDep GhcRn]
    fundeps
                           , tcdSigs :: forall pass. TyClDecl pass -> [LSig pass]
    tcdSigs = [LSig GhcRn]
    sigs
                           , tcdATs :: forall pass. TyClDecl pass -> [LFamilyDecl pass]
    tcdATs = [LFamilyDecl GhcRn]
    ats
                           , tcdATDefs :: forall pass. TyClDecl pass -> [LTyFamDefltDecl pass]
    tcdATDefs = [LTyFamDefltDecl GhcRn]
    at_defs })
      = Bool
    -> IOEnv
         (Env TcGblEnv TcLclEnv)
         ((TyCon, [TyFamEqnValidityInfo]), [DerivInfo])
    -> IOEnv
         (Env TcGblEnv TcLclEnv)
         ((TyCon, [TyFamEqnValidityInfo]), [DerivInfo])
    forall a. HasCallStack => Bool -> a -> a
    assert (Maybe Class -> Bool
    forall a. Maybe a -> Bool
    isNothing Maybe Class
    _parent) (IOEnv
       (Env TcGblEnv TcLclEnv)
       ((TyCon, [TyFamEqnValidityInfo]), [DerivInfo])
     -> IOEnv
          (Env TcGblEnv TcLclEnv)
          ((TyCon, [TyFamEqnValidityInfo]), [DerivInfo]))
    -> IOEnv
         (Env TcGblEnv TcLclEnv)
         ((TyCon, [TyFamEqnValidityInfo]), [DerivInfo])
    -> IOEnv
         (Env TcGblEnv TcLclEnv)
         ((TyCon, [TyFamEqnValidityInfo]), [DerivInfo])
    forall a b. (a -> b) -> a -> b
    $
        do { clas <- (Name -> [Role])
    -> Name
    -> Maybe (LHsContext GhcRn)
    -> LHsBinds GhcRn
    -> [LHsFunDep GhcRn]
    -> [LSig GhcRn]
    -> [LFamilyDecl GhcRn]
    -> [LTyFamDefltDecl GhcRn]
    -> TcM Class
    tcClassDecl1 Name -> [Role]
    roles_info Name
    class_name Maybe (LHsContext GhcRn)
    hs_ctxt
                                  LHsBinds GhcRn
    meths [LHsFunDep GhcRn]
    fundeps [LSig GhcRn]
    sigs [LFamilyDecl GhcRn]
    ats [LTyFamDefltDecl GhcRn]
    at_defs
           ; return (noDerivInfos $ noEqnValidityInfos (classTyCon clas)) }

    {- *********************************************************************
    *                                                                      *
              Class declarations
    *                                                                      *
    ********************************************************************* -}

    tcClassDecl1 :: RolesInfo -> Name -> Maybe (LHsContext GhcRn)
                 -> LHsBinds GhcRn -> [LHsFunDep GhcRn] -> [LSig GhcRn]
                 -> [LFamilyDecl GhcRn] -> [LTyFamDefltDecl GhcRn]
                 -> TcM Class
    tcClassDecl1 :: (Name -> [Role])
    -> Name
    -> Maybe (LHsContext GhcRn)
    -> LHsBinds GhcRn
    -> [LHsFunDep GhcRn]
    -> [LSig GhcRn]
    -> [LFamilyDecl GhcRn]
    -> [LTyFamDefltDecl GhcRn]
    -> TcM Class
    tcClassDecl1 Name -> [Role]
    roles_info Name
    class_name Maybe (LHsContext GhcRn)
    hs_ctxt LHsBinds GhcRn
    meths [LHsFunDep GhcRn]
    fundeps [LSig GhcRn]
    sigs [LFamilyDecl GhcRn]
    ats [LTyFamDefltDecl GhcRn]
    at_defs
      = (Class -> TcM Class) -> TcM Class
    forall a env. (a -> IOEnv env a) -> IOEnv env a
    fixM ((Class -> TcM Class) -> TcM Class)
    -> (Class -> TcM Class) -> TcM Class
    forall a b. (a -> b) -> a -> b
    $ \ Class
    clas -> -- We need the knot because 'clas' is passed into tcClassATs
        Name -> ([TyConBinder] -> Type -> TcM Class) -> TcM Class
    forall a. Name -> ([TyConBinder] -> Type -> TcM a) -> TcM a
    bindTyClTyVars Name
    class_name (([TyConBinder] -> Type -> TcM Class) -> TcM Class)
    -> ([TyConBinder] -> Type -> TcM Class) -> TcM Class
    forall a b. (a -> b) -> a -> b
    $ \ [TyConBinder]
    tc_bndrs Type
    res_kind ->
        do { Type -> TcRn ()
    checkClassKindSig Type
    res_kind
           ; String -> SDoc -> TcRn ()
    traceTc String
    "tcClassDecl 1" (Name -> SDoc
    forall a. Outputable a => a -> SDoc
    ppr Name
    class_name SDoc -> SDoc -> SDoc
    forall doc. IsDoc doc => doc -> doc -> doc
    $$ [TyConBinder] -> SDoc
    forall a. Outputable a => a -> SDoc
    ppr [TyConBinder]
    tc_bndrs)
           ; let tycon_name :: Name
    tycon_name = Name
    class_name        -- We use the same name
                 roles :: [Role]
    roles = Name -> [Role]
    roles_info Name
    tycon_name  -- for TyCon and Class

           ; (ctxt, fds, sig_stuff, at_stuff)
                <- SkolemInfoAnon
    -> [TyConBinder]
    -> TcM (ThetaType, [([Var], [Var])], [TcMethInfo], [ClassATItem])
    -> TcM (ThetaType, [([Var], [Var])], [TcMethInfo], [ClassATItem])
    forall a. SkolemInfoAnon -> [TyConBinder] -> TcM a -> TcM a
    pushLevelAndSolveEqualities SkolemInfoAnon
    skol_info [TyConBinder]
    tc_bndrs (TcM (ThetaType, [([Var], [Var])], [TcMethInfo], [ClassATItem])
     -> TcM (ThetaType, [([Var], [Var])], [TcMethInfo], [ClassATItem]))
    -> TcM (ThetaType, [([Var], [Var])], [TcMethInfo], [ClassATItem])
    -> TcM (ThetaType, [([Var], [Var])], [TcMethInfo], [ClassATItem])
    forall a b. (a -> b) -> a -> b
    $
                   -- The (binderVars tc_bndrs) is needed bring into scope the
                   -- skolems bound by the class decl header (#17841)
                   do { ctxt <- Maybe (LHsContext GhcRn) -> TcM ThetaType
    tcHsContext Maybe (LHsContext GhcRn)
    hs_ctxt
                      ; fds  <- mapM (addLocM tc_fundep) fundeps
                      ; sig_stuff <- tcClassSigs class_name sigs meths
                      ; at_stuff  <- tcClassATs class_name clas ats at_defs
                      ; return (ctxt, fds, sig_stuff, at_stuff) }

           -- See Note [Error on unconstrained meta-variables] in GHC.Tc.Utils.TcMType
           -- Example: (typecheck/should_fail/T17562)
           --   type C :: Type -> Type -> Constraint
           --   class (forall a. a b ~ a c) => C b c
           -- The kind of `a` is unconstrained.
           ; dvs <- candidateQTyVarsOfTypes ctxt
           ; let err_ctx TidyEnv
    tidy_env = do { (tidy_env2, ctxt) <- TidyEnv -> ThetaType -> ZonkM (TidyEnv, ThetaType)
    zonkTidyTcTypes TidyEnv
    tidy_env ThetaType
    ctxt
                                       ; return (tidy_env2, UninfTyCtx_ClassContext ctxt) }
           ; doNotQuantifyTyVars dvs err_ctx

           -- The pushLevelAndSolveEqualities will report errors for any
           -- unsolved equalities, so these zonks should not encounter
           -- any unfilled coercion variables unless there is such an error
           -- The zonk also squeeze out the TcTyCons, and converts
           -- Skolems to tyvars.
           ; (bndrs, ctxt, sig_stuff) <- initZonkEnv NoFlexi $
             runZonkBndrT (zonkTyVarBindersX tc_bndrs) $ \ [TyConBinder]
    bndrs ->
               do { ctxt        <- ThetaType -> ZonkTcM ThetaType
    zonkTcTypesToTypesX ThetaType
    ctxt
                  ; sig_stuff   <- mapM zonkTcMethInfoToMethInfoX sig_stuff
                    -- ToDo: do we need to zonk at_stuff?
                  ; return (bndrs, ctxt, sig_stuff) }

           -- TODO: Allow us to distinguish between abstract class,
           -- and concrete class with no methods (maybe by
           -- specifying a trailing where or not

           ; mindef <- tcClassMinimalDef class_name sigs sig_stuff
           ; is_boot <- tcIsHsBootOrSig
           ; let body | Bool
    is_boot, Maybe
      (GenLocated SrcSpanAnnC [GenLocated SrcSpanAnnA (HsType GhcRn)])
    -> Bool
    forall a. Maybe a -> Bool
    isNothing Maybe (LHsContext GhcRn)
    Maybe
      (GenLocated SrcSpanAnnC [GenLocated SrcSpanAnnA (HsType GhcRn)])
    hs_ctxt, [ClassATItem] -> Bool
    forall a. [a] -> Bool
    forall (t :: * -> *) a. Foldable t => t a -> Bool
    null [ClassATItem]
    at_stuff, [TcMethInfo] -> Bool
    forall a. [a] -> Bool
    forall (t :: * -> *) a. Foldable t => t a -> Bool
    null [TcMethInfo]
    sig_stuff
                      -- We use @isNothing hs_ctxt@ rather than @null ctxt@,
                      -- so that a declaration in an hs-boot file such as:
                      --
                      -- class () => C a b | a -> b
                      --
                      -- is not considered abstract; it's sometimes useful
                      -- to be able to declare such empty classes in hs-boot files.
                      -- See #20661.
                      = Maybe (ThetaType, [ClassATItem], [TcMethInfo], ClassMinimalDef)
    forall a. Maybe a
    Nothing
                      | Bool
    otherwise
                      = (ThetaType, [ClassATItem], [TcMethInfo], ClassMinimalDef)
    -> Maybe (ThetaType, [ClassATItem], [TcMethInfo], ClassMinimalDef)
    forall a. a -> Maybe a
    Just (ThetaType
    ctxt, [ClassATItem]
    at_stuff, [TcMethInfo]
    sig_stuff, ClassMinimalDef
    mindef)

           ; clas <- buildClass class_name bndrs roles fds body
           ; traceTc "tcClassDecl" (ppr fundeps $$ ppr bndrs $$
                                    ppr fds)
           ; return clas }
      where
        skol_info :: SkolemInfoAnon
    skol_info = TyConFlavour TyCon -> Name -> SkolemInfoAnon
    TyConSkol TyConFlavour TyCon
    forall tc. TyConFlavour tc
    ClassFlavour Name
    class_name

        tc_fundep :: GHC.Hs.FunDep GhcRn -> TcM ([Var],[Var])
        tc_fundep :: FunDep GhcRn -> IOEnv (Env TcGblEnv TcLclEnv) ([Var], [Var])
    tc_fundep (FunDep XCFunDep GhcRn
    _ [LIdP GhcRn]
    tvs1 [LIdP GhcRn]
    tvs2)
                               = do { tvs1' <- (LocatedN Name -> IOEnv (Env TcGblEnv TcLclEnv) Var)
    -> [LocatedN Name] -> TcM [Var]
    forall (t :: * -> *) (m :: * -> *) a b.
    (Traversable t, Monad m) =>
    (a -> m b) -> t a -> m (t b)
    forall (m :: * -> *) a b. Monad m => (a -> m b) -> [a] -> m [b]
    mapM (Name -> IOEnv (Env TcGblEnv TcLclEnv) Var
    tcLookupTyVar (Name -> IOEnv (Env TcGblEnv TcLclEnv) Var)
    -> (LocatedN Name -> Name)
    -> LocatedN Name
    -> IOEnv (Env TcGblEnv TcLclEnv) Var
    forall b c a. (b -> c) -> (a -> b) -> a -> c
    . LocatedN Name -> Name
    forall l e. GenLocated l e -> e
    unLoc) [LIdP GhcRn]
    [LocatedN Name]
    tvs1 ;
                                    ; tvs2' <- mapM (tcLookupTyVar . unLoc) tvs2 ;
                                    ; return (tvs1',tvs2') }

    {- Note [Associated type defaults]
    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    The following is an example of associated type defaults:

      class C a where
        data D a

        type F a b :: *
        type F a b = [a]        -- Default

    Note that we can get default definitions only for type families, not data
    families.
    -}

    tcClassATs :: Name                    -- The class name (not knot-tied)
               -> Class                   -- The class parent of this associated type
               -> [LFamilyDecl GhcRn]     -- Associated types.
               -> [LTyFamDefltDecl GhcRn] -- Associated type defaults.
               -> TcM [ClassATItem]
    tcClassATs :: Name
    -> Class
    -> [LFamilyDecl GhcRn]
    -> [LTyFamDefltDecl GhcRn]
    -> TcM [ClassATItem]
    tcClassATs Name
    class_name Class
    cls [LFamilyDecl GhcRn]
    ats [LTyFamDefltDecl GhcRn]
    at_defs
      = do {  -- Complain about associated type defaults for non associated-types
             [IOEnv (Env TcGblEnv TcLclEnv) Any] -> TcRn ()
    forall (t :: * -> *) (m :: * -> *) a.
    (Foldable t, Monad m) =>
    t (m a) -> m ()
    sequence_ [ TcRnMessage -> IOEnv (Env TcGblEnv TcLclEnv) Any
    forall a. TcRnMessage -> TcM a
    failWithTc (TcRnMessage -> IOEnv (Env TcGblEnv TcLclEnv) Any)
    -> TcRnMessage -> IOEnv (Env TcGblEnv TcLclEnv) Any
    forall a b. (a -> b) -> a -> b
    $ IllegalInstanceReason -> TcRnMessage
    TcRnIllegalInstance
                                    (IllegalInstanceReason -> TcRnMessage)
    -> IllegalInstanceReason -> TcRnMessage
    forall a b. (a -> b) -> a -> b
    $ IllegalFamilyInstanceReason -> IllegalInstanceReason
    IllegalFamilyInstance (IllegalFamilyInstanceReason -> IllegalInstanceReason)
    -> IllegalFamilyInstanceReason -> IllegalInstanceReason
    forall a b. (a -> b) -> a -> b
    $ InvalidAssoc -> IllegalFamilyInstanceReason
    InvalidAssoc
                                    (InvalidAssoc -> IllegalFamilyInstanceReason)
    -> InvalidAssoc -> IllegalFamilyInstanceReason
    forall a b. (a -> b) -> a -> b
    $ InvalidAssocDefault -> InvalidAssoc
    InvalidAssocDefault
                                    (InvalidAssocDefault -> InvalidAssoc)
    -> InvalidAssocDefault -> InvalidAssoc
    forall a b. (a -> b) -> a -> b
    $ Name -> Name -> InvalidAssocDefault
    AssocDefaultNotAssoc Name
    class_name Name
    n
                       | Name
    n <- (GenLocated SrcSpanAnnA (TyFamInstDecl GhcRn) -> Name)
    -> [GenLocated SrcSpanAnnA (TyFamInstDecl GhcRn)] -> [Name]
    forall a b. (a -> b) -> [a] -> [b]
    map LTyFamDefltDecl GhcRn -> Name
    GenLocated SrcSpanAnnA (TyFamInstDecl GhcRn) -> Name
    at_def_tycon [LTyFamDefltDecl GhcRn]
    [GenLocated SrcSpanAnnA (TyFamInstDecl GhcRn)]
    at_defs
                       , Bool -> Bool
    not (Name
    n Name -> NameSet -> Bool
    `elemNameSet` NameSet
    at_names) ]
           ; (GenLocated SrcSpanAnnA (FamilyDecl GhcRn)
     -> IOEnv (Env TcGblEnv TcLclEnv) ClassATItem)
    -> [GenLocated SrcSpanAnnA (FamilyDecl GhcRn)] -> TcM [ClassATItem]
    forall (t :: * -> *) (m :: * -> *) a b.
    (Traversable t, Monad m) =>
    (a -> m b) -> t a -> m (t b)
    forall (m :: * -> *) a b. Monad m => (a -> m b) -> [a] -> m [b]
    mapM GenLocated SrcSpanAnnA (FamilyDecl GhcRn)
    -> IOEnv (Env TcGblEnv TcLclEnv) ClassATItem
    tc_at [LFamilyDecl GhcRn]
    [GenLocated SrcSpanAnnA (FamilyDecl GhcRn)]
    ats }
      where
        at_def_tycon :: LTyFamDefltDecl GhcRn -> Name
        at_def_tycon :: LTyFamDefltDecl GhcRn -> Name
    at_def_tycon = TyFamInstDecl GhcRn -> IdP GhcRn
    TyFamInstDecl GhcRn -> Name
    forall (p :: Pass).
    (Anno (IdGhcP p) ~ SrcSpanAnnN) =>
    TyFamInstDecl (GhcPass p) -> IdP (GhcPass p)
    tyFamInstDeclName (TyFamInstDecl GhcRn -> Name)
    -> (GenLocated SrcSpanAnnA (TyFamInstDecl GhcRn)
        -> TyFamInstDecl GhcRn)
    -> GenLocated SrcSpanAnnA (TyFamInstDecl GhcRn)
    -> Name
    forall b c a. (b -> c) -> (a -> b) -> a -> c
    . GenLocated SrcSpanAnnA (TyFamInstDecl GhcRn) -> TyFamInstDecl GhcRn
    forall l e. GenLocated l e -> e
    unLoc

        at_fam_name :: LFamilyDecl GhcRn -> Name
        at_fam_name :: LFamilyDecl GhcRn -> Name
    at_fam_name = FamilyDecl GhcRn -> IdP GhcRn
    FamilyDecl GhcRn -> Name
    forall (p :: Pass). FamilyDecl (GhcPass p) -> IdP (GhcPass p)
    familyDeclName (FamilyDecl GhcRn -> Name)
    -> (GenLocated SrcSpanAnnA (FamilyDecl GhcRn) -> FamilyDecl GhcRn)
    -> GenLocated SrcSpanAnnA (FamilyDecl GhcRn)
    -> Name
    forall b c a. (b -> c) -> (a -> b) -> a -> c
    . GenLocated SrcSpanAnnA (FamilyDecl GhcRn) -> FamilyDecl GhcRn
    forall l e. GenLocated l e -> e
    unLoc

        at_names :: NameSet
    at_names = [Name] -> NameSet
    mkNameSet ((GenLocated SrcSpanAnnA (FamilyDecl GhcRn) -> Name)
    -> [GenLocated SrcSpanAnnA (FamilyDecl GhcRn)] -> [Name]
    forall a b. (a -> b) -> [a] -> [b]
    map LFamilyDecl GhcRn -> Name
    GenLocated SrcSpanAnnA (FamilyDecl GhcRn) -> Name
    at_fam_name [LFamilyDecl GhcRn]
    [GenLocated SrcSpanAnnA (FamilyDecl GhcRn)]
    ats)

        at_defs_map :: NameEnv [LTyFamDefltDecl GhcRn]
        -- Maps an AT in 'ats' to a list of all its default defs in 'at_defs'
        at_defs_map :: NameEnv [LTyFamDefltDecl GhcRn]
    at_defs_map = (GenLocated SrcSpanAnnA (TyFamInstDecl GhcRn)
     -> NameEnv [GenLocated SrcSpanAnnA (TyFamInstDecl GhcRn)]
     -> NameEnv [GenLocated SrcSpanAnnA (TyFamInstDecl GhcRn)])
    -> NameEnv [GenLocated SrcSpanAnnA (TyFamInstDecl GhcRn)]
    -> [GenLocated SrcSpanAnnA (TyFamInstDecl GhcRn)]
    -> NameEnv [GenLocated SrcSpanAnnA (TyFamInstDecl GhcRn)]
    forall a b. (a -> b -> b) -> b -> [a] -> b
    forall (t :: * -> *) a b.
    Foldable t =>
    (a -> b -> b) -> b -> t a -> b
    foldr (\GenLocated SrcSpanAnnA (TyFamInstDecl GhcRn)
    at_def NameEnv [GenLocated SrcSpanAnnA (TyFamInstDecl GhcRn)]
    nenv -> ([GenLocated SrcSpanAnnA (TyFamInstDecl GhcRn)]
     -> [GenLocated SrcSpanAnnA (TyFamInstDecl GhcRn)]
     -> [GenLocated SrcSpanAnnA (TyFamInstDecl GhcRn)])
    -> NameEnv [GenLocated SrcSpanAnnA (TyFamInstDecl GhcRn)]
    -> Name
    -> [GenLocated SrcSpanAnnA (TyFamInstDecl GhcRn)]
    -> NameEnv [GenLocated SrcSpanAnnA (TyFamInstDecl GhcRn)]
    forall a. (a -> a -> a) -> NameEnv a -> Name -> a -> NameEnv a
    extendNameEnv_C [GenLocated SrcSpanAnnA (TyFamInstDecl GhcRn)]
    -> [GenLocated SrcSpanAnnA (TyFamInstDecl GhcRn)]
    -> [GenLocated SrcSpanAnnA (TyFamInstDecl GhcRn)]
    forall a. [a] -> [a] -> [a]
    (++) NameEnv [GenLocated SrcSpanAnnA (TyFamInstDecl GhcRn)]
    nenv
                                              (LTyFamDefltDecl GhcRn -> Name
    at_def_tycon LTyFamDefltDecl GhcRn
    GenLocated SrcSpanAnnA (TyFamInstDecl GhcRn)
    at_def) [GenLocated SrcSpanAnnA (TyFamInstDecl GhcRn)
    at_def])
                            NameEnv [GenLocated SrcSpanAnnA (TyFamInstDecl GhcRn)]
    forall a. NameEnv a
    emptyNameEnv [LTyFamDefltDecl GhcRn]
    [GenLocated SrcSpanAnnA (TyFamInstDecl GhcRn)]
    at_defs

        tc_at :: GenLocated SrcSpanAnnA (FamilyDecl GhcRn)
    -> IOEnv (Env TcGblEnv TcLclEnv) ClassATItem
    tc_at GenLocated SrcSpanAnnA (FamilyDecl GhcRn)
    at = do { (fam_tc, val_infos) <- (FamilyDecl GhcRn
     -> IOEnv (Env TcGblEnv TcLclEnv) (TyCon, [TyFamEqnValidityInfo]))
    -> GenLocated SrcSpanAnnA (FamilyDecl GhcRn)
    -> IOEnv (Env TcGblEnv TcLclEnv) (TyCon, [TyFamEqnValidityInfo])
    forall t a b. HasLoc t => (a -> TcM b) -> GenLocated t a -> TcM b
    addLocM (Maybe Class
    -> FamilyDecl GhcRn
    -> IOEnv (Env TcGblEnv TcLclEnv) (TyCon, [TyFamEqnValidityInfo])
    tcFamDecl1 (Class -> Maybe Class
    forall a. a -> Maybe a
    Just Class
    cls)) GenLocated SrcSpanAnnA (FamilyDecl GhcRn)
    at
                      ; mapM_ (checkTyFamEqnValidityInfo fam_tc) val_infos
                      ; let at_defs = NameEnv [GenLocated SrcSpanAnnA (TyFamInstDecl GhcRn)]
    -> Name -> Maybe [GenLocated SrcSpanAnnA (TyFamInstDecl GhcRn)]
    forall a. NameEnv a -> Name -> Maybe a
    lookupNameEnv NameEnv [LTyFamDefltDecl GhcRn]
    NameEnv [GenLocated SrcSpanAnnA (TyFamInstDecl GhcRn)]
    at_defs_map (LFamilyDecl GhcRn -> Name
    at_fam_name LFamilyDecl GhcRn
    GenLocated SrcSpanAnnA (FamilyDecl GhcRn)
    at)
                                      Maybe [GenLocated SrcSpanAnnA (TyFamInstDecl GhcRn)]
    -> [GenLocated SrcSpanAnnA (TyFamInstDecl GhcRn)]
    -> [GenLocated SrcSpanAnnA (TyFamInstDecl GhcRn)]
    forall a. Maybe a -> a -> a
    `orElse` []
                      ; atd <- tcDefaultAssocDecl fam_tc at_defs
                      ; return (ATI fam_tc atd) }

    -------------------------
    tcDefaultAssocDecl ::
         TyCon                                             -- ^ Family TyCon (not knot-tied)
      -> [LTyFamDefltDecl GhcRn]                           -- ^ Defaults
      -> TcM (Maybe (KnotTied Type, TyFamEqnValidityInfo)) -- ^ Type checked RHS
    tcDefaultAssocDecl :: TyCon
    -> [LTyFamDefltDecl GhcRn]
    -> TcM (Maybe (Type, TyFamEqnValidityInfo))
    tcDefaultAssocDecl TyCon
    _ []
      = Maybe (Type, TyFamEqnValidityInfo)
    -> TcM (Maybe (Type, TyFamEqnValidityInfo))
    forall a. a -> IOEnv (Env TcGblEnv TcLclEnv) a
    forall (m :: * -> *) a. Monad m => a -> m a
    return Maybe (Type, TyFamEqnValidityInfo)
    forall a. Maybe a
    Nothing  -- No default declaration

    tcDefaultAssocDecl TyCon
    _ (LTyFamDefltDecl GhcRn
    d1:LTyFamDefltDecl GhcRn
    _:[LTyFamDefltDecl GhcRn]
    _)
      = TcRnMessage -> TcM (Maybe (Type, TyFamEqnValidityInfo))
    forall a. TcRnMessage -> TcM a
    failWithTc (TcRnMessage -> TcM (Maybe (Type, TyFamEqnValidityInfo)))
    -> TcRnMessage -> TcM (Maybe (Type, TyFamEqnValidityInfo))
    forall a b. (a -> b) -> a -> b
    $ IllegalInstanceReason -> TcRnMessage
    TcRnIllegalInstance (IllegalInstanceReason -> TcRnMessage)
    -> IllegalInstanceReason -> TcRnMessage
    forall a b. (a -> b) -> a -> b
    $ IllegalFamilyInstanceReason -> IllegalInstanceReason
    IllegalFamilyInstance
                   (IllegalFamilyInstanceReason -> IllegalInstanceReason)
    -> IllegalFamilyInstanceReason -> IllegalInstanceReason
    forall a b. (a -> b) -> a -> b
    $ InvalidAssoc -> IllegalFamilyInstanceReason
    InvalidAssoc (InvalidAssoc -> IllegalFamilyInstanceReason)
    -> InvalidAssoc -> IllegalFamilyInstanceReason
    forall a b. (a -> b) -> a -> b
    $ InvalidAssocDefault -> InvalidAssoc
    InvalidAssocDefault (InvalidAssocDefault -> InvalidAssoc)
    -> InvalidAssocDefault -> InvalidAssoc
    forall a b. (a -> b) -> a -> b
    $
          Name -> InvalidAssocDefault
    AssocMultipleDefaults (TyFamInstDecl GhcRn -> IdP GhcRn
    forall (p :: Pass).
    (Anno (IdGhcP p) ~ SrcSpanAnnN) =>
    TyFamInstDecl (GhcPass p) -> IdP (GhcPass p)
    tyFamInstDeclName (GenLocated SrcSpanAnnA (TyFamInstDecl GhcRn) -> TyFamInstDecl GhcRn
    forall l e. GenLocated l e -> e
    unLoc LTyFamDefltDecl GhcRn
    GenLocated SrcSpanAnnA (TyFamInstDecl GhcRn)
    d1))

    tcDefaultAssocDecl TyCon
    fam_tc
      [L SrcSpanAnnA
    loc (TyFamInstDecl { tfid_eqn :: forall pass. TyFamInstDecl pass -> TyFamInstEqn pass
    tfid_eqn =
                                FamEqn { feqn_tycon :: forall pass rhs. FamEqn pass rhs -> LIdP pass
    feqn_tycon = L SrcSpanAnnN
    _ Name
    tc_name
                                       , feqn_bndrs :: forall pass rhs. FamEqn pass rhs -> HsOuterFamEqnTyVarBndrs pass
    feqn_bndrs = HsOuterFamEqnTyVarBndrs GhcRn
    outer_bndrs
                                       , feqn_pats :: forall pass rhs. FamEqn pass rhs -> HsFamEqnPats pass
    feqn_pats  = HsFamEqnPats GhcRn
    hs_pats
                                       , feqn_rhs :: forall pass rhs. FamEqn pass rhs -> rhs
    feqn_rhs   = LHsKind GhcRn
    hs_rhs_ty }})]
      = -- See Note [Type-checking default assoc decls]
        SrcSpanAnnA
    -> TcM (Maybe (Type, TyFamEqnValidityInfo))
    -> TcM (Maybe (Type, TyFamEqnValidityInfo))
    forall ann a. EpAnn ann -> TcRn a -> TcRn a
    setSrcSpanA SrcSpanAnnA
    loc (TcM (Maybe (Type, TyFamEqnValidityInfo))
     -> TcM (Maybe (Type, TyFamEqnValidityInfo)))
    -> TcM (Maybe (Type, TyFamEqnValidityInfo))
    -> TcM (Maybe (Type, TyFamEqnValidityInfo))
    forall a b. (a -> b) -> a -> b
    $
        SDoc
    -> Name
    -> TcM (Maybe (Type, TyFamEqnValidityInfo))
    -> TcM (Maybe (Type, TyFamEqnValidityInfo))
    forall a. SDoc -> Name -> TcM a -> TcM a
    tcAddFamInstCtxt (String -> SDoc
    forall doc. IsLine doc => String -> doc
    text String
    "default type instance") Name
    tc_name (TcM (Maybe (Type, TyFamEqnValidityInfo))
     -> TcM (Maybe (Type, TyFamEqnValidityInfo)))
    -> TcM (Maybe (Type, TyFamEqnValidityInfo))
    -> TcM (Maybe (Type, TyFamEqnValidityInfo))
    forall a b. (a -> b) -> a -> b
    $
        do { String -> SDoc -> TcRn ()
    traceTc String
    "tcDefaultAssocDecl 1" (Name -> SDoc
    forall a. Outputable a => a -> SDoc
    ppr Name
    tc_name)
           ; let fam_tc_name :: Name
    fam_tc_name = TyCon -> Name
    tyConName TyCon
    fam_tc
                 vis_arity :: Int
    vis_arity = [Var] -> Int
    forall a. [a] -> Int
    forall (t :: * -> *) a. Foldable t => t a -> Int
    length (TyCon -> [Var]
    tyConVisibleTyVars TyCon
    fam_tc)
                 vis_pats :: Int
    vis_pats  = [HsArg
       GhcRn
       (GenLocated SrcSpanAnnA (HsType GhcRn))
       (GenLocated SrcSpanAnnA (HsType GhcRn))]
    -> Int
    forall p tm ty. [HsArg p tm ty] -> Int
    numVisibleArgs HsFamEqnPats GhcRn
    [HsArg
       GhcRn
       (GenLocated SrcSpanAnnA (HsType GhcRn))
       (GenLocated SrcSpanAnnA (HsType GhcRn))]
    hs_pats

           -- Kind of family check
           ; Bool -> TcRn () -> TcRn ()
    forall a. HasCallStack => Bool -> a -> a
    assert (Name
    fam_tc_name Name -> Name -> Bool
    forall a. Eq a => a -> a -> Bool
    == Name
    tc_name) (TcRn () -> TcRn ()) -> TcRn () -> TcRn ()
    forall a b. (a -> b) -> a -> b
    $
             Bool -> TcRnMessage -> TcRn ()
    checkTc (TyCon -> Bool
    isTypeFamilyTyCon TyCon
    fam_tc) (TcRnMessage -> TcRn ()) -> TcRnMessage -> TcRn ()
    forall a b. (a -> b) -> a -> b
    $
             IllegalInstanceReason -> TcRnMessage
    TcRnIllegalInstance (IllegalInstanceReason -> TcRnMessage)
    -> IllegalInstanceReason -> TcRnMessage
    forall a b. (a -> b) -> a -> b
    $ IllegalFamilyInstanceReason -> IllegalInstanceReason
    IllegalFamilyInstance (IllegalFamilyInstanceReason -> IllegalInstanceReason)
    -> IllegalFamilyInstanceReason -> IllegalInstanceReason
    forall a b. (a -> b) -> a -> b
    $
               TyCon -> IllegalFamilyInstanceReason
    FamilyCategoryMismatch TyCon
    fam_tc

           -- Arity check
           ; Bool -> TcRnMessage -> TcRn ()
    checkTc (Int
    vis_pats Int -> Int -> Bool
    forall a. Eq a => a -> a -> Bool
    == Int
    vis_arity) (TcRnMessage -> TcRn ()) -> TcRnMessage -> TcRn ()
    forall a b. (a -> b) -> a -> b
    $
             IllegalInstanceReason -> TcRnMessage
    TcRnIllegalInstance (IllegalInstanceReason -> TcRnMessage)
    -> IllegalInstanceReason -> TcRnMessage
    forall a b. (a -> b) -> a -> b
    $ IllegalFamilyInstanceReason -> IllegalInstanceReason
    IllegalFamilyInstance (IllegalFamilyInstanceReason -> IllegalInstanceReason)
    -> IllegalFamilyInstanceReason -> IllegalInstanceReason
    forall a b. (a -> b) -> a -> b
    $
               TyCon -> Int -> IllegalFamilyInstanceReason
    FamilyArityMismatch TyCon
    fam_tc Int
    vis_arity

           -- Typecheck RHS
           --
           -- You might think we should pass in some AssocInstInfo, as we're looking
           -- at an associated type. But this would be wrong, because an associated
           -- type default LHS can mention *different* type variables than the
           -- enclosing class. So it's treated more as a freestanding beast.
           ; (qtvs, non_user_tvs, pats, rhs_ty)
               <- TyCon
    -> AssocInstInfo
    -> HsOuterFamEqnTyVarBndrs GhcRn
    -> HsFamEqnPats GhcRn
    -> LHsKind GhcRn
    -> TcM ([Var], VarSet, ThetaType, Type)
    tcTyFamInstEqnGuts TyCon
    fam_tc AssocInstInfo
    NotAssociated
                    HsOuterFamEqnTyVarBndrs GhcRn
    outer_bndrs HsFamEqnPats GhcRn
    hs_pats LHsKind GhcRn
    hs_rhs_ty

           ; let fam_tvs = TyCon -> [Var]
    tyConTyVars TyCon
    fam_tc
           ; traceTc "tcDefaultAssocDecl 2" (vcat
               [ text "hs_pats"   <+> ppr hs_pats
               , text "hs_rhs_ty" <+> ppr hs_rhs_ty
               , text "fam_tvs" <+> ppr fam_tvs
               , text "qtvs"    <+> ppr qtvs
                 -- NB: Do *not* print `pats` or rhs_ty here, as they can mention
                 -- knot-tied TyCons. See #18648.
               ])
           ; let subst = case (Type -> Maybe Var) -> ThetaType -> Maybe [Var]
    forall (t :: * -> *) (f :: * -> *) a b.
    (Traversable t, Applicative f) =>
    (a -> f b) -> t a -> f (t b)
    forall (f :: * -> *) a b.
    Applicative f =>
    (a -> f b) -> [a] -> f [b]
    traverse Type -> Maybe Var
    getTyVar_maybe ThetaType
    pats of
                           Just [Var]
    cpt_tvs -> [Var] -> ThetaType -> Subst
    HasDebugCallStack => [Var] -> ThetaType -> Subst
    zipTvSubst [Var]
    cpt_tvs ([Var] -> ThetaType
    mkTyVarTys [Var]
    fam_tvs)
                           Maybe [Var]
    Nothing      -> Subst
    emptySubst
                           -- The Nothing case can only be reached in invalid
                           -- associated type family defaults. In such cases, we
                           -- simply create an empty substitution and let GHC fall
                           -- over later, in GHC.Tc.Validity.checkValidAssocTyFamDeflt.
                           -- See Note [Type-checking default assoc decls].

           ; pure $ Just ( substTyUnchecked subst rhs_ty
                         , VI { vi_loc          = locA loc
                              , vi_qtvs         = qtvs
                              , vi_non_user_tvs = non_user_tvs
                              , vi_pats         = pats
                              , vi_rhs          = rhs_ty } )
               -- We perform checks for well-formedness and validity later, in
               -- GHC.Tc.Validity.checkValidAssocTyFamDeflt.
         }

    {- Note [Type-checking default assoc decls]
    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    Consider this default declaration for an associated type

       class C a where
          type F (a :: k) b :: Type
          type F (x :: j) y = Proxy x -> y

    Note that the class variable 'a' doesn't scope over the default assoc
    decl, nor do the type variables `k` and `b`. Instead, the default decl is
    treated more like a top-level type instance. However, we store the default rhs
    (Proxy x -> y) in F's TyCon, using F's own type variables, so we need to
    convert it to (Proxy a -> b). We do this in the tcDefaultAssocDecl function by
    creating a substitution [j |-> k, x |-> a, b |-> y] and applying this
    substitution to the RHS.

    In order to create this substitution, we must first ensure that all of
    the arguments in the default instance consist of distinct type variables.
    Checking for this property proves surprisingly tricky. Three potential places
    where GHC could check for this property include:

    1. Before typechecking (in the parser or renamer)
    2. During typechecking (in tcDefaultAssocDecl)
    3. After typechecking (using GHC.Tc.Validity)

    Currently, GHC picks option (3) and implements this check using
    GHC.Tc.Validity.checkValidAssocTyFamDeflt. GHC previously used options (1) and
    (2), but neither option quite worked out for reasons that we will explain
    shortly.

    The first thing that checkValidAssocTyFamDeflt does is check that all arguments
    in an associated type family default are type variables. As a motivating
    example, consider this erroneous program (inspired by #11361):

       class C a where
          type F (a :: k) b :: Type
          type F x        b = x

    If you squint, you'll notice that the kind of `x` is actually Type. However,
    we cannot substitute from [Type |-> k], so we reject this default. This also
    explains why GHC no longer implements option (1) above, since figuring out that
    `x`'s kind is Type would be much more difficult without the knowledge that the
    typechecker provides.

    Next, checkValidAssocTyFamDeflt checks that all arguments are distinct. Here is
    another offending example, this time taken from #13971:

       class C2 (a :: j) where
          type F2 (a :: j) (b :: k)
          type F2 (x :: z) y = SameKind x y
       data SameKind :: k -> k -> Type

    All of the arguments in the default equation for `F2` are type variables, so
    that passes the first check. However, if we were to build this substitution,
    then both `j` and `k` map to `z`! In terms of visible kind application, it's as
    if we had written `type F2 @z @z x y = SameKind @z x y`, which makes it clear
    that we have duplicated a use of `z` on the LHS. Therefore, `F2`'s default is
    also rejected.

    There is one more design consideration in play here: what error message should
    checkValidAssocTyFamDeflt produce if one of its checks fails? Ideally, it would
    be something like this:

      Illegal duplicate variable ‘z’ in:
        ‘type F2 @z @z x y = ...’
        The arguments to ‘F2’ must all be distinct type variables

    This requires printing out the arguments to the associated type family. This
    can be dangerous, however. Consider this example, adapted from #18648:

      class C3 a where
         type F3 a
         type F3 (F3 a) = a

    F3's default is illegal, since its argument is not a bare type variable. But
    note that when we typecheck F3's default, the F3 type constructor is knot-tied.
    Therefore, if we print the type `F3 a` in an error message, GHC will diverge!
    This is the reason why GHC no longer implements option (2) above and instead
    waits until /after/ typechecking has finished, at which point the typechecker
    knot has been worked out.

    As one final point, one might worry that the typechecker knot could cause the
    substitution that tcDefaultAssocDecl creates to diverge, but this is not the
    case. Since the LHS of a valid associated type family default is always just
    variables, it won't contain any tycons. Accordingly, the patterns used in the
    substitution won't actually be knot-tied, even though we're in the knot. (This
    is too delicate for my taste, but it works.) If we're dealing with /invalid/
    default, such as F3's above, then we simply create an empty substitution and
    rely on checkValidAssocTyFamDeflt throwing an error message afterwards before
    any damage is done.
    -}

    {- *********************************************************************
    *                                                                      *
              Type family declarations
    *                                                                      *
    ********************************************************************* -}

    tcFamDecl1 :: Maybe Class -> FamilyDecl GhcRn -> TcM (TyCon, [TyFamEqnValidityInfo])
    tcFamDecl1 :: Maybe Class
    -> FamilyDecl GhcRn
    -> IOEnv (Env TcGblEnv TcLclEnv) (TyCon, [TyFamEqnValidityInfo])
    tcFamDecl1 Maybe Class
    parent (FamilyDecl { fdInfo :: forall pass. FamilyDecl pass -> FamilyInfo pass
    fdInfo = FamilyInfo GhcRn
    fam_info
                                  , fdLName :: forall pass. FamilyDecl pass -> LIdP pass
    fdLName = tc_lname :: LIdP GhcRn
    tc_lname@(L SrcSpanAnnN
    _ Name
    tc_name)
                                  , fdResultSig :: forall pass. FamilyDecl pass -> LFamilyResultSig pass
    fdResultSig = L EpAnnCO
    _ FamilyResultSig GhcRn
    sig
                                  , fdInjectivityAnn :: forall pass. FamilyDecl pass -> Maybe (LInjectivityAnn pass)
    fdInjectivityAnn = Maybe (LInjectivityAnn GhcRn)
    inj })
      | FamilyInfo GhcRn
    DataFamily <- FamilyInfo GhcRn
    fam_info
      = Name
    -> ([TyConBinder]
        -> Type
        -> IOEnv (Env TcGblEnv TcLclEnv) (TyCon, [TyFamEqnValidityInfo]))
    -> IOEnv (Env TcGblEnv TcLclEnv) (TyCon, [TyFamEqnValidityInfo])
    forall a. Name -> ([TyConBinder] -> Type -> TcM a) -> TcM a
    bindTyClTyVarsAndZonk Name
    tc_name (([TyConBinder]
      -> Type
      -> IOEnv (Env TcGblEnv TcLclEnv) (TyCon, [TyFamEqnValidityInfo]))
     -> IOEnv (Env TcGblEnv TcLclEnv) (TyCon, [TyFamEqnValidityInfo]))
    -> ([TyConBinder]
        -> Type
        -> IOEnv (Env TcGblEnv TcLclEnv) (TyCon, [TyFamEqnValidityInfo]))
    -> IOEnv (Env TcGblEnv TcLclEnv) (TyCon, [TyFamEqnValidityInfo])
    forall a b. (a -> b) -> a -> b
    $ \ [TyConBinder]
    tc_bndrs Type
    res_kind -> do
      { String -> SDoc -> TcRn ()
    traceTc String
    "tcFamDecl1 data family:" (Name -> SDoc
    forall a. Outputable a => a -> SDoc
    ppr Name
    tc_name)
      ; Name -> TcRn ()
    checkFamFlag Name
    tc_name

      -- Check that the result kind is OK
      -- We allow things like
      --   data family T (a :: Type) :: forall k. k -> Type
      -- We treat T as having arity 1, but result kind forall k. k -> Type
      -- But we want to check that the result kind finishes in
      --   Type or a kind-variable
      -- For the latter, consider
      --   data family D a :: forall k. Type -> k
      -- When UnliftedNewtypes is enabled, we loosen this restriction
      -- on the return kind. See Note [Implementation of UnliftedNewtypes], wrinkle (1).
      -- See also Note [Datatype return kinds]
      ; DataSort -> Type -> TcRn ()
    checkDataKindSig DataSort
    DataFamilySort Type
    res_kind
      ; tc_rep_name <- Name -> TcRnIf TcGblEnv TcLclEnv Name
    forall gbl lcl. Name -> TcRnIf gbl lcl Name
    newTyConRepName Name
    tc_name
      ; let inj   = [Bool] -> Injectivity
    Injective ([Bool] -> Injectivity) -> [Bool] -> Injectivity
    forall a b. (a -> b) -> a -> b
    $ Int -> Bool -> [Bool]
    forall a. Int -> a -> [a]
    replicate ([TyConBinder] -> Int
    forall a. [a] -> Int
    forall (t :: * -> *) a. Foldable t => t a -> Int
    length [TyConBinder]
    tc_bndrs) Bool
    True
            tycon = Name
    -> [TyConBinder]
    -> Type
    -> Maybe Name
    -> FamTyConFlav
    -> Maybe Class
    -> Injectivity
    -> TyCon
    mkFamilyTyCon Name
    tc_name [TyConBinder]
    tc_bndrs
                                  Type
    res_kind
                                  (FamilyResultSig GhcRn -> Maybe (IdP GhcRn)
    forall (a :: Pass).
    FamilyResultSig (GhcPass a) -> Maybe (IdP (GhcPass a))
    resultVariableName FamilyResultSig GhcRn
    sig)
                                  (Name -> FamTyConFlav
    DataFamilyTyCon Name
    tc_rep_name)
                                  Maybe Class
    parent Injectivity
    inj
      ; return (tycon, []) }

      | FamilyInfo GhcRn
    OpenTypeFamily <- FamilyInfo GhcRn
    fam_info
      = Name
    -> ([TyConBinder]
        -> Type
        -> IOEnv (Env TcGblEnv TcLclEnv) (TyCon, [TyFamEqnValidityInfo]))
    -> IOEnv (Env TcGblEnv TcLclEnv) (TyCon, [TyFamEqnValidityInfo])
    forall a. Name -> ([TyConBinder] -> Type -> TcM a) -> TcM a
    bindTyClTyVarsAndZonk Name
    tc_name (([TyConBinder]
      -> Type
      -> IOEnv (Env TcGblEnv TcLclEnv) (TyCon, [TyFamEqnValidityInfo]))
     -> IOEnv (Env TcGblEnv TcLclEnv) (TyCon, [TyFamEqnValidityInfo]))
    -> ([TyConBinder]
        -> Type
        -> IOEnv (Env TcGblEnv TcLclEnv) (TyCon, [TyFamEqnValidityInfo]))
    -> IOEnv (Env TcGblEnv TcLclEnv) (TyCon, [TyFamEqnValidityInfo])
    forall a b. (a -> b) -> a -> b
    $ \ [TyConBinder]
    tc_bndrs Type
    res_kind -> do
      { String -> SDoc -> TcRn ()
    traceTc String
    "tcFamDecl1 open type family:" (Name -> SDoc
    forall a. Outputable a => a -> SDoc
    ppr Name
    tc_name)
      ; Name -> TcRn ()
    checkFamFlag Name
    tc_name
      ; inj' <- [TyConBinder] -> Maybe (LInjectivityAnn GhcRn) -> TcM Injectivity
    tcInjectivity [TyConBinder]
    tc_bndrs Maybe (LInjectivityAnn GhcRn)
    inj
      ; checkResultSigFlag tc_name sig  -- check after injectivity for better errors
      ; let tycon = Name
    -> [TyConBinder]
    -> Type
    -> Maybe Name
    -> FamTyConFlav
    -> Maybe Class
    -> Injectivity
    -> TyCon
    mkFamilyTyCon Name
    tc_name [TyConBinder]
    tc_bndrs Type
    res_kind
                                   (FamilyResultSig GhcRn -> Maybe (IdP GhcRn)
    forall (a :: Pass).
    FamilyResultSig (GhcPass a) -> Maybe (IdP (GhcPass a))
    resultVariableName FamilyResultSig GhcRn
    sig) FamTyConFlav
    OpenSynFamilyTyCon
                                   Maybe Class
    parent Injectivity
    inj'
      ; return (tycon, []) }

      | ClosedTypeFamily Maybe [LTyFamInstEqn GhcRn]
    mb_eqns <- FamilyInfo GhcRn
    fam_info
      = -- Closed type families are a little tricky, because they contain the definition
        -- of both the type family and the equations for a CoAxiom.
        do { String -> SDoc -> TcRn ()
    traceTc String
    "tcFamDecl1 Closed type family:" (Name -> SDoc
    forall a. Outputable a => a -> SDoc
    ppr Name
    tc_name)
             -- the variables in the header scope only over the injectivity
             -- declaration but this is not involved here
           ; (inj', tc_bndrs, res_kind)
                <- Name
    -> ([TyConBinder]
        -> Type -> TcM (Injectivity, [TyConBinder], Type))
    -> TcM (Injectivity, [TyConBinder], Type)
    forall a. Name -> ([TyConBinder] -> Type -> TcM a) -> TcM a
    bindTyClTyVarsAndZonk Name
    tc_name (([TyConBinder] -> Type -> TcM (Injectivity, [TyConBinder], Type))
     -> TcM (Injectivity, [TyConBinder], Type))
    -> ([TyConBinder]
        -> Type -> TcM (Injectivity, [TyConBinder], Type))
    -> TcM (Injectivity, [TyConBinder], Type)
    forall a b. (a -> b) -> a -> b
    $ \ [TyConBinder]
    tc_bndrs Type
    res_kind ->
                   do { inj' <- [TyConBinder] -> Maybe (LInjectivityAnn GhcRn) -> TcM Injectivity
    tcInjectivity [TyConBinder]
    tc_bndrs Maybe (LInjectivityAnn GhcRn)
    inj
                      ; return (inj', tc_bndrs, res_kind) }

           ; checkFamFlag tc_name -- make sure we have -XTypeFamilies
           ; checkResultSigFlag tc_name sig

             -- If Nothing, this is an abstract family in a hs-boot file;
             -- but eqns might be empty in the Just case as well
           ; case mb_eqns of
               Maybe [LTyFamInstEqn GhcRn]
    Nothing   ->
                  let tc :: TyCon
    tc = Name
    -> [TyConBinder]
    -> Type
    -> Maybe Name
    -> FamTyConFlav
    -> Maybe Class
    -> Injectivity
    -> TyCon
    mkFamilyTyCon Name
    tc_name [TyConBinder]
    tc_bndrs Type
    res_kind
                                         (FamilyResultSig GhcRn -> Maybe (IdP GhcRn)
    forall (a :: Pass).
    FamilyResultSig (GhcPass a) -> Maybe (IdP (GhcPass a))
    resultVariableName FamilyResultSig GhcRn
    sig)
                                         FamTyConFlav
    AbstractClosedSynFamilyTyCon Maybe Class
    parent
                                         Injectivity
    inj'
                  in (TyCon, [TyFamEqnValidityInfo])
    -> IOEnv (Env TcGblEnv TcLclEnv) (TyCon, [TyFamEqnValidityInfo])
    forall a. a -> IOEnv (Env TcGblEnv TcLclEnv) a
    forall (m :: * -> *) a. Monad m => a -> m a
    return (TyCon
    tc, [])
               Just [LTyFamInstEqn GhcRn]
    eqns -> do {

             -- Process the equations, creating CoAxBranches
           ; let tc_fam_tc :: TyCon
    tc_fam_tc = Name
    -> [TyConBinder]
    -> Type
    -> [(Name, Var)]
    -> Bool
    -> TyConFlavour TyCon
    -> TyCon
    mkTcTyCon Name
    tc_name [TyConBinder]
    tc_bndrs Type
    res_kind
                                       [(Name, Var)]
    noTcTyConScopedTyVars
                                       Bool
    False {- this doesn't matter here -}
                                       TyConFlavour TyCon
    forall tc. TyConFlavour tc
    ClosedTypeFamilyFlavour

           ; (branches, axiom_validity_infos) <-
               [(KnotTied CoAxBranch, TyFamEqnValidityInfo)]
    -> ([KnotTied CoAxBranch], [TyFamEqnValidityInfo])
    forall a b. [(a, b)] -> ([a], [b])
    unzip ([(KnotTied CoAxBranch, TyFamEqnValidityInfo)]
     -> ([KnotTied CoAxBranch], [TyFamEqnValidityInfo]))
    -> IOEnv
         (Env TcGblEnv TcLclEnv)
         [(KnotTied CoAxBranch, TyFamEqnValidityInfo)]
    -> IOEnv
         (Env TcGblEnv TcLclEnv)
         ([KnotTied CoAxBranch], [TyFamEqnValidityInfo])
    forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
    <$> (GenLocated
       SrcSpanAnnA (FamEqn GhcRn (GenLocated SrcSpanAnnA (HsType GhcRn)))
     -> TcRn (KnotTied CoAxBranch, TyFamEqnValidityInfo))
    -> [GenLocated
          SrcSpanAnnA (FamEqn GhcRn (GenLocated SrcSpanAnnA (HsType GhcRn)))]
    -> IOEnv
         (Env TcGblEnv TcLclEnv)
         [(KnotTied CoAxBranch, TyFamEqnValidityInfo)]
    forall a b. (a -> TcRn b) -> [a] -> TcRn [b]
    mapAndReportM (TyCon
    -> AssocInstInfo
    -> LTyFamInstEqn GhcRn
    -> TcRn (KnotTied CoAxBranch, TyFamEqnValidityInfo)
    tcTyFamInstEqn TyCon
    tc_fam_tc AssocInstInfo
    NotAssociated) [LTyFamInstEqn GhcRn]
    [GenLocated
       SrcSpanAnnA (FamEqn GhcRn (GenLocated SrcSpanAnnA (HsType GhcRn)))]
    eqns
             -- Do not attempt to drop equations dominated by earlier
             -- ones here; in the case of mutual recursion with a data
             -- type, we get a knot-tying failure.  Instead we check
             -- for this afterwards, in GHC.Tc.Validity.checkValidCoAxiom
             -- Example: tc265

             -- Create a CoAxiom, with the correct src location.
           ; co_ax_name <- newFamInstAxiomName tc_lname []

           ; let mb_co_ax
                  | [GenLocated
       SrcSpanAnnA (FamEqn GhcRn (GenLocated SrcSpanAnnA (HsType GhcRn)))]
    -> Bool
    forall a. [a] -> Bool
    forall (t :: * -> *) a. Foldable t => t a -> Bool
    null [LTyFamInstEqn GhcRn]
    [GenLocated
       SrcSpanAnnA (FamEqn GhcRn (GenLocated SrcSpanAnnA (HsType GhcRn)))]
    eqns = Maybe (CoAxiom Branched)
    forall a. Maybe a
    Nothing   -- mkBranchedCoAxiom fails on empty list
                  | Bool
    otherwise = CoAxiom Branched -> Maybe (CoAxiom Branched)
    forall a. a -> Maybe a
    Just (Name -> TyCon -> [KnotTied CoAxBranch] -> CoAxiom Branched
    mkBranchedCoAxiom Name
    co_ax_name TyCon
    fam_tc [KnotTied CoAxBranch]
    branches)

                 fam_tc = Name
    -> [TyConBinder]
    -> Type
    -> Maybe Name
    -> FamTyConFlav
    -> Maybe Class
    -> Injectivity
    -> TyCon
    mkFamilyTyCon Name
    tc_name [TyConBinder]
    tc_bndrs Type
    res_kind (FamilyResultSig GhcRn -> Maybe (IdP GhcRn)
    forall (a :: Pass).
    FamilyResultSig (GhcPass a) -> Maybe (IdP (GhcPass a))
    resultVariableName FamilyResultSig GhcRn
    sig)
                          (Maybe (CoAxiom Branched) -> FamTyConFlav
    ClosedSynFamilyTyCon Maybe (CoAxiom Branched)
    mb_co_ax) Maybe Class
    parent Injectivity
    inj'

             -- We check for instance validity later, when doing validity
             -- checking for the tycon. Exception: checking equations
             -- overlap done by dropDominatedAxioms
           ; return (fam_tc, axiom_validity_infos) } }

    -- | Maybe return a list of Bools that say whether a type family was declared
    -- injective in the corresponding type arguments. Length of the list is equal to
    -- the number of arguments (including implicit kind/coercion arguments).
    -- True on position
    -- N means that a function is injective in its Nth argument. False means it is
    -- not.
    tcInjectivity :: [TyConBinder] -> Maybe (LInjectivityAnn GhcRn)
                  -> TcM Injectivity
    tcInjectivity :: [TyConBinder] -> Maybe (LInjectivityAnn GhcRn) -> TcM Injectivity
    tcInjectivity [TyConBinder]
    _ Maybe (LInjectivityAnn GhcRn)
    Nothing
      = Injectivity -> TcM Injectivity
    forall a. a -> IOEnv (Env TcGblEnv TcLclEnv) a
    forall (m :: * -> *) a. Monad m => a -> m a
    return Injectivity
    NotInjective

      -- User provided an injectivity annotation, so for each tyvar argument we
      -- check whether a type family was declared injective in that argument. We
      -- return a list of Bools, where True means that corresponding type variable
      -- was mentioned in lInjNames (type family is injective in that argument) and
      -- False means that it was not mentioned in lInjNames (type family is not
      -- injective in that type variable). We also extend injectivity information to
      -- kind variables, so if a user declares:
      --
      --   type family F (a :: k1) (b :: k2) = (r :: k3) | r -> a
      --
      -- then we mark both `a` and `k1` as injective.
      -- NB: the return kind is considered to be *input* argument to a type family.
      -- Since injectivity allows to infer input arguments from the result in theory
      -- we should always mark the result kind variable (`k3` in this example) as
      -- injective.  The reason is that result type has always an assigned kind and
      -- therefore we can always infer the result kind if we know the result type.
      -- But this does not seem to be useful in any way so we don't do it.  (Another
      -- reason is that the implementation would not be straightforward.)
    tcInjectivity [TyConBinder]
    tcbs (Just (L EpAnnCO
    loc (InjectivityAnn XCInjectivityAnn GhcRn
    _ LIdP GhcRn
    _ [LIdP GhcRn]
    lInjNames)))
      = EpAnnCO -> TcM Injectivity -> TcM Injectivity
    forall ann a. EpAnn ann -> TcRn a -> TcRn a
    setSrcSpanA EpAnnCO
    loc (TcM Injectivity -> TcM Injectivity)
    -> TcM Injectivity -> TcM Injectivity
    forall a b. (a -> b) -> a -> b
    $
        do { let tvs :: [Var]
    tvs = [TyConBinder] -> [Var]
    forall tv argf. [VarBndr tv argf] -> [tv]
    binderVars [TyConBinder]
    tcbs
           ; dflags <- IOEnv (Env TcGblEnv TcLclEnv) DynFlags
    forall (m :: * -> *). HasDynFlags m => m DynFlags
    getDynFlags
           -- Fail eagerly to avoid reporting injectivity errors when
           -- TypeFamilyDependencies is not enabled.
           ; checkTc (xopt LangExt.TypeFamilyDependencies dflags)
                     TcRnTyFamDepsDisabled
           ; inj_tvs <- mapM (tcLookupTyVar . unLoc) lInjNames
           ; inj_tvs <- liftZonkM $ zonkTcTyVarsToTcTyVars inj_tvs -- zonk the kinds
           ; let inj_ktvs = (Var -> Bool) -> VarSet -> VarSet
    filterVarSet Var -> Bool
    isTyVar (VarSet -> VarSet) -> VarSet -> VarSet
    forall a b. (a -> b) -> a -> b
    $  -- no injective coercion vars
                            VarSet -> VarSet
    closeOverKinds ([Var] -> VarSet
    mkVarSet [Var]
    inj_tvs)
           ; let inj_bools = (Var -> Bool) -> [Var] -> [Bool]
    forall a b. (a -> b) -> [a] -> [b]
    map (Var -> VarSet -> Bool
    `elemVarSet` VarSet
    inj_ktvs) [Var]
    tvs
           ; traceTc "tcInjectivity" (vcat [ ppr tvs, ppr lInjNames, ppr inj_tvs
                                           , ppr inj_ktvs, ppr inj_bools ])
           ; return $ Injective inj_bools }

    tcTySynRhs :: RolesInfo -> Name
               -> LHsType GhcRn -> TcM TyCon
    tcTySynRhs :: (Name -> [Role]) -> Name -> LHsKind GhcRn -> TcRn TyCon
    tcTySynRhs Name -> [Role]
    roles_info Name
    tc_name LHsKind GhcRn
    hs_ty
      = Name -> ([TyConBinder] -> Type -> TcRn TyCon) -> TcRn TyCon
    forall a. Name -> ([TyConBinder] -> Type -> TcM a) -> TcM a
    bindTyClTyVars Name
    tc_name (([TyConBinder] -> Type -> TcRn TyCon) -> TcRn TyCon)
    -> ([TyConBinder] -> Type -> TcRn TyCon) -> TcRn TyCon
    forall a b. (a -> b) -> a -> b
    $ \ [TyConBinder]
    tc_bndrs Type
    res_kind ->
        do { env <- TcRnIf TcGblEnv TcLclEnv TcLclEnv
    forall gbl lcl. TcRnIf gbl lcl lcl
    getLclEnv
           ; traceTc "tc-syn" (ppr tc_name $$ ppr (getLclEnvRdrEnv env))
           ; rhs_ty <- pushLevelAndSolveEqualities skol_info tc_bndrs $
                       tcCheckLHsType hs_ty (TheKind res_kind)

             -- See Note [Error on unconstrained meta-variables] in GHC.Tc.Utils.TcMType
             -- Example: (typecheck/should_fail/T17567)
             --   type T = forall a. Proxy a
             -- The kind of `a` is unconstrained.
           ; dvs <- candidateQTyVarsOfType rhs_ty
           ; let err_ctx TidyEnv
    tidy_env = do { (tidy_env2, rhs_ty) <- TidyEnv -> Type -> ZonkM (TidyEnv, Type)
    zonkTidyTcType TidyEnv
    tidy_env Type
    rhs_ty
                                       ; return (tidy_env2, UninfTyCtx_TySynRhs rhs_ty) }
           ; doNotQuantifyTyVars dvs err_ctx

           ; (bndrs, rhs_ty) <- initZonkEnv NoFlexi $
             runZonkBndrT (zonkTyVarBindersX tc_bndrs) $ \ [TyConBinder]
    bndrs ->
               do { rhs_ty <- Type -> ZonkTcM Type
    zonkTcTypeToTypeX Type
    rhs_ty
                  ; return (bndrs, rhs_ty) }
           ; let roles = Name -> [Role]
    roles_info Name
    tc_name
           ; return (buildSynTyCon tc_name bndrs res_kind roles rhs_ty) }
      where
        skol_info :: SkolemInfoAnon
    skol_info = TyConFlavour TyCon -> Name -> SkolemInfoAnon
    TyConSkol TyConFlavour TyCon
    forall tc. TyConFlavour tc
    TypeSynonymFlavour Name
    tc_name

    tcDataDefn :: SDoc -> RolesInfo -> Name
               -> HsDataDefn GhcRn -> TcM (TyCon, [DerivInfo])
      -- NB: not used for newtype/data instances (whether associated or not)
    tcDataDefn :: SDoc
    -> (Name -> [Role])
    -> Name
    -> HsDataDefn GhcRn
    -> IOEnv (Env TcGblEnv TcLclEnv) (TyCon, [DerivInfo])
    tcDataDefn SDoc
    err_ctxt Name -> [Role]
    roles_info Name
    tc_name
               (HsDataDefn { dd_cType :: forall pass. HsDataDefn pass -> Maybe (XRec pass CType)
    dd_cType = Maybe (XRec GhcRn CType)
    cType
                           , dd_ctxt :: forall pass. HsDataDefn pass -> Maybe (LHsContext pass)
    dd_ctxt = Maybe (LHsContext GhcRn)
    ctxt
                           , dd_kindSig :: forall pass. HsDataDefn pass -> Maybe (LHsKind pass)
    dd_kindSig = Maybe (LHsKind GhcRn)
    mb_ksig  -- Already in tc's kind
                                                   -- via inferInitialKinds
                           , dd_cons :: forall pass. HsDataDefn pass -> DataDefnCons (LConDecl pass)
    dd_cons = DataDefnCons (LConDecl GhcRn)
    cons
                           , dd_derivs :: forall pass. HsDataDefn pass -> HsDeriving pass
    dd_derivs = HsDeriving GhcRn
    derivs })
      = Name
    -> ([TyConBinder]
        -> Type -> IOEnv (Env TcGblEnv TcLclEnv) (TyCon, [DerivInfo]))
    -> IOEnv (Env TcGblEnv TcLclEnv) (TyCon, [DerivInfo])
    forall a. Name -> ([TyConBinder] -> Type -> TcM a) -> TcM a
    bindTyClTyVars Name
    tc_name (([TyConBinder]
      -> Type -> IOEnv (Env TcGblEnv TcLclEnv) (TyCon, [DerivInfo]))
     -> IOEnv (Env TcGblEnv TcLclEnv) (TyCon, [DerivInfo]))
    -> ([TyConBinder]
        -> Type -> IOEnv (Env TcGblEnv TcLclEnv) (TyCon, [DerivInfo]))
    -> IOEnv (Env TcGblEnv TcLclEnv) (TyCon, [DerivInfo])
    forall a b. (a -> b) -> a -> b
    $ \ [TyConBinder]
    tc_bndrs Type
    res_kind ->
           -- The TyCon tyvars must scope over
           --    - the stupid theta (dd_ctxt)
           --    - for H98 constructors only, the ConDecl
           -- But it does no harm to bring them into scope
           -- over GADT ConDecls as well; and it's awkward not to
        do { gadt_syntax <- Name
    -> Maybe (LHsContext GhcRn)
    -> DataDefnCons (LConDecl GhcRn)
    -> TcRnIf TcGblEnv TcLclEnv Bool
    dataDeclChecks Name
    tc_name Maybe (LHsContext GhcRn)
    ctxt DataDefnCons (LConDecl GhcRn)
    cons

           ; tcg_env <- getGblEnv
           ; let hsc_src = TcGblEnv -> HscSource
    tcg_src TcGblEnv
    tcg_env
           ; unless (mk_permissive_kind hsc_src cons) $
             checkDataKindSig (DataDeclSort (dataDefnConsNewOrData cons)) res_kind

           ; stupid_tc_theta <- pushLevelAndSolveEqualities skol_info tc_bndrs $
                                tcHsContext ctxt

           -- See Note [Error on unconstrained meta-variables] in GHC.Tc.Utils.TcMType
           -- Example: (typecheck/should_fail/T17567StupidTheta)
           --   data (forall a. a b ~ a c) => T b c
           -- The kind of 'a' is unconstrained.
           ; dvs <- candidateQTyVarsOfTypes stupid_tc_theta
           ; let err_ctx TidyEnv
    tidy_env
                   = do { (tidy_env2, theta) <- TidyEnv -> ThetaType -> ZonkM (TidyEnv, ThetaType)
    zonkTidyTcTypes TidyEnv
    tidy_env ThetaType
    stupid_tc_theta
                        ; return (tidy_env2, UninfTyCtx_DataContext theta) }
           ; doNotQuantifyTyVars dvs err_ctx

                 -- Check that we don't use kind signatures without the extension
           ; kind_signatures <- xoptM LangExt.KindSignatures
           ; case mb_ksig of
              Just (L SrcSpanAnnA
    _ HsType GhcRn
    ksig)
                | Bool -> Bool
    not Bool
    kind_signatures
                -> TcRnMessage -> TcRn ()
    addErrTc (TcRnMessage -> TcRn ()) -> TcRnMessage -> TcRn ()
    forall a b. (a -> b) -> a -> b
    $ Either (HsType GhcPs) (Name, HsType GhcRn) -> TcRnMessage
    TcRnKindSignaturesDisabled ((Name, HsType GhcRn) -> Either (HsType GhcPs) (Name, HsType GhcRn)
    forall a b. b -> Either a b
    Right (Name
    tc_name, HsType GhcRn
    ksig))
              Maybe (LHsKind GhcRn)
    _ -> () -> TcRn ()
    forall a. a -> IOEnv (Env TcGblEnv TcLclEnv) a
    forall (m :: * -> *) a. Monad m => a -> m a
    return ()

           ; (bndrs, stupid_theta, res_kind) <- initZonkEnv NoFlexi $
             runZonkBndrT (zonkTyVarBindersX tc_bndrs) $ \ [TyConBinder]
    bndrs ->
               do { stupid_theta   <- ThetaType -> ZonkTcM ThetaType
    zonkTcTypesToTypesX ThetaType
    stupid_tc_theta
                  ; res_kind       <- zonkTcTypeToTypeX   res_kind
                  ; return (bndrs, stupid_theta, res_kind) }

           ; tycon <- fixM $ \ TyCon
    rec_tycon -> do
                 { data_cons <- DataDeclInfo
    -> TyCon
    -> [TyConBinder]
    -> Type
    -> DataDefnCons (LConDecl GhcRn)
    -> TcM (DataDefnCons DataCon)
    tcConDecls DataDeclInfo
    DDataType TyCon
    rec_tycon [TyConBinder]
    tc_bndrs Type
    res_kind DataDefnCons (LConDecl GhcRn)
    cons
                 ; tc_rhs    <- mk_tc_rhs hsc_src rec_tycon data_cons
                 ; tc_rep_nm <- newTyConRepName tc_name

                 ; return (mkAlgTyCon tc_name
                                      bndrs
                                      res_kind
                                      (roles_info tc_name)
                                      (fmap unLoc cType)
                                      stupid_theta tc_rhs
                                      (VanillaAlgTyCon tc_rep_nm)
                                      gadt_syntax)
             }

           ; let scoped_tvs = [Var] -> [(Name, Var)]
    mkTyVarNamePairs ([TyConBinder] -> [Var]
    forall tv argf. [VarBndr tv argf] -> [tv]
    binderVars [TyConBinder]
    tc_bndrs)
                              -- scoped_tvs: still the skolem TcTyVars
                 deriv_info = DerivInfo { di_rep_tc :: TyCon
    di_rep_tc = TyCon
    tycon
                                        , di_scoped_tvs :: [(Name, Var)]
    di_scoped_tvs = [(Name, Var)]
    scoped_tvs
                                        , di_clauses :: HsDeriving GhcRn
    di_clauses = HsDeriving GhcRn
    derivs
                                        , di_ctxt :: SDoc
    di_ctxt = SDoc
    err_ctxt }
           ; traceTc "tcDataDefn" (ppr tc_name $$ ppr tc_bndrs)
           ; return (tycon, [deriv_info]) }
      where
        skol_info :: SkolemInfoAnon
    skol_info = TyConFlavour TyCon -> Name -> SkolemInfoAnon
    TyConSkol TyConFlavour TyCon
    flav Name
    tc_name
        flav :: TyConFlavour TyCon
    flav = NewOrData -> TyConFlavour TyCon
    forall tc. NewOrData -> TyConFlavour tc
    newOrDataToFlavour (DataDefnCons (GenLocated SrcSpanAnnA (ConDecl GhcRn)) -> NewOrData
    forall a. DataDefnCons a -> NewOrData
    dataDefnConsNewOrData DataDefnCons (LConDecl GhcRn)
    DataDefnCons (GenLocated SrcSpanAnnA (ConDecl GhcRn))
    cons)

        -- Abstract data types in hsig files can have arbitrary kinds,
        -- because they may be implemented by type synonyms
        -- (which themselves can have arbitrary kinds, not just *). See #13955.
        --
        -- Note that this is only a property that data type declarations possess,
        -- so one could not have, say, a data family instance in an hsig file that
        -- has kind `Bool`. Therefore, this check need only occur in the code that
        -- typechecks data type declarations.
        mk_permissive_kind :: HscSource -> DataDefnCons a -> Bool
    mk_permissive_kind HscSource
    HsigFile (DataTypeCons Bool
    _ []) = Bool
    True
        mk_permissive_kind HscSource
    _ DataDefnCons a
    _ = Bool
    False

        -- In an hs-boot or a signature file,
        -- a 'data' declaration with no constructors
        -- indicates a nominally distinct abstract data type.
        mk_tc_rhs :: HscSource
    -> TyCon
    -> DataDefnCons DataCon
    -> IOEnv (Env TcGblEnv TcLclEnv) AlgTyConRhs
    mk_tc_rhs (HscSource -> Bool
    isHsBootOrSig -> Bool
    True) TyCon
    _ (DataTypeCons Bool
    _ [])
          = AlgTyConRhs -> IOEnv (Env TcGblEnv TcLclEnv) AlgTyConRhs
    forall a. a -> IOEnv (Env TcGblEnv TcLclEnv) a
    forall (m :: * -> *) a. Monad m => a -> m a
    return AlgTyConRhs
    AbstractTyCon

        mk_tc_rhs HscSource
    _ TyCon
    tycon DataDefnCons DataCon
    data_cons = case DataDefnCons DataCon
    data_cons of
              DataTypeCons Bool
    is_type_data [DataCon]
    data_cons -> AlgTyConRhs -> IOEnv (Env TcGblEnv TcLclEnv) AlgTyConRhs
    forall a. a -> IOEnv (Env TcGblEnv TcLclEnv) a
    forall (m :: * -> *) a. Monad m => a -> m a
    return (AlgTyConRhs -> IOEnv (Env TcGblEnv TcLclEnv) AlgTyConRhs)
    -> AlgTyConRhs -> IOEnv (Env TcGblEnv TcLclEnv) AlgTyConRhs
    forall a b. (a -> b) -> a -> b
    $
                            Bool -> Bool -> [DataCon] -> AlgTyConRhs
    mkLevPolyDataTyConRhs
                              (HasDebugCallStack => Type -> Bool
    Type -> Bool
    isFixedRuntimeRepKind (TyCon -> Type
    tyConResKind TyCon
    tycon))
                              Bool
    is_type_data
                              [DataCon]
    data_cons
              NewTypeCon DataCon
    data_con -> Name
    -> TyCon -> DataCon -> IOEnv (Env TcGblEnv TcLclEnv) AlgTyConRhs
    forall m n. Name -> TyCon -> DataCon -> TcRnIf m n AlgTyConRhs
    mkNewTyConRhs Name
    tc_name TyCon
    tycon DataCon
    data_con

    -------------------------
    kcTyFamInstEqn :: TcTyCon -> LTyFamInstEqn GhcRn -> TcM ()
    -- Used for the equations of a closed type family only
    -- Not used for data/type instances
    kcTyFamInstEqn :: TyCon -> LTyFamInstEqn GhcRn -> TcRn ()
    kcTyFamInstEqn TyCon
    tc_fam_tc
        (L SrcSpanAnnA
    loc (FamEqn { feqn_tycon :: forall pass rhs. FamEqn pass rhs -> LIdP pass
    feqn_tycon = L SrcSpanAnnN
    _ Name
    eqn_tc_name
                       , feqn_bndrs :: forall pass rhs. FamEqn pass rhs -> HsOuterFamEqnTyVarBndrs pass
    feqn_bndrs = HsOuterFamEqnTyVarBndrs GhcRn
    outer_bndrs
                       , feqn_pats :: forall pass rhs. FamEqn pass rhs -> HsFamEqnPats pass
    feqn_pats  = HsFamEqnPats GhcRn
    hs_pats
                       , feqn_rhs :: forall pass rhs. FamEqn pass rhs -> rhs
    feqn_rhs   = GenLocated SrcSpanAnnA (HsType GhcRn)
    hs_rhs_ty }))
      = SrcSpanAnnA -> TcRn () -> TcRn ()
    forall ann a. EpAnn ann -> TcRn a -> TcRn a
    setSrcSpanA SrcSpanAnnA
    loc (TcRn () -> TcRn ()) -> TcRn () -> TcRn ()
    forall a b. (a -> b) -> a -> b
    $
        do { String -> SDoc -> TcRn ()
    traceTc String
    "kcTyFamInstEqn" ([SDoc] -> SDoc
    forall doc. IsDoc doc => [doc] -> doc
    vcat
               [ String -> SDoc
    forall doc. IsLine doc => String -> doc
    text String
    "tc_name ="    SDoc -> SDoc -> SDoc
    forall doc. IsLine doc => doc -> doc -> doc
    <+> Name -> SDoc
    forall a. Outputable a => a -> SDoc
    ppr Name
    eqn_tc_name
               , String -> SDoc
    forall doc. IsLine doc => String -> doc
    text String
    "fam_tc ="     SDoc -> SDoc -> SDoc
    forall doc. IsLine doc => doc -> doc -> doc
    <+> TyCon -> SDoc
    forall a. Outputable a => a -> SDoc
    ppr TyCon
    tc_fam_tc SDoc -> SDoc -> SDoc
    forall doc. IsLine doc => doc -> doc -> doc
    <+> SDoc
    dcolon SDoc -> SDoc -> SDoc
    forall doc. IsLine doc => doc -> doc -> doc
    <+> Type -> SDoc
    forall a. Outputable a => a -> SDoc
    ppr (TyCon -> Type
    tyConKind TyCon
    tc_fam_tc)
               , String -> SDoc
    forall doc. IsLine doc => String -> doc
    text String
    "feqn_bndrs =" SDoc -> SDoc -> SDoc
    forall doc. IsLine doc => doc -> doc -> doc
    <+> HsOuterFamEqnTyVarBndrs GhcRn -> SDoc
    forall a. Outputable a => a -> SDoc
    ppr HsOuterFamEqnTyVarBndrs GhcRn
    outer_bndrs
               , String -> SDoc
    forall doc. IsLine doc => String -> doc
    text String
    "feqn_pats ="  SDoc -> SDoc -> SDoc
    forall doc. IsLine doc => doc -> doc -> doc
    <+> [HsArg
       GhcRn
       (GenLocated SrcSpanAnnA (HsType GhcRn))
       (GenLocated SrcSpanAnnA (HsType GhcRn))]
    -> SDoc
    forall a. Outputable a => a -> SDoc
    ppr HsFamEqnPats GhcRn
    [HsArg
       GhcRn
       (GenLocated SrcSpanAnnA (HsType GhcRn))
       (GenLocated SrcSpanAnnA (HsType GhcRn))]
    hs_pats ])

           ; TyCon
    -> Name
    -> [HsArg
          GhcRn
          (GenLocated SrcSpanAnnA (HsType GhcRn))
          (GenLocated SrcSpanAnnA (HsType GhcRn))]
    -> TcRn ()
    forall p tm ty. TyCon -> Name -> [HsArg p tm ty] -> TcRn ()
    checkTyFamInstEqn TyCon
    tc_fam_tc Name
    eqn_tc_name HsFamEqnPats GhcRn
    [HsArg
       GhcRn
       (GenLocated SrcSpanAnnA (HsType GhcRn))
       (GenLocated SrcSpanAnnA (HsType GhcRn))]
    hs_pats

           ; TcM (HsOuterFamEqnTyVarBndrs GhcTc, Type) -> TcRn ()
    forall a. TcM a -> TcRn ()
    discardResult (TcM (HsOuterFamEqnTyVarBndrs GhcTc, Type) -> TcRn ())
    -> TcM (HsOuterFamEqnTyVarBndrs GhcTc, Type) -> TcRn ()
    forall a b. (a -> b) -> a -> b
    $
             HsOuterFamEqnTyVarBndrs GhcRn
    -> IOEnv (Env TcGblEnv TcLclEnv) Type
    -> TcM (HsOuterFamEqnTyVarBndrs GhcTc, Type)
    forall a.
    HsOuterFamEqnTyVarBndrs GhcRn
    -> TcM a -> TcM (HsOuterFamEqnTyVarBndrs GhcTc, a)
    bindOuterFamEqnTKBndrs_Q_Tv HsOuterFamEqnTyVarBndrs GhcRn
    outer_bndrs (IOEnv (Env TcGblEnv TcLclEnv) Type
     -> TcM (HsOuterFamEqnTyVarBndrs GhcTc, Type))
    -> IOEnv (Env TcGblEnv TcLclEnv) Type
    -> TcM (HsOuterFamEqnTyVarBndrs GhcTc, Type)
    forall a b. (a -> b) -> a -> b
    $
             do { (_fam_app, res_kind) <- TyCon -> HsFamEqnPats GhcRn -> TcM (Type, Type)
    tcFamTyPats TyCon
    tc_fam_tc HsFamEqnPats GhcRn
    hs_pats
                ; tcCheckLHsType hs_rhs_ty (TheKind res_kind) }
                 -- Why "_Tv" here?  Consider (#14066)
                 --  type family Bar x y where
                 --      Bar (x :: a) (y :: b) = Int
                 --      Bar (x :: c) (y :: d) = Bool
                 -- During kind-checking, a,b,c,d should be TyVarTvs and unify appropriately
        }

    --------------------------
    tcTyFamInstEqn :: TcTyCon -> AssocInstInfo -> LTyFamInstEqn GhcRn
                   -> TcM (KnotTied CoAxBranch, TyFamEqnValidityInfo)
    -- Needs to be here, not in GHC.Tc.TyCl.Instance, because closed families
    -- (typechecked here) have TyFamInstEqns

    tcTyFamInstEqn :: TyCon
    -> AssocInstInfo
    -> LTyFamInstEqn GhcRn
    -> TcRn (KnotTied CoAxBranch, TyFamEqnValidityInfo)
    tcTyFamInstEqn TyCon
    fam_tc AssocInstInfo
    mb_clsinfo
        (L SrcSpanAnnA
    loc (FamEqn { feqn_tycon :: forall pass rhs. FamEqn pass rhs -> LIdP pass
    feqn_tycon  = L SrcSpanAnnN
    _ Name
    eqn_tc_name
                       , feqn_bndrs :: forall pass rhs. FamEqn pass rhs -> HsOuterFamEqnTyVarBndrs pass
    feqn_bndrs  = HsOuterFamEqnTyVarBndrs GhcRn
    outer_bndrs
                       , feqn_pats :: forall pass rhs. FamEqn pass rhs -> HsFamEqnPats pass
    feqn_pats   = HsFamEqnPats GhcRn
    hs_pats
                       , feqn_rhs :: forall pass rhs. FamEqn pass rhs -> rhs
    feqn_rhs    = GenLocated SrcSpanAnnA (HsType GhcRn)
    hs_rhs_ty }))
      = SrcSpanAnnA
    -> TcRn (KnotTied CoAxBranch, TyFamEqnValidityInfo)
    -> TcRn (KnotTied CoAxBranch, TyFamEqnValidityInfo)
    forall ann a. EpAnn ann -> TcRn a -> TcRn a
    setSrcSpanA SrcSpanAnnA
    loc (TcRn (KnotTied CoAxBranch, TyFamEqnValidityInfo)
     -> TcRn (KnotTied CoAxBranch, TyFamEqnValidityInfo))
    -> TcRn (KnotTied CoAxBranch, TyFamEqnValidityInfo)
    -> TcRn (KnotTied CoAxBranch, TyFamEqnValidityInfo)
    forall a b. (a -> b) -> a -> b
    $
        do { String -> SDoc -> TcRn ()
    traceTc String
    "tcTyFamInstEqn" (SDoc -> TcRn ()) -> SDoc -> TcRn ()
    forall a b. (a -> b) -> a -> b
    $
             [SDoc] -> SDoc
    forall doc. IsDoc doc => [doc] -> doc
    vcat [ SrcSpanAnnA -> SDoc
    forall a. Outputable a => a -> SDoc
    ppr SrcSpanAnnA
    loc, TyCon -> SDoc
    forall a. Outputable a => a -> SDoc
    ppr TyCon
    fam_tc SDoc -> SDoc -> SDoc
    forall doc. IsLine doc => doc -> doc -> doc
    <+> [HsArg
       GhcRn
       (GenLocated SrcSpanAnnA (HsType GhcRn))
       (GenLocated SrcSpanAnnA (HsType GhcRn))]
    -> SDoc
    forall a. Outputable a => a -> SDoc
    ppr HsFamEqnPats GhcRn
    [HsArg
       GhcRn
       (GenLocated SrcSpanAnnA (HsType GhcRn))
       (GenLocated SrcSpanAnnA (HsType GhcRn))]
    hs_pats
                  , String -> SDoc
    forall doc. IsLine doc => String -> doc
    text String
    "fam tc bndrs" SDoc -> SDoc -> SDoc
    forall doc. IsLine doc => doc -> doc -> doc
    <+> [Var] -> SDoc
    pprTyVars (TyCon -> [Var]
    tyConTyVars TyCon
    fam_tc)
                  , case AssocInstInfo
    mb_clsinfo of
                      NotAssociated {} -> SDoc
    forall doc. IsOutput doc => doc
    empty
                      InClsInst { ai_class :: AssocInstInfo -> Class
    ai_class = Class
    cls } -> String -> SDoc
    forall doc. IsLine doc => String -> doc
    text String
    "class" SDoc -> SDoc -> SDoc
    forall doc. IsLine doc => doc -> doc -> doc
    <+> Class -> SDoc
    forall a. Outputable a => a -> SDoc
    ppr Class
    cls SDoc -> SDoc -> SDoc
    forall doc. IsLine doc => doc -> doc -> doc
    <+> [Var] -> SDoc
    pprTyVars (Class -> [Var]
    classTyVars Class
    cls) ]

           ; TyCon
    -> Name
    -> [HsArg
          GhcRn
          (GenLocated SrcSpanAnnA (HsType GhcRn))
          (GenLocated SrcSpanAnnA (HsType GhcRn))]
    -> TcRn ()
    forall p tm ty. TyCon -> Name -> [HsArg p tm ty] -> TcRn ()
    checkTyFamInstEqn TyCon
    fam_tc Name
    eqn_tc_name HsFamEqnPats GhcRn
    [HsArg
       GhcRn
       (GenLocated SrcSpanAnnA (HsType GhcRn))
       (GenLocated SrcSpanAnnA (HsType GhcRn))]
    hs_pats

           ; (qtvs, non_user_tvs, pats, rhs_ty)
               <- TyCon
    -> AssocInstInfo
    -> HsOuterFamEqnTyVarBndrs GhcRn
    -> HsFamEqnPats GhcRn
    -> LHsKind GhcRn
    -> TcM ([Var], VarSet, ThetaType, Type)
    tcTyFamInstEqnGuts TyCon
    fam_tc AssocInstInfo
    mb_clsinfo
                    HsOuterFamEqnTyVarBndrs GhcRn
    outer_bndrs HsFamEqnPats GhcRn
    hs_pats LHsKind GhcRn
    GenLocated SrcSpanAnnA (HsType GhcRn)
    hs_rhs_ty
           -- Don't print results they may be knot-tied
           -- (tcFamInstEqnGuts zonks to Type)

           ; let ax = [Var]
    -> [Var]
    -> [Var]
    -> ThetaType
    -> Type
    -> [Role]
    -> SrcSpan
    -> KnotTied CoAxBranch
    mkCoAxBranch [Var]
    qtvs [] [] ThetaType
    pats Type
    rhs_ty
                        ((Var -> Role) -> [Var] -> [Role]
    forall a b. (a -> b) -> [a] -> [b]
    map (Role -> Var -> Role
    forall a b. a -> b -> a
    const Role
    Nominal) [Var]
    qtvs)
                        (SrcSpanAnnA -> SrcSpan
    forall a. HasLoc a => a -> SrcSpan
    locA SrcSpanAnnA
    loc)
                 vi = VI { vi_loc :: SrcSpan
    vi_loc          = SrcSpanAnnA -> SrcSpan
    forall a. HasLoc a => a -> SrcSpan
    locA SrcSpanAnnA
    loc
                         , vi_qtvs :: [Var]
    vi_qtvs         = [Var]
    qtvs
                         , vi_non_user_tvs :: VarSet
    vi_non_user_tvs = VarSet
    non_user_tvs
                         , vi_pats :: ThetaType
    vi_pats         = ThetaType
    pats
                         , vi_rhs :: Type
    vi_rhs          = Type
    rhs_ty }

           ; return (ax, vi) }

    checkTyFamInstEqn :: TcTyCon -> Name -> [HsArg p tm ty] -> TcM ()
    checkTyFamInstEqn :: forall p tm ty. TyCon -> Name -> [HsArg p tm ty] -> TcRn ()
    checkTyFamInstEqn TyCon
    tc_fam_tc Name
    eqn_tc_name [HsArg p tm ty]
    hs_pats =
      do { -- Ensure that each equation's type constructor is for the right
           -- type family.  E.g. barf on
           --    type family F a where { G Int = Bool }
           let tc_fam_tc_name :: Name
    tc_fam_tc_name = TyCon -> Name
    forall a. NamedThing a => a -> Name
    getName TyCon
    tc_fam_tc
         ; Bool -> TcRnMessage -> TcRn ()
    checkTc (Name
    tc_fam_tc_name Name -> Name -> Bool
    forall a. Eq a => a -> a -> Bool
    == Name
    eqn_tc_name) (TcRnMessage -> TcRn ()) -> TcRnMessage -> TcRn ()
    forall a b. (a -> b) -> a -> b
    $
                   IllegalInstanceReason -> TcRnMessage
    TcRnIllegalInstance (IllegalInstanceReason -> TcRnMessage)
    -> IllegalInstanceReason -> TcRnMessage
    forall a b. (a -> b) -> a -> b
    $ IllegalFamilyInstanceReason -> IllegalInstanceReason
    IllegalFamilyInstance (IllegalFamilyInstanceReason -> IllegalInstanceReason)
    -> IllegalFamilyInstanceReason -> IllegalInstanceReason
    forall a b. (a -> b) -> a -> b
    $
                   Name -> Name -> IllegalFamilyInstanceReason
    TyFamNameMismatch Name
    tc_fam_tc_name Name
    eqn_tc_name

           -- Check the arity of visible arguments
           -- If we wait until validity checking, we'll get kind errors
           -- below when an arity error will be much easier to understand.
         ; let vis_arity :: Int
    vis_arity = [Var] -> Int
    forall a. [a] -> Int
    forall (t :: * -> *) a. Foldable t => t a -> Int
    length (TyCon -> [Var]
    tyConVisibleTyVars TyCon
    tc_fam_tc)
               vis_pats :: Int
    vis_pats  = [HsArg p tm ty] -> Int
    forall p tm ty. [HsArg p tm ty] -> Int
    numVisibleArgs [HsArg p tm ty]
    hs_pats
         ; Bool -> TcRnMessage -> TcRn ()
    checkTc (Int
    vis_pats Int -> Int -> Bool
    forall a. Eq a => a -> a -> Bool
    == Int
    vis_arity) (TcRnMessage -> TcRn ()) -> TcRnMessage -> TcRn ()
    forall a b. (a -> b) -> a -> b
    $
            IllegalInstanceReason -> TcRnMessage
    TcRnIllegalInstance (IllegalInstanceReason -> TcRnMessage)
    -> IllegalInstanceReason -> TcRnMessage
    forall a b. (a -> b) -> a -> b
    $ IllegalFamilyInstanceReason -> IllegalInstanceReason
    IllegalFamilyInstance (IllegalFamilyInstanceReason -> IllegalInstanceReason)
    -> IllegalFamilyInstanceReason -> IllegalInstanceReason
    forall a b. (a -> b) -> a -> b
    $
            TyCon -> Int -> IllegalFamilyInstanceReason
    FamilyArityMismatch TyCon
    tc_fam_tc Int
    vis_arity
         }

    {- Note [Instantiating a family tycon]
    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    It's possible that kind-checking the result of a family tycon applied to
    its patterns will instantiate the tycon further. For example, we might
    have

      type family F :: k where
        F = Int
        F = Maybe

    After checking (F :: forall k. k) (with no visible patterns), we still need
    to instantiate the k. With data family instances, this problem can be even
    more intricate, due to Note [Arity of data families] in GHC.Core.FamInstEnv. See
    indexed-types/should_compile/T12369 for an example.

    So, the kind-checker must return the new skolems and args (that is, Type
    or (Type -> Type) for the equations above) and the instantiated kind.

    Note [Generalising in tcTyFamInstEqnGuts]
    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    Suppose we have something like
      type instance forall (a::k) b. F (Proxy t1) _ = rhs

    Then  imp_vars = [k], exp_bndrs = [a::k, b]

    We want to quantify over all the free vars of the LHS including
      * any invisible kind variables arising from instantiating tycons,
        such as Proxy
      * wildcards such as '_' above

    The wildcards are particularly awkward: they may need to be quantified
      - before the explicit variables k,a,b
      - after them
      - or even interleaved with them
      c.f. Note [Naughty quantification candidates] in GHC.Tc.Utils.TcMType

    So, we use bindOuterFamEqnTKBndrs (which does not create an implication for
    the telescope), and generalise over /all/ the variables in the LHS,
    without treating the explicitly-quantified ones specially. Wrinkles:

     - When generalising, include the explicit user-specified forall'd
       variables, so that we get an error from Validity.checkFamPatBinders
       if a forall'd variable is not bound on the LHS

     - We still want to complain about a bad telescope among the user-specified
       variables.  So in checkFamTelescope we emit an implication constraint
       quantifying only over them, purely so that we get a good telescope error.

      - Note that, unlike a type signature like
           f :: forall (a::k). blah
        we do /not/ care about the Inferred/Specified designation or order for
        the final quantified tyvars.  Type-family instances are not invoked
        directly in Haskell source code, so visible type application etc plays
        no role.

    See also Note [Re-quantify type variables in rules] in
    GHC.Tc.Gen.Rule, which explains a /very/ similar design when
    generalising over the type of a rewrite rule.

    -}

    --------------------------

    tcTyFamInstEqnGuts :: TyCon -> AssocInstInfo
                       -> HsOuterFamEqnTyVarBndrs GhcRn     -- Implicit and explicit binders
                       -> HsFamEqnPats GhcRn                -- Patterns
                       -> LHsType GhcRn                     -- RHS
                       -> TcM ([TyVar], TyVarSet, [TcType], TcType)
                           -- (tyvars, non_user_tvs, pats, rhs)
    -- Used only for type families, not data families
    tcTyFamInstEqnGuts :: TyCon
    -> AssocInstInfo
    -> HsOuterFamEqnTyVarBndrs GhcRn
    -> HsFamEqnPats GhcRn
    -> LHsKind GhcRn
    -> TcM ([Var], VarSet, ThetaType, Type)
    tcTyFamInstEqnGuts TyCon
    fam_tc AssocInstInfo
    mb_clsinfo HsOuterFamEqnTyVarBndrs GhcRn
    outer_hs_bndrs HsFamEqnPats GhcRn
    hs_pats LHsKind GhcRn
    hs_rhs_ty
      = do { String -> SDoc -> TcRn ()
    traceTc String
    "tcTyFamInstEqnGuts {" (TyCon -> SDoc
    forall a. Outputable a => a -> SDoc
    ppr TyCon
    fam_tc SDoc -> SDoc -> SDoc
    forall doc. IsDoc doc => doc -> doc -> doc
    $$ HsOuterFamEqnTyVarBndrs GhcRn -> SDoc
    forall a. Outputable a => a -> SDoc
    ppr HsOuterFamEqnTyVarBndrs GhcRn
    outer_hs_bndrs SDoc -> SDoc -> SDoc
    forall doc. IsDoc doc => doc -> doc -> doc
    $$ [HsArg
       GhcRn
       (GenLocated SrcSpanAnnA (HsType GhcRn))
       (GenLocated SrcSpanAnnA (HsType GhcRn))]
    -> SDoc
    forall a. Outputable a => a -> SDoc
    ppr HsFamEqnPats GhcRn
    [HsArg
       GhcRn
       (GenLocated SrcSpanAnnA (HsType GhcRn))
       (GenLocated SrcSpanAnnA (HsType GhcRn))]
    hs_pats)

           -- By now, for type families (but not data families) we should
           -- have checked that the number of patterns matches tyConArity
           ; skol_info <- SkolemInfoAnon -> IOEnv (Env TcGblEnv TcLclEnv) SkolemInfo
    forall (m :: * -> *). MonadIO m => SkolemInfoAnon -> m SkolemInfo
    mkSkolemInfo SkolemInfoAnon
    FamInstSkol

           -- This code is closely related to the code
           -- in GHC.Tc.Gen.HsType.kcCheckDeclHeader_cusk
           ; (tclvl, wanted, (outer_bndrs, (lhs_ty, rhs_ty)))
                   <- pushLevelAndSolveEqualitiesX "tcTyFamInstEqnGuts" $
                      bindOuterFamEqnTKBndrs skol_info outer_hs_bndrs   $
                      do { (lhs_ty, rhs_kind) <- tcFamTyPats fam_tc hs_pats
                           -- Ensure that the instance is consistent with its
                           -- parent class (#16008)
                         ; addConsistencyConstraints mb_clsinfo lhs_ty
                         ; rhs_ty <- tcCheckLHsType hs_rhs_ty (TheKind rhs_kind)
                         ; return (lhs_ty, rhs_ty) }

           ; outer_bndrs <- scopedSortOuter outer_bndrs
           ; let outer_tvs = HsOuterFamEqnTyVarBndrs GhcTc -> [Var]
    forall flag. HsOuterTyVarBndrs flag GhcTc -> [Var]
    outerTyVars HsOuterFamEqnTyVarBndrs GhcTc
    outer_bndrs
           ; checkFamTelescope tclvl outer_hs_bndrs outer_tvs

           ; traceTc "tcTyFamInstEqnGuts 1" (pprTyVars outer_tvs $$ ppr skol_info)

           -- This code (and the stuff immediately above) is very similar
           -- to that in tcDataFamInstHeader.  Maybe we should abstract the
           -- common code; but for the moment I concluded that it's
           -- clearer to duplicate it.  Still, if you fix a bug here,
           -- check there too!

           -- See Note [Generalising in tcTyFamInstEqnGuts]
           ; dvs  <- candidateQTyVarsWithBinders outer_tvs lhs_ty
           ; qtvs <- quantifyTyVars skol_info TryNotToDefaultNonStandardTyVars dvs
           ; let final_tvs = [Var] -> [Var]
    scopedSort ([Var]
    qtvs [Var] -> [Var] -> [Var]
    forall a. [a] -> [a] -> [a]
    ++ [Var]
    outer_tvs)
                 -- This scopedSort is important: the qtvs may be /interleaved/ with
                 -- the outer_tvs.  See Note [Generalising in tcTyFamInstEqnGuts]
           ; reportUnsolvedEqualities skol_info final_tvs tclvl wanted

           ; traceTc "tcTyFamInstEqnGuts 2" $
             vcat [ ppr fam_tc
                  , text "lhs_ty:"    <+> ppr lhs_ty
                  , text "final_tvs:" <+> pprTyVars final_tvs ]

           -- See Note [Error on unconstrained meta-variables] in GHC.Tc.Utils.TcMType
           -- Example: typecheck/should_fail/T17301
           ; dvs_rhs <- candidateQTyVarsOfType rhs_ty
           ; let err_ctx TidyEnv
    tidy_env
                   = do { (tidy_env2, rhs_ty) <- TidyEnv -> Type -> ZonkM (TidyEnv, Type)
    zonkTidyTcType TidyEnv
    tidy_env Type
    rhs_ty
                        ; return (tidy_env2, UninfTyCtx_TyFamRhs rhs_ty) }
           ; doNotQuantifyTyVars dvs_rhs err_ctx

           ; (final_tvs, non_user_tvs, lhs_ty, rhs_ty) <- initZonkEnv NoFlexi $
             runZonkBndrT (zonkTyBndrsX final_tvs) $ \ [Var]
    final_tvs ->
               do { lhs_ty       <- Type -> ZonkTcM Type
    zonkTcTypeToTypeX Type
    lhs_ty
                  ; rhs_ty       <- zonkTcTypeToTypeX rhs_ty
                  ; non_user_tvs <- traverse lookupTyVarX qtvs
                  ; return (final_tvs, non_user_tvs, lhs_ty, rhs_ty) }

           ; let pats = Type -> ThetaType
    unravelFamInstPats Type
    lhs_ty
                 -- Note that we do this after solveEqualities
                 -- so that any strange coercions inside lhs_ty
                 -- have been solved before we attempt to unravel it

           ; traceTc "tcTyFamInstEqnGuts }" (vcat [ ppr fam_tc, pprTyVars final_tvs ])
                     -- Don't try to print 'pats' here, because lhs_ty involves
                     -- a knot-tied type constructor, so we get a black hole

           ; return (final_tvs, mkVarSet non_user_tvs, pats, rhs_ty) }

    checkFamTelescope :: TcLevel
                      -> HsOuterFamEqnTyVarBndrs GhcRn
                      -> [TcTyVar] -> TcM ()
    -- Emit a constraint (forall a b c. <empty>), so that
    -- we will do telescope-checking on a,b,c
    -- See Note [Generalising in tcTyFamInstEqnGuts]
    checkFamTelescope :: TcLevel -> HsOuterFamEqnTyVarBndrs GhcRn -> [Var] -> TcRn ()
    checkFamTelescope TcLevel
    tclvl HsOuterFamEqnTyVarBndrs GhcRn
    hs_outer_bndrs [Var]
    outer_tvs
      | HsOuterExplicit { hso_bndrs :: forall flag pass.
    HsOuterTyVarBndrs flag pass -> [LHsTyVarBndr flag (NoGhcTc pass)]
    hso_bndrs = [LHsTyVarBndr () (NoGhcTc GhcRn)]
    bndrs } <- HsOuterFamEqnTyVarBndrs GhcRn
    hs_outer_bndrs
      , (LHsTyVarBndr () (NoGhcTc GhcRn)
    b_first : [LHsTyVarBndr () (NoGhcTc GhcRn)]
    _) <- [LHsTyVarBndr () (NoGhcTc GhcRn)]
    bndrs
      , let b_last :: GenLocated SrcSpanAnnA (HsTyVarBndr () GhcRn)
    b_last    = [GenLocated SrcSpanAnnA (HsTyVarBndr () GhcRn)]
    -> GenLocated SrcSpanAnnA (HsTyVarBndr () GhcRn)
    forall a. HasCallStack => [a] -> a
    last [LHsTyVarBndr () (NoGhcTc GhcRn)]
    [GenLocated SrcSpanAnnA (HsTyVarBndr () GhcRn)]
    bndrs
      = do { skol_info <- SkolemInfoAnon -> IOEnv (Env TcGblEnv TcLclEnv) SkolemInfo
    forall (m :: * -> *). MonadIO m => SkolemInfoAnon -> m SkolemInfo
    mkSkolemInfo (TyVarBndrs -> SkolemInfoAnon
    ForAllSkol (TyVarBndrs -> SkolemInfoAnon) -> TyVarBndrs -> SkolemInfoAnon
    forall a b. (a -> b) -> a -> b
    $ [HsTyVarBndr () GhcRn] -> TyVarBndrs
    forall flag.
    OutputableBndrFlag flag 'Renamed =>
    [HsTyVarBndr flag GhcRn] -> TyVarBndrs
    HsTyVarBndrsRn ((GenLocated SrcSpanAnnA (HsTyVarBndr () GhcRn)
     -> HsTyVarBndr () GhcRn)
    -> [GenLocated SrcSpanAnnA (HsTyVarBndr () GhcRn)]
    -> [HsTyVarBndr () GhcRn]
    forall a b. (a -> b) -> [a] -> [b]
    map GenLocated SrcSpanAnnA (HsTyVarBndr () GhcRn)
    -> HsTyVarBndr () GhcRn
    forall l e. GenLocated l e -> e
    unLoc [LHsTyVarBndr () (NoGhcTc GhcRn)]
    [GenLocated SrcSpanAnnA (HsTyVarBndr () GhcRn)]
    bndrs))
           ; setSrcSpan (combineSrcSpans (getLocA b_first) (getLocA b_last)) $ do
             emitResidualTvConstraint skol_info outer_tvs tclvl emptyWC }
      | Bool
    otherwise
      = () -> TcRn ()
    forall a. a -> IOEnv (Env TcGblEnv TcLclEnv) a
    forall (m :: * -> *) a. Monad m => a -> m a
    return ()

    -----------------
    unravelFamInstPats :: TcType -> [TcType]
    -- Decompose fam_app to get the argument patterns
    --
    -- We expect fam_app to look like (F t1 .. tn)
    --   tcFamTyPats is capable of returning ((F ty1 |> co) ty2),
    --   but that can't happen here because we already checked the
    --   arity of F matches the number of pattern
    unravelFamInstPats :: Type -> ThetaType
    unravelFamInstPats Type
    fam_app
      = case HasCallStack => Type -> Maybe (TyCon, ThetaType)
    Type -> Maybe (TyCon, ThetaType)
    tcSplitTyConApp_maybe Type
    fam_app of
          Just (TyCon
    _, ThetaType
    pats) -> ThetaType
    pats
          Maybe (TyCon, ThetaType)
    Nothing -> String -> ThetaType
    forall a. HasCallStack => String -> a
    panic String
    "unravelFamInstPats: Ill-typed LHS of family instance"
            -- The Nothing case cannot happen for type families, because
            -- we don't call unravelFamInstPats until we've solved the
            -- equalities. For data families, it shouldn't happen either,
            -- we need to fail hard and early if it does. See issue #15905
            -- for an example of this happening.

    addConsistencyConstraints :: AssocInstInfo -> TcType -> TcM ()
    -- In the corresponding positions of the class and type-family,
    -- ensure the family argument is the same as the class argument
    --   E.g    class C a b c d where
    --             F c x y a :: Type
    -- Here the first  arg of F should be the same as the third of C
    --  and the fourth arg of F should be the same as the first of C
    addConsistencyConstraints :: AssocInstInfo -> Type -> TcRn ()
    addConsistencyConstraints AssocInstInfo
    mb_clsinfo Type
    fam_app
      | InClsInst { ai_inst_env :: AssocInstInfo -> VarEnv Type
    ai_inst_env = VarEnv Type
    inst_env } <- AssocInstInfo
    mb_clsinfo
      , Just (TyCon
    fam_tc, ThetaType
    pats) <- HasCallStack => Type -> Maybe (TyCon, ThetaType)
    Type -> Maybe (TyCon, ThetaType)
    tcSplitTyConApp_maybe Type
    fam_app
      = do { let eqs :: [(Type, Type)]
    eqs = [ (Type
    cls_ty, Type
    pat)
                       | (Var
    fam_tc_tv, Type
    pat) <- TyCon -> [Var]
    tyConTyVars TyCon
    fam_tc [Var] -> ThetaType -> [(Var, Type)]
    forall a b. [a] -> [b] -> [(a, b)]
    `zip` ThetaType
    pats
                       , Just Type
    cls_ty <- [VarEnv Type -> Var -> Maybe Type
    forall a. VarEnv a -> Var -> Maybe a
    lookupVarEnv VarEnv Type
    inst_env Var
    fam_tc_tv] ]
           ; String -> SDoc -> TcRn ()
    traceTc String
    "addConsistencyConstraints" ([(Type, Type)] -> SDoc
    forall a. Outputable a => a -> SDoc
    ppr [(Type, Type)]
    eqs)
           ; CtOrigin -> [(Type, Type)] -> TcRn ()
    emitWantedEqs CtOrigin
    AssocFamPatOrigin [(Type, Type)]
    eqs }
        -- Improve inference; these equalities will not produce errors.
        -- See Note [Constraints to ignore] in GHC.Tc.Errors
        -- Any mis-match is reports by checkConsistentFamInst
      | Bool
    otherwise
      = () -> TcRn ()
    forall a. a -> IOEnv (Env TcGblEnv TcLclEnv) a
    forall (m :: * -> *) a. Monad m => a -> m a
    return ()

    {- Note [Constraints in patterns]
    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    NB: This isn't the whole story. See comment in tcFamTyPats.

    At first glance, it seems there is a complicated story to tell in tcFamTyPats
    around constraint solving. After all, type family patterns can now do
    GADT pattern-matching, which is jolly complicated. But, there's a key fact
    which makes this all simple: everything is at top level! There cannot
    be untouchable type variables. There can't be weird interaction between
    case branches. There can't be global skolems.

    This means that the semantics of type-level GADT matching is a little
    different than term level. If we have

      data G a where
        MkGBool :: G Bool

    And then

      type family F (a :: G k) :: k
      type instance F MkGBool = True

    we get

      axF : F Bool (MkGBool <Bool>) ~ True

    Simple! No casting on the RHS, because we can affect the kind parameter
    to F.

    If we ever introduce local type families, this all gets a lot more
    complicated, and will end up looking awfully like term-level GADT
    pattern-matching.

    ** The new story **

    Here is really what we want:

    The matcher really can't deal with covars in arbitrary spots in coercions.
    But it can deal with covars that are arguments to GADT data constructors.
    So we somehow want to allow covars only in precisely those spots, then use
    them as givens when checking the RHS. TODO (RAE): Implement plan.

    Note [Quantified kind variables of a family pattern]
    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    Consider   type family KindFam (p :: k1) (q :: k1)
               data T :: Maybe k1 -> k2 -> *
               type instance KindFam (a :: Maybe k) b = T a b -> Int
    The HsBSig for the family patterns will be ([k], [a])

    Then in the family instance we want to
      * Bring into scope [ "k" -> k:*, "a" -> a:k ]
      * Kind-check the RHS
      * Quantify the type instance over k and k', as well as a,b, thus
           type instance [k, k', a:Maybe k, b:k']
                         KindFam (Maybe k) k' a b = T k k' a b -> Int

    Notice that in the third step we quantify over all the visibly-mentioned
    type variables (a,b), but also over the implicitly mentioned kind variables
    (k, k').  In this case one is bound explicitly but often there will be
    none. The role of the kind signature (a :: Maybe k) is to add a constraint
    that 'a' must have that kind, and to bring 'k' into scope.

    ************************************************************************
    *                                                                      *
                   Data types
    *                                                                      *
    ************************************************************************
    -}

    dataDeclChecks :: Name
                   -> Maybe (LHsContext GhcRn) -> DataDefnCons (LConDecl GhcRn)
                   -> TcM Bool
    dataDeclChecks :: Name
    -> Maybe (LHsContext GhcRn)
    -> DataDefnCons (LConDecl GhcRn)
    -> TcRnIf TcGblEnv TcLclEnv Bool
    dataDeclChecks Name
    tc_name Maybe (LHsContext GhcRn)
    mctxt DataDefnCons (LConDecl GhcRn)
    cons
      = do { let stupid_theta :: HsContext GhcRn
    stupid_theta = Maybe (LHsContext GhcRn) -> HsContext GhcRn
    forall (p :: Pass).
    Maybe (LHsContext (GhcPass p)) -> HsContext (GhcPass p)
    fromMaybeContext Maybe (LHsContext GhcRn)
    mctxt
             -- Check that we don't use GADT syntax in H98 world
           ;  gadtSyntax_ok <- Extension -> TcRnIf TcGblEnv TcLclEnv Bool
    forall gbl lcl. Extension -> TcRnIf gbl lcl Bool
    xoptM Extension
    LangExt.GADTSyntax
           ; let gadt_syntax = DataDefnCons (GenLocated SrcSpanAnnA (ConDecl GhcRn)) -> Bool
    forall (f :: * -> *) l pass.
    Foldable f =>
    f (GenLocated l (ConDecl pass)) -> Bool
    anyLConIsGadt DataDefnCons (LConDecl GhcRn)
    DataDefnCons (GenLocated SrcSpanAnnA (ConDecl GhcRn))
    cons
           ; unless (gadtSyntax_ok || not gadt_syntax) $
             addErrTc (TcRnGADTsDisabled tc_name)

               -- Check that the stupid theta is empty for a GADT-style declaration.
               -- See Note [The stupid context] in GHC.Core.DataCon.
           ; checkTc (null stupid_theta || not gadt_syntax) (TcRnGADTDataContext tc_name)

             -- Check that there's at least one condecl,
             -- or else we're reading an hs-boot file, or -XEmptyDataDecls
           ; empty_data_decls <- xoptM LangExt.EmptyDataDecls
           ; is_boot <- tcIsHsBootOrSig  -- Are we compiling an hs-boot file?
           ; unless (not (null cons) || empty_data_decls || is_boot) $
                     addErrTc (TcRnEmptyDataDeclsDisabled tc_name)
           ; return gadt_syntax }

    -----------------------------------
    data DataDeclInfo
      = DDataType      -- data T a b = T1 a | T2 b
      | DDataInstance  -- data instance D [a] = D1 a | D2
           Type        --   The header D [a]

    mkDDHeaderTy :: DataDeclInfo -> TyCon -> [TyConBinder] -> Type
    mkDDHeaderTy :: DataDeclInfo -> TyCon -> [TyConBinder] -> Type
    mkDDHeaderTy DataDeclInfo
    dd_info TyCon
    rep_tycon [TyConBinder]
    tc_bndrs
      = case DataDeclInfo
    dd_info of
          DataDeclInfo
    DDataType -> TyCon -> ThetaType -> Type
    mkTyConApp TyCon
    rep_tycon (ThetaType -> Type) -> ThetaType -> Type
    forall a b. (a -> b) -> a -> b
    $
                       [Var] -> ThetaType
    mkTyVarTys ([TyConBinder] -> [Var]
    forall tv argf. [VarBndr tv argf] -> [tv]
    binderVars [TyConBinder]
    tc_bndrs)
          DDataInstance Type
    header_ty -> Type
    header_ty

    -- We use `concatMapDataDefnConsTcM` here, since the following is illegal:
    -- @newtype T a where T1, T2 :: a -> T a@
    -- It would be represented as a single 'ConDeclGadt' with multiple names, which is valid for 'data', but not 'newtype'.
    -- So when 'tcConDecl' expands the 'ConDecl' per each name it has, if we are type-checking a 'newtype' declaration, we
    -- must fail if it returns more than one.
    tcConDecls :: DataDeclInfo
               -> KnotTied TyCon            -- Representation TyCon
               -> [TcTyConBinder]           -- Binders of representation TyCon
               -> TcKind                    -- Result kind
               -> DataDefnCons (LConDecl GhcRn) -> TcM (DataDefnCons DataCon)
    tcConDecls :: DataDeclInfo
    -> TyCon
    -> [TyConBinder]
    -> Type
    -> DataDefnCons (LConDecl GhcRn)
    -> TcM (DataDefnCons DataCon)
    tcConDecls DataDeclInfo
    dd_info TyCon
    rep_tycon [TyConBinder]
    tmpl_bndrs Type
    res_kind
      = Name
    -> (NewOrData -> LConDecl GhcRn -> TcM (NonEmpty DataCon))
    -> DataDefnCons (LConDecl GhcRn)
    -> TcM (DataDefnCons DataCon)
    forall a b.
    Name
    -> (NewOrData -> a -> TcM (NonEmpty b))
    -> DataDefnCons a
    -> TcM (DataDefnCons b)
    concatMapDataDefnConsTcM (TyCon -> Name
    tyConName TyCon
    rep_tycon) ((NewOrData -> LConDecl GhcRn -> TcM (NonEmpty DataCon))
     -> DataDefnCons (LConDecl GhcRn) -> TcM (DataDefnCons DataCon))
    -> (NewOrData -> LConDecl GhcRn -> TcM (NonEmpty DataCon))
    -> DataDefnCons (LConDecl GhcRn)
    -> TcM (DataDefnCons DataCon)
    forall a b. (a -> b) -> a -> b
    $ \ NewOrData
    new_or_data ->
        (ConDecl GhcRn -> TcM (NonEmpty DataCon))
    -> GenLocated SrcSpanAnnA (ConDecl GhcRn) -> TcM (NonEmpty DataCon)
    forall t a b. HasLoc t => (a -> TcM b) -> GenLocated t a -> TcM b
    addLocM ((ConDecl GhcRn -> TcM (NonEmpty DataCon))
     -> GenLocated SrcSpanAnnA (ConDecl GhcRn)
     -> TcM (NonEmpty DataCon))
    -> (ConDecl GhcRn -> TcM (NonEmpty DataCon))
    -> GenLocated SrcSpanAnnA (ConDecl GhcRn)
    -> TcM (NonEmpty DataCon)
    forall a b. (a -> b) -> a -> b
    $ NewOrData
    -> DataDeclInfo
    -> TyCon
    -> [TyConBinder]
    -> Type
    -> NameEnv Int
    -> ConDecl GhcRn
    -> TcM (NonEmpty DataCon)
    tcConDecl NewOrData
    new_or_data DataDeclInfo
    dd_info TyCon
    rep_tycon [TyConBinder]
    tmpl_bndrs Type
    res_kind (TyCon -> NameEnv Int
    mkTyConTagMap TyCon
    rep_tycon)
        -- mkTyConTagMap: it's important that we pay for tag allocation here,
        -- once per TyCon. See Note [Constructor tag allocation], fixes #14657

    -- 'concatMap' for 'DataDefnCons', but fail if the given function returns multiple values and the argument is a 'NewTypeCon'.
    concatMapDataDefnConsTcM :: Name -> (NewOrData -> a -> TcM (NonEmpty b)) -> DataDefnCons a -> TcM (DataDefnCons b)
    concatMapDataDefnConsTcM :: forall a b.
    Name
    -> (NewOrData -> a -> TcM (NonEmpty b))
    -> DataDefnCons a
    -> TcM (DataDefnCons b)
    concatMapDataDefnConsTcM Name
    name NewOrData -> a -> TcM (NonEmpty b)
    f = \ case
        NewTypeCon a
    a -> NewOrData -> a -> TcM (NonEmpty b)
    f NewOrData
    NewType a
    a TcM (NonEmpty b)
    -> (NonEmpty b -> TcM (DataDefnCons b)) -> TcM (DataDefnCons b)
    forall a b.
    IOEnv (Env TcGblEnv TcLclEnv) a
    -> (a -> IOEnv (Env TcGblEnv TcLclEnv) b)
    -> IOEnv (Env TcGblEnv TcLclEnv) b
    forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
    >>= \ case
            b
    b:|[] -> DataDefnCons b -> TcM (DataDefnCons b)
    forall a. a -> IOEnv (Env TcGblEnv TcLclEnv) a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (b -> DataDefnCons b
    forall a. a -> DataDefnCons a
    NewTypeCon b
    b)
            NonEmpty b
    bs -> TcRnMessage -> TcM (DataDefnCons b)
    forall a. TcRnMessage -> TcM a
    failWithTc (TcRnMessage -> TcM (DataDefnCons b))
    -> TcRnMessage -> TcM (DataDefnCons b)
    forall a b. (a -> b) -> a -> b
    $ Name -> Int -> TcRnMessage
    TcRnMultipleConForNewtype Name
    name (NonEmpty b -> Int
    forall a. NonEmpty a -> Int
    forall (t :: * -> *) a. Foldable t => t a -> Int
    length NonEmpty b
    bs)
        DataTypeCons Bool
    is_type_data [a]
    as -> Bool -> [b] -> DataDefnCons b
    forall a. Bool -> [a] -> DataDefnCons a
    DataTypeCons Bool
    is_type_data ([b] -> DataDefnCons b)
    -> IOEnv (Env TcGblEnv TcLclEnv) [b] -> TcM (DataDefnCons b)
    forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
    <$> (a -> IOEnv (Env TcGblEnv TcLclEnv) [b])
    -> [a] -> IOEnv (Env TcGblEnv TcLclEnv) [b]
    forall (m :: * -> *) (f :: * -> *) a b.
    (Monad m, Traversable f) =>
    (a -> m [b]) -> f a -> m [b]
    concatMapM ((NonEmpty b -> [b])
    -> TcM (NonEmpty b) -> IOEnv (Env TcGblEnv TcLclEnv) [b]
    forall a b.
    (a -> b)
    -> IOEnv (Env TcGblEnv TcLclEnv) a
    -> IOEnv (Env TcGblEnv TcLclEnv) b
    forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
    fmap NonEmpty b -> [b]
    forall a. NonEmpty a -> [a]
    forall (t :: * -> *) a. Foldable t => t a -> [a]
    toList (TcM (NonEmpty b) -> IOEnv (Env TcGblEnv TcLclEnv) [b])
    -> (a -> TcM (NonEmpty b))
    -> a
    -> IOEnv (Env TcGblEnv TcLclEnv) [b]
    forall b c a. (b -> c) -> (a -> b) -> a -> c
    . NewOrData -> a -> TcM (NonEmpty b)
    f NewOrData
    DataType) [a]
    as

    tcConDecl :: NewOrData
              -> DataDeclInfo
              -> KnotTied TyCon   -- Representation tycon. Knot-tied!
              -> [TcTyConBinder]  -- Binders of representation TyCon
              -> TcKind           -- Result kind
              -> NameEnv ConTag
              -> ConDecl GhcRn
              -> TcM (NonEmpty DataCon)

    tcConDecl :: NewOrData
    -> DataDeclInfo
    -> TyCon
    -> [TyConBinder]
    -> Type
    -> NameEnv Int
    -> ConDecl GhcRn
    -> TcM (NonEmpty DataCon)
    tcConDecl NewOrData
    new_or_data DataDeclInfo
    dd_info TyCon
    rep_tycon [TyConBinder]
    tc_bndrs Type
    res_kind NameEnv Int
    tag_map
              (ConDeclH98 { con_name :: forall pass. ConDecl pass -> LIdP pass
    con_name = lname :: LIdP GhcRn
    lname@(L SrcSpanAnnN
    _ Name
    name)
                          , con_ex_tvs :: forall pass. ConDecl pass -> [LHsTyVarBndr Specificity pass]
    con_ex_tvs = [LHsTyVarBndr Specificity GhcRn]
    explicit_tkv_nms
                          , con_mb_cxt :: forall pass. ConDecl pass -> Maybe (LHsContext pass)
    con_mb_cxt = Maybe (LHsContext GhcRn)
    hs_ctxt
                          , con_args :: forall pass. ConDecl pass -> HsConDeclH98Details pass
    con_args = HsConDeclH98Details GhcRn
    hs_args })
      = SDoc -> TcM (NonEmpty DataCon) -> TcM (NonEmpty DataCon)
    forall a. SDoc -> TcM a -> TcM a
    addErrCtxt (NonEmpty (LocatedN Name) -> SDoc
    dataConCtxt (LocatedN Name -> NonEmpty (LocatedN Name)
    forall a. a -> NonEmpty a
    NE.singleton LIdP GhcRn
    LocatedN Name
    lname)) (TcM (NonEmpty DataCon) -> TcM (NonEmpty DataCon))
    -> TcM (NonEmpty DataCon) -> TcM (NonEmpty DataCon)
    forall a b. (a -> b) -> a -> b
    $
        do { -- NB: the tyvars from the declaration header are in scope

             -- Get hold of the existential type variables
             -- e.g. data T a = forall k (b::k) f. MkT a (f b)
             -- Here tc_bndrs = {a}
             --      hs_qvars = HsQTvs { hsq_implicit = {k}
             --                        , hsq_explicit = {f,b} }

           ; String -> SDoc -> TcRn ()
    traceTc String
    "tcConDecl 1" ([SDoc] -> SDoc
    forall doc. IsDoc doc => [doc] -> doc
    vcat [ Name -> SDoc
    forall a. Outputable a => a -> SDoc
    ppr Name
    name
                                         , String -> SDoc
    forall doc. IsLine doc => String -> doc
    text String
    "explicit_tkv_nms" SDoc -> SDoc -> SDoc
    forall doc. IsLine doc => doc -> doc -> doc
    <+> [GenLocated SrcSpanAnnA (HsTyVarBndr Specificity GhcRn)] -> SDoc
    forall a. Outputable a => a -> SDoc
    ppr [LHsTyVarBndr Specificity GhcRn]
    [GenLocated SrcSpanAnnA (HsTyVarBndr Specificity GhcRn)]
    explicit_tkv_nms
                                         , String -> SDoc
    forall doc. IsLine doc => String -> doc
    text String
    "tc_bndrs" SDoc -> SDoc -> SDoc
    forall doc. IsLine doc => doc -> doc -> doc
    <+> [TyConBinder] -> SDoc
    forall a. Outputable a => a -> SDoc
    ppr [TyConBinder]
    tc_bndrs ])
           ; skol_info <- SkolemInfoAnon -> IOEnv (Env TcGblEnv TcLclEnv) SkolemInfo
    forall (m :: * -> *). MonadIO m => SkolemInfoAnon -> m SkolemInfo
    mkSkolemInfo (TyVarBndrs -> SkolemInfoAnon
    ForAllSkol ([HsTyVarBndr Specificity GhcRn] -> TyVarBndrs
    forall flag.
    OutputableBndrFlag flag 'Renamed =>
    [HsTyVarBndr flag GhcRn] -> TyVarBndrs
    HsTyVarBndrsRn (GenLocated SrcSpanAnnA (HsTyVarBndr Specificity GhcRn)
    -> HsTyVarBndr Specificity GhcRn
    forall l e. GenLocated l e -> e
    unLoc (GenLocated SrcSpanAnnA (HsTyVarBndr Specificity GhcRn)
     -> HsTyVarBndr Specificity GhcRn)
    -> [GenLocated SrcSpanAnnA (HsTyVarBndr Specificity GhcRn)]
    -> [HsTyVarBndr Specificity GhcRn]
    forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
    <$> [LHsTyVarBndr Specificity GhcRn]
    [GenLocated SrcSpanAnnA (HsTyVarBndr Specificity GhcRn)]
    explicit_tkv_nms)))

           ; (tclvl, wanted, (exp_tvbndrs, (ctxt, arg_tys, field_lbls, stricts)))
               <- pushLevelAndSolveEqualitiesX "tcConDecl:H98"  $
                  tcExplicitTKBndrs skol_info explicit_tkv_nms  $
                  do { ctxt <- tcHsContext hs_ctxt
                     ; let exp_kind = NewOrData -> Type -> ContextKind
    getArgExpKind NewOrData
    new_or_data Type
    res_kind
                     ; btys <- tcConH98Args exp_kind hs_args
                     ; field_lbls <- lookupConstructorFields name
                     ; let (arg_tys, stricts) = unzip btys
                     ; return (ctxt, arg_tys, field_lbls, stricts)
                     }

           ; let tc_tvs   = [TyConBinder] -> [Var]
    forall tv argf. [VarBndr tv argf] -> [tv]
    binderVars [TyConBinder]
    tc_bndrs
                 fake_ty  = [Var] -> Type -> Type
    mkSpecForAllTys  [Var]
    tc_tvs      (Type -> Type) -> Type -> Type
    forall a b. (a -> b) -> a -> b
    $
                            [VarBndr Var Specificity] -> Type -> Type
    mkInvisForAllTys [VarBndr Var Specificity]
    exp_tvbndrs (Type -> Type) -> Type -> Type
    forall a b. (a -> b) -> a -> b
    $
                            ThetaType -> Type -> Type
    HasDebugCallStack => ThetaType -> Type -> Type
    tcMkPhiTy ThetaType
    ctxt               (Type -> Type) -> Type -> Type
    forall a b. (a -> b) -> a -> b
    $
                            [Scaled Type] -> Type -> Type
    tcMkScaledFunTys [Scaled Type]
    arg_tys     (Type -> Type) -> Type -> Type
    forall a b. (a -> b) -> a -> b
    $
                            Type
    unitTy
                 -- That type is a lie, of course. (It shouldn't end in ()!)
                 -- And we could construct a proper result type from the info
                 -- at hand. But the result would mention only the univ_tvs,
                 -- and so it just creates more work to do it right. Really,
                 -- we're only doing this to find the right kind variables to
                 -- quantify over, and this type is fine for that purpose.

             -- exp_tvbndrs have explicit, user-written binding sites
             -- the kvs below are those kind variables entirely unmentioned by the user
             --   and discovered only by generalization

           ; kvs <- kindGeneralizeAll skol_info fake_ty

           ; let all_skol_tvs = [Var]
    tc_tvs [Var] -> [Var] -> [Var]
    forall a. [a] -> [a] -> [a]
    ++ [Var]
    kvs
           ; reportUnsolvedEqualities skol_info all_skol_tvs tclvl wanted
                 -- The skol_info claims that all the variables are bound
                 -- by the data constructor decl, whereas actually the
                 -- univ_tvs are bound by the data type decl itself.  It
                 -- would be better to have a doubly-nested implication.
                 -- But that just doesn't seem worth it.
                 -- See test dependent/should_fail/T13780a

           -- Zonk to Types
           ; (tc_bndrs, kvs, exp_tvbndrs, arg_tys, ctxt) <- initZonkEnv NoFlexi $
             runZonkBndrT (zonkTyVarBindersX tc_bndrs   ) $ \ [TyConBinder]
    tc_bndrs ->
             ZonkBndrT (IOEnv (Env TcGblEnv TcLclEnv)) [Var]
    -> forall r.
       ([Var] -> ZonkT (IOEnv (Env TcGblEnv TcLclEnv)) r)
       -> ZonkT (IOEnv (Env TcGblEnv TcLclEnv)) r
    forall (m :: * -> *) a.
    ZonkBndrT m a -> forall r. (a -> ZonkT m r) -> ZonkT m r
    runZonkBndrT ([Var] -> ZonkBndrT (IOEnv (Env TcGblEnv TcLclEnv)) [Var]
    zonkTyBndrsX      [Var]
    kvs        ) (([Var]
      -> ZonkT
           (IOEnv (Env TcGblEnv TcLclEnv))
           ([TyConBinder], [Var], [VarBndr Var Specificity], [Scaled Type],
            ThetaType))
     -> ZonkT
          (IOEnv (Env TcGblEnv TcLclEnv))
          ([TyConBinder], [Var], [VarBndr Var Specificity], [Scaled Type],
           ThetaType))
    -> ([Var]
        -> ZonkT
             (IOEnv (Env TcGblEnv TcLclEnv))
             ([TyConBinder], [Var], [VarBndr Var Specificity], [Scaled Type],
              ThetaType))
    -> ZonkT
         (IOEnv (Env TcGblEnv TcLclEnv))
         ([TyConBinder], [Var], [VarBndr Var Specificity], [Scaled Type],
          ThetaType)
    forall a b. (a -> b) -> a -> b
    $ \ [Var]
    kvs ->
             ZonkBndrT (IOEnv (Env TcGblEnv TcLclEnv)) [VarBndr Var Specificity]
    -> forall r.
       ([VarBndr Var Specificity]
        -> ZonkT (IOEnv (Env TcGblEnv TcLclEnv)) r)
       -> ZonkT (IOEnv (Env TcGblEnv TcLclEnv)) r
    forall (m :: * -> *) a.
    ZonkBndrT m a -> forall r. (a -> ZonkT m r) -> ZonkT m r
    runZonkBndrT ([VarBndr Var Specificity]
    -> ZonkBndrT
         (IOEnv (Env TcGblEnv TcLclEnv)) [VarBndr Var Specificity]
    forall vis. [VarBndr Var vis] -> ZonkBndrTcM [VarBndr Var vis]
    zonkTyVarBindersX [VarBndr Var Specificity]
    exp_tvbndrs) (([VarBndr Var Specificity]
      -> ZonkT
           (IOEnv (Env TcGblEnv TcLclEnv))
           ([TyConBinder], [Var], [VarBndr Var Specificity], [Scaled Type],
            ThetaType))
     -> ZonkT
          (IOEnv (Env TcGblEnv TcLclEnv))
          ([TyConBinder], [Var], [VarBndr Var Specificity], [Scaled Type],
           ThetaType))
    -> ([VarBndr Var Specificity]
        -> ZonkT
             (IOEnv (Env TcGblEnv TcLclEnv))
             ([TyConBinder], [Var], [VarBndr Var Specificity], [Scaled Type],
              ThetaType))
    -> ZonkT
         (IOEnv (Env TcGblEnv TcLclEnv))
         ([TyConBinder], [Var], [VarBndr Var Specificity], [Scaled Type],
          ThetaType)
    forall a b. (a -> b) -> a -> b
    $ \ [VarBndr Var Specificity]
    exp_tvbndrs ->
               do { arg_tys <- [Scaled Type] -> ZonkTcM [Scaled Type]
    zonkScaledTcTypesToTypesX [Scaled Type]
    arg_tys
                  ; ctxt    <- zonkTcTypesToTypesX       ctxt
                  ; return (tc_bndrs, kvs, exp_tvbndrs, arg_tys, ctxt) }

           -- Can't print univ_tvs, arg_tys etc, because we are inside the knot here
           ; traceTc "tcConDecl 2" (ppr name $$ ppr field_lbls)
           ; let univ_tvbs = [TyConBinder] -> [VarBndr Var Specificity]
    tyConInvisTVBinders [TyConBinder]
    tc_bndrs
                 ex_tvbs   = Specificity -> [Var] -> [VarBndr Var Specificity]
    forall vis. vis -> [Var] -> [VarBndr Var vis]
    mkTyVarBinders Specificity
    InferredSpec [Var]
    kvs [VarBndr Var Specificity]
    -> [VarBndr Var Specificity] -> [VarBndr Var Specificity]
    forall a. [a] -> [a] -> [a]
    ++ [VarBndr Var Specificity]
    exp_tvbndrs
                 ex_tvs    = [VarBndr Var Specificity] -> [Var]
    forall tv argf. [VarBndr tv argf] -> [tv]
    binderVars [VarBndr Var Specificity]
    ex_tvbs
                    -- For H98 datatypes, the user-written tyvar binders are precisely
                    -- the universals followed by the existentials.
                    -- See Note [DataCon user type variable binders] in GHC.Core.DataCon.
                 user_tvbs = [VarBndr Var Specificity]
    univ_tvbs [VarBndr Var Specificity]
    -> [VarBndr Var Specificity] -> [VarBndr Var Specificity]
    forall a. [a] -> [a] -> [a]
    ++ [VarBndr Var Specificity]
    ex_tvbs
                 user_res_ty = DataDeclInfo -> TyCon -> [TyConBinder] -> Type
    mkDDHeaderTy DataDeclInfo
    dd_info TyCon
    rep_tycon [TyConBinder]
    tc_bndrs

           ; traceTc "tcConDecl 2" (ppr name)
           ; is_infix <- tcConIsInfixH98 name hs_args
           ; rep_nm   <- newTyConRepName name
           ; fam_envs <- tcGetFamInstEnvs
           ; dflags   <- getDynFlags
           ; let bang_opts = BangOpts -> DataConBangOpts
    SrcBangOpts (DynFlags -> BangOpts
    initBangOpts DynFlags
    dflags)
           ; dc <- buildDataCon fam_envs bang_opts name is_infix rep_nm
                                stricts field_lbls
                                tc_tvs ex_tvs user_tvbs
                                [{- no eq_preds -}] ctxt arg_tys
                                user_res_ty rep_tycon tag_map
                      -- NB:  we put data_tc, the type constructor gotten from the
                      --      constructor type signature into the data constructor;
                      --      that way checkValidDataCon can complain if it's wrong.

           ; return (NE.singleton dc) }

    tcConDecl NewOrData
    new_or_data DataDeclInfo
    dd_info TyCon
    rep_tycon [TyConBinder]
    tc_bndrs Type
    _res_kind NameEnv Int
    tag_map
      -- NB: don't use res_kind here, as it's ill-scoped. Instead,
      -- we get the res_kind by typechecking the result type.
              (ConDeclGADT { con_names :: forall pass. ConDecl pass -> NonEmpty (LIdP pass)
    con_names = NonEmpty (LIdP GhcRn)
    names
                           , con_bndrs :: forall pass. ConDecl pass -> XRec pass (HsOuterSigTyVarBndrs pass)
    con_bndrs = L SrcSpanAnnA
    _ HsOuterSigTyVarBndrs GhcRn
    outer_hs_bndrs
                           , con_mb_cxt :: forall pass. ConDecl pass -> Maybe (LHsContext pass)
    con_mb_cxt = Maybe (LHsContext GhcRn)
    cxt, con_g_args :: forall pass. ConDecl pass -> HsConDeclGADTDetails pass
    con_g_args = HsConDeclGADTDetails GhcRn
    hs_args
                           , con_res_ty :: forall pass. ConDecl pass -> LHsType pass
    con_res_ty = LHsKind GhcRn
    hs_res_ty })
      = SDoc -> TcM (NonEmpty DataCon) -> TcM (NonEmpty DataCon)
    forall a. SDoc -> TcM a -> TcM a
    addErrCtxt (NonEmpty (LocatedN Name) -> SDoc
    dataConCtxt NonEmpty (LIdP GhcRn)
    NonEmpty (LocatedN Name)
    names) (TcM (NonEmpty DataCon) -> TcM (NonEmpty DataCon))
    -> TcM (NonEmpty DataCon) -> TcM (NonEmpty DataCon)
    forall a b. (a -> b) -> a -> b
    $
        do { String -> SDoc -> TcRn ()
    traceTc String
    "tcConDecl 1 gadt" (NonEmpty (LocatedN Name) -> SDoc
    forall a. Outputable a => a -> SDoc
    ppr NonEmpty (LIdP GhcRn)
    NonEmpty (LocatedN Name)
    names)
           ; let L SrcSpanAnnN
    _ Name
    name :| [LIdP GhcRn]
    _ = NonEmpty (LIdP GhcRn)
    names
           ; skol_info <- SkolemInfoAnon -> IOEnv (Env TcGblEnv TcLclEnv) SkolemInfo
    forall (m :: * -> *). MonadIO m => SkolemInfoAnon -> m SkolemInfo
    mkSkolemInfo (Name -> SkolemInfoAnon
    DataConSkol Name
    name)
           ; (tclvl, wanted, (outer_bndrs, (ctxt, arg_tys, res_ty, field_lbls, stricts)))
               <- pushLevelAndSolveEqualitiesX "tcConDecl:GADT" $
                  tcOuterTKBndrs skol_info outer_hs_bndrs       $
                  do { ctxt <- tcHsContext cxt
                     ; (res_ty, res_kind) <- tcInferLHsTypeKind hs_res_ty
                             -- See Note [GADT return kinds]

                     -- For data instances (only), ensure that the return type,
                     -- res_ty, is a substitution instance of the header.
                     -- See Note [GADT return types]
                     ; case dd_info of
                          DataDeclInfo
    DDataType -> () -> TcRn ()
    forall a. a -> IOEnv (Env TcGblEnv TcLclEnv) a
    forall (m :: * -> *) a. Monad m => a -> m a
    return ()
                          DDataInstance Type
    hdr_ty ->
                            do { (subst, _meta_tvs) <- [Var] -> TcM (Subst, [Var])
    newMetaTyVars ([TyConBinder] -> [Var]
    forall tv argf. [VarBndr tv argf] -> [tv]
    binderVars [TyConBinder]
    tc_bndrs)
                               ; let head_shape = HasDebugCallStack => Subst -> Type -> Type
    Subst -> Type -> Type
    substTy Subst
    subst Type
    hdr_ty
                               ; discardResult $
                                 popErrCtxt $  -- Drop dataConCtxt
                                 addErrCtxt (dataConResCtxt names) $
                                 unifyType Nothing res_ty head_shape }

                       -- See Note [Datatype return kinds]
                     ; let exp_kind = NewOrData -> Type -> ContextKind
    getArgExpKind NewOrData
    new_or_data Type
    res_kind
                     ; btys <- tcConGADTArgs exp_kind hs_args

                     ; let (arg_tys, stricts) = unzip btys
                     ; field_lbls <- lookupConstructorFields name
                     ; return (ctxt, arg_tys, res_ty, field_lbls, stricts)
                     }

           ; outer_bndrs <- scopedSortOuter outer_bndrs
           ; let outer_tv_bndrs = HsOuterSigTyVarBndrs GhcTc -> [VarBndr Var Specificity]
    outerTyVarBndrs HsOuterSigTyVarBndrs GhcTc
    outer_bndrs

           ; tkvs <- kindGeneralizeAll skol_info
                        (mkInvisForAllTys outer_tv_bndrs $
                         tcMkPhiTy ctxt                  $
                         tcMkScaledFunTys arg_tys        $
                         res_ty)
           ; traceTc "tcConDecl:GADT" (ppr names $$ ppr res_ty $$ ppr tkvs)
           ; reportUnsolvedEqualities skol_info tkvs tclvl wanted

           ; let tvbndrs =  Specificity -> [Var] -> [VarBndr Var Specificity]
    forall vis. vis -> [Var] -> [VarBndr Var vis]
    mkTyVarBinders Specificity
    InferredSpec [Var]
    tkvs [VarBndr Var Specificity]
    -> [VarBndr Var Specificity] -> [VarBndr Var Specificity]
    forall a. [a] -> [a] -> [a]
    ++ [VarBndr Var Specificity]
    outer_tv_bndrs

           -- Zonk to Types
           ; (tvbndrs, arg_tys, ctxt, res_ty) <- initZonkEnv NoFlexi $
             runZonkBndrT (zonkTyVarBindersX tvbndrs) $ \ [VarBndr Var Specificity]
    tvbndrs ->
               do { arg_tys <- [Scaled Type] -> ZonkTcM [Scaled Type]
    zonkScaledTcTypesToTypesX [Scaled Type]
    arg_tys
                  ; ctxt    <- zonkTcTypesToTypesX       ctxt
                  ; res_ty  <- zonkTcTypeToTypeX         res_ty
                  ; return (tvbndrs, arg_tys, ctxt, res_ty) }

           ; let res_tmpl = DataDeclInfo -> TyCon -> [TyConBinder] -> Type
    mkDDHeaderTy DataDeclInfo
    dd_info TyCon
    rep_tycon [TyConBinder]
    tc_bndrs
                 (univ_tvs, ex_tvs, tvbndrs', eq_preds, arg_subst)
                   = rejigConRes tc_bndrs res_tmpl tvbndrs res_ty
                 -- See Note [rejigConRes]

                 ctxt'      = HasDebugCallStack => Subst -> ThetaType -> ThetaType
    Subst -> ThetaType -> ThetaType
    substTys Subst
    arg_subst ThetaType
    ctxt
                 arg_tys'   = HasDebugCallStack => Subst -> [Scaled Type] -> [Scaled Type]
    Subst -> [Scaled Type] -> [Scaled Type]
    substScaledTys Subst
    arg_subst [Scaled Type]
    arg_tys
                 res_ty'    = HasDebugCallStack => Subst -> Type -> Type
    Subst -> Type -> Type
    substTy  Subst
    arg_subst Type
    res_ty

           -- Can't print univ_tvs, arg_tys etc, because we are inside the knot here
           ; traceTc "tcConDecl 2" (ppr names $$ ppr field_lbls)
           ; fam_envs <- tcGetFamInstEnvs
           ; dflags <- getDynFlags
           ; let
               buildOneDataCon (L SrcSpanAnnN
    _ Name
    name) = do
                 { is_infix <- Name -> HsConDeclGADTDetails GhcRn -> TcRnIf TcGblEnv TcLclEnv Bool
    tcConIsInfixGADT Name
    name HsConDeclGADTDetails GhcRn
    hs_args
                 ; rep_nm   <- newTyConRepName name

                 ; let bang_opts = BangOpts -> DataConBangOpts
    SrcBangOpts (DynFlags -> BangOpts
    initBangOpts DynFlags
    dflags)
                 ; buildDataCon fam_envs bang_opts name is_infix
                                rep_nm stricts field_lbls
                                univ_tvs ex_tvs tvbndrs' eq_preds
                                ctxt' arg_tys' res_ty' rep_tycon tag_map
                      -- NB:  we put data_tc, the type constructor gotten from the
                      --      constructor type signature into the data constructor;
                      --      that way checkValidDataCon can complain if it's wrong.
                 }
           ; mapM buildOneDataCon names }

    {- Note [GADT return types]
    ~~~~~~~~~~~~~~~~~~~~~~~~~~~
    Consider
      data family T :: forall k. k -> Type
      data instance T (a :: Type) where
        MkT :: forall b. T b

    What kind does `b` have in the signature for MkT?
    Since the return type must be an instance of the type in the header,
    we must have (b :: Type), but you can't tell that by looking only at
    the type of the data constructor; you have to look at the header too.
    If you wrote it out fully, it'd look like
      data instance T @Type (a :: Type) where
        MkT :: forall (b::Type). T @Type b

    We could reject the program, and expect the user to add kind
    annotations to `MkT` to restrict the signature.  But an easy and
    helpful alternative is this: simply instantiate the type from the
    header with fresh unification variables, and unify with the return
    type of `MkT`. That will force `b` to have kind `Type`.  See #8707
    and #14111.

    Wrikles
    * At first sight it looks as though this would completely subsume the
      return-type check in checkValidDataCon.  But it does not. Suppose we
      have
         data instance T [a] where
            MkT :: T (F (Maybe a))

      where F is a type function.  Then maybe (F (Maybe a)) evaluates to
      [a], so unifyType will succeed.  But we discard the coercion
      returned by unifyType; and we really don't want to accept this
      program.  The check in checkValidDataCon will, however, reject it.
      TL;DR: keep the check in checkValidDataCon.

    * Consider a data type, rather than a data instance, declaration
         data S a where { MkS :: b -> S [b]  }
      In tcConDecl, S is knot-tied, so we don't want to unify (S alpha)
      with (S [b]). To put it another way, unifyType should never see a
      TcTycon.  Simple solution: do *not* do the extra unifyType for
      data types (DDataType) only for data instances (DDataInstance); in
      the latter the family constructor is not knot-tied so there is no
      problem.

    * Consider this (from an earlier form of GHC itself):

         data Pass = Parsed | ...
         data GhcPass (c :: Pass) where
           GhcPs :: GhcPs
           ...
         type GhcPs   = GhcPass 'Parsed

       Now GhcPs and GhcPass are mutually recursive. If we did unifyType
       for datatypes like GhcPass, we would not be able to expand the type
       synonym (it'd still be a TcTyCon).  So again, we don't do unifyType
       for data types; we leave it to checkValidDataCon.

       We /do/ perform the unifyType for data /instances/, but a data
       instance doesn't declare a new (user-visible) type constructor, so
       there is no mutual recursion with type synonyms to worry about.
       All good.

       TL;DR we do support mutual recursion between type synonyms and
       data type/instance declarations, as above.

    Note [GADT return kinds]
    ~~~~~~~~~~~~~~~~~~~~~~~~
    Consider
       type family Star where Star = Type
       data T :: Type where
          MkT :: Int -> T

    If, for some stupid reason, tcInferLHsTypeKind on the return type of
    MkT returned (T |> ax, Star), then the return-type check in
    checkValidDataCon would reject the decl (although of course there is
    nothing wrong with it).  We are implicitly requiring tha
    tcInferLHsTypeKind doesn't any gratuitous top-level casts.
    -}

    -- | Produce an "expected kind" for the arguments of a data/newtype.
    -- If the declaration is indeed for a newtype,
    -- then this expected kind will be the kind provided. Otherwise,
    -- it is OpenKind for datatypes and liftedTypeKind.
    -- Why do we not check for -XUnliftedNewtypes? See point <Error Messages>
    -- in Note [Implementation of UnliftedNewtypes]
    getArgExpKind :: NewOrData -> TcKind -> ContextKind
    getArgExpKind :: NewOrData -> Type -> ContextKind
    getArgExpKind NewOrData
    NewType Type
    res_ki = Type -> ContextKind
    TheKind Type
    res_ki
    getArgExpKind NewOrData
    DataType Type
    _     = ContextKind
    OpenKind

    tcConIsInfixH98 :: Name
                 -> HsConDeclH98Details GhcRn
                 -> TcM Bool
    tcConIsInfixH98 :: Name -> HsConDeclH98Details GhcRn -> TcRnIf TcGblEnv TcLclEnv Bool
    tcConIsInfixH98 Name
    _   HsConDeclH98Details GhcRn
    details
      = case HsConDeclH98Details GhcRn
    details of
               InfixCon{}  -> Bool -> TcRnIf TcGblEnv TcLclEnv Bool
    forall a. a -> IOEnv (Env TcGblEnv TcLclEnv) a
    forall (m :: * -> *) a. Monad m => a -> m a
    return Bool
    True
               RecCon{}    -> Bool -> TcRnIf TcGblEnv TcLclEnv Bool
    forall a. a -> IOEnv (Env TcGblEnv TcLclEnv) a
    forall (m :: * -> *) a. Monad m => a -> m a
    return Bool
    False
               PrefixCon{} -> Bool -> TcRnIf TcGblEnv TcLclEnv Bool
    forall a. a -> IOEnv (Env TcGblEnv TcLclEnv) a
    forall (m :: * -> *) a. Monad m => a -> m a
    return Bool
    False

    tcConIsInfixGADT :: Name
                 -> HsConDeclGADTDetails GhcRn
                 -> TcM Bool
    tcConIsInfixGADT :: Name -> HsConDeclGADTDetails GhcRn -> TcRnIf TcGblEnv TcLclEnv Bool
    tcConIsInfixGADT Name
    con HsConDeclGADTDetails GhcRn
    details
      = case HsConDeclGADTDetails GhcRn
    details of
               RecConGADT{} -> Bool -> TcRnIf TcGblEnv TcLclEnv Bool
    forall a. a -> IOEnv (Env TcGblEnv TcLclEnv) a
    forall (m :: * -> *) a. Monad m => a -> m a
    return Bool
    False
               PrefixConGADT XPrefixConGADT GhcRn
    _ [HsScaled GhcRn (LHsKind GhcRn)]
    arg_tys       -- See Note [Infix GADT constructors]
                   | OccName -> Bool
    isSymOcc (Name -> OccName
    forall a. NamedThing a => a -> OccName
    getOccName Name
    con)
                   , [GenLocated SrcSpanAnnA (HsType GhcRn)
    _ty1,GenLocated SrcSpanAnnA (HsType GhcRn)
    _ty2] <- (HsScaled GhcRn (GenLocated SrcSpanAnnA (HsType GhcRn))
     -> GenLocated SrcSpanAnnA (HsType GhcRn))
    -> [HsScaled GhcRn (GenLocated SrcSpanAnnA (HsType GhcRn))]
    -> [GenLocated SrcSpanAnnA (HsType GhcRn)]
    forall a b. (a -> b) -> [a] -> [b]
    map HsScaled GhcRn (GenLocated SrcSpanAnnA (HsType GhcRn))
    -> GenLocated SrcSpanAnnA (HsType GhcRn)
    forall pass a. HsScaled pass a -> a
    hsScaledThing [HsScaled GhcRn (LHsKind GhcRn)]
    [HsScaled GhcRn (GenLocated SrcSpanAnnA (HsType GhcRn))]
    arg_tys
                      -> do { fix_env <- TcRn FixityEnv
    getFixityEnv
                            ; return (con `elemNameEnv` fix_env) }
                   | Bool
    otherwise -> Bool -> TcRnIf TcGblEnv TcLclEnv Bool
    forall a. a -> IOEnv (Env TcGblEnv TcLclEnv) a
    forall (m :: * -> *) a. Monad m => a -> m a
    return Bool
    False

    tcConH98Args :: ContextKind  -- expected kind of arguments
                                 -- always OpenKind for datatypes, but unlifted newtypes
                                 -- might have a specific kind
                 -> HsConDeclH98Details GhcRn
                 -> TcM [(Scaled TcType, HsSrcBang)]
    tcConH98Args :: ContextKind
    -> HsConDeclH98Details GhcRn -> TcM [(Scaled Type, HsSrcBang)]
    tcConH98Args ContextKind
    exp_kind (PrefixCon [Void]
    _ [HsScaled GhcRn (LHsKind GhcRn)]
    btys)
      = (HsScaled GhcRn (GenLocated SrcSpanAnnA (HsType GhcRn))
     -> IOEnv (Env TcGblEnv TcLclEnv) (Scaled Type, HsSrcBang))
    -> [HsScaled GhcRn (GenLocated SrcSpanAnnA (HsType GhcRn))]
    -> TcM [(Scaled Type, HsSrcBang)]
    forall (t :: * -> *) (m :: * -> *) a b.
    (Traversable t, Monad m) =>
    (a -> m b) -> t a -> m (t b)
    forall (m :: * -> *) a b. Monad m => (a -> m b) -> [a] -> m [b]
    mapM (ContextKind
    -> HsScaled GhcRn (LHsKind GhcRn)
    -> IOEnv (Env TcGblEnv TcLclEnv) (Scaled Type, HsSrcBang)
    tcConArg ContextKind
    exp_kind) [HsScaled GhcRn (LHsKind GhcRn)]
    [HsScaled GhcRn (GenLocated SrcSpanAnnA (HsType GhcRn))]
    btys
    tcConH98Args ContextKind
    exp_kind (InfixCon HsScaled GhcRn (LHsKind GhcRn)
    bty1 HsScaled GhcRn (LHsKind GhcRn)
    bty2)
      = do { bty1' <- ContextKind
    -> HsScaled GhcRn (LHsKind GhcRn)
    -> IOEnv (Env TcGblEnv TcLclEnv) (Scaled Type, HsSrcBang)
    tcConArg ContextKind
    exp_kind HsScaled GhcRn (LHsKind GhcRn)
    bty1
           ; bty2' <- tcConArg exp_kind bty2
           ; return [bty1', bty2'] }
    tcConH98Args ContextKind
    exp_kind (RecCon XRec GhcRn [LConDeclField GhcRn]
    fields)
      = ContextKind
    -> LocatedL [LConDeclField GhcRn] -> TcM [(Scaled Type, HsSrcBang)]
    tcRecConDeclFields ContextKind
    exp_kind XRec GhcRn [LConDeclField GhcRn]
    LocatedL [LConDeclField GhcRn]
    fields

    tcConGADTArgs :: ContextKind  -- expected kind of arguments
                                  -- always OpenKind for datatypes, but unlifted newtypes
                                  -- might have a specific kind
                  -> HsConDeclGADTDetails GhcRn
                  -> TcM [(Scaled TcType, HsSrcBang)]
    tcConGADTArgs :: ContextKind
    -> HsConDeclGADTDetails GhcRn -> TcM [(Scaled Type, HsSrcBang)]
    tcConGADTArgs ContextKind
    exp_kind (PrefixConGADT XPrefixConGADT GhcRn
    _ [HsScaled GhcRn (LHsKind GhcRn)]
    btys)
      = (HsScaled GhcRn (GenLocated SrcSpanAnnA (HsType GhcRn))
     -> IOEnv (Env TcGblEnv TcLclEnv) (Scaled Type, HsSrcBang))
    -> [HsScaled GhcRn (GenLocated SrcSpanAnnA (HsType GhcRn))]
    -> TcM [(Scaled Type, HsSrcBang)]
    forall (t :: * -> *) (m :: * -> *) a b.
    (Traversable t, Monad m) =>
    (a -> m b) -> t a -> m (t b)
    forall (m :: * -> *) a b. Monad m => (a -> m b) -> [a] -> m [b]
    mapM (ContextKind
    -> HsScaled GhcRn (LHsKind GhcRn)
    -> IOEnv (Env TcGblEnv TcLclEnv) (Scaled Type, HsSrcBang)
    tcConArg ContextKind
    exp_kind) [HsScaled GhcRn (LHsKind GhcRn)]
    [HsScaled GhcRn (GenLocated SrcSpanAnnA (HsType GhcRn))]
    btys
    tcConGADTArgs ContextKind
    exp_kind (RecConGADT XRecConGADT GhcRn
    _ XRec GhcRn [LConDeclField GhcRn]
    fields)
      = ContextKind
    -> LocatedL [LConDeclField GhcRn] -> TcM [(Scaled Type, HsSrcBang)]
    tcRecConDeclFields ContextKind
    exp_kind XRec GhcRn [LConDeclField GhcRn]
    LocatedL [LConDeclField GhcRn]
    fields

    tcConArg :: ContextKind  -- expected kind for args; always OpenKind for datatypes,
                             -- but might be an unlifted type with UnliftedNewtypes
             -> HsScaled GhcRn (LHsType GhcRn) -> TcM (Scaled TcType, HsSrcBang)
    tcConArg :: ContextKind
    -> HsScaled GhcRn (LHsKind GhcRn)
    -> IOEnv (Env TcGblEnv TcLclEnv) (Scaled Type, HsSrcBang)
    tcConArg ContextKind
    exp_kind (HsScaled HsArrow GhcRn
    w LHsKind GhcRn
    bty)
      = do  { String -> SDoc -> TcRn ()
    traceTc String
    "tcConArg 1" (GenLocated SrcSpanAnnA (HsType GhcRn) -> SDoc
    forall a. Outputable a => a -> SDoc
    ppr LHsKind GhcRn
    GenLocated SrcSpanAnnA (HsType GhcRn)
    bty)
            ; arg_ty <- LHsKind GhcRn -> ContextKind -> IOEnv (Env TcGblEnv TcLclEnv) Type
    tcCheckLHsType (LHsKind GhcRn -> LHsKind GhcRn
    forall (p :: Pass). LHsType (GhcPass p) -> LHsType (GhcPass p)
    getBangType LHsKind GhcRn
    bty) ContextKind
    exp_kind
            ; w' <- tcDataConMult w
            ; traceTc "tcConArg 2" (ppr bty)
            ; return (Scaled w' arg_ty, getBangStrictness bty) }

    tcRecConDeclFields :: ContextKind
                       -> LocatedL [LConDeclField GhcRn]
                       -> TcM [(Scaled TcType, HsSrcBang)]
    tcRecConDeclFields :: ContextKind
    -> LocatedL [LConDeclField GhcRn] -> TcM [(Scaled Type, HsSrcBang)]
    tcRecConDeclFields ContextKind
    exp_kind LocatedL [LConDeclField GhcRn]
    fields
      = (HsScaled GhcRn (LHsKind GhcRn)
     -> IOEnv (Env TcGblEnv TcLclEnv) (Scaled Type, HsSrcBang))
    -> [HsScaled GhcRn (LHsKind GhcRn)]
    -> TcM [(Scaled Type, HsSrcBang)]
    forall (t :: * -> *) (m :: * -> *) a b.
    (Traversable t, Monad m) =>
    (a -> m b) -> t a -> m (t b)
    forall (m :: * -> *) a b. Monad m => (a -> m b) -> [a] -> m [b]
    mapM (ContextKind
    -> HsScaled GhcRn (LHsKind GhcRn)
    -> IOEnv (Env TcGblEnv TcLclEnv) (Scaled Type, HsSrcBang)
    tcConArg ContextKind
    exp_kind) [HsScaled GhcRn (LHsKind GhcRn)]
    btys
      where
        -- We need a one-to-one mapping from field_names to btys
        combined :: [([XRec GhcRn (FieldOcc GhcRn)], HsScaled GhcRn (LHsKind GhcRn))]
    combined = (GenLocated SrcSpanAnnA (ConDeclField GhcRn)
     -> ([XRec GhcRn (FieldOcc GhcRn)], HsScaled GhcRn (LHsKind GhcRn)))
    -> [GenLocated SrcSpanAnnA (ConDeclField GhcRn)]
    -> [([XRec GhcRn (FieldOcc GhcRn)],
         HsScaled GhcRn (LHsKind GhcRn))]
    forall a b. (a -> b) -> [a] -> [b]
    map (\(L SrcSpanAnnA
    _ ConDeclField GhcRn
    f) -> (ConDeclField GhcRn -> [XRec GhcRn (FieldOcc GhcRn)]
    forall pass. ConDeclField pass -> [LFieldOcc pass]
    cd_fld_names ConDeclField GhcRn
    f,LHsKind GhcRn -> HsScaled GhcRn (LHsKind GhcRn)
    forall (p :: Pass) a. IsPass p => a -> HsScaled (GhcPass p) a
    hsLinear (ConDeclField GhcRn -> LHsKind GhcRn
    forall pass. ConDeclField pass -> LBangType pass
    cd_fld_type ConDeclField GhcRn
    f)))
                       (GenLocated
      SrcSpanAnnL [GenLocated SrcSpanAnnA (ConDeclField GhcRn)]
    -> [GenLocated SrcSpanAnnA (ConDeclField GhcRn)]
    forall l e. GenLocated l e -> e
    unLoc LocatedL [LConDeclField GhcRn]
    GenLocated
      SrcSpanAnnL [GenLocated SrcSpanAnnA (ConDeclField GhcRn)]
    fields)
        explode :: ([a], b) -> [(a, b)]
    explode ([a]
    ns,b
    ty) = [a] -> [b] -> [(a, b)]
    forall a b. [a] -> [b] -> [(a, b)]
    zip [a]
    ns (b -> [b]
    forall a. a -> [a]
    repeat b
    ty)
        exploded :: [(XRec GhcRn (FieldOcc GhcRn), HsScaled GhcRn (LHsKind GhcRn))]
    exploded = (([XRec GhcRn (FieldOcc GhcRn)], HsScaled GhcRn (LHsKind GhcRn))
     -> [(XRec GhcRn (FieldOcc GhcRn), HsScaled GhcRn (LHsKind GhcRn))])
    -> [([XRec GhcRn (FieldOcc GhcRn)],
         HsScaled GhcRn (LHsKind GhcRn))]
    -> [(XRec GhcRn (FieldOcc GhcRn), HsScaled GhcRn (LHsKind GhcRn))]
    forall (t :: * -> *) a b. Foldable t => (a -> [b]) -> t a -> [b]
    concatMap ([XRec GhcRn (FieldOcc GhcRn)], HsScaled GhcRn (LHsKind GhcRn))
    -> [(XRec GhcRn (FieldOcc GhcRn), HsScaled GhcRn (LHsKind GhcRn))]
    forall {a} {b}. ([a], b) -> [(a, b)]
    explode [([XRec GhcRn (FieldOcc GhcRn)], HsScaled GhcRn (LHsKind GhcRn))]
    combined
        ([XRec GhcRn (FieldOcc GhcRn)]
    _,[HsScaled GhcRn (LHsKind GhcRn)]
    btys) = [(XRec GhcRn (FieldOcc GhcRn), HsScaled GhcRn (LHsKind GhcRn))]
    -> ([XRec GhcRn (FieldOcc GhcRn)],
        [HsScaled GhcRn (LHsKind GhcRn)])
    forall a b. [(a, b)] -> ([a], [b])
    unzip [(XRec GhcRn (FieldOcc GhcRn), HsScaled GhcRn (LHsKind GhcRn))]
    exploded

    tcDataConMult :: HsArrow GhcRn -> TcM Mult
    tcDataConMult :: HsArrow GhcRn -> IOEnv (Env TcGblEnv TcLclEnv) Type
    tcDataConMult arr :: HsArrow GhcRn
    arr@(HsUnrestrictedArrow XUnrestrictedArrow GhcRn
    _) = do
      -- See Note [Function arrows in GADT constructors]
      linearEnabled <- Extension -> TcRnIf TcGblEnv TcLclEnv Bool
    forall gbl lcl. Extension -> TcRnIf gbl lcl Bool
    xoptM Extension
    LangExt.LinearTypes
      if linearEnabled then tcMult arr else return oneDataConTy
    tcDataConMult HsArrow GhcRn
    arr = HsArrow GhcRn -> IOEnv (Env TcGblEnv TcLclEnv) Type
    tcMult HsArrow GhcRn
    arr

    {-
    Note [Function arrows in GADT constructors]
    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    In the absence of -XLinearTypes, we always interpret function arrows
    in GADT constructor types as linear, even if the user wrote an
    unrestricted arrow. See the "Without -XLinearTypes" section of the
    linear types GHC proposal (#111). We opt to do this in the
    typechecker, and not in an earlier pass, to ensure that the AST
    matches what the user wrote (#18791).

    Note [Infix GADT constructors]
    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    We do not currently have syntax to declare an infix constructor in GADT syntax,
    but it makes a (small) difference to the Show instance.  So as a slightly
    ad-hoc solution, we regard a GADT data constructor as infix if
      a) it is an operator symbol
      b) it has two arguments
      c) there is a fixity declaration for it
    For example:
       infix 6 (:--:)
       data T a where
         (:--:) :: t1 -> t2 -> T Int

    Note [rejigConRes]
    ~~~~~~~~~~~~~~~~~~
    There is a delicacy around checking the return types of a datacon. The
    central problem is dealing with a declaration like

      data T a where
        MkT :: T a -> Q a

    Note that the return type of MkT is totally bogus. When creating the T
    tycon, we also need to create the MkT datacon, which must have a "rejigged"
    return type. That is, the MkT datacon's type must be transformed to have
    a uniform return type with explicit coercions for GADT-like type parameters.
    This rejigging is what rejigConRes does. The problem is, though, that checking
    that the return type is appropriate is much easier when done over *Type*,
    not *HsType*, and doing a call to tcMatchTy will loop because T isn't fully
    defined yet.

    So, we want to make rejigConRes lazy and then check the validity of
    the return type in checkValidDataCon.  To do this we /always/ return a
    6-tuple from rejigConRes (so that we can compute the return type from it, which
    checkValidDataCon needs), but the first three fields may be bogus if
    the return type isn't valid (the last equation for rejigConRes).

    This is better than an earlier solution which reduced the number of
    errors reported in one pass.  See #7175, and #10836.
    -}

    -- Example
    --   data instance T (b,c) where
    --      TI :: forall e. e -> T (e,e)
    --
    -- The representation tycon looks like this:
    --   data :R7T b c where
    --      TI :: forall b1 c1. (b1 ~ c1) => b1 -> :R7T b1 c1
    -- In this case orig_res_ty = T (e,e)

    rejigConRes :: [KnotTied TyConBinder]  -- Template for result type; e.g.
                -> KnotTied Type           -- data instance T [a] b c ...
                                           --      gives template ([a,b,c], T [a] b c)
                -> [InvisTVBinder]    -- The constructor's type variables (both inferred and user-written)
                -> KnotTied Type      -- res_ty
                -> ([TyVar],          -- Universal
                    [TyVar],          -- Existential (distinct OccNames from univs)
                    [InvisTVBinder],  -- The constructor's rejigged, user-written
                                      -- type variables
                    [EqSpec],         -- Equality predicates
                    Subst)            -- Substitution to apply to argument types
            -- We don't check that the TyCon given in the ResTy is
            -- the same as the parent tycon, because checkValidDataCon will do it
    -- NB: All arguments may potentially be knot-tied
    rejigConRes :: [TyConBinder]
    -> Type
    -> [VarBndr Var Specificity]
    -> Type
    -> ([Var], [Var], [VarBndr Var Specificity], [EqSpec], Subst)
    rejigConRes [TyConBinder]
    tc_tvbndrs Type
    res_tmpl [VarBndr Var Specificity]
    dc_tvbndrs Type
    res_ty
            -- E.g.  data T [a] b c where
            --         MkT :: forall x y z. T [(x,y)] z z
            -- The {a,b,c} are the tc_tvs, and the {x,y,z} are the dc_tvs
            --     (NB: unlike the H98 case, the dc_tvs are not all existential)
            -- Then we generate
            --      Univ tyvars     Eq-spec
            --          a              a~(x,y)
            --          b              b~z
            --          z
            -- Existentials are the leftover type vars: [x,y]
            -- The user-written type variables are what is listed in the forall:
            --   [x, y, z] (all specified). We must rejig these as well.
            --   See Note [DataCon user type variable binders] in GHC.Core.DataCon.
            -- So we return ( [a,b,z], [x,y]
            --              , [], [x,y,z]
            --              , [a~(x,y),b~z], <arg-subst> )
      | Just Subst
    subst <- Type -> Type -> Maybe Subst
    tcMatchTy Type
    res_tmpl Type
    res_ty
      = let ([Var]
    univ_tvs, [(Var, Type)]
    raw_eqs, Subst
    kind_subst) = [Var] -> [Var] -> Subst -> ([Var], [(Var, Type)], Subst)
    mkGADTVars [Var]
    tc_tvs [Var]
    dc_tvs Subst
    subst
            raw_ex_tvs :: [Var]
    raw_ex_tvs = [Var]
    dc_tvs [Var] -> [Var] -> [Var]
    forall a. Ord a => [a] -> [a] -> [a]
    `minusList` [Var]
    univ_tvs
            (Subst
    arg_subst, [Var]
    substed_ex_tvs) = HasDebugCallStack => Subst -> [Var] -> (Subst, [Var])
    Subst -> [Var] -> (Subst, [Var])
    substTyVarBndrs Subst
    kind_subst [Var]
    raw_ex_tvs

            -- After rejigging the existential tyvars, the resulting substitution
            -- gives us exactly what we need to rejig the user-written tyvars,
            -- since the dcUserTyVarBinders invariant guarantees that the
            -- substitution has *all* the tyvars in its domain.
            -- See Note [DataCon user type variable binders] in GHC.Core.DataCon.
            subst_user_tvs :: [VarBndr Var Specificity] -> [VarBndr Var Specificity]
    subst_user_tvs  = (Var -> Var)
    -> [VarBndr Var Specificity] -> [VarBndr Var Specificity]
    forall var var' flag.
    (var -> var') -> [VarBndr var flag] -> [VarBndr var' flag]
    mapVarBndrs (HasDebugCallStack => Subst -> Var -> Var
    Subst -> Var -> Var
    substTyVarToTyVar Subst
    arg_subst)
            substed_tvbndrs :: [VarBndr Var Specificity]
    substed_tvbndrs = [VarBndr Var Specificity] -> [VarBndr Var Specificity]
    subst_user_tvs [VarBndr Var Specificity]
    dc_tvbndrs

            substed_eqs :: [EqSpec]
    substed_eqs = [ Var -> Type -> EqSpec
    mkEqSpec (HasDebugCallStack => Subst -> Var -> Var
    Subst -> Var -> Var
    substTyVarToTyVar Subst
    arg_subst Var
    tv)
                                     (HasDebugCallStack => Subst -> Type -> Type
    Subst -> Type -> Type
    substTy Subst
    arg_subst Type
    ty)
                          | (Var
    tv,Type
    ty) <- [(Var, Type)]
    raw_eqs ]
        in
        ([Var]
    univ_tvs, [Var]
    substed_ex_tvs, [VarBndr Var Specificity]
    substed_tvbndrs, [EqSpec]
    substed_eqs, Subst
    arg_subst)

      | Bool
    otherwise
            -- If the return type of the data constructor doesn't match the parent
            -- type constructor, or the arity is wrong, the tcMatchTy will fail
            --    e.g   data T a b where
            --            T1 :: Maybe a   -- Wrong tycon
            --            T2 :: T [a]     -- Wrong arity
            -- We are detect that later, in checkValidDataCon, but meanwhile
            -- we must do *something*, not just crash.  So we do something simple
            -- albeit bogus, relying on checkValidDataCon to check the
            --  bad-result-type error before seeing that the other fields look odd
            -- See Note [rejigConRes]
      = ([Var]
    tc_tvs, [Var]
    dc_tvs [Var] -> [Var] -> [Var]
    forall a. Ord a => [a] -> [a] -> [a]
    `minusList` [Var]
    tc_tvs, [VarBndr Var Specificity]
    dc_tvbndrs, [], Subst
    emptySubst)
      where
        dc_tvs :: [Var]
    dc_tvs = [VarBndr Var Specificity] -> [Var]
    forall tv argf. [VarBndr tv argf] -> [tv]
    binderVars [VarBndr Var Specificity]
    dc_tvbndrs
        tc_tvs :: [Var]
    tc_tvs = [TyConBinder] -> [Var]
    forall tv argf. [VarBndr tv argf] -> [tv]
    binderVars [TyConBinder]
    tc_tvbndrs

    {- Note [mkGADTVars]
    ~~~~~~~~~~~~~~~~~~~~
    Running example:

    data T (k1 :: *) (k2 :: *) (a :: k2) (b :: k2) where
      MkT :: forall (x1 : *) (y :: x1) (z :: *).
             T x1 * (Proxy (y :: x1), z) z

    We need the rejigged type to be

      MkT :: forall (x1 :: *) (k2 :: *) (a :: k2) (b :: k2).
             forall (y :: x1) (z :: *).
             (k2 ~ *, a ~ (Proxy x1 y, z), b ~ z)
          => T x1 k2 a b

    You might naively expect that z should become a universal tyvar,
    not an existential. (After all, x1 becomes a universal tyvar.)
    But z has kind * while b has kind k2, so the return type
       T x1 k2 a z
    is ill-kinded.  Another way to say it is this: the universal
    tyvars must have exactly the same kinds as the tyConTyVars.

    So we need an existential tyvar and a heterogeneous equality
    constraint. (The b ~ z is a bit redundant with the k2 ~ * that
    comes before in that b ~ z implies k2 ~ *. I'm sure we could do
    some analysis that could eliminate k2 ~ *. But we don't do this
    yet.)

    The data con signature has already been fully kind-checked.
    The return type

      T x1 * (Proxy (y :: x1), z) z
    becomes
      qtkvs    = [x1 :: *, y :: x1, z :: *]
      res_tmpl = T x1 * (Proxy x1 y, z) z

    We start off by matching (T k1 k2 a b) with (T x1 * (Proxy x1 y, z) z). We
    know this match will succeed because of the validity check (actually done
    later, but laziness saves us -- see Note [rejigConRes]).
    Thus, we get

      subst := { k1 |-> x1, k2 |-> *, a |-> (Proxy x1 y, z), b |-> z }

    Now, we need to figure out what the GADT equalities should be. In this case,
    we *don't* want (k1 ~ x1) to be a GADT equality: it should just be a
    renaming. The others should be GADT equalities. We also need to make
    sure that the universally-quantified variables of the datacon match up
    with the tyvars of the tycon, as required for Core context well-formedness.
    (This last bit is why we have to rejig at all!)

    `choose` walks down the tycon tyvars, figuring out what to do with each one.
    It carries two substitutions:
      - t_sub's domain is *template* or *tycon* tyvars, mapping them to variables
        mentioned in the datacon signature.
      - r_sub's domain is *result* tyvars, names written by the programmer in
        the datacon signature. The final rejigged type will use these names, but
        the subst is still needed because sometimes the printed name of these variables
        is different. (See choose_tv_name, below.)

    Before explaining the details of `choose`, let's just look at its operation
    on our example:

      choose [] [] {} {} [k1, k2, a, b]
      -->          -- first branch of `case` statement
      choose
        univs:    [x1 :: *]
        eq_spec:  []
        t_sub:    {k1 |-> x1}
        r_sub:    {x1 |-> x1}
        t_tvs:    [k2, a, b]
      -->          -- second branch of `case` statement
      choose
        univs:    [k2 :: *, x1 :: *]
        eq_spec:  [k2 ~ *]
        t_sub:    {k1 |-> x1, k2 |-> k2}
        r_sub:    {x1 |-> x1}
        t_tvs:    [a, b]
      -->          -- second branch of `case` statement
      choose
        univs:    [a :: k2, k2 :: *, x1 :: *]
        eq_spec:  [ a ~ (Proxy x1 y, z)
                  , k2 ~ * ]
        t_sub:    {k1 |-> x1, k2 |-> k2, a |-> a}
        r_sub:    {x1 |-> x1}
        t_tvs:    [b]
      -->          -- second branch of `case` statement
      choose
        univs:    [b :: k2, a :: k2, k2 :: *, x1 :: *]
        eq_spec:  [ b ~ z
                  , a ~ (Proxy x1 y, z)
                  , k2 ~ * ]
        t_sub:    {k1 |-> x1, k2 |-> k2, a |-> a, b |-> z}
        r_sub:    {x1 |-> x1}
        t_tvs:    []
      -->          -- end of recursion
      ( [x1 :: *, k2 :: *, a :: k2, b :: k2]
      , [k2 ~ *, a ~ (Proxy x1 y, z), b ~ z]
      , {x1 |-> x1} )

    `choose` looks up each tycon tyvar in the matching (it *must* be matched!).

    * If it finds a bare result tyvar (the first branch of the `case`
      statement), it checks to make sure that the result tyvar isn't yet
      in the list of univ_tvs.  If it is in that list, then we have a
      repeated variable in the return type, and we in fact need a GADT
      equality.

    * It then checks to make sure that the kind of the result tyvar
      matches the kind of the template tyvar. This check is what forces
      `z` to be existential, as it should be, explained above.

    * Assuming no repeated variables or kind-changing, we wish to use the
      variable name given in the datacon signature (that is, `x1` not
      `k1`), not the tycon signature (which may have been made up by
      GHC). So, we add a mapping from the tycon tyvar to the result tyvar
      to t_sub.

    * If we discover that a mapping in `subst` gives us a non-tyvar (the
      second branch of the `case` statement), then we have a GADT equality
      to create.  We create a fresh equality, but we don't extend any
      substitutions. The template variable substitution is meant for use
      in universal tyvar kinds, and these shouldn't be affected by any
      GADT equalities.

    This whole algorithm is quite delicate, indeed. I (Richard E.) see two ways
    of simplifying it:

    1) The first branch of the `case` statement is really an optimization, used
    in order to get fewer GADT equalities. It might be possible to make a GADT
    equality for *every* univ. tyvar, even if the equality is trivial, and then
    either deal with the bigger type or somehow reduce it later.

    2) This algorithm strives to use the names for type variables as specified
    by the user in the datacon signature. If we always used the tycon tyvar
    names, for example, this would be simplified. This change would almost
    certainly degrade error messages a bit, though.
    -}

    -- | From information about a source datacon definition, extract out
    -- what the universal variables and the GADT equalities should be.
    -- See Note [mkGADTVars].
    mkGADTVars :: [TyVar]    -- ^ The tycon vars
               -> [TyVar]    -- ^ The datacon vars
               -> Subst   -- ^ The matching between the template result type
                             -- and the actual result type
               -> ( [TyVar]
                  , [(TyVar,Type)]   -- The un-substituted eq-spec
                  , Subst ) -- ^ The univ. variables, the GADT equalities,
                               -- and a subst to apply to the GADT equalities
                               -- and existentials.
    mkGADTVars :: [Var] -> [Var] -> Subst -> ([Var], [(Var, Type)], Subst)
    mkGADTVars [Var]
    tmpl_tvs [Var]
    dc_tvs Subst
    subst
      = [Var]
    -> [(Var, Type)]
    -> Subst
    -> Subst
    -> [Var]
    -> ([Var], [(Var, Type)], Subst)
    choose [] [] Subst
    empty_subst Subst
    empty_subst [Var]
    tmpl_tvs
      where
        in_scope :: InScopeSet
    in_scope = VarSet -> InScopeSet
    mkInScopeSet ([Var] -> VarSet
    mkVarSet [Var]
    tmpl_tvs VarSet -> VarSet -> VarSet
    `unionVarSet` [Var] -> VarSet
    mkVarSet [Var]
    dc_tvs)
                   InScopeSet -> InScopeSet -> InScopeSet
    `unionInScope` Subst -> InScopeSet
    getSubstInScope Subst
    subst
        empty_subst :: Subst
    empty_subst = InScopeSet -> Subst
    mkEmptySubst InScopeSet
    in_scope

        choose :: [TyVar]        -- accumulator of univ tvs, reversed
               -> [(TyVar,Type)] -- accumulator of GADT equalities, reversed
               -> Subst          -- template substitution
               -> Subst          -- res. substitution
               -> [TyVar]           -- template tvs (the univ tvs passed in)
               -> ( [TyVar]         -- the univ_tvs
                  , [(TyVar,Type)]  -- GADT equalities
                  , Subst )       -- a substitution to fix kinds in ex_tvs

        choose :: [Var]
    -> [(Var, Type)]
    -> Subst
    -> Subst
    -> [Var]
    -> ([Var], [(Var, Type)], Subst)
    choose [Var]
    univs [(Var, Type)]
    eqs Subst
    _t_sub Subst
    r_sub []
          = ([Var] -> [Var]
    forall a. [a] -> [a]
    reverse [Var]
    univs, [(Var, Type)] -> [(Var, Type)]
    forall a. [a] -> [a]
    reverse [(Var, Type)]
    eqs, Subst
    r_sub)
        choose [Var]
    univs [(Var, Type)]
    eqs Subst
    t_sub Subst
    r_sub (Var
    t_tv:[Var]
    t_tvs)
          | Just Type
    r_ty <- Subst -> Var -> Maybe Type
    lookupTyVar Subst
    subst Var
    t_tv
          = case Type -> Maybe Var
    getTyVar_maybe Type
    r_ty of
              Just Var
    r_tv
                |  Bool -> Bool
    not (Var
    r_tv Var -> [Var] -> Bool
    forall a. Eq a => a -> [a] -> Bool
    forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
    `elem` [Var]
    univs)
                ,  Var -> Type
    tyVarKind Var
    r_tv Type -> Type -> Bool
    `eqType` (HasDebugCallStack => Subst -> Type -> Type
    Subst -> Type -> Type
    substTy Subst
    t_sub (Var -> Type
    tyVarKind Var
    t_tv))
                -> -- simple, well-kinded variable substitution.
                   -- the name of the universal comes from the result of the ctor
                   -- see (R2) of Note [DataCon user type variable binders] in GHC.Core.DataCon
                   [Var]
    -> [(Var, Type)]
    -> Subst
    -> Subst
    -> [Var]
    -> ([Var], [(Var, Type)], Subst)
    choose (Var
    r_tvVar -> [Var] -> [Var]
    forall a. a -> [a] -> [a]
    :[Var]
    univs) [(Var, Type)]
    eqs
                          (Subst -> Var -> Type -> Subst
    extendTvSubst Subst
    t_sub Var
    t_tv Type
    r_ty')
                          (Subst -> Var -> Type -> Subst
    extendTvSubst Subst
    r_sub Var
    r_tv Type
    r_ty')
                          [Var]
    t_tvs
                where
                  r_tv1 :: Var
    r_tv1  = Var -> Name -> Var
    setTyVarName Var
    r_tv (Var -> Var -> Name
    choose_tv_name Var
    r_tv Var
    t_tv)
                  r_ty' :: Type
    r_ty'  = Var -> Type
    mkTyVarTy Var
    r_tv1

                   -- Not a simple substitution: make an equality predicate
                   -- the name of the universal comes from the datatype header
                   -- see (R2) of Note [DataCon user type variable binders] in GHC.Core.DataCon
              Maybe Var
    _ -> [Var]
    -> [(Var, Type)]
    -> Subst
    -> Subst
    -> [Var]
    -> ([Var], [(Var, Type)], Subst)
    choose (Var
    t_tv'Var -> [Var] -> [Var]
    forall a. a -> [a] -> [a]
    :[Var]
    univs) [(Var, Type)]
    eqs'
                          (Subst -> Var -> Type -> Subst
    extendTvSubst Subst
    t_sub Var
    t_tv (Var -> Type
    mkTyVarTy Var
    t_tv'))
                             -- We've updated the kind of t_tv,
                             -- so add it to t_sub (#14162)
                          Subst
    r_sub [Var]
    t_tvs
                where
                  tv_kind :: Type
    tv_kind  = Var -> Type
    tyVarKind Var
    t_tv
                  tv_kind' :: Type
    tv_kind' = HasDebugCallStack => Subst -> Type -> Type
    Subst -> Type -> Type
    substTy Subst
    t_sub Type
    tv_kind
                  t_tv' :: Var
    t_tv'    = Var -> Type -> Var
    setTyVarKind Var
    t_tv Type
    tv_kind'
                  eqs' :: [(Var, Type)]
    eqs'     = (Var
    t_tv', Type
    r_ty) (Var, Type) -> [(Var, Type)] -> [(Var, Type)]
    forall a. a -> [a] -> [a]
    : [(Var, Type)]
    eqs

          | Bool
    otherwise
          = [Var]
    -> [(Var, Type)]
    -> Subst
    -> Subst
    -> [Var]
    -> ([Var], [(Var, Type)], Subst)
    choose (Var
    t_tvVar -> [Var] -> [Var]
    forall a. a -> [a] -> [a]
    :[Var]
    univs) [(Var, Type)]
    eqs Subst
    t_sub Subst
    r_sub [Var]
    t_tvs

          -- choose an appropriate name for a univ tyvar.
          -- This *must* preserve the Unique of the result tv, so that we
          -- can detect repeated variables. It prefers user-specified names
          -- over system names. A result variable with a system name can
          -- happen with GHC-generated implicit kind variables.
        choose_tv_name :: TyVar -> TyVar -> Name
        choose_tv_name :: Var -> Var -> Name
    choose_tv_name Var
    r_tv Var
    t_tv
          | Name -> Bool
    isSystemName Name
    r_tv_name
          = Name -> Unique -> Name
    setNameUnique Name
    t_tv_name (Name -> Unique
    forall a. Uniquable a => a -> Unique
    getUnique Name
    r_tv_name)

          | Bool
    otherwise
          = Name
    r_tv_name

          where
            r_tv_name :: Name
    r_tv_name = Var -> Name
    forall a. NamedThing a => a -> Name
    getName Var
    r_tv
            t_tv_name :: Name
    t_tv_name = Var -> Name
    forall a. NamedThing a => a -> Name
    getName Var
    t_tv

    {-
    Note [Substitution in template variables kinds]
    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

    data G (a :: Maybe k) where
      MkG :: G Nothing

    With explicit kind variables

    data G k (a :: Maybe k) where
      MkG :: G k1 (Nothing k1)

    Note how k1 is distinct from k. So, when we match the template
    `G k a` against `G k1 (Nothing k1)`, we get a subst
    [ k |-> k1, a |-> Nothing k1 ]. Even though this subst has two
    mappings, we surely don't want to add (k, k1) to the list of
    GADT equalities -- that would be overly complex and would create
    more untouchable variables than we need. So, when figuring out
    which tyvars are GADT-like and which aren't (the fundamental
    job of `choose`), we want to treat `k` as *not* GADT-like.
    Instead, we wish to substitute in `a`'s kind, to get (a :: Maybe k1)
    instead of (a :: Maybe k). This is the reason for dealing
    with a substitution in here.

    However, we do not *always* want to substitute. Consider

    data H (a :: k) where
      MkH :: H Int

    With explicit kind variables:

    data H k (a :: k) where
      MkH :: H * Int

    Here, we have a kind-indexed GADT. The subst in question is
    [ k |-> *, a |-> Int ]. Now, we *don't* want to substitute in `a`'s
    kind, because that would give a constructor with the type

    MkH :: forall (k :: *) (a :: *). (k ~ *) -> (a ~ Int) -> H k a

    The problem here is that a's kind is wrong -- it needs to be k, not *!
    So, if the matching for a variable is anything but another bare variable,
    we drop the mapping from the substitution before proceeding. This
    was not an issue before kind-indexed GADTs because this case could
    never happen.

    ************************************************************************
    *                                                                      *
                    Validity checking
    *                                                                      *
    ************************************************************************

    Validity checking is done once the mutually-recursive knot has been
    tied, so we can look at things freely.
    -}

    checkValidTyCl :: TyCon -> TcM [TyCon]
    -- The returned list is either a singleton (if valid)
    -- or a list of "fake tycons" (if not); the fake tycons
    -- include any implicits, like promoted data constructors
    -- See Note [Recover from validity error]
    checkValidTyCl :: TyCon -> TcM [TyCon]
    checkValidTyCl TyCon
    tc
      = SrcSpan -> TcM [TyCon] -> TcM [TyCon]
    forall a. SrcSpan -> TcRn a -> TcRn a
    setSrcSpan (TyCon -> SrcSpan
    forall a. NamedThing a => a -> SrcSpan
    getSrcSpan TyCon
    tc) (TcM [TyCon] -> TcM [TyCon]) -> TcM [TyCon] -> TcM [TyCon]
    forall a b. (a -> b) -> a -> b
    $
        TyCon -> TcM [TyCon] -> TcM [TyCon]
    forall a. TyCon -> TcM a -> TcM a
    addTyConCtxt TyCon
    tc            (TcM [TyCon] -> TcM [TyCon]) -> TcM [TyCon] -> TcM [TyCon]
    forall a b. (a -> b) -> a -> b
    $
        TcM [TyCon] -> TcM [TyCon] -> TcM [TyCon]
    forall r. TcRn r -> TcRn r -> TcRn r
    recoverM TcM [TyCon]
    recovery_code     (TcM [TyCon] -> TcM [TyCon]) -> TcM [TyCon] -> TcM [TyCon]
    forall a b. (a -> b) -> a -> b
    $
        do { String -> SDoc -> TcRn ()
    traceTc String
    "Starting validity for tycon" (TyCon -> SDoc
    forall a. Outputable a => a -> SDoc
    ppr TyCon
    tc)
           ; TyCon -> TcRn ()
    checkValidTyCon TyCon
    tc
           ; TyCon -> TcRn ()
    checkTyConConsistentWithBoot TyCon
    tc -- See Note [TyCon boot consistency checking]
           ; String -> SDoc -> TcRn ()
    traceTc String
    "Done validity for tycon" (TyCon -> SDoc
    forall a. Outputable a => a -> SDoc
    ppr TyCon
    tc)
           ; [TyCon] -> TcM [TyCon]
    forall a. a -> IOEnv (Env TcGblEnv TcLclEnv) a
    forall (m :: * -> *) a. Monad m => a -> m a
    return [TyCon
    tc] }
      where
        recovery_code :: TcM [TyCon]
    recovery_code -- See Note [Recover from validity error]
          = do { String -> SDoc -> TcRn ()
    traceTc String
    "Aborted validity for tycon" (TyCon -> SDoc
    forall a. Outputable a => a -> SDoc
    ppr TyCon
    tc)
               ; [TyCon] -> TcM [TyCon]
    forall a. a -> IOEnv (Env TcGblEnv TcLclEnv) a
    forall (m :: * -> *) a. Monad m => a -> m a
    return ((TyCon -> TyCon) -> [TyCon] -> [TyCon]
    forall a b. (a -> b) -> [a] -> [b]
    map TyCon -> TyCon
    mk_fake_tc ([TyCon] -> [TyCon]) -> [TyCon] -> [TyCon]
    forall a b. (a -> b) -> a -> b
    $
                         TyCon
    tc TyCon -> [TyCon] -> [TyCon]
    forall a. a -> [a] -> [a]
    : TyCon -> [TyCon]
    child_tycons TyCon
    tc) }

        mk_fake_tc :: TyCon -> TyCon
    mk_fake_tc TyCon
    tc
          | TyCon -> Bool
    isClassTyCon TyCon
    tc = TyCon
    tc   -- Ugh! Note [Recover from validity error]
          | Bool
    otherwise       = TyCon -> TyCon
    makeRecoveryTyCon TyCon
    tc

        child_tycons :: TyCon -> [TyCon]
    child_tycons TyCon
    tc = TyCon -> [TyCon]
    tyConATs TyCon
    tc [TyCon] -> [TyCon] -> [TyCon]
    forall a. [a] -> [a] -> [a]
    ++ (DataCon -> TyCon) -> [DataCon] -> [TyCon]
    forall a b. (a -> b) -> [a] -> [b]
    map DataCon -> TyCon
    promoteDataCon (TyCon -> [DataCon]
    tyConDataCons TyCon
    tc)

    {- Note [Recover from validity error]
    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    We recover from a validity error in a type or class, which allows us
    to report multiple validity errors. In the failure case we return a
    TyCon of the right kind, but with no interesting behaviour
    (makeRecoveryTyCon). Why?  Suppose we have
       type T a = Fun
    where Fun is a type family of arity 1.  The RHS is invalid, but we
    want to go on checking validity of subsequent type declarations.
    So we replace T with an abstract TyCon which will do no harm.
    See indexed-types/should_fail/BadSock and #10896

    Some notes:

    * We must make fakes for promoted DataCons too. Consider (#15215)
          data T a = MkT ...
          data S a = ...T...MkT....
      If there is an error in the definition of 'T' we add a "fake type
      constructor" to the type environment, so that we can continue to
      typecheck 'S'.  But we /were not/ adding a fake anything for 'MkT'
      and so there was an internal error when we met 'MkT' in the body of
      'S'.

      Similarly for associated types.

    * Painfully, we *don't* want to do this for classes.
      Consider tcfail041:
         class (?x::Int) => C a where ...
         instance C Int
      The class is invalid because of the superclass constraint.  But
      we still want it to look like a /class/, else the instance bleats
      that the instance is mal-formed because it hasn't got a class in
      the head.

      This is really bogus; now we have in scope a Class that is invalid
      in some way, with unknown downstream consequences.  A better
      alternative might be to make a fake class TyCon.  A job for another day.

    * Previously, we used implicitTyConThings to snaffle out the parts
      to add to the context. The problem is that this also grabs data con
      wrapper Ids. These could be filtered out. But, painfully, getting
      the wrapper Ids checks the DataConRep, and forcing the DataConRep
      can panic if there is a representation-polymorphic argument. This is #18534.
      We don't need the wrapper Ids here anyway. So the code just takes what
      it needs, via child_tycons.
    -}

    -------------------------
    -- For data types declared with record syntax, we require
    -- that each constructor that has a field 'f'
    --      (a) has the same result type
    --      (b) has the same type for 'f'
    -- module alpha conversion of the quantified type variables
    -- of the constructor.
    --
    -- Note that we allow existentials to match because the
    -- fields can never meet. E.g
    --      data T where
    --        T1 { f1 :: b, f2 :: a, f3 ::Int } :: T
    --        T2 { f1 :: c, f2 :: c, f3 ::Int } :: T
    -- Here we do not complain about f1,f2 because they are existential

    -- | Check that a 'TyCon' is consistent with the one in the hs-boot file,
    -- if any.
    --
    -- See Note [TyCon boot consistency checking].
    checkTyConConsistentWithBoot :: TyCon -> TcM ()
    checkTyConConsistentWithBoot :: TyCon -> TcRn ()
    checkTyConConsistentWithBoot TyCon
    tc =
      do { gbl_env <- TcRnIf TcGblEnv TcLclEnv TcGblEnv
    forall gbl lcl. TcRnIf gbl lcl gbl
    getGblEnv
         ; let name          = TyCon -> Name
    tyConName TyCon
    tc
               real_thing    = TyCon -> TyThing
    ATyCon TyCon
    tc
               boot_info     = TcGblEnv -> SelfBootInfo
    tcg_self_boot TcGblEnv
    gbl_env
               boot_type_env = case SelfBootInfo
    boot_info of
                 SelfBootInfo
    NoSelfBoot            -> TypeEnv
    emptyTypeEnv
                 SelfBoot ModDetails
    boot_details -> ModDetails -> TypeEnv
    md_types ModDetails
    boot_details
               m_boot_info   = TypeEnv -> Name -> Maybe TyThing
    lookupTypeEnv TypeEnv
    boot_type_env Name
    name
         ; case m_boot_info of
             Maybe TyThing
    Nothing         -> () -> TcRn ()
    forall a. a -> IOEnv (Env TcGblEnv TcLclEnv) a
    forall (m :: * -> *) a. Monad m => a -> m a
    return ()
             Just TyThing
    boot_thing -> HsBootOrSig -> TyThing -> TyThing -> TcRn ()
    checkBootDeclM HsBootOrSig
    HsBoot TyThing
    boot_thing TyThing
    real_thing
         }

    {- Note [TyCon boot consistency checking]
    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    We want to throw an error when A.hs and A.hs-boot define a TyCon inconsistently,
    e.g.

      -- A.hs-boot
      type D :: Type
      data D

      -- A.hs
      data D (k :: Type) = MkD

    Here A.D and A[boot].D have different kinds, so we must error. In addition, we
    must error eagerly, lest other parts of the compiler witness this inconsistency
    (which was the subject of #16127). To achieve this, we call
    checkTyConIsConsistentWithBoot in checkValidTyCl, which is called in
    GHC.Tc.TyCl.tcTyClGroup.

    Note that, when calling checkValidTyCl, we must extend the TyCon environment.
    For example, we could end up comparing the RHS of two type synonym declarations
    to check they are consistent, and these RHS might mention some of the TyCons we
    are validity checking, so they need to be in the environment.
    -}

    checkValidTyCon :: TyCon -> TcM ()
    checkValidTyCon :: TyCon -> TcRn ()
    checkValidTyCon TyCon
    tc
      | TyCon -> Bool
    isPrimTyCon TyCon
    tc   -- Happens when Haddock'ing GHC.Prim
      = () -> TcRn ()
    forall a. a -> IOEnv (Env TcGblEnv TcLclEnv) a
    forall (m :: * -> *) a. Monad m => a -> m a
    return ()

      | TyCon -> Bool
    forall thing. NamedThing thing => thing -> Bool
    isWiredIn TyCon
    tc     -- validity-checking wired-in tycons is a waste of
                         -- time. More importantly, a wired-in tycon might
                         -- violate assumptions. Example: (~) has a superclass
                         -- mentioning (~#), which is ill-kinded in source Haskell
      = String -> SDoc -> TcRn ()
    traceTc String
    "Skipping validity check for wired-in" (TyCon -> SDoc
    forall a. Outputable a => a -> SDoc
    ppr TyCon
    tc)

      | Bool
    otherwise
      = do { String -> SDoc -> TcRn ()
    traceTc String
    "checkValidTyCon" (TyCon -> SDoc
    forall a. Outputable a => a -> SDoc
    ppr TyCon
    tc SDoc -> SDoc -> SDoc
    forall doc. IsDoc doc => doc -> doc -> doc
    $$ Maybe Class -> SDoc
    forall a. Outputable a => a -> SDoc
    ppr (TyCon -> Maybe Class
    tyConClass_maybe TyCon
    tc))
           ; if | Just Class
    cl <- TyCon -> Maybe Class
    tyConClass_maybe TyCon
    tc
                  -> Class -> TcRn ()
    checkValidClass Class
    cl

                | Just Type
    syn_rhs <- TyCon -> Maybe Type
    synTyConRhs_maybe TyCon
    tc
                  -> do { UserTypeCtxt -> Type -> TcRn ()
    checkValidType UserTypeCtxt
    syn_ctxt Type
    syn_rhs
                        ; UserTypeCtxt -> Type -> TcRn ()
    checkTySynRhs UserTypeCtxt
    syn_ctxt Type
    syn_rhs }

                | Just FamTyConFlav
    fam_flav <- TyCon -> Maybe FamTyConFlav
    famTyConFlav_maybe TyCon
    tc
                  -> case FamTyConFlav
    fam_flav of
                   { ClosedSynFamilyTyCon (Just CoAxiom Branched
    ax)
                       -> TyCon -> TcRn () -> TcRn ()
    forall a. TyCon -> TcM a -> TcM a
    tcAddClosedTypeFamilyDeclCtxt TyCon
    tc (TcRn () -> TcRn ()) -> TcRn () -> TcRn ()
    forall a b. (a -> b) -> a -> b
    $
                          CoAxiom Branched -> TcRn ()
    checkValidCoAxiom CoAxiom Branched
    ax
                   ; ClosedSynFamilyTyCon Maybe (CoAxiom Branched)
    Nothing   -> () -> TcRn ()
    forall a. a -> IOEnv (Env TcGblEnv TcLclEnv) a
    forall (m :: * -> *) a. Monad m => a -> m a
    return ()
                   ; FamTyConFlav
    AbstractClosedSynFamilyTyCon ->
                     do { hsBoot <- TcRnIf TcGblEnv TcLclEnv Bool
    tcIsHsBootOrSig
                        ; checkTc hsBoot $ TcRnAbstractClosedTyFamDecl }
                   ; DataFamilyTyCon {}           -> () -> TcRn ()
    forall a. a -> IOEnv (Env TcGblEnv TcLclEnv) a
    forall (m :: * -> *) a. Monad m => a -> m a
    return ()
                   ; FamTyConFlav
    OpenSynFamilyTyCon           -> () -> TcRn ()
    forall a. a -> IOEnv (Env TcGblEnv TcLclEnv) a
    forall (m :: * -> *) a. Monad m => a -> m a
    return ()
                   ; BuiltInSynFamTyCon BuiltInSynFamily
    _         -> () -> TcRn ()
    forall a. a -> IOEnv (Env TcGblEnv TcLclEnv) a
    forall (m :: * -> *) a. Monad m => a -> m a
    return () }

                 | Bool
    otherwise -> do
                   { -- Check the context on the data decl
                     String -> SDoc -> TcRn ()
    traceTc String
    "cvtc1" (TyCon -> SDoc
    forall a. Outputable a => a -> SDoc
    ppr TyCon
    tc)
                   ; UserTypeCtxt -> ThetaType -> TcRn ()
    checkValidTheta (Name -> UserTypeCtxt
    DataTyCtxt Name
    name) (TyCon -> ThetaType
    tyConStupidTheta TyCon
    tc)

                   ; String -> SDoc -> TcRn ()
    traceTc String
    "cvtc2" (TyCon -> SDoc
    forall a. Outputable a => a -> SDoc
    ppr TyCon
    tc)

                   ; dflags          <- IOEnv (Env TcGblEnv TcLclEnv) DynFlags
    forall (m :: * -> *). HasDynFlags m => m DynFlags
    getDynFlags
                   ; existential_ok  <- xoptM LangExt.ExistentialQuantification
                   ; gadt_ok         <- xoptM LangExt.GADTs
                   ; let ex_ok = Bool
    existential_ok Bool -> Bool -> Bool
    || Bool
    gadt_ok
                         -- Data cons can have existential context
                   ; mapM_ (checkValidDataCon dflags ex_ok tc) data_cons
                   ; mapM_ (checkPartialRecordField data_cons) (tyConFieldLabels tc)

                    -- Check that fields with the same name share a type
                   ; mapM_ check_fields groups }}
      where
        syn_ctxt :: UserTypeCtxt
    syn_ctxt  = Name -> UserTypeCtxt
    TySynCtxt Name
    name
        name :: Name
    name      = TyCon -> Name
    tyConName TyCon
    tc
        data_cons :: [DataCon]
    data_cons = TyCon -> [DataCon]
    tyConDataCons TyCon
    tc

        groups :: [NonEmpty (FieldLabel, DataCon)]
    groups = ((FieldLabel, DataCon) -> (FieldLabel, DataCon) -> Ordering)
    -> [(FieldLabel, DataCon)] -> [NonEmpty (FieldLabel, DataCon)]
    forall a. (a -> a -> Ordering) -> [a] -> [NonEmpty a]
    equivClasses (FieldLabel, DataCon) -> (FieldLabel, DataCon) -> Ordering
    forall {b} {b}. (FieldLabel, b) -> (FieldLabel, b) -> Ordering
    cmp_fld ((DataCon -> [(FieldLabel, DataCon)])
    -> [DataCon] -> [(FieldLabel, DataCon)]
    forall (t :: * -> *) a b. Foldable t => (a -> [b]) -> t a -> [b]
    concatMap DataCon -> [(FieldLabel, DataCon)]
    get_fields [DataCon]
    data_cons)
        -- This spot seems OK with non-determinism. cmp_fld is used only in equivClasses
        -- which produces equivalence classes.
        -- The order of these equivalence classes might conceivably (non-deterministically)
        -- depend on the result of this comparison, but that just affects the order in which
        -- fields are checked for compatibility. It will not affect the compiled binary.
        cmp_fld :: (FieldLabel, b) -> (FieldLabel, b) -> Ordering
    cmp_fld (FieldLabel
    f1,b
    _) (FieldLabel
    f2,b
    _) = FieldLabelString -> FastString
    field_label (FieldLabel -> FieldLabelString
    flLabel FieldLabel
    f1) FastString -> FastString -> Ordering
    `uniqCompareFS` FieldLabelString -> FastString
    field_label (FieldLabel -> FieldLabelString
    flLabel FieldLabel
    f2)
        get_fields :: DataCon -> [(FieldLabel, DataCon)]
    get_fields DataCon
    con = DataCon -> [FieldLabel]
    dataConFieldLabels DataCon
    con [FieldLabel] -> [DataCon] -> [(FieldLabel, DataCon)]
    forall a b. [a] -> [b] -> [(a, b)]
    `zip` DataCon -> [DataCon]
    forall a. a -> [a]
    repeat DataCon
    con
            -- dataConFieldLabels may return the empty list, which is fine

        -- See Note [GADT record selectors] in GHC.Tc.TyCl.Utils
        -- We must check (a) that the named field has the same
        --                   type in each constructor
        --               (b) that those constructors have the same result type
        --
        -- However, the constructors may have differently named type variable
        -- and (worse) we don't know how the correspond to each other.  E.g.
        --     C1 :: forall a b. { f :: a, g :: b } -> T a b
        --     C2 :: forall d c. { f :: c, g :: c } -> T c d
        --
        -- So what we do is to ust Unify.tcMatchTys to compare the first candidate's
        -- result type against other candidates' types BOTH WAYS ROUND.
        -- If they magically agrees, take the substitution and
        -- apply them to the latter ones, and see if they match perfectly.
        check_fields :: NonEmpty (FieldLabel, DataCon) -> TcRn ()
    check_fields ((FieldLabel
    label, DataCon
    con1) :| [(FieldLabel, DataCon)]
    other_fields)
            -- These fields all have the same name, but are from
            -- different constructors in the data type
            = TcRn () -> TcRn () -> TcRn ()
    forall r. TcRn r -> TcRn r -> TcRn r
    recoverM (() -> TcRn ()
    forall a. a -> IOEnv (Env TcGblEnv TcLclEnv) a
    forall (m :: * -> *) a. Monad m => a -> m a
    return ()) (TcRn () -> TcRn ()) -> TcRn () -> TcRn ()
    forall a b. (a -> b) -> a -> b
    $ ((FieldLabel, DataCon) -> TcRn ())
    -> [(FieldLabel, DataCon)] -> TcRn ()
    forall (t :: * -> *) (m :: * -> *) a b.
    (Foldable t, Monad m) =>
    (a -> m b) -> t a -> m ()
    mapM_ (FieldLabel, DataCon) -> TcRn ()
    checkOne [(FieldLabel, DataCon)]
    other_fields
                    -- Check that all the fields in the group have the same type
                    -- NB: this check assumes that all the constructors of a given
                    -- data type use the same type variables
            where
            res1 :: Type
    res1 = DataCon -> Type
    dataConOrigResTy DataCon
    con1
            fty1 :: Type
    fty1 = DataCon -> FieldLabelString -> Type
    dataConFieldType DataCon
    con1 FieldLabelString
    lbl
            lbl :: FieldLabelString
    lbl = FieldLabel -> FieldLabelString
    flLabel FieldLabel
    label

            checkOne :: (FieldLabel, DataCon) -> TcRn ()
    checkOne (FieldLabel
    _, DataCon
    con2)    -- Do it both ways to ensure they are structurally identical
                = do { FieldLabelString
    -> DataCon -> DataCon -> Type -> Type -> Type -> Type -> TcRn ()
    checkFieldCompat FieldLabelString
    lbl DataCon
    con1 DataCon
    con2 Type
    res1 Type
    res2 Type
    fty1 Type
    fty2
                     ; FieldLabelString
    -> DataCon -> DataCon -> Type -> Type -> Type -> Type -> TcRn ()
    checkFieldCompat FieldLabelString
    lbl DataCon
    con2 DataCon
    con1 Type
    res2 Type
    res1 Type
    fty2 Type
    fty1 }
                where
                    res2 :: Type
    res2 = DataCon -> Type
    dataConOrigResTy DataCon
    con2
                    fty2 :: Type
    fty2 = DataCon -> FieldLabelString -> Type
    dataConFieldType DataCon
    con2 FieldLabelString
    lbl

    checkPartialRecordField :: [DataCon] -> FieldLabel -> TcM ()
    -- Checks the partial record field selector, and warns.
    -- See Note [Checking partial record field]
    checkPartialRecordField :: [DataCon] -> FieldLabel -> TcRn ()
    checkPartialRecordField [DataCon]
    all_cons FieldLabel
    fld
      = SrcSpan -> TcRn () -> TcRn ()
    forall a. SrcSpan -> TcRn a -> TcRn a
    setSrcSpan SrcSpan
    loc (TcRn () -> TcRn ()) -> TcRn () -> TcRn ()
    forall a b. (a -> b) -> a -> b
    $
          Bool -> TcRnMessage -> TcRn ()
    warnIf (Bool -> Bool
    not Bool
    is_exhaustive Bool -> Bool -> Bool
    && Bool -> Bool
    not (OccName -> Bool
    startsWithUnderscore OccName
    occ_name))
                 (FieldLabel -> TcRnMessage
    TcRnPartialFieldSelector FieldLabel
    fld)
      where
        sel :: Name
    sel = FieldLabel -> Name
    flSelector FieldLabel
    fld
        loc :: SrcSpan
    loc = Name -> SrcSpan
    forall a. NamedThing a => a -> SrcSpan
    getSrcSpan Name
    sel
        occ_name :: OccName
    occ_name = Name -> OccName
    nameOccName Name
    sel

        ([DataCon]
    cons_with_field, [DataCon]
    cons_without_field) = (DataCon -> Bool) -> [DataCon] -> ([DataCon], [DataCon])
    forall a. (a -> Bool) -> [a] -> ([a], [a])
    partition DataCon -> Bool
    has_field [DataCon]
    all_cons
        has_field :: DataCon -> Bool
    has_field DataCon
    con = FieldLabel
    fld FieldLabel -> [FieldLabel] -> Bool
    forall a. Eq a => a -> [a] -> Bool
    forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
    `elem` (DataCon -> [FieldLabel]
    dataConFieldLabels DataCon
    con)
        is_exhaustive :: Bool
    is_exhaustive = (DataCon -> Bool) -> [DataCon] -> Bool
    forall (t :: * -> *) a. Foldable t => (a -> Bool) -> t a -> Bool
    all (ThetaType -> DataCon -> Bool
    dataConCannotMatch ThetaType
    inst_tys) [DataCon]
    cons_without_field

        con1 :: DataCon
    con1 = Bool -> DataCon -> DataCon
    forall a. HasCallStack => Bool -> a -> a
    assert (Bool -> Bool
    not ([DataCon] -> Bool
    forall a. [a] -> Bool
    forall (t :: * -> *) a. Foldable t => t a -> Bool
    null [DataCon]
    cons_with_field)) (DataCon -> DataCon) -> DataCon -> DataCon
    forall a b. (a -> b) -> a -> b
    $ [DataCon] -> DataCon
    forall a. HasCallStack => [a] -> a
    head [DataCon]
    cons_with_field
        inst_tys :: ThetaType
    inst_tys = DataCon -> ThetaType
    dataConResRepTyArgs DataCon
    con1

    checkFieldCompat :: FieldLabelString -> DataCon -> DataCon
                     -> Type -> Type -> Type -> Type -> TcM ()
    checkFieldCompat :: FieldLabelString
    -> DataCon -> DataCon -> Type -> Type -> Type -> Type -> TcRn ()
    checkFieldCompat FieldLabelString
    fld DataCon
    con1 DataCon
    con2 Type
    res1 Type
    res2 Type
    fty1 Type
    fty2
      = do  { Bool -> TcRnMessage -> TcRn ()
    checkTc (Maybe Subst -> Bool
    forall a. Maybe a -> Bool
    isJust Maybe Subst
    mb_subst1) (DataCon -> DataCon -> FieldLabelString -> TcRnMessage
    TcRnCommonFieldResultTypeMismatch DataCon
    con1 DataCon
    con2 FieldLabelString
    fld)
            ; Bool -> TcRnMessage -> TcRn ()
    checkTc (Maybe Subst -> Bool
    forall a. Maybe a -> Bool
    isJust Maybe Subst
    mb_subst2) (DataCon -> DataCon -> FieldLabelString -> TcRnMessage
    TcRnCommonFieldTypeMismatch DataCon
    con1 DataCon
    con2 FieldLabelString
    fld) }
      where
        mb_subst1 :: Maybe Subst
    mb_subst1 = Type -> Type -> Maybe Subst
    tcMatchTy Type
    res1 Type
    res2
        mb_subst2 :: Maybe Subst
    mb_subst2 = Subst -> Type -> Type -> Maybe Subst
    tcMatchTyX (String -> Maybe Subst -> Subst
    forall a. HasCallStack => String -> Maybe a -> a
    expectJust String
    "checkFieldCompat" Maybe Subst
    mb_subst1) Type
    fty1 Type
    fty2

    -------------------------------
    checkValidDataCon :: DynFlags -> Bool -> TyCon -> DataCon -> TcM ()
    checkValidDataCon :: DynFlags -> Bool -> TyCon -> DataCon -> TcRn ()
    checkValidDataCon DynFlags
    dflags Bool
    existential_ok TyCon
    tc DataCon
    con
      = SrcSpan -> TcRn () -> TcRn ()
    forall a. SrcSpan -> TcRn a -> TcRn a
    setSrcSpan SrcSpan
    con_loc (TcRn () -> TcRn ()) -> TcRn () -> TcRn ()
    forall a b. (a -> b) -> a -> b
    $
        SDoc -> TcRn () -> TcRn ()
    forall a. SDoc -> TcM a -> TcM a
    addErrCtxt (NonEmpty (LocatedN Name) -> SDoc
    dataConCtxt (LocatedN Name -> NonEmpty (LocatedN Name)
    forall a. a -> NonEmpty a
    NE.singleton (SrcSpanAnnN -> Name -> LocatedN Name
    forall l e. l -> e -> GenLocated l e
    L (SrcSpan -> SrcSpanAnnN
    forall e. HasAnnotation e => SrcSpan -> e
    noAnnSrcSpan SrcSpan
    con_loc) Name
    con_name))) (TcRn () -> TcRn ()) -> TcRn () -> TcRn ()
    forall a b. (a -> b) -> a -> b
    $
        do  { let tc_tvs :: [Var]
    tc_tvs      = TyCon -> [Var]
    tyConTyVars TyCon
    tc
                  res_ty_tmpl :: Type
    res_ty_tmpl = TyCon -> ThetaType -> Type
    mkFamilyTyConApp TyCon
    tc ([Var] -> ThetaType
    mkTyVarTys [Var]
    tc_tvs)
                  arg_tys :: [Scaled Type]
    arg_tys     = DataCon -> [Scaled Type]
    dataConOrigArgTys DataCon
    con
                  orig_res_ty :: Type
    orig_res_ty = DataCon -> Type
    dataConOrigResTy  DataCon
    con

            ; String -> SDoc -> TcRn ()
    traceTc String
    "checkValidDataCon" ([SDoc] -> SDoc
    forall doc. IsDoc doc => [doc] -> doc
    vcat
                  [ DataCon -> SDoc
    forall a. Outputable a => a -> SDoc
    ppr DataCon
    con, TyCon -> SDoc
    forall a. Outputable a => a -> SDoc
    ppr TyCon
    tc, [Var] -> SDoc
    forall a. Outputable a => a -> SDoc
    ppr [Var]
    tc_tvs
                  , Type -> SDoc
    forall a. Outputable a => a -> SDoc
    ppr Type
    res_ty_tmpl SDoc -> SDoc -> SDoc
    forall doc. IsLine doc => doc -> doc -> doc
    <+> SDoc
    dcolon SDoc -> SDoc -> SDoc
    forall doc. IsLine doc => doc -> doc -> doc
    <+> Type -> SDoc
    forall a. Outputable a => a -> SDoc
    ppr (HasDebugCallStack => Type -> Type
    Type -> Type
    typeKind Type
    res_ty_tmpl)
                  , Type -> SDoc
    forall a. Outputable a => a -> SDoc
    ppr Type
    orig_res_ty SDoc -> SDoc -> SDoc
    forall doc. IsLine doc => doc -> doc -> doc
    <+> SDoc
    dcolon SDoc -> SDoc -> SDoc
    forall doc. IsLine doc => doc -> doc -> doc
    <+> Type -> SDoc
    forall a. Outputable a => a -> SDoc
    ppr (HasDebugCallStack => Type -> Type
    Type -> Type
    typeKind Type
    orig_res_ty)])

            -- Check that the return type of the data constructor
            -- matches the type constructor; eg reject this:
            --   data T a where { MkT :: Bogus a }
            -- It's important to do this first:
            --  see Note [rejigConRes]
            --  and c.f. Note [Check role annotations in a second pass]

            -- Check that the return type of the data constructor is an instance
            -- of the header of the header of data decl.  This checks for
            --      data T a where { MkT :: S a }
            --      data instance D [a] where { MkD :: D (Maybe b) }
            -- see Note [GADT return types]
            ; Bool -> TcRnMessage -> TcRn ()
    checkTc (Maybe Subst -> Bool
    forall a. Maybe a -> Bool
    isJust (Type -> Type -> Maybe Subst
    tcMatchTyKi Type
    res_ty_tmpl Type
    orig_res_ty))
                      (DataCon -> Type -> TcRnMessage
    TcRnDataConParentTypeMismatch DataCon
    con Type
    res_ty_tmpl)
                -- Note that checkTc aborts if it finds an error. This is
                -- critical to avoid panicking when we call dataConDisplayType
                -- on an un-rejiggable datacon!
                -- Also NB that we match the *kind* as well as the *type* (#18357)
                -- However, if the kind is the only thing that doesn't match, the
                -- error message is terrible.  E.g. test T18357b
                --    type family Star where Star = Type
                --    newtype T :: Type where MkT :: Int -> (T :: Star)

            ; String -> SDoc -> TcRn ()
    traceTc String
    "checkValidDataCon 2" (Type -> SDoc
    forall a. Outputable a => a -> SDoc
    ppr Type
    data_con_display_type)

              -- Check that the result type is a *monotype*
              --  e.g. reject this:   MkT :: T (forall a. a->a)
              -- Reason: it's really the argument of an equality constraint
            ; Type -> TcRn ()
    checkValidMonoType Type
    orig_res_ty
            ; Type -> TcRn ()
    checkEscapingKind (DataCon -> Type
    dataConWrapperType DataCon
    con)

            -- For /data/ types check that each argument has a fixed runtime rep
            -- If we are dealing with a /newtype/, we allow representation
            -- polymorphism regardless of whether or not UnliftedNewtypes
            -- is enabled. A later check in checkNewDataCon handles this,
            -- producing a better error message than checkTypeHasFixedRuntimeRep would.
            ; let check_rr :: Type -> TcRn ()
    check_rr = FixedRuntimeRepProvenance -> Type -> TcRn ()
    checkTypeHasFixedRuntimeRep FixedRuntimeRepProvenance
    FixedRuntimeRepDataConField
            ; Bool -> TcRn () -> TcRn ()
    forall (f :: * -> *). Applicative f => Bool -> f () -> f ()
    unless (TyCon -> Bool
    isNewTyCon TyCon
    tc) (TcRn () -> TcRn ()) -> TcRn () -> TcRn ()
    forall a b. (a -> b) -> a -> b
    $
              TcRn () -> TcRn ()
    forall r. TcM r -> TcM r
    checkNoErrs            (TcRn () -> TcRn ()) -> TcRn () -> TcRn ()
    forall a b. (a -> b) -> a -> b
    $
              (Scaled Type -> TcRn ()) -> [Scaled Type] -> TcRn ()
    forall (t :: * -> *) (m :: * -> *) a b.
    (Foldable t, Monad m) =>
    (a -> m b) -> t a -> m ()
    mapM_ (Type -> TcRn ()
    check_rr (Type -> TcRn ())
    -> (Scaled Type -> Type) -> Scaled Type -> TcRn ()
    forall b c a. (b -> c) -> (a -> b) -> a -> c
    . Scaled Type -> Type
    forall a. Scaled a -> a
    scaledThing) [Scaled Type]
    arg_tys
                -- The checkNoErrs is to prevent a panic in isVanillaDataCon
                -- (called a a few lines down), which can fall over if there is a
                -- bang on a representation-polymorphic argument. This is #18534,
                -- typecheck/should_fail/T18534

              -- Extra checks for newtype data constructors. Importantly, these
              -- checks /must/ come before the call to checkValidType below. This
              -- is because checkValidType invokes the constraint solver, and
              -- invoking the solver on an ill formed newtype constructor can
              -- confuse GHC to the point of panicking. See #17955 for an example.
            ; Bool -> TcRn () -> TcRn ()
    forall (f :: * -> *). Applicative f => Bool -> f () -> f ()
    when (TyCon -> Bool
    isNewTyCon TyCon
    tc) (DataCon -> TcRn ()
    checkNewDataCon DataCon
    con)

              -- Check all argument types for validity
            ; UserTypeCtxt -> Type -> TcRn ()
    checkValidType UserTypeCtxt
    ctxt Type
    data_con_display_type

              -- Check that existentials are allowed if they are used
            ; Bool -> TcRn () -> TcRn ()
    forall (f :: * -> *). Applicative f => Bool -> f () -> f ()
    unless (Bool
    existential_ok Bool -> Bool -> Bool
    || DataCon -> Bool
    isVanillaDataCon DataCon
    con) (TcRn () -> TcRn ()) -> TcRn () -> TcRn ()
    forall a b. (a -> b) -> a -> b
    $
                      TcRnMessage -> TcRn ()
    addErrTc (DataCon -> TcRnMessage
    TcRnExistentialQuantificationDisabled DataCon
    con)

              -- Check that the only constraints in signatures of constructors
              -- in a "type data" declaration are equality constraints.
              -- See Note [Type data declarations] in GHC.Rename.Module,
              -- restriction (R4).
            ; Bool -> TcRn () -> TcRn ()
    forall (f :: * -> *). Applicative f => Bool -> f () -> f ()
    when (DataCon -> Bool
    isTypeDataCon DataCon
    con) (TcRn () -> TcRn ()) -> TcRn () -> TcRn ()
    forall a b. (a -> b) -> a -> b
    $
              Bool -> TcRnMessage -> TcRn ()
    checkTc ((Type -> Bool) -> ThetaType -> Bool
    forall (t :: * -> *) a. Foldable t => (a -> Bool) -> t a -> Bool
    all Type -> Bool
    isEqPred (DataCon -> ThetaType
    dataConOtherTheta DataCon
    con))
                      (Type -> TcRnMessage
    TcRnConstraintInKind (DataCon -> Type
    dataConRepType DataCon
    con))

            ; hsc_env <- IOEnv (Env TcGblEnv TcLclEnv) HscEnv
    forall gbl lcl. TcRnIf gbl lcl HscEnv
    getTopEnv
            ; let check_bang :: Type -> HsSrcBang -> HsImplBang -> Int -> TcM ()
                  check_bang Type
    orig_arg_ty HsSrcBang
    bang HsImplBang
    rep_bang Int
    n
                   | HsSrcBang SourceText
    _ SrcUnpackedness
    _ SrcStrictness
    SrcLazy <- HsSrcBang
    bang
                   , Bool -> Bool
    not (BangOpts -> Bool
    bang_opt_strict_data BangOpts
    bang_opts)
                   = TcRnMessage -> TcRn ()
    addErrTc (Int -> BadFieldAnnotationReason -> TcRnMessage
    bad_bang Int
    n BadFieldAnnotationReason
    LazyFieldsDisabled)

                   -- Warn about UNPACK without "!"
                   -- e.g.   data T = MkT {-# UNPACK #-} Int
                   | HsSrcBang SourceText
    _ SrcUnpackedness
    want_unpack SrcStrictness
    strict_mark <- HsSrcBang
    bang
                   , SrcUnpackedness -> Bool
    isSrcUnpacked SrcUnpackedness
    want_unpack, Bool -> Bool
    not (SrcStrictness -> Bool
    is_strict SrcStrictness
    strict_mark)
                   , Bool -> Bool
    not (HasDebugCallStack => Type -> Bool
    Type -> Bool
    isUnliftedType Type
    orig_arg_ty)
                   = TcRnMessage -> TcRn ()
    addDiagnosticTc (Int -> BadFieldAnnotationReason -> TcRnMessage
    bad_bang Int
    n BadFieldAnnotationReason
    UnpackWithoutStrictness)

                   -- Warn about a redundant ! on an unlifted type
                   -- e.g.   data T = MkT !Int#
                   | HsSrcBang SourceText
    _ SrcUnpackedness
    _ SrcStrictness
    SrcStrict <- HsSrcBang
    bang
                   , HasDebugCallStack => Type -> Bool
    Type -> Bool
    isUnliftedType Type
    orig_arg_ty
                   = TcRnMessage -> TcRn ()
    addDiagnosticTc (TcRnMessage -> TcRn ()) -> TcRnMessage -> TcRn ()
    forall a b. (a -> b) -> a -> b
    $ Type -> TcRnMessage
    TcRnBangOnUnliftedType Type
    orig_arg_ty

                   -- Warn about a ~ on an unlifted type (#21951)
                   -- e.g.   data T = MkT ~Int#
                   | HsSrcBang SourceText
    _ SrcUnpackedness
    _ SrcStrictness
    SrcLazy <- HsSrcBang
    bang
                   , HasDebugCallStack => Type -> Bool
    Type -> Bool
    isUnliftedType Type
    orig_arg_ty
                   = TcRnMessage -> TcRn ()
    addDiagnosticTc (TcRnMessage -> TcRn ()) -> TcRnMessage -> TcRn ()
    forall a b. (a -> b) -> a -> b
    $ Type -> TcRnMessage
    TcRnLazyBangOnUnliftedType Type
    orig_arg_ty

                   -- Warn about unusable UNPACK pragmas
                   -- e.g.   data T a = MkT {-# UNPACK #-} !a      -- Can't unpack
                   | HsSrcBang SourceText
    _ SrcUnpackedness
    want_unpack SrcStrictness
    _ <- HsSrcBang
    bang

                   -- See Note [Detecting useless UNPACK pragmas] in GHC.Core.DataCon.
                   , SrcUnpackedness -> Bool
    isSrcUnpacked SrcUnpackedness
    want_unpack  -- this means the user wrote {-# UNPACK #-}
                   , case HsImplBang
    rep_bang of { HsUnpack {} -> Bool
    False; HsStrict Bool
    True -> Bool
    False; HsImplBang
    _ -> Bool
    True }

                   -- When typechecking an indefinite package in Backpack, we
                   -- may attempt to UNPACK an abstract type.  The test here will
                   -- conclude that this is unusable, but it might become usable
                   -- when we actually fill in the abstract type.  As such, don't
                   -- warn in this case (it gives users the wrong idea about whether
                   -- or not UNPACK on abstract types is supported; it is!)
                   , HomeUnit -> Bool
    forall u. GenHomeUnit u -> Bool
    isHomeUnitDefinite (HscEnv -> HomeUnit
    hsc_home_unit HscEnv
    hsc_env)
                   = TcRnMessage -> TcRn ()
    addDiagnosticTc (Int -> BadFieldAnnotationReason -> TcRnMessage
    bad_bang Int
    n BadFieldAnnotationReason
    BackpackUnpackAbstractType)

                   | Bool
    otherwise
                   = () -> TcRn ()
    forall a. a -> IOEnv (Env TcGblEnv TcLclEnv) a
    forall (m :: * -> *) a. Monad m => a -> m a
    return ()

            ; void $ zipWith4M check_bang (map scaledThing $ dataConOrigArgTys con)
              (dataConSrcBangs con) (dataConImplBangs con) [1..]

              -- Check the dcUserTyVarBinders invariant
              -- See Note [DataCon user type variable binders] in GHC.Core.DataCon
              -- checked here because we sometimes build invalid DataCons before
              -- erroring above here
            ; when debugIsOn $ whenNoErrs $
              massertPpr (checkDataConTyVars con) $
              ppr con $$  ppr (dataConFullSig con) $$ ppr (dataConUserTyVars con)

            ; traceTc "Done validity of data con" $
              vcat [ ppr con
                   , text "Datacon wrapper type:" <+> ppr (dataConWrapperType con)
                   , text "Datacon rep type:" <+> ppr (dataConRepType con)
                   , text "Datacon display type:" <+> ppr data_con_display_type
                   , text "Rep typcon binders:" <+> ppr (tyConBinders (dataConTyCon con))
                   , case tyConFamInst_maybe (dataConTyCon con) of
                       Maybe (TyCon, ThetaType)
    Nothing -> String -> SDoc
    forall doc. IsLine doc => String -> doc
    text String
    "not family"
                       Just (TyCon
    f, ThetaType
    _) -> [TyConBinder] -> SDoc
    forall a. Outputable a => a -> SDoc
    ppr (TyCon -> [TyConBinder]
    tyConBinders TyCon
    f) ]
        }
      where
        bang_opts :: BangOpts
    bang_opts = DynFlags -> BangOpts
    initBangOpts DynFlags
    dflags
        con_name :: Name
    con_name  = DataCon -> Name
    dataConName DataCon
    con
        con_loc :: SrcSpan
    con_loc   = Name -> SrcSpan
    nameSrcSpan Name
    con_name
        ctxt :: UserTypeCtxt
    ctxt      = Name -> UserTypeCtxt
    ConArgCtxt Name
    con_name
        is_strict :: SrcStrictness -> Bool
    is_strict = \case
          SrcStrictness
    NoSrcStrict -> BangOpts -> Bool
    bang_opt_strict_data BangOpts
    bang_opts
          SrcStrictness
    bang        -> SrcStrictness -> Bool
    isSrcStrict SrcStrictness
    bang

        bad_bang :: Int -> BadFieldAnnotationReason -> TcRnMessage
    bad_bang Int
    n
          = Int -> DataCon -> BadFieldAnnotationReason -> TcRnMessage
    TcRnBadFieldAnnotation Int
    n DataCon
    con

        show_linear_types :: Bool
    show_linear_types     = Extension -> DynFlags -> Bool
    xopt Extension
    LangExt.LinearTypes DynFlags
    dflags
        data_con_display_type :: Type
    data_con_display_type = Bool -> DataCon -> Type
    dataConDisplayType Bool
    show_linear_types DataCon
    con

    -------------------------------
    checkNewDataCon :: DataCon -> TcM ()
    -- Further checks for the data constructor of a newtype
    -- You might wonder if we need to check for an unlifted newtype
    -- without -XUnliftedNewtypes, such as
    --   newtype C = MkC Int#
    -- But they are caught earlier, by GHC.Tc.Gen.HsType.checkDataKindSig
    checkNewDataCon :: DataCon -> TcRn ()
    checkNewDataCon DataCon
    con
      = do  { show_linear_types <- Extension -> DynFlags -> Bool
    xopt Extension
    LangExt.LinearTypes (DynFlags -> Bool)
    -> IOEnv (Env TcGblEnv TcLclEnv) DynFlags
    -> TcRnIf TcGblEnv TcLclEnv Bool
    forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
    <$> IOEnv (Env TcGblEnv TcLclEnv) DynFlags
    forall (m :: * -> *). HasDynFlags m => m DynFlags
    getDynFlags
            ; checkNoErrs $
              -- Fail here if the newtype is invalid: subsequent code in
              -- checkValidDataCon can fall over if it comes across an invalid newtype.
         do { case arg_tys of
                [Scaled Type
    arg_mult Type
    _] ->
                  Bool -> TcRn () -> TcRn ()
    forall (f :: * -> *). Applicative f => Bool -> f () -> f ()
    unless (Type -> Bool
    ok_mult Type
    arg_mult) (TcRn () -> TcRn ()) -> TcRn () -> TcRn ()
    forall a b. (a -> b) -> a -> b
    $
                  TcRnMessage -> TcRn ()
    addErrTc (TcRnMessage -> TcRn ()) -> TcRnMessage -> TcRn ()
    forall a b. (a -> b) -> a -> b
    $
                  DataCon -> Bool -> IllegalNewtypeReason -> TcRnMessage
    TcRnIllegalNewtype DataCon
    con Bool
    show_linear_types IllegalNewtypeReason
    IsNonLinear
                [Scaled Type]
    _ ->
                  TcRnMessage -> TcRn ()
    addErrTc (TcRnMessage -> TcRn ()) -> TcRnMessage -> TcRn ()
    forall a b. (a -> b) -> a -> b
    $
                  DataCon -> Bool -> IllegalNewtypeReason -> TcRnMessage
    TcRnIllegalNewtype DataCon
    con Bool
    show_linear_types (Int -> IllegalNewtypeReason
    DoesNotHaveSingleField (Int -> IllegalNewtypeReason) -> Int -> IllegalNewtypeReason
    forall a b. (a -> b) -> a -> b
    $ [Scaled Type] -> Int
    forall a. [a] -> Int
    forall (t :: * -> *) a. Foldable t => t a -> Int
    length [Scaled Type]
    arg_tys)

              -- Add an error if the newtype is a GADt or has existentials.
              --
              -- If the newtype is a GADT, the GADT error is enough;
              -- we don't need to *also* complain about existentials.
            ; if not (null eq_spec)
              then addErrTc $ TcRnIllegalNewtype con show_linear_types IsGADT
              else unless (null ex_tvs) $
                   addErrTc $
                   TcRnIllegalNewtype con show_linear_types HasExistentialTyVar

            ; unless (null theta) $
              addErrTc $
              TcRnIllegalNewtype con show_linear_types HasConstructorContext

            ; unless (all ok_bang (dataConSrcBangs con)) $
              addErrTc $
              TcRnIllegalNewtype con show_linear_types HasStrictnessAnnotation } }
      where

        ([Var]
    _univ_tvs, [Var]
    ex_tvs, [EqSpec]
    eq_spec, ThetaType
    theta, [Scaled Type]
    arg_tys, Type
    _res_ty)
          = DataCon -> ([Var], [Var], [EqSpec], ThetaType, [Scaled Type], Type)
    dataConFullSig DataCon
    con

        ok_bang :: HsSrcBang -> Bool
    ok_bang (HsSrcBang SourceText
    _ SrcUnpackedness
    _ SrcStrictness
    SrcStrict) = Bool
    False
        ok_bang (HsSrcBang SourceText
    _ SrcUnpackedness
    _ SrcStrictness
    SrcLazy)   = Bool
    False
        ok_bang HsSrcBang
    _                         = Bool
    True

        ok_mult :: Type -> Bool
    ok_mult Type
    OneTy = Bool
    True
        ok_mult Type
    _     = Bool
    False

    -------------------------------
    checkValidClass :: Class -> TcM ()
    checkValidClass :: Class -> TcRn ()
    checkValidClass Class
    cls
      = do  { constrained_class_methods <- Extension -> TcRnIf TcGblEnv TcLclEnv Bool
    forall gbl lcl. Extension -> TcRnIf gbl lcl Bool
    xoptM Extension
    LangExt.ConstrainedClassMethods
            ; multi_param_type_classes  <- xoptM LangExt.MultiParamTypeClasses
            ; nullary_type_classes      <- xoptM LangExt.NullaryTypeClasses
            ; fundep_classes            <- xoptM LangExt.FunctionalDependencies
            ; undecidable_super_classes <- xoptM LangExt.UndecidableSuperClasses

            -- Check that the class is unary, unless multiparameter type classes
            -- are enabled; also recognize deprecated nullary type classes
            -- extension (subsumed by multiparameter type classes, #8993)
            ; checkTc (multi_param_type_classes || cls_arity == 1 ||
                        (nullary_type_classes && cls_arity == 0))
                      (TcRnClassExtensionDisabled cls (MultiParamDisabled cls_arity))
            ; unless (fundep_classes || null fundeps) $
                     addErrTc (TcRnClassExtensionDisabled cls FunDepsDisabled)

            -- Check the super-classes
            ; checkValidTheta (ClassSCCtxt (className cls)) theta

              -- Now check for cyclic superclasses
              -- If there are superclass cycles, checkClassCycleErrs bails.
            ; unless undecidable_super_classes $
              case checkClassCycles cls of
                 Just SuperclassCycle
    err -> SrcSpan -> TcRn () -> TcRn ()
    forall a. SrcSpan -> TcRn a -> TcRn a
    setSrcSpan (Class -> SrcSpan
    forall a. NamedThing a => a -> SrcSpan
    getSrcSpan Class
    cls) (TcRn () -> TcRn ()) -> TcRn () -> TcRn ()
    forall a b. (a -> b) -> a -> b
    $
                             TcRnMessage -> TcRn ()
    addErrTc (SuperclassCycle -> TcRnMessage
    TcRnSuperclassCycle SuperclassCycle
    err)
                 Maybe SuperclassCycle
    Nothing  -> () -> TcRn ()
    forall a. a -> IOEnv (Env TcGblEnv TcLclEnv) a
    forall (m :: * -> *) a. Monad m => a -> m a
    return ()

            -- Check the class operations.
            -- But only if there have been no earlier errors
            -- See Note [Abort when superclass cycle is detected]
            ; whenNoErrs $
              mapM_ (check_op constrained_class_methods) op_stuff

            -- Check the associated type defaults are well-formed and instantiated
            ; mapM_ check_at at_stuff  }
      where
        ([Var]
    tyvars, [([Var], [Var])]
    fundeps, ThetaType
    theta, [Var]
    _, [ClassATItem]
    at_stuff, [(Var, DefMethInfo)]
    op_stuff) = Class
    -> ([Var], [([Var], [Var])], ThetaType, [Var], [ClassATItem],
        [(Var, DefMethInfo)])
    classExtraBigSig Class
    cls
        cls_arity :: Int
    cls_arity = [Var] -> Int
    forall a. [a] -> Int
    forall (t :: * -> *) a. Foldable t => t a -> Int
    length (TyCon -> [Var]
    tyConVisibleTyVars (Class -> TyCon
    classTyCon Class
    cls))
           -- Ignore invisible variables
        cls_tv_set :: VarSet
    cls_tv_set = [Var] -> VarSet
    mkVarSet [Var]
    tyvars

        check_op :: Bool -> (Var, DefMethInfo) -> TcRn ()
    check_op Bool
    constrained_class_methods (Var
    sel_id, DefMethInfo
    dm)
          = SrcSpan -> TcRn () -> TcRn ()
    forall a. SrcSpan -> TcRn a -> TcRn a
    setSrcSpan (Var -> SrcSpan
    forall a. NamedThing a => a -> SrcSpan
    getSrcSpan Var
    sel_id) (TcRn () -> TcRn ()) -> TcRn () -> TcRn ()
    forall a b. (a -> b) -> a -> b
    $
            SDoc -> TcRn () -> TcRn ()
    forall a. SDoc -> TcM a -> TcM a
    addErrCtxt (Var -> Type -> SDoc
    classOpCtxt Var
    sel_id Type
    op_ty) (TcRn () -> TcRn ()) -> TcRn () -> TcRn ()
    forall a b. (a -> b) -> a -> b
    $ do
            { String -> SDoc -> TcRn ()
    traceTc String
    "class op type" (Type -> SDoc
    forall a. Outputable a => a -> SDoc
    ppr Type
    op_ty)
            ; UserTypeCtxt -> Type -> TcRn ()
    checkValidType UserTypeCtxt
    ctxt Type
    op_ty
                    -- This implements the ambiguity check, among other things
                    -- Example: tc223
                    --   class Error e => Game b mv e | b -> mv e where
                    --      newBoard :: MonadState b m => m ()
                    -- Here, MonadState has a fundep m->b, so newBoard is fine

            -- NB: we don't check that the class method is not representation-polymorphic here,
            -- as GHC.TcGen.TyCl.tcClassSigType already includes a subtype check that guarantees
            -- typeclass methods always have kind 'Type'.
            --
            -- Test case: rep-poly/RepPolyClassMethod.

            ; Bool -> TcRn () -> TcRn ()
    forall (f :: * -> *). Applicative f => Bool -> f () -> f ()
    unless Bool
    constrained_class_methods (TcRn () -> TcRn ()) -> TcRn () -> TcRn ()
    forall a b. (a -> b) -> a -> b
    $
              (Type -> TcRn ()) -> ThetaType -> TcRn ()
    forall (t :: * -> *) (m :: * -> *) a b.
    (Foldable t, Monad m) =>
    (a -> m b) -> t a -> m ()
    mapM_ Type -> TcRn ()
    check_constraint ThetaType
    op_theta

            ; UserTypeCtxt -> Var -> Type -> Type -> DefMethInfo -> TcRn ()
    check_dm UserTypeCtxt
    ctxt Var
    sel_id Type
    cls_pred Type
    tau2 DefMethInfo
    dm
            }
            where
              ctxt :: UserTypeCtxt
    ctxt    = Name -> ReportRedundantConstraints -> UserTypeCtxt
    FunSigCtxt Name
    op_name (SrcSpan -> ReportRedundantConstraints
    WantRRC (Class -> SrcSpan
    forall a. NamedThing a => a -> SrcSpan
    getSrcSpan Class
    cls)) -- Report redundant class constraints
              op_name :: Name
    op_name = Var -> Name
    idName Var
    sel_id
              op_ty :: Type
    op_ty   = Var -> Type
    idType Var
    sel_id
              ([Var]
    _,Type
    cls_pred,Type
    tau1) = Type -> ([Var], Type, Type)
    tcSplitMethodTy Type
    op_ty
              -- See Note [Splitting nested sigma types in class type signatures]
              ([Var]
    _,ThetaType
    op_theta,Type
    tau2) = Type -> ([Var], ThetaType, Type)
    tcSplitNestedSigmaTys Type
    tau1

              check_constraint :: TcPredType -> TcM ()
              check_constraint :: Type -> TcRn ()
    check_constraint Type
    pred -- See Note [Class method constraints]
                = Bool -> TcRn () -> TcRn ()
    forall (f :: * -> *). Applicative f => Bool -> f () -> f ()
    when (Bool -> Bool
    not (VarSet -> Bool
    isEmptyVarSet VarSet
    pred_tvs) Bool -> Bool -> Bool
    &&
                        VarSet
    pred_tvs VarSet -> VarSet -> Bool
    `subVarSet` VarSet
    cls_tv_set)
                       (TcRnMessage -> TcRn ()
    addErrTc (Class -> DisabledClassExtension -> TcRnMessage
    TcRnClassExtensionDisabled Class
    cls (Var -> Type -> DisabledClassExtension
    ConstrainedClassMethodsDisabled Var
    sel_id Type
    pred)))
                where
                  pred_tvs :: VarSet
    pred_tvs = Type -> VarSet
    tyCoVarsOfType Type
    pred

        check_at :: ClassATItem -> TcRn ()
    check_at (ATI TyCon
    fam_tc Maybe (Type, TyFamEqnValidityInfo)
    m_dflt_rhs)
          = do { String -> SDoc -> TcRn ()
    traceTc String
    "ati" (TyCon -> SDoc
    forall a. Outputable a => a -> SDoc
    ppr TyCon
    fam_tc SDoc -> SDoc -> SDoc
    forall doc. IsDoc doc => doc -> doc -> doc
    $$ [Var] -> SDoc
    forall a. Outputable a => a -> SDoc
    ppr [Var]
    tyvars SDoc -> SDoc -> SDoc
    forall doc. IsDoc doc => doc -> doc -> doc
    $$ [Var] -> SDoc
    forall a. Outputable a => a -> SDoc
    ppr [Var]
    fam_tvs)
               ; Bool -> TcRnMessage -> TcRn ()
    checkTc (Int
    cls_arity Int -> Int -> Bool
    forall a. Eq a => a -> a -> Bool
    == Int
    0 Bool -> Bool -> Bool
    || (Var -> Bool) -> [Var] -> Bool
    forall (t :: * -> *) a. Foldable t => (a -> Bool) -> t a -> Bool
    any (Var -> VarSet -> Bool
    `elemVarSet` VarSet
    cls_tv_set) [Var]
    fam_tvs) (TcRnMessage -> TcRn ()) -> TcRnMessage -> TcRn ()
    forall a b. (a -> b) -> a -> b
    $
                  IllegalInstanceReason -> TcRnMessage
    TcRnIllegalInstance (IllegalInstanceReason -> TcRnMessage)
    -> IllegalInstanceReason -> TcRnMessage
    forall a b. (a -> b) -> a -> b
    $ IllegalFamilyInstanceReason -> IllegalInstanceReason
    IllegalFamilyInstance (IllegalFamilyInstanceReason -> IllegalInstanceReason)
    -> IllegalFamilyInstanceReason -> IllegalInstanceReason
    forall a b. (a -> b) -> a -> b
    $
                    InvalidAssoc -> IllegalFamilyInstanceReason
    InvalidAssoc (InvalidAssoc -> IllegalFamilyInstanceReason)
    -> InvalidAssoc -> IllegalFamilyInstanceReason
    forall a b. (a -> b) -> a -> b
    $ InvalidAssocInstance -> InvalidAssoc
    InvalidAssocInstance (InvalidAssocInstance -> InvalidAssoc)
    -> InvalidAssocInstance -> InvalidAssoc
    forall a b. (a -> b) -> a -> b
    $
                    Class -> TyCon -> InvalidAssocInstance
    AssocNoClassTyVar Class
    cls TyCon
    fam_tc
                            -- Check that the associated type mentions at least
                            -- one of the class type variables
                            -- The check is disabled for nullary type classes,
                            -- since there is no possible ambiguity (#10020)

                 -- Check that any default declarations for associated types are valid
               ; Maybe (Type, TyFamEqnValidityInfo)
    -> ((Type, TyFamEqnValidityInfo) -> TcRn ()) -> TcRn ()
    forall (m :: * -> *) a. Monad m => Maybe a -> (a -> m ()) -> m ()
    whenIsJust Maybe (Type, TyFamEqnValidityInfo)
    m_dflt_rhs (((Type, TyFamEqnValidityInfo) -> TcRn ()) -> TcRn ())
    -> ((Type, TyFamEqnValidityInfo) -> TcRn ()) -> TcRn ()
    forall a b. (a -> b) -> a -> b
    $ \ (Type
    _, TyFamEqnValidityInfo
    at_validity_info) ->
                 case TyFamEqnValidityInfo
    at_validity_info of
                   TyFamEqnValidityInfo
    NoVI -> () -> TcRn ()
    forall a. a -> IOEnv (Env TcGblEnv TcLclEnv) a
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure ()
                   VI { vi_loc :: TyFamEqnValidityInfo -> SrcSpan
    vi_loc          = SrcSpan
    loc
                      , vi_qtvs :: TyFamEqnValidityInfo -> [Var]
    vi_qtvs         = [Var]
    qtvs
                      , vi_non_user_tvs :: TyFamEqnValidityInfo -> VarSet
    vi_non_user_tvs = VarSet
    non_user_tvs
                      , vi_pats :: TyFamEqnValidityInfo -> ThetaType
    vi_pats         = ThetaType
    pats
                      , vi_rhs :: TyFamEqnValidityInfo -> Type
    vi_rhs          = Type
    orig_rhs } ->
                     SrcSpan -> TcRn () -> TcRn ()
    forall a. SrcSpan -> TcRn a -> TcRn a
    setSrcSpan SrcSpan
    loc (TcRn () -> TcRn ()) -> TcRn () -> TcRn ()
    forall a b. (a -> b) -> a -> b
    $
                     SDoc -> Name -> TcRn () -> TcRn ()
    forall a. SDoc -> Name -> TcM a -> TcM a
    tcAddFamInstCtxt (String -> SDoc
    forall doc. IsLine doc => String -> doc
    text String
    "default type instance") (TyCon -> Name
    forall a. NamedThing a => a -> Name
    getName TyCon
    fam_tc) (TcRn () -> TcRn ()) -> TcRn () -> TcRn ()
    forall a b. (a -> b) -> a -> b
    $
                     do { TyCon -> ThetaType -> TcRn ()
    checkValidAssocTyFamDeflt TyCon
    fam_tc ThetaType
    pats
                        ; TyCon -> [Var] -> VarSet -> ThetaType -> Type -> TcRn ()
    checkFamPatBinders TyCon
    fam_tc [Var]
    qtvs VarSet
    non_user_tvs ThetaType
    pats Type
    orig_rhs
                        ; TyCon -> ThetaType -> Type -> TcRn ()
    checkValidTyFamEqn TyCon
    fam_tc ThetaType
    pats Type
    orig_rhs }}
            where
              fam_tvs :: [Var]
    fam_tvs = TyCon -> [Var]
    tyConTyVars TyCon
    fam_tc

        check_dm :: UserTypeCtxt -> Id -> PredType -> Type -> DefMethInfo -> TcM ()
        -- Check validity of the /top-level/ generic-default type
        -- E.g for   class C a where
        --             default op :: forall b. (a~b) => blah
        -- we do not want to do an ambiguity check on a type with
        -- a free TyVar 'a' (#11608).  See TcType
        -- Note [TyVars and TcTyVars during type checking] in GHC.Tc.Utils.TcType
        -- Hence the mkDefaultMethodType to close the type.
        check_dm :: UserTypeCtxt -> Var -> Type -> Type -> DefMethInfo -> TcRn ()
    check_dm UserTypeCtxt
    ctxt Var
    sel_id Type
    vanilla_cls_pred Type
    vanilla_tau
                 (Just (Name
    dm_name, dm_spec :: DefMethSpec Type
    dm_spec@(GenericDM Type
    dm_ty)))
          = SrcSpan -> TcRn () -> TcRn ()
    forall a. SrcSpan -> TcRn a -> TcRn a
    setSrcSpan (Name -> SrcSpan
    forall a. NamedThing a => a -> SrcSpan
    getSrcSpan Name
    dm_name) (TcRn () -> TcRn ()) -> TcRn () -> TcRn ()
    forall a b. (a -> b) -> a -> b
    $ do
                -- We have carefully set the SrcSpan on the generic
                -- default-method Name to be that of the generic
                -- default type signature

              -- First, we check that the method's default type signature
              -- aligns with the non-default type signature.
              -- See Note [Default method type signatures must align]
              let cls_pred :: Type
    cls_pred = Class -> ThetaType -> Type
    mkClassPred Class
    cls (ThetaType -> Type) -> ThetaType -> Type
    forall a b. (a -> b) -> a -> b
    $ [Var] -> ThetaType
    mkTyVarTys ([Var] -> ThetaType) -> [Var] -> ThetaType
    forall a b. (a -> b) -> a -> b
    $ Class -> [Var]
    classTyVars Class
    cls
                  -- Note that the second field of this tuple contains the context
                  -- of the default type signature, making it apparent that we
                  -- ignore method contexts completely when validity-checking
                  -- default type signatures. See the end of
                  -- Note [Default method type signatures must align]
                  -- to learn why this is OK.
                  --
                  -- See also
                  -- Note [Splitting nested sigma types in class type signatures]
                  -- for an explanation of why we don't use tcSplitSigmaTy here.
                  ([Var]
    _, ThetaType
    _, Type
    dm_tau) = Type -> ([Var], ThetaType, Type)
    tcSplitNestedSigmaTys Type
    dm_ty

                  -- Given this class definition:
                  --
                  --  class C a b where
                  --    op         :: forall p q. (Ord a, D p q)
                  --               => a -> b -> p -> (a, b)
                  --    default op :: forall r s. E r
                  --               => a -> b -> s -> (a, b)
                  --
                  -- We want to match up two types of the form:
                  --
                  --   Vanilla type sig: C aa bb => aa -> bb -> p -> (aa, bb)
                  --   Default type sig: C a  b  => a  -> b  -> s -> (a,  b)
                  --
                  -- Notice that the two type signatures can be quantified over
                  -- different class type variables! Therefore, it's important that
                  -- we include the class predicate parts to match up a with aa and
                  -- b with bb.
                  vanilla_phi_ty :: Type
    vanilla_phi_ty = ThetaType -> Type -> Type
    HasDebugCallStack => ThetaType -> Type -> Type
    mkPhiTy [Type
    vanilla_cls_pred] Type
    vanilla_tau
                  dm_phi_ty :: Type
    dm_phi_ty      = ThetaType -> Type -> Type
    HasDebugCallStack => ThetaType -> Type -> Type
    mkPhiTy [Type
    cls_pred] Type
    dm_tau

              String -> SDoc -> TcRn ()
    traceTc String
    "check_dm" (SDoc -> TcRn ()) -> SDoc -> TcRn ()
    forall a b. (a -> b) -> a -> b
    $ [SDoc] -> SDoc
    forall doc. IsDoc doc => [doc] -> doc
    vcat
                  [ String -> SDoc
    forall doc. IsLine doc => String -> doc
    text String
    "vanilla_phi_ty" SDoc -> SDoc -> SDoc
    forall doc. IsLine doc => doc -> doc -> doc
    <+> Type -> SDoc
    forall a. Outputable a => a -> SDoc
    ppr Type
    vanilla_phi_ty
                  , String -> SDoc
    forall doc. IsLine doc => String -> doc
    text String
    "dm_phi_ty"      SDoc -> SDoc -> SDoc
    forall doc. IsLine doc => doc -> doc -> doc
    <+> Type -> SDoc
    forall a. Outputable a => a -> SDoc
    ppr Type
    dm_phi_ty ]

              -- Actually checking that the types align is done with a call to
              -- tcMatchTys. We need to get a match in both directions to rule
              -- out degenerate cases like these:
              --
              --  class Foo a where
              --    foo1         :: a -> b
              --    default foo1 :: a -> Int
              --
              --    foo2         :: a -> Int
              --    default foo2 :: a -> b
              Bool -> TcRn () -> TcRn ()
    forall (f :: * -> *). Applicative f => Bool -> f () -> f ()
    unless (Maybe Subst -> Bool
    forall a. Maybe a -> Bool
    isJust (Maybe Subst -> Bool) -> Maybe Subst -> Bool
    forall a b. (a -> b) -> a -> b
    $ ThetaType -> ThetaType -> Maybe Subst
    tcMatchTys [Type
    dm_phi_ty, Type
    vanilla_phi_ty]
                                          [Type
    vanilla_phi_ty, Type
    dm_phi_ty]) (TcRn () -> TcRn ()) -> TcRn () -> TcRn ()
    forall a b. (a -> b) -> a -> b
    $ TcRnMessage -> TcRn ()
    addErrTc (TcRnMessage -> TcRn ()) -> TcRnMessage -> TcRn ()
    forall a b. (a -> b) -> a -> b
    $
                   Var -> Type -> TcRnMessage
    TcRnDefaultSigMismatch Var
    sel_id Type
    dm_ty

              -- Now do an ambiguity check on the default type signature.
              UserTypeCtxt -> Type -> TcRn ()
    checkValidType UserTypeCtxt
    ctxt (Class -> Var -> DefMethSpec Type -> Type
    mkDefaultMethodType Class
    cls Var
    sel_id DefMethSpec Type
    dm_spec)
        check_dm UserTypeCtxt
    _ Var
    _ Type
    _ Type
    _ DefMethInfo
    _ = () -> TcRn ()
    forall a. a -> IOEnv (Env TcGblEnv TcLclEnv) a
    forall (m :: * -> *) a. Monad m => a -> m a
    return ()

    checkFamFlag :: Name -> TcM ()
    -- Check that we don't use families without -XTypeFamilies
    -- The parser won't even parse them, but I suppose a GHC API
    -- client might have a go!
    checkFamFlag :: Name -> TcRn ()
    checkFamFlag Name
    tc_name
      = do { idx_tys <- Extension -> TcRnIf TcGblEnv TcLclEnv Bool
    forall gbl lcl. Extension -> TcRnIf gbl lcl Bool
    xoptM Extension
    LangExt.TypeFamilies
           ; unless idx_tys $ addErrTc (TcRnTyFamsDisabled (TyFamsDisabledFamily tc_name)) }

    checkResultSigFlag :: Name -> FamilyResultSig GhcRn -> TcM ()
    checkResultSigFlag :: Name -> FamilyResultSig GhcRn -> TcRn ()
    checkResultSigFlag Name
    tc_name (TyVarSig XTyVarSig GhcRn
    _ LHsTyVarBndr () GhcRn
    tvb)
      = do { ty_fam_deps <- Extension -> TcRnIf TcGblEnv TcLclEnv Bool
    forall gbl lcl. Extension -> TcRnIf gbl lcl Bool
    xoptM Extension
    LangExt.TypeFamilyDependencies
           ; unless ty_fam_deps $ addErrTc (TcRnTyFamResultDisabled tc_name tvb) }
    checkResultSigFlag Name
    _ FamilyResultSig GhcRn
    _ = () -> TcRn ()
    forall a. a -> IOEnv (Env TcGblEnv TcLclEnv) a
    forall (m :: * -> *) a. Monad m => a -> m a
    return ()  -- other cases OK

    {- Note [Class method constraints]
    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    Haskell 2010 is supposed to reject
      class C a where
        op :: Eq a => a -> a
    where the method type constrains only the class variable(s).  (The extension
    -XConstrainedClassMethods switches off this check.)  But regardless
    we should not reject
      class C a where
        op :: (?x::Int) => a -> a
    as pointed out in #11793. So the test here rejects the program if
      * -XConstrainedClassMethods is off
      * the tyvars of the constraint are non-empty
      * all the tyvars are class tyvars, none are locally quantified

    Note [Abort when superclass cycle is detected]
    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    We must avoid doing the ambiguity check for the methods (in
    checkValidClass.check_op) when there are already errors accumulated.
    This is because one of the errors may be a superclass cycle, and
    superclass cycles cause canonicalization to loop. Here is a
    representative example:

      class D a => C a where
        meth :: D a => ()
      class C a => D a

    This fixes #9415, #9739

    Note [Default method type signatures must align]
    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    GHC enforces the invariant that a class method's default type signature
    must "align" with that of the method's non-default type signature, as per
    GHC #12918. For instance, if you have:

      class Foo a where
        bar :: forall b. Context => a -> b

    Then a default type signature for bar must be alpha equivalent to
    (forall b. a -> b). That is, the types must be the same modulo differences in
    contexts. So the following would be acceptable default type signatures:

        default bar :: forall b. Context1 => a -> b
        default bar :: forall x. Context2 => a -> x

    But the following are NOT acceptable default type signatures:

        default bar :: forall b. b -> a
        default bar :: forall x. x
        default bar :: a -> Int

    Note that a is bound by the class declaration for Foo itself, so it is
    not allowed to differ in the default type signature.

    The default type signature (default bar :: a -> Int) deserves special mention,
    since (a -> Int) is a straightforward instantiation of (forall b. a -> b). To
    write this, you need to declare the default type signature like so:

        default bar :: forall b. (b ~ Int). a -> b

    As noted in #12918, there are several reasons to do this:

    1. It would make no sense to have a type that was flat-out incompatible with
       the non-default type signature. For instance, if you had:

         class Foo a where
           bar :: a -> Int
           default bar :: a -> Bool

       Then that would always fail in an instance declaration. So this check
       nips such cases in the bud before they have the chance to produce
       confusing error messages.

    2. Internally, GHC uses TypeApplications to instantiate the default method in
       an instance. See Note [Default methods in instances] in GHC.Tc.TyCl.Instance.
       Thus, GHC needs to know exactly what the universally quantified type
       variables are, and when instantiated that way, the default method's type
       must match the expected type.

    3. Aesthetically, by only allowing the default type signature to differ in its
       context, we are making it more explicit the ways in which the default type
       signature is less polymorphic than the non-default type signature.

    You might be wondering: why are the contexts allowed to be different, but not
    the rest of the type signature? That's because default implementations often
    rely on assumptions that the more general, non-default type signatures do not.
    For instance, in the Enum class declaration:

        class Enum a where
          enum :: [a]
          default enum :: (Generic a, GEnum (Rep a)) => [a]
          enum = map to genum

        class GEnum f where
          genum :: [f a]

    The default implementation for enum only works for types that are instances of
    Generic, and for which their generic Rep type is an instance of GEnum. But
    clearly enum doesn't _have_ to use this implementation, so naturally, the
    context for enum is allowed to be different to accommodate this. As a result,
    when we validity-check default type signatures, we ignore contexts completely.

    Note that when checking whether two type signatures match, we must take care to
    split as many foralls as it takes to retrieve the tau types we which to check.
    See Note [Splitting nested sigma types in class type signatures].

    Extra note: July 22.  If we have
       class C a b where
          op :: op_ty
          default op :: def_ty
          op = blah

    then we'll generate something like
       $gdm_op :: C a b => def_ty
       $gdm_op = blah

    We expect to write an instance that looks (in effect) like this:
       instance G => C t1 t2 where
          op = $gdm_op  -- Added when you leave out binding for 'op'

    So we need that
      assuming constraints G, and C t1 t2,
      we have (def_ty[t1/a,t2/b] <= op_ty[t1/a,t2/b]

    In the validity check, we want to check that there is such a G.
    E.g. if we check  def_ty <= op_ty, and get an insoluble constraint
    (Int~Bool), we know there will never be such a G, and can complain.

    This seems to be a more general way of thinking about the problem.
    But no one is complaining, so it'll have to wait for another day

    Note [Splitting nested sigma types in class type signatures]
    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    Consider this type synonym and class definition:

      type Traversal s t a b = forall f. Applicative f => (a -> f b) -> s -> f t

      class Each s t a b where
        each         ::                                      Traversal s t a b
        default each :: (Traversable g, s ~ g a, t ~ g b) => Traversal s t a b

    It might seem obvious that the tau types in both type signatures for `each`
    are the same, but actually getting GHC to conclude this is surprisingly tricky.
    That is because in general, the form of a class method's non-default type
    signature is:

      forall a. C a => forall d. D d => E a b

    And the general form of a default type signature is:

      forall f. F f => E a f -- The variable `a` comes from the class

    So it you want to get the tau types in each type signature, you might find it
    reasonable to call tcSplitSigmaTy twice on the non-default type signature, and
    call it once on the default type signature. For most classes and methods, this
    will work, but Each is a bit of an exceptional case. The way `each` is written,
    it doesn't quantify any additional type variables besides those of the Each
    class itself, so the non-default type signature for `each` is actually this:

      forall s t a b. Each s t a b => Traversal s t a b

    Notice that there _appears_ to only be one forall. But there's actually another
    forall lurking in the Traversal type synonym, so if you call tcSplitSigmaTy
    twice, you'll also go under the forall in Traversal! That is, you'll end up
    with:

      (a -> f b) -> s -> f t

    A problem arises because you only call tcSplitSigmaTy once on the default type
    signature for `each`, which gives you

      Traversal s t a b

    Or, equivalently:

      forall f. Applicative f => (a -> f b) -> s -> f t

    This is _not_ the same thing as (a -> f b) -> s -> f t! So now tcMatchTy will
    say that the tau types for `each` are not equal.

    A solution to this problem is to use tcSplitNestedSigmaTys instead of
    tcSplitSigmaTy. tcSplitNestedSigmaTys will always split any foralls that it
    sees until it can't go any further, so if you called it on the default type
    signature for `each`, it would return (a -> f b) -> s -> f t like we desired.

    Note [Checking partial record field]
    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    This check checks the partial record field selector, and warns (#7169).

    For example:

      data T a = A { m1 :: a, m2 :: a } | B { m1 :: a }

    The function 'm2' is partial record field, and will fail when it is applied to
    'B'. The warning identifies such partial fields. The check is performed at the
    declaration of T, not at the call-sites of m2.

    The warning can be suppressed by prefixing the field-name with an underscore.
    For example:

      data T a = A { m1 :: a, _m2 :: a } | B { m1 :: a }

    ************************************************************************
    *                                                                      *
                    Checking role validity
    *                                                                      *
    ************************************************************************
    -}

    checkValidRoleAnnots :: RoleAnnotEnv -> TyCon -> TcM ()
    checkValidRoleAnnots :: RoleAnnotEnv -> TyCon -> TcRn ()
    checkValidRoleAnnots RoleAnnotEnv
    role_annots TyCon
    tc
      | TyCon -> Bool
    isTypeSynonymTyCon TyCon
    tc = TcRn ()
    check_no_roles
      | TyCon -> Bool
    isFamilyTyCon TyCon
    tc      = TcRn ()
    check_no_roles
      | TyCon -> Bool
    isAlgTyCon TyCon
    tc         = TcRn ()
    check_roles
      | Bool
    otherwise             = () -> TcRn ()
    forall a. a -> IOEnv (Env TcGblEnv TcLclEnv) a
    forall (m :: * -> *) a. Monad m => a -> m a
    return ()
      where
        -- Role annotations are given only on *explicit* variables,
        -- but a tycon stores roles for all variables.
        -- So, we drop the implicit roles (which are all Nominal, anyway).
        name :: Name
    name                   = TyCon -> Name
    tyConName TyCon
    tc
        roles :: [Role]
    roles                  = TyCon -> [Role]
    tyConRoles TyCon
    tc
        ([Role]
    vis_roles, [Var]
    vis_vars)  = [(Role, Var)] -> ([Role], [Var])
    forall a b. [(a, b)] -> ([a], [b])
    unzip ([(Role, Var)] -> ([Role], [Var]))
    -> [(Role, Var)] -> ([Role], [Var])
    forall a b. (a -> b) -> a -> b
    $ ((Role, TyConBinder) -> Maybe (Role, Var))
    -> [(Role, TyConBinder)] -> [(Role, Var)]
    forall a b. (a -> Maybe b) -> [a] -> [b]
    mapMaybe (Role, TyConBinder) -> Maybe (Role, Var)
    pick_vis ([(Role, TyConBinder)] -> [(Role, Var)])
    -> [(Role, TyConBinder)] -> [(Role, Var)]
    forall a b. (a -> b) -> a -> b
    $
                                 [Role] -> [TyConBinder] -> [(Role, TyConBinder)]
    forall a b. [a] -> [b] -> [(a, b)]
    zip [Role]
    roles (TyCon -> [TyConBinder]
    tyConBinders TyCon
    tc)
        role_annot_decl_maybe :: Maybe (LRoleAnnotDecl GhcRn)
    role_annot_decl_maybe  = RoleAnnotEnv -> Name -> Maybe (LRoleAnnotDecl GhcRn)
    lookupRoleAnnot RoleAnnotEnv
    role_annots Name
    name

        pick_vis :: (Role, TyConBinder) -> Maybe (Role, TyVar)
        pick_vis :: (Role, TyConBinder) -> Maybe (Role, Var)
    pick_vis (Role
    role, TyConBinder
    tvb)
          | TyConBinder -> Bool
    forall tv. VarBndr tv TyConBndrVis -> Bool
    isVisibleTyConBinder TyConBinder
    tvb = (Role, Var) -> Maybe (Role, Var)
    forall a. a -> Maybe a
    Just (Role
    role, TyConBinder -> Var
    forall tv argf. VarBndr tv argf -> tv
    binderVar TyConBinder
    tvb)
          | Bool
    otherwise                = Maybe (Role, Var)
    forall a. Maybe a
    Nothing

        check_roles :: TcRn ()
    check_roles = case Maybe (LRoleAnnotDecl GhcRn)
    role_annot_decl_maybe of
          Maybe (LRoleAnnotDecl GhcRn)
    Nothing ->
              SrcSpan -> TcRn () -> TcRn ()
    forall a. SrcSpan -> TcRn a -> TcRn a
    setSrcSpan (Name -> SrcSpan
    forall a. NamedThing a => a -> SrcSpan
    getSrcSpan Name
    name) (TcRn () -> TcRn ()) -> TcRn () -> TcRn ()
    forall a b. (a -> b) -> a -> b
    $
              -- See Note [Missing role annotations warning]
              Bool -> TcRnMessage -> TcRn ()
    warnIf (Bool -> Bool
    not (TyCon -> Bool
    isClassTyCon TyCon
    tc) Bool -> Bool -> Bool
    && Bool -> Bool
    not ([Role] -> Bool
    forall a. [a] -> Bool
    forall (t :: * -> *) a. Foldable t => t a -> Bool
    null [Role]
    vis_roles)) (TcRnMessage -> TcRn ()) -> TcRnMessage -> TcRn ()
    forall a b. (a -> b) -> a -> b
    $
              Name -> [Role] -> TcRnMessage
    TcRnMissingRoleAnnotation Name
    name [Role]
    vis_roles
          Just (decl :: LRoleAnnotDecl GhcRn
    decl@(L SrcSpanAnnA
    loc (RoleAnnotDecl XCRoleAnnotDecl GhcRn
    _ LIdP GhcRn
    _ [XRec GhcRn (Maybe Role)]
    the_role_annots))) ->
              Name -> TcRn () -> TcRn ()
    forall a. Name -> TcM a -> TcM a
    addRoleAnnotCtxt Name
    name (TcRn () -> TcRn ()) -> TcRn () -> TcRn ()
    forall a b. (a -> b) -> a -> b
    $
              SrcSpanAnnA -> TcRn () -> TcRn ()
    forall ann a. EpAnn ann -> TcRn a -> TcRn a
    setSrcSpanA SrcSpanAnnA
    loc (TcRn () -> TcRn ()) -> TcRn () -> TcRn ()
    forall a b. (a -> b) -> a -> b
    $ do
              { role_annots_ok <- Extension -> TcRnIf TcGblEnv TcLclEnv Bool
    forall gbl lcl. Extension -> TcRnIf gbl lcl Bool
    xoptM Extension
    LangExt.RoleAnnotations
              ; unless role_annots_ok $ addErrTc $ TcRnRoleAnnotationsDisabled tc
              ; checkTc (vis_vars `equalLength` the_role_annots)
                        (TcRnRoleCountMismatch (length vis_vars) decl)
              ; _ <- zipWith3M checkRoleAnnot vis_vars the_role_annots vis_roles
              -- Representational or phantom roles for class parameters
              -- quickly lead to incoherence. So, we require
              -- IncoherentInstances to have them. See #8773, #14292
              ; incoherent_roles_ok <- xoptM LangExt.IncoherentInstances
              ; checkTc (  incoherent_roles_ok
                        || (not $ isClassTyCon tc)
                        || (all (== Nominal) vis_roles))
                        (TcRnIncoherentRoles tc)

              ; lint <- goptM Opt_DoCoreLinting
              ; when lint $ checkValidRoles tc }

        check_no_roles :: TcRn ()
    check_no_roles
          = Maybe (GenLocated SrcSpanAnnA (RoleAnnotDecl GhcRn))
    -> (GenLocated SrcSpanAnnA (RoleAnnotDecl GhcRn) -> TcRn ())
    -> TcRn ()
    forall (m :: * -> *) a. Monad m => Maybe a -> (a -> m ()) -> m ()
    whenIsJust Maybe (LRoleAnnotDecl GhcRn)
    Maybe (GenLocated SrcSpanAnnA (RoleAnnotDecl GhcRn))
    role_annot_decl_maybe LRoleAnnotDecl GhcRn -> TcRn ()
    GenLocated SrcSpanAnnA (RoleAnnotDecl GhcRn) -> TcRn ()
    illegalRoleAnnotDecl

    -- Note [Missing role annotations warning]
    -- ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    -- We warn about missing role annotations for tycons
    -- 1. not type-classes:
    --    type classes are nominal by default, which is most conservative
    --    choice. E.g. we cannot have a type-class with an (accidentally)
    --    phantom or representational type variable, as we can with
    --    data types.
    -- 2. with visible roles
    --
    -- We don't make any exceptions for other data types.
    -- In particular we explicitly warn about omitted (default and common)
    -- representational roles. That is the point of the warning.
    -- For example the default representational role for `Map`s key type parameter
    -- would be wrong, and this warning is there to warn about it,
    -- asking users to be explicit.
    --
    -- If the default roles have been nominal, i.e. as conservative as possible,
    -- the warning would still be valuable, as most types can be `representational`
    -- (c.f. type-classes, which usually cannot).
    --
    -- We don't warn about types with invisible roles only, because users cannot
    -- specify them:
    --
    --    type Foo :: forall {k}. Type
    --    data Foo = Foo Int
    --    type role Foo phantom
    --
    -- is incorrect, GHC complains:
    -- Wrong number of roles listed in role annotation;
    -- Expected 0, got 1:
    --

    checkRoleAnnot :: TyVar -> LocatedAn NoEpAnns (Maybe Role) -> Role -> TcM ()
    checkRoleAnnot :: Var -> GenLocated EpAnnCO (Maybe Role) -> Role -> TcRn ()
    checkRoleAnnot Var
    _  (L EpAnnCO
    _ Maybe Role
    Nothing)   Role
    _  = () -> TcRn ()
    forall a. a -> IOEnv (Env TcGblEnv TcLclEnv) a
    forall (m :: * -> *) a. Monad m => a -> m a
    return ()
    checkRoleAnnot Var
    tv (L EpAnnCO
    _ (Just Role
    r1)) Role
    r2
      = Bool -> TcRn () -> TcRn ()
    forall (f :: * -> *). Applicative f => Bool -> f () -> f ()
    when (Role
    r1 Role -> Role -> Bool
    forall a. Eq a => a -> a -> Bool
    /= Role
    r2) (TcRn () -> TcRn ()) -> TcRn () -> TcRn ()
    forall a b. (a -> b) -> a -> b
    $
        TcRnMessage -> TcRn ()
    addErrTc (TcRnMessage -> TcRn ()) -> TcRnMessage -> TcRn ()
    forall a b. (a -> b) -> a -> b
    $ Name -> Role -> Role -> TcRnMessage
    TcRnRoleMismatch (Var -> Name
    tyVarName Var
    tv) Role
    r1 Role
    r2

    -- This is a double-check on the role inference algorithm. It is only run when
    -- -dcore-lint is enabled. See Note [Role inference] in GHC.Tc.TyCl.Utils
    checkValidRoles :: TyCon -> TcM ()
    -- If you edit this function, you may need to update the GHC formalism
    -- See Note [GHC Formalism] in GHC.Core.Lint
    checkValidRoles :: TyCon -> TcRn ()
    checkValidRoles TyCon
    tc
      | TyCon -> Bool
    isAlgTyCon TyCon
    tc
        -- tyConDataCons returns an empty list for data families
      = (DataCon -> TcRn ()) -> [DataCon] -> TcRn ()
    forall (t :: * -> *) (m :: * -> *) a b.
    (Foldable t, Monad m) =>
    (a -> m b) -> t a -> m ()
    mapM_ DataCon -> TcRn ()
    check_dc_roles (TyCon -> [DataCon]
    tyConDataCons TyCon
    tc)
      | Just Type
    rhs <- TyCon -> Maybe Type
    synTyConRhs_maybe TyCon
    tc
      = VarEnv Role -> Role -> Type -> TcRn ()
    check_ty_roles ([Var] -> [Role] -> VarEnv Role
    forall a. [Var] -> [a] -> VarEnv a
    zipVarEnv (TyCon -> [Var]
    tyConTyVars TyCon
    tc) (TyCon -> [Role]
    tyConRoles TyCon
    tc)) Role
    Representational Type
    rhs
      | Bool
    otherwise
      = () -> TcRn ()
    forall a. a -> IOEnv (Env TcGblEnv TcLclEnv) a
    forall (m :: * -> *) a. Monad m => a -> m a
    return ()
      where
        check_dc_roles :: DataCon -> TcRn ()
    check_dc_roles DataCon
    datacon
          = do { String -> SDoc -> TcRn ()
    traceTc String
    "check_dc_roles" (DataCon -> SDoc
    forall a. Outputable a => a -> SDoc
    ppr DataCon
    datacon SDoc -> SDoc -> SDoc
    forall doc. IsLine doc => doc -> doc -> doc
    <+> [Role] -> SDoc
    forall a. Outputable a => a -> SDoc
    ppr (TyCon -> [Role]
    tyConRoles TyCon
    tc))
               ; (Type -> TcRn ()) -> ThetaType -> TcRn ()
    forall (t :: * -> *) (m :: * -> *) a b.
    (Foldable t, Monad m) =>
    (a -> m b) -> t a -> m ()
    mapM_ (VarEnv Role -> Role -> Type -> TcRn ()
    check_ty_roles VarEnv Role
    role_env Role
    Representational) (ThetaType -> TcRn ()) -> ThetaType -> TcRn ()
    forall a b. (a -> b) -> a -> b
    $
                 [EqSpec] -> ThetaType
    eqSpecPreds [EqSpec]
    eq_spec ThetaType -> ThetaType -> ThetaType
    forall a. [a] -> [a] -> [a]
    ++ ThetaType
    theta ThetaType -> ThetaType -> ThetaType
    forall a. [a] -> [a] -> [a]
    ++ (Scaled Type -> Type) -> [Scaled Type] -> ThetaType
    forall a b. (a -> b) -> [a] -> [b]
    map Scaled Type -> Type
    forall a. Scaled a -> a
    scaledThing [Scaled Type]
    arg_tys }
                        -- See Note [Role-checking data constructor arguments] in GHC.Tc.TyCl.Utils
          where
            ([Var]
    univ_tvs, [Var]
    ex_tvs, [EqSpec]
    eq_spec, ThetaType
    theta, [Scaled Type]
    arg_tys, Type
    _res_ty)
              = DataCon -> ([Var], [Var], [EqSpec], ThetaType, [Scaled Type], Type)
    dataConFullSig DataCon
    datacon
            univ_roles :: VarEnv Role
    univ_roles = [Var] -> [Role] -> VarEnv Role
    forall a. [Var] -> [a] -> VarEnv a
    zipVarEnv [Var]
    univ_tvs (TyCon -> [Role]
    tyConRoles TyCon
    tc)
                  -- zipVarEnv uses zipEqual, but we don't want that for ex_tvs
            ex_roles :: VarEnv Role
    ex_roles   = [(Var, Role)] -> VarEnv Role
    forall a. [(Var, a)] -> VarEnv a
    mkVarEnv ((Var -> (Var, Role)) -> [Var] -> [(Var, Role)]
    forall a b. (a -> b) -> [a] -> [b]
    map (, Role
    Nominal) [Var]
    ex_tvs)
            role_env :: VarEnv Role
    role_env   = VarEnv Role
    univ_roles VarEnv Role -> VarEnv Role -> VarEnv Role
    forall a. VarEnv a -> VarEnv a -> VarEnv a
    `plusVarEnv` VarEnv Role
    ex_roles

        check_ty_roles :: VarEnv Role -> Role -> Type -> TcRn ()
    check_ty_roles VarEnv Role
    env Role
    role Type
    ty
          | Just Type
    ty' <- Type -> Maybe Type
    coreView Type
    ty -- #14101
          = VarEnv Role -> Role -> Type -> TcRn ()
    check_ty_roles VarEnv Role
    env Role
    role Type
    ty'

        check_ty_roles VarEnv Role
    env Role
    role (TyVarTy Var
    tv)
          = case VarEnv Role -> Var -> Maybe Role
    forall a. VarEnv a -> Var -> Maybe a
    lookupVarEnv VarEnv Role
    env Var
    tv of
              Just Role
    role' -> Bool -> TcRn () -> TcRn ()
    forall (f :: * -> *). Applicative f => Bool -> f () -> f ()
    unless (Role
    role' Role -> Role -> Bool
    `ltRole` Role
    role Bool -> Bool -> Bool
    || Role
    role' Role -> Role -> Bool
    forall a. Eq a => a -> a -> Bool
    == Role
    role) (TcRn () -> TcRn ()) -> TcRn () -> TcRn ()
    forall a b. (a -> b) -> a -> b
    $
                            Role -> RoleValidationFailedReason -> TcRn ()
    report_error Role
    role (RoleValidationFailedReason -> TcRn ())
    -> RoleValidationFailedReason -> TcRn ()
    forall a b. (a -> b) -> a -> b
    $ Var -> Role -> RoleValidationFailedReason
    TyVarRoleMismatch Var
    tv Role
    role'
              Maybe Role
    Nothing    -> Role -> RoleValidationFailedReason -> TcRn ()
    report_error Role
    role (RoleValidationFailedReason -> TcRn ())
    -> RoleValidationFailedReason -> TcRn ()
    forall a b. (a -> b) -> a -> b
    $ Var -> RoleValidationFailedReason
    TyVarMissingInEnv Var
    tv

        check_ty_roles VarEnv Role
    env Role
    Representational (TyConApp TyCon
    tc ThetaType
    tys)
          = let roles' :: [Role]
    roles' = TyCon -> [Role]
    tyConRoles TyCon
    tc in
            (Role -> Type -> TcRn ()) -> [Role] -> ThetaType -> TcRn ()
    forall (m :: * -> *) a b c.
    Applicative m =>
    (a -> b -> m c) -> [a] -> [b] -> m ()
    zipWithM_ (VarEnv Role -> Role -> Type -> TcRn ()
    maybe_check_ty_roles VarEnv Role
    env) [Role]
    roles' ThetaType
    tys

        check_ty_roles VarEnv Role
    env Role
    Nominal (TyConApp TyCon
    _ ThetaType
    tys)
          = (Type -> TcRn ()) -> ThetaType -> TcRn ()
    forall (t :: * -> *) (m :: * -> *) a b.
    (Foldable t, Monad m) =>
    (a -> m b) -> t a -> m ()
    mapM_ (VarEnv Role -> Role -> Type -> TcRn ()
    check_ty_roles VarEnv Role
    env Role
    Nominal) ThetaType
    tys

        check_ty_roles VarEnv Role
    _   Role
    Phantom ty :: Type
    ty@(TyConApp {})
          = String -> SDoc -> TcRn ()
    forall a. HasCallStack => String -> SDoc -> a
    pprPanic String
    "check_ty_roles" (Type -> SDoc
    forall a. Outputable a => a -> SDoc
    ppr Type
    ty)

        check_ty_roles VarEnv Role
    env Role
    role (AppTy Type
    ty1 Type
    ty2)
          =  VarEnv Role -> Role -> Type -> TcRn ()
    check_ty_roles VarEnv Role
    env Role
    role    Type
    ty1
          TcRn () -> TcRn () -> TcRn ()
    forall a b.
    IOEnv (Env TcGblEnv TcLclEnv) a
    -> IOEnv (Env TcGblEnv TcLclEnv) b
    -> IOEnv (Env TcGblEnv TcLclEnv) b
    forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
    >> VarEnv Role -> Role -> Type -> TcRn ()
    check_ty_roles VarEnv Role
    env Role
    Nominal Type
    ty2

        check_ty_roles VarEnv Role
    env Role
    role (FunTy FunTyFlag
    _ Type
    w Type
    ty1 Type
    ty2)
          =  VarEnv Role -> Role -> Type -> TcRn ()
    check_ty_roles VarEnv Role
    env Role
    Nominal Type
    w
          TcRn () -> TcRn () -> TcRn ()
    forall a b.
    IOEnv (Env TcGblEnv TcLclEnv) a
    -> IOEnv (Env TcGblEnv TcLclEnv) b
    -> IOEnv (Env TcGblEnv TcLclEnv) b
    forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
    >> VarEnv Role -> Role -> Type -> TcRn ()
    check_ty_roles VarEnv Role
    env Role
    role Type
    ty1
          TcRn () -> TcRn () -> TcRn ()
    forall a b.
    IOEnv (Env TcGblEnv TcLclEnv) a
    -> IOEnv (Env TcGblEnv TcLclEnv) b
    -> IOEnv (Env TcGblEnv TcLclEnv) b
    forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
    >> VarEnv Role -> Role -> Type -> TcRn ()
    check_ty_roles VarEnv Role
    env Role
    role Type
    ty2

        check_ty_roles VarEnv Role
    env Role
    role (ForAllTy (Bndr Var
    tv ForAllTyFlag
    _) Type
    ty)
          =  VarEnv Role -> Role -> Type -> TcRn ()
    check_ty_roles VarEnv Role
    env Role
    Nominal (Var -> Type
    tyVarKind Var
    tv)
          TcRn () -> TcRn () -> TcRn ()
    forall a b.
    IOEnv (Env TcGblEnv TcLclEnv) a
    -> IOEnv (Env TcGblEnv TcLclEnv) b
    -> IOEnv (Env TcGblEnv TcLclEnv) b
    forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
    >> VarEnv Role -> Role -> Type -> TcRn ()
    check_ty_roles (VarEnv Role -> Var -> Role -> VarEnv Role
    forall a. VarEnv a -> Var -> a -> VarEnv a
    extendVarEnv VarEnv Role
    env Var
    tv Role
    Nominal) Role
    role Type
    ty

        check_ty_roles VarEnv Role
    _   Role
    _    (LitTy {}) = () -> TcRn ()
    forall a. a -> IOEnv (Env TcGblEnv TcLclEnv) a
    forall (m :: * -> *) a. Monad m => a -> m a
    return ()

        check_ty_roles VarEnv Role
    env Role
    role (CastTy Type
    t Coercion
    _)
          = VarEnv Role -> Role -> Type -> TcRn ()
    check_ty_roles VarEnv Role
    env Role
    role Type
    t

        check_ty_roles VarEnv Role
    _   Role
    role (CoercionTy Coercion
    co)
          = Bool -> TcRn () -> TcRn ()
    forall (f :: * -> *). Applicative f => Bool -> f () -> f ()
    unless (Role
    role Role -> Role -> Bool
    forall a. Eq a => a -> a -> Bool
    == Role
    Phantom) (TcRn () -> TcRn ()) -> TcRn () -> TcRn ()
    forall a b. (a -> b) -> a -> b
    $
            Role -> RoleValidationFailedReason -> TcRn ()
    report_error Role
    role (RoleValidationFailedReason -> TcRn ())
    -> RoleValidationFailedReason -> TcRn ()
    forall a b. (a -> b) -> a -> b
    $ Coercion -> RoleValidationFailedReason
    BadCoercionRole Coercion
    co

        maybe_check_ty_roles :: VarEnv Role -> Role -> Type -> TcRn ()
    maybe_check_ty_roles VarEnv Role
    env Role
    role Type
    ty
          = Bool -> TcRn () -> TcRn ()
    forall (f :: * -> *). Applicative f => Bool -> f () -> f ()
    when (Role
    role Role -> Role -> Bool
    forall a. Eq a => a -> a -> Bool
    == Role
    Nominal Bool -> Bool -> Bool
    || Role
    role Role -> Role -> Bool
    forall a. Eq a => a -> a -> Bool
    == Role
    Representational) (TcRn () -> TcRn ()) -> TcRn () -> TcRn ()
    forall a b. (a -> b) -> a -> b
    $
            VarEnv Role -> Role -> Type -> TcRn ()
    check_ty_roles VarEnv Role
    env Role
    role Type
    ty

        report_error :: Role -> RoleValidationFailedReason -> TcRn ()
    report_error Role
    role RoleValidationFailedReason
    reason
          = TcRnMessage -> TcRn ()
    addErrTc (TcRnMessage -> TcRn ()) -> TcRnMessage -> TcRn ()
    forall a b. (a -> b) -> a -> b
    $ Role -> RoleValidationFailedReason -> TcRnMessage
    TcRnRoleValidationFailed Role
    role RoleValidationFailedReason
    reason

    {-
    ************************************************************************
    *                                                                      *
                    Error messages
    *                                                                      *
    ************************************************************************
    -}

    tcMkDeclCtxt :: TyClDecl GhcRn -> SDoc
    tcMkDeclCtxt :: TyClDecl GhcRn -> SDoc
    tcMkDeclCtxt TyClDecl GhcRn
    decl = [SDoc] -> SDoc
    forall doc. IsLine doc => [doc] -> doc
    hsep [String -> SDoc
    forall doc. IsLine doc => String -> doc
    text String
    "In the", TyClDecl GhcRn -> SDoc
    forall (p :: Pass). TyClDecl (GhcPass p) -> SDoc
    pprTyClDeclFlavour TyClDecl GhcRn
    decl,
                          String -> SDoc
    forall doc. IsLine doc => String -> doc
    text String
    "declaration for", SDoc -> SDoc
    quotes (Name -> SDoc
    forall a. Outputable a => a -> SDoc
    ppr (TyClDecl GhcRn -> IdP GhcRn
    forall (p :: Pass).
    (Anno (IdGhcP p) ~ SrcSpanAnnN) =>
    TyClDecl (GhcPass p) -> IdP (GhcPass p)
    tcdName TyClDecl GhcRn
    decl))]

    addVDQNote :: TcTyCon -> TcM a -> TcM a
    -- See Note [Inferring visible dependent quantification]
    -- Only types without a signature (CUSK or SAKS) here
    addVDQNote :: forall a. TyCon -> TcM a -> TcM a
    addVDQNote TyCon
    tycon TcM a
    thing_inside
      | Bool -> SDoc -> Bool -> Bool
    forall a. HasCallStack => Bool -> SDoc -> a -> a
    assertPpr (TyCon -> Bool
    isMonoTcTyCon TyCon
    tycon) (TyCon -> SDoc
    forall a. Outputable a => a -> SDoc
    ppr TyCon
    tycon SDoc -> SDoc -> SDoc
    forall doc. IsDoc doc => doc -> doc -> doc
    $$ Type -> SDoc
    forall a. Outputable a => a -> SDoc
    ppr Type
    tc_kind)
        Bool
    has_vdq
      = SDoc -> TcM a -> TcM a
    forall a. SDoc -> TcM a -> TcM a
    addLandmarkErrCtxt SDoc
    vdq_warning TcM a
    thing_inside
      | Bool
    otherwise
      = TcM a
    thing_inside
      where
          -- Check whether a tycon has visible dependent quantification.
          -- This will *always* be a TcTyCon. Furthermore, it will *always*
          -- be an ungeneralised TcTyCon, straight out of kcInferDeclHeader.
          -- Thus, all the TyConBinders will be anonymous. Thus, the
          -- free variables of the tycon's kind will be the same as the free
          -- variables from all the binders.
        has_vdq :: Bool
    has_vdq  = (TyConBinder -> Bool) -> [TyConBinder] -> Bool
    forall (t :: * -> *) a. Foldable t => (a -> Bool) -> t a -> Bool
    any TyConBinder -> Bool
    is_vdq_tcb (TyCon -> [TyConBinder]
    tyConBinders TyCon
    tycon)
        tc_kind :: Type
    tc_kind  = TyCon -> Type
    tyConKind TyCon
    tycon
        kind_fvs :: VarSet
    kind_fvs = Type -> VarSet
    tyCoVarsOfType Type
    tc_kind

        is_vdq_tcb :: TyConBinder -> Bool
    is_vdq_tcb TyConBinder
    tcb = (TyConBinder -> Var
    forall tv argf. VarBndr tv argf -> tv
    binderVar TyConBinder
    tcb Var -> VarSet -> Bool
    `elemVarSet` VarSet
    kind_fvs) Bool -> Bool -> Bool
    &&
                         TyConBinder -> Bool
    forall tv. VarBndr tv TyConBndrVis -> Bool
    isVisibleTyConBinder TyConBinder
    tcb

        vdq_warning :: SDoc
    vdq_warning = [SDoc] -> SDoc
    forall doc. IsDoc doc => [doc] -> doc
    vcat
          [ String -> SDoc
    forall doc. IsLine doc => String -> doc
    text String
    "NB: Type" SDoc -> SDoc -> SDoc
    forall doc. IsLine doc => doc -> doc -> doc
    <+> SDoc -> SDoc
    quotes (TyCon -> SDoc
    forall a. Outputable a => a -> SDoc
    ppr TyCon
    tycon) SDoc -> SDoc -> SDoc
    forall doc. IsLine doc => doc -> doc -> doc
    <+>
            String -> SDoc
    forall doc. IsLine doc => String -> doc
    text String
    "was inferred to use visible dependent quantification."
          , String -> SDoc
    forall doc. IsLine doc => String -> doc
    text String
    "Most types with visible dependent quantification are"
          , String -> SDoc
    forall doc. IsLine doc => String -> doc
    text String
    "polymorphically recursive and need a standalone kind"
          , String -> SDoc
    forall doc. IsLine doc => String -> doc
    text String
    "signature. Perhaps supply one, with StandaloneKindSignatures."
          ]

    tcAddDeclCtxt :: TyClDecl GhcRn -> TcM a -> TcM a
    tcAddDeclCtxt :: forall a. TyClDecl GhcRn -> TcM a -> TcM a
    tcAddDeclCtxt TyClDecl GhcRn
    decl TcM a
    thing_inside
      = SDoc -> TcM a -> TcM a
    forall a. SDoc -> TcM a -> TcM a
    addErrCtxt (TyClDecl GhcRn -> SDoc
    tcMkDeclCtxt TyClDecl GhcRn
    decl) TcM a
    thing_inside

    tcAddTyFamInstCtxt :: TyFamInstDecl GhcRn -> TcM a -> TcM a
    tcAddTyFamInstCtxt :: forall a. TyFamInstDecl GhcRn -> TcM a -> TcM a
    tcAddTyFamInstCtxt TyFamInstDecl GhcRn
    decl
      = SDoc -> Name -> TcM a -> TcM a
    forall a. SDoc -> Name -> TcM a -> TcM a
    tcAddFamInstCtxt (String -> SDoc
    forall doc. IsLine doc => String -> doc
    text String
    "type instance") (TyFamInstDecl GhcRn -> IdP GhcRn
    forall (p :: Pass).
    (Anno (IdGhcP p) ~ SrcSpanAnnN) =>
    TyFamInstDecl (GhcPass p) -> IdP (GhcPass p)
    tyFamInstDeclName TyFamInstDecl GhcRn
    decl)

    tcMkDataFamInstCtxt :: DataFamInstDecl GhcRn -> SDoc
    tcMkDataFamInstCtxt :: DataFamInstDecl GhcRn -> SDoc
    tcMkDataFamInstCtxt decl :: DataFamInstDecl GhcRn
    decl@(DataFamInstDecl { dfid_eqn :: forall pass. DataFamInstDecl pass -> FamEqn pass (HsDataDefn pass)
    dfid_eqn = FamEqn GhcRn (HsDataDefn GhcRn)
    eqn })
      = SDoc -> Name -> SDoc
    tcMkFamInstCtxt (DataFamInstDecl GhcRn -> SDoc
    forall (p :: Pass). DataFamInstDecl (GhcPass p) -> SDoc
    pprDataFamInstFlavour DataFamInstDecl GhcRn
    decl SDoc -> SDoc -> SDoc
    forall doc. IsLine doc => doc -> doc -> doc
    <+> String -> SDoc
    forall doc. IsLine doc => String -> doc
    text String
    "instance")
                        (LocatedN Name -> Name
    forall l e. GenLocated l e -> e
    unLoc (FamEqn GhcRn (HsDataDefn GhcRn) -> LIdP GhcRn
    forall pass rhs. FamEqn pass rhs -> LIdP pass
    feqn_tycon FamEqn GhcRn (HsDataDefn GhcRn)
    eqn))

    tcAddDataFamInstCtxt :: DataFamInstDecl GhcRn -> TcM a -> TcM a
    tcAddDataFamInstCtxt :: forall a. DataFamInstDecl GhcRn -> TcM a -> TcM a
    tcAddDataFamInstCtxt DataFamInstDecl GhcRn
    decl
      = SDoc -> TcM a -> TcM a
    forall a. SDoc -> TcM a -> TcM a
    addErrCtxt (DataFamInstDecl GhcRn -> SDoc
    tcMkDataFamInstCtxt DataFamInstDecl GhcRn
    decl)

    tcMkFamInstCtxt :: SDoc -> Name -> SDoc
    tcMkFamInstCtxt :: SDoc -> Name -> SDoc
    tcMkFamInstCtxt SDoc
    flavour Name
    tycon
      = [SDoc] -> SDoc
    forall doc. IsLine doc => [doc] -> doc
    hsep [ String -> SDoc
    forall doc. IsLine doc => String -> doc
    text String
    "In the" SDoc -> SDoc -> SDoc
    forall doc. IsLine doc => doc -> doc -> doc
    <+> SDoc
    flavour SDoc -> SDoc -> SDoc
    forall doc. IsLine doc => doc -> doc -> doc
    <+> String -> SDoc
    forall doc. IsLine doc => String -> doc
    text String
    "declaration for"
             , SDoc -> SDoc
    quotes (Name -> SDoc
    forall a. Outputable a => a -> SDoc
    ppr Name
    tycon) ]

    tcAddFamInstCtxt :: SDoc -> Name -> TcM a -> TcM a
    tcAddFamInstCtxt :: forall a. SDoc -> Name -> TcM a -> TcM a
    tcAddFamInstCtxt SDoc
    flavour Name
    tycon TcM a
    thing_inside
      = SDoc -> TcM a -> TcM a
    forall a. SDoc -> TcM a -> TcM a
    addErrCtxt (SDoc -> Name -> SDoc
    tcMkFamInstCtxt SDoc
    flavour Name
    tycon) TcM a
    thing_inside

    tcAddClosedTypeFamilyDeclCtxt :: TyCon -> TcM a -> TcM a
    tcAddClosedTypeFamilyDeclCtxt :: forall a. TyCon -> TcM a -> TcM a
    tcAddClosedTypeFamilyDeclCtxt TyCon
    tc
      = SDoc -> TcM a -> TcM a
    forall a. SDoc -> TcM a -> TcM a
    addErrCtxt SDoc
    ctxt
      where
        ctxt :: SDoc
    ctxt = String -> SDoc
    forall doc. IsLine doc => String -> doc
    text String
    "In the equations for closed type family" SDoc -> SDoc -> SDoc
    forall doc. IsLine doc => doc -> doc -> doc
    <+>
               SDoc -> SDoc
    quotes (TyCon -> SDoc
    forall a. Outputable a => a -> SDoc
    ppr TyCon
    tc)

    dataConCtxt :: NonEmpty (LocatedN Name) -> SDoc
    dataConCtxt :: NonEmpty (LocatedN Name) -> SDoc
    dataConCtxt NonEmpty (LocatedN Name)
    cons = String -> SDoc
    forall doc. IsLine doc => String -> doc
    text String
    "In the definition of data constructor" SDoc -> SDoc -> SDoc
    forall doc. IsLine doc => doc -> doc -> doc
    <> [LocatedN Name] -> SDoc
    forall a. [a] -> SDoc
    plural (NonEmpty (LocatedN Name) -> [LocatedN Name]
    forall a. NonEmpty a -> [a]
    forall (t :: * -> *) a. Foldable t => t a -> [a]
    toList NonEmpty (LocatedN Name)
    cons)
                       SDoc -> SDoc -> SDoc
    forall doc. IsLine doc => doc -> doc -> doc
    <+> [LocatedN Name] -> SDoc
    ppr_cons (NonEmpty (LocatedN Name) -> [LocatedN Name]
    forall a. NonEmpty a -> [a]
    forall (t :: * -> *) a. Foldable t => t a -> [a]
    toList NonEmpty (LocatedN Name)
    cons)

    dataConResCtxt :: NonEmpty (LocatedN Name) -> SDoc
    dataConResCtxt :: NonEmpty (LocatedN Name) -> SDoc
    dataConResCtxt NonEmpty (LocatedN Name)
    cons = String -> SDoc
    forall doc. IsLine doc => String -> doc
    text String
    "In the result type of data constructor" SDoc -> SDoc -> SDoc
    forall doc. IsLine doc => doc -> doc -> doc
    <> [LocatedN Name] -> SDoc
    forall a. [a] -> SDoc
    plural (NonEmpty (LocatedN Name) -> [LocatedN Name]
    forall a. NonEmpty a -> [a]
    forall (t :: * -> *) a. Foldable t => t a -> [a]
    toList NonEmpty (LocatedN Name)
    cons)
                          SDoc -> SDoc -> SDoc
    forall doc. IsLine doc => doc -> doc -> doc
    <+> [LocatedN Name] -> SDoc
    ppr_cons (NonEmpty (LocatedN Name) -> [LocatedN Name]
    forall a. NonEmpty a -> [a]
    forall (t :: * -> *) a. Foldable t => t a -> [a]
    toList NonEmpty (LocatedN Name)
    cons)

    ppr_cons :: [LocatedN Name] -> SDoc
    ppr_cons :: [LocatedN Name] -> SDoc
    ppr_cons [LocatedN Name
    con] = SDoc -> SDoc
    quotes (LocatedN Name -> SDoc
    forall a. Outputable a => a -> SDoc
    ppr LocatedN Name
    con)
    ppr_cons [LocatedN Name]
    cons  = [LocatedN Name] -> SDoc
    forall a. Outputable a => [a] -> SDoc
    interpp'SP [LocatedN Name]
    cons

    classOpCtxt :: Var -> Type -> SDoc
    classOpCtxt :: Var -> Type -> SDoc
    classOpCtxt Var
    sel_id Type
    tau = [SDoc] -> SDoc
    forall doc. IsLine doc => [doc] -> doc
    sep [String -> SDoc
    forall doc. IsLine doc => String -> doc
    text String
    "When checking the class method:",
                                  Int -> SDoc -> SDoc
    nest Int
    2 (Var -> SDoc
    forall a. OutputableBndr a => a -> SDoc
    pprPrefixOcc Var
    sel_id SDoc -> SDoc -> SDoc
    forall doc. IsLine doc => doc -> doc -> doc
    <+> SDoc
    dcolon SDoc -> SDoc -> SDoc
    forall doc. IsLine doc => doc -> doc -> doc
    <+> Type -> SDoc
    forall a. Outputable a => a -> SDoc
    ppr Type
    tau)]

    illegalRoleAnnotDecl :: LRoleAnnotDecl GhcRn -> TcM ()
    illegalRoleAnnotDecl :: LRoleAnnotDecl GhcRn -> TcRn ()
    illegalRoleAnnotDecl (L SrcSpanAnnA
    loc RoleAnnotDecl GhcRn
    role)
      = [ErrCtxt] -> TcRn () -> TcRn ()
    forall a. [ErrCtxt] -> TcM a -> TcM a
    setErrCtxt [] (TcRn () -> TcRn ()) -> TcRn () -> TcRn ()
    forall a b. (a -> b) -> a -> b
    $
        SrcSpanAnnA -> TcRn () -> TcRn ()
    forall ann a. EpAnn ann -> TcRn a -> TcRn a
    setSrcSpanA SrcSpanAnnA
    loc (TcRn () -> TcRn ()) -> TcRn () -> TcRn ()
    forall a b. (a -> b) -> a -> b
    $
        TcRnMessage -> TcRn ()
    addErrTc (TcRnMessage -> TcRn ()) -> TcRnMessage -> TcRn ()
    forall a b. (a -> b) -> a -> b
    $ RoleAnnotDecl GhcRn -> TcRnMessage
    TcRnIllegalRoleAnnotation RoleAnnotDecl GhcRn
    role

    addTyConCtxt :: TyCon -> TcM a -> TcM a
    addTyConCtxt :: forall a. TyCon -> TcM a -> TcM a
    addTyConCtxt TyCon
    tc = Name -> TyConFlavour TyCon -> TcM a -> TcM a
    forall tc a. Name -> TyConFlavour tc -> TcM a -> TcM a
    addTyConFlavCtxt Name
    name TyConFlavour TyCon
    flav
      where
        name :: Name
    name = TyCon -> Name
    forall a. NamedThing a => a -> Name
    getName TyCon
    tc
        flav :: TyConFlavour TyCon
    flav = TyCon -> TyConFlavour TyCon
    tyConFlavour TyCon
    tc

    addRoleAnnotCtxt :: Name -> TcM a -> TcM a
    addRoleAnnotCtxt :: forall a. Name -> TcM a -> TcM a
    addRoleAnnotCtxt Name
    name
      = SDoc -> TcM a -> TcM a
    forall a. SDoc -> TcM a -> TcM a
    addErrCtxt (SDoc -> TcM a -> TcM a) -> SDoc -> TcM a -> TcM a
    forall a b. (a -> b) -> a -> b
    $
        String -> SDoc
    forall doc. IsLine doc => String -> doc
    text String
    "while checking a role annotation for" SDoc -> SDoc -> SDoc
    forall doc. IsLine doc => doc -> doc -> doc
    <+> SDoc -> SDoc
    quotes (Name -> SDoc
    forall a. Outputable a => a -> SDoc
    ppr Name
    name)