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

    -}

    {-# LANGUAGE CPP, 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,
            wrongKindOfFamily
        ) where

    #include "HsVersions.h"

    import GHC.Prelude

    import GHC.Driver.Env
    import GHC.Driver.Session

    import GHC.Hs

    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.Utils.Zonk
    import GHC.Tc.TyCl.Utils
    import GHC.Tc.TyCl.Class
    import {-# SOURCE #-} GHC.Tc.TyCl.Instance( tcInstDecls1 )
    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.Builtin.Types (oneDataConTy,  unitTy, makeRecoveryTyCon )

    import GHC.Rename.Env( lookupConstructorFields )

    import GHC.Core.Multiplicity
    import GHC.Core.FamInstEnv
    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.Id
    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.Unique
    import GHC.Types.Basic
    import qualified GHC.LanguageExtensions as LangExt

    import GHC.Data.FastString
    import GHC.Data.Maybe
    import GHC.Data.List.SetOps

    import GHC.Unit

    import GHC.Utils.Outputable
    import GHC.Utils.Panic
    import GHC.Utils.Misc

    import Control.Monad
    import Data.Function ( on )
    import Data.Functor.Identity
    import Data.List (nubBy, partition)
    import Data.List.NonEmpty ( NonEmpty(..) )
    import qualified Data.Set as Set
    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
                             )
    -- Fails if there are any errors
    tcTyAndClassDecls :: [TyClGroup GhcRn] -> TcM (TcGblEnv, [InstInfo GhcRn], [DerivInfo])
    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])
    -> TcM (TcGblEnv, [InstInfo GhcRn], [DerivInfo])
    forall r. TcM r -> TcM r
    checkNoErrs (TcM (TcGblEnv, [InstInfo GhcRn], [DerivInfo])
     -> TcM (TcGblEnv, [InstInfo GhcRn], [DerivInfo]))
    -> TcM (TcGblEnv, [InstInfo GhcRn], [DerivInfo])
    -> TcM (TcGblEnv, [InstInfo GhcRn], [DerivInfo])
    forall a b. (a -> b) -> a -> b
    $ [InstInfo GhcRn]
    -> [DerivInfo]
    -> [TyClGroup GhcRn]
    -> TcM (TcGblEnv, [InstInfo GhcRn], [DerivInfo])
    fold_env [] [] [TyClGroup GhcRn]
    tyclds_s
      where
        fold_env :: [InstInfo GhcRn]
                 -> [DerivInfo]
                 -> [TyClGroup GhcRn]
                 -> TcM (TcGblEnv, [InstInfo GhcRn], [DerivInfo])
        fold_env :: [InstInfo GhcRn]
    -> [DerivInfo]
    -> [TyClGroup GhcRn]
    -> TcM (TcGblEnv, [InstInfo GhcRn], [DerivInfo])
    fold_env [InstInfo GhcRn]
    inst_info [DerivInfo]
    deriv_info []
          = do { TcGblEnv
    gbl_env <- TcRnIf TcGblEnv TcLclEnv TcGblEnv
    forall gbl lcl. TcRnIf gbl lcl gbl
    getGblEnv
               ; (TcGblEnv, [InstInfo GhcRn], [DerivInfo])
    -> TcM (TcGblEnv, [InstInfo GhcRn], [DerivInfo])
    forall (m :: * -> *) a. Monad m => a -> m a
    return (TcGblEnv
    gbl_env, [InstInfo GhcRn]
    inst_info, [DerivInfo]
    deriv_info) }
        fold_env [InstInfo GhcRn]
    inst_info [DerivInfo]
    deriv_info (TyClGroup GhcRn
    tyclds:[TyClGroup GhcRn]
    tyclds_s)
          = do { (TcGblEnv
    tcg_env, [InstInfo GhcRn]
    inst_info', [DerivInfo]
    deriv_info') <- TyClGroup GhcRn -> TcM (TcGblEnv, [InstInfo GhcRn], [DerivInfo])
    tcTyClGroup TyClGroup GhcRn
    tyclds
               ; TcGblEnv
    -> TcM (TcGblEnv, [InstInfo GhcRn], [DerivInfo])
    -> TcM (TcGblEnv, [InstInfo GhcRn], [DerivInfo])
    forall gbl lcl a. gbl -> TcRnIf gbl lcl a -> TcRnIf gbl lcl a
    setGblEnv TcGblEnv
    tcg_env (TcM (TcGblEnv, [InstInfo GhcRn], [DerivInfo])
     -> TcM (TcGblEnv, [InstInfo GhcRn], [DerivInfo]))
    -> TcM (TcGblEnv, [InstInfo GhcRn], [DerivInfo])
    -> TcM (TcGblEnv, [InstInfo GhcRn], [DerivInfo])
    forall a b. (a -> b) -> a -> b
    $
                   -- remaining groups are typechecked in the extended global env.
                 [InstInfo GhcRn]
    -> [DerivInfo]
    -> [TyClGroup GhcRn]
    -> TcM (TcGblEnv, [InstInfo GhcRn], [DerivInfo])
    fold_env ([InstInfo GhcRn]
    inst_info' [InstInfo GhcRn] -> [InstInfo GhcRn] -> [InstInfo GhcRn]
    forall a. [a] -> [a] -> [a]
    ++ [InstInfo GhcRn]
    inst_info)
                          ([DerivInfo]
    deriv_info' [DerivInfo] -> [DerivInfo] -> [DerivInfo]
    forall a. [a] -> [a] -> [a]
    ++ [DerivInfo]
    deriv_info)
                          [TyClGroup GhcRn]
    tyclds_s }

    tcTyClGroup :: TyClGroup GhcRn
                -> TcM (TcGblEnv, [InstInfo GhcRn], [DerivInfo])
    -- 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])
    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
    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 -> 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) [GenLocated SrcSpanAnnA (TyClDecl GhcRn)]
    [LTyClDecl GhcRn]
    tyclds))
           ; ([TyCon]
    tyclss, [DerivInfo]
    data_deriv_info, NameSet
    kindless) <-
               TcTypeEnv
    -> TcM ([TyCon], [DerivInfo], NameSet)
    -> TcM ([TyCon], [DerivInfo], NameSet)
    forall r. TcTypeEnv -> TcM r -> TcM r
    tcExtendKindEnv ([LTyClDecl GhcRn] -> TcTypeEnv
    mkPromotionErrorEnv [LTyClDecl GhcRn]
    tyclds) (TcM ([TyCon], [DerivInfo], NameSet)
     -> TcM ([TyCon], [DerivInfo], NameSet))
    -> TcM ([TyCon], [DerivInfo], NameSet)
    -> TcM ([TyCon], [DerivInfo], NameSet)
    forall a b. (a -> b) -> a -> b
    $ -- See Note [Type environment evolution]
               do { NameEnv Type
    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)
    traverse GenLocated SrcSpanAnnA (StandaloneKindSig GhcRn)
    -> IOEnv (Env TcGblEnv TcLclEnv) (Name, Type)
    LStandaloneKindSig GhcRn
    -> IOEnv (Env TcGblEnv TcLclEnv) (Name, Type)
    tcStandaloneKindSig [GenLocated SrcSpanAnnA (StandaloneKindSig GhcRn)]
    [LStandaloneKindSig GhcRn]
    kisigs
                  ; [LTyClDecl GhcRn]
    -> NameEnv Type
    -> RoleAnnotEnv
    -> TcM ([TyCon], [DerivInfo], NameSet)
    tcTyClDecls [LTyClDecl GhcRn]
    tyclds NameEnv Type
    kisig_env RoleAnnotEnv
    role_annots }

               -- Step 1.5: Make sure we don't have any type synonym cycles
           ; String -> SDoc -> TcRn ()
    traceTc String
    "Starting synonym cycle check" ([TyCon] -> SDoc
    forall a. Outputable a => a -> SDoc
    ppr [TyCon]
    tyclss)
           ; HomeUnit
    home_unit <- HscEnv -> HomeUnit
    hsc_home_unit (HscEnv -> HomeUnit)
    -> IOEnv (Env TcGblEnv TcLclEnv) HscEnv
    -> IOEnv (Env TcGblEnv TcLclEnv) HomeUnit
    forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
    <$> IOEnv (Env TcGblEnv TcLclEnv) HscEnv
    forall gbl lcl. TcRnIf gbl lcl HscEnv
    getTopEnv
           ; Unit -> [TyCon] -> [LTyClDecl GhcRn] -> TcRn ()
    checkSynCycles (HomeUnit -> Unit
    homeUnitAsUnit HomeUnit
    home_unit) [TyCon]
    tyclss [LTyClDecl GhcRn]
    tyclds
           ; String -> SDoc -> TcRn ()
    traceTc String
    "Done synonym cycle check" ([TyCon] -> SDoc
    forall a. Outputable a => a -> SDoc
    ppr [TyCon]
    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
           ; String -> SDoc -> TcRn ()
    traceTc String
    "Starting validity check" ([TyCon] -> SDoc
    forall a. Outputable a => a -> SDoc
    ppr [TyCon]
    tyclss)
           ; [TyCon]
    tyclss <- (TyCon -> IOEnv (Env TcGblEnv TcLclEnv) [TyCon])
    -> [TyCon] -> IOEnv (Env TcGblEnv TcLclEnv) [TyCon]
    forall (m :: * -> *) a b. Monad m => (a -> m [b]) -> [a] -> m [b]
    concatMapM TyCon -> IOEnv (Env TcGblEnv TcLclEnv) [TyCon]
    checkValidTyCl [TyCon]
    tyclss
           ; String -> SDoc -> TcRn ()
    traceTc String
    "Done validity check" ([TyCon] -> SDoc
    forall a. Outputable a => a -> SDoc
    ppr [TyCon]
    tyclss)
           ; (TyCon -> TcRn ()) -> [TyCon] -> TcRn ()
    forall (t :: * -> *) (m :: * -> *) a b.
    (Foldable t, Monad m) =>
    (a -> m b) -> t a -> m ()
    mapM_ (TcRn () -> TcRn () -> TcRn ()
    forall r. TcRn r -> TcRn r -> TcRn r
    recoverM (() -> TcRn ()
    forall (m :: * -> *) a. Monad m => a -> m a
    return ()) (TcRn () -> TcRn ()) -> (TyCon -> TcRn ()) -> TyCon -> TcRn ()
    forall b c a. (b -> c) -> (a -> b) -> a -> c
    . RoleAnnotEnv -> TyCon -> TcRn ()
    checkValidRoleAnnots RoleAnnotEnv
    role_annots) [TyCon]
    tyclss
               -- See Note [Check role annotations in a second pass]

           ; String -> SDoc -> TcRn ()
    traceTc String
    "---- end tcTyClGroup ---- }" SDoc
    empty

               -- Step 3: Add the implicit things;
               -- we want them in the environment because
               -- they may be mentioned in interface files
           ; TcGblEnv
    gbl_env <- [TyCon] -> TcRnIf TcGblEnv TcLclEnv TcGblEnv
    addTyConsToGblEnv [TyCon]
    tyclss

               -- Step 4: check instance declarations
           ; (TcGblEnv
    gbl_env', [InstInfo GhcRn]
    inst_info, [DerivInfo]
    datafam_deriv_info) <-
             TcGblEnv
    -> TcM (TcGblEnv, [InstInfo GhcRn], [DerivInfo])
    -> TcM (TcGblEnv, [InstInfo GhcRn], [DerivInfo])
    forall gbl lcl a. gbl -> TcRnIf gbl lcl a -> TcRnIf gbl lcl a
    setGblEnv TcGblEnv
    gbl_env (TcM (TcGblEnv, [InstInfo GhcRn], [DerivInfo])
     -> TcM (TcGblEnv, [InstInfo GhcRn], [DerivInfo]))
    -> TcM (TcGblEnv, [InstInfo GhcRn], [DerivInfo])
    -> TcM (TcGblEnv, [InstInfo GhcRn], [DerivInfo])
    forall a b. (a -> b) -> a -> b
    $
             [LInstDecl GhcRn] -> TcM (TcGblEnv, [InstInfo GhcRn], [DerivInfo])
    tcInstDecls1 [LInstDecl GhcRn]
    instds

           ; let deriv_info :: [DerivInfo]
    deriv_info = [DerivInfo]
    datafam_deriv_info [DerivInfo] -> [DerivInfo] -> [DerivInfo]
    forall a. [a] -> [a] -> [a]
    ++ [DerivInfo]
    data_deriv_info
           ; let gbl_env'' :: TcGblEnv
    gbl_env'' = TcGblEnv
    gbl_env'
                    { tcg_ksigs :: NameSet
    tcg_ksigs = TcGblEnv -> NameSet
    tcg_ksigs TcGblEnv
    gbl_env' NameSet -> NameSet -> NameSet
    `unionNameSet` NameSet
    kindless }
           ; (TcGblEnv, [InstInfo GhcRn], [DerivInfo])
    -> TcM (TcGblEnv, [InstInfo GhcRn], [DerivInfo])
    forall (m :: * -> *) a. Monad m => a -> m a
    return (TcGblEnv
    gbl_env'', [InstInfo GhcRn]
    inst_info, [DerivInfo]
    deriv_info) }

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

    tcTyClDecls
      :: [LTyClDecl GhcRn]
      -> KindSigEnv
      -> RoleAnnotEnv
      -> TcM ([TyCon], [DerivInfo], NameSet)
    tcTyClDecls :: [LTyClDecl GhcRn]
    -> NameEnv Type
    -> RoleAnnotEnv
    -> TcM ([TyCon], [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]
             ([TyCon]
    tc_tycons, NameSet
    kindless) <- NameEnv Type -> [LTyClDecl GhcRn] -> TcM ([TyCon], NameSet)
    kcTyClGroup NameEnv Type
    kisig_env [LTyClDecl GhcRn]
    tyclds
           ; String -> SDoc -> TcRn ()
    traceTc String
    "tcTyAndCl generalized kinds" ([SDoc] -> SDoc
    vcat ((TyCon -> SDoc) -> [TyCon] -> [SDoc]
    forall a b. (a -> b) -> [a] -> [b]
    map TyCon -> SDoc
    ppr_tc_tycon [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.
           ; (([TyCon], [DerivInfo], NameSet)
     -> TcM ([TyCon], [DerivInfo], NameSet))
    -> TcM ([TyCon], [DerivInfo], NameSet)
    forall a env. (a -> IOEnv env a) -> IOEnv env a
    fixM ((([TyCon], [DerivInfo], NameSet)
      -> TcM ([TyCon], [DerivInfo], NameSet))
     -> TcM ([TyCon], [DerivInfo], NameSet))
    -> (([TyCon], [DerivInfo], NameSet)
        -> TcM ([TyCon], [DerivInfo], NameSet))
    -> TcM ([TyCon], [DerivInfo], NameSet)
    forall a b. (a -> b) -> a -> b
    $ \ ~([TyCon]
    rec_tyclss, [DerivInfo]
    _, NameSet
    _) -> do
               { TcGblEnv
    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 :: HscSource
    src  = TcGblEnv -> HscSource
    tcg_src TcGblEnv
    tcg_env
                     roles :: Name -> [Role]
    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
               ; ([TyCon]
    tycons, [[DerivInfo]]
    data_deriv_infos) <-
                 [(Name, TyThing)]
    -> TcM ([TyCon], [[DerivInfo]]) -> TcM ([TyCon], [[DerivInfo]])
    forall r. [(Name, TyThing)] -> TcM r -> TcM r
    tcExtendRecEnv ([TyCon] -> [TyCon] -> [(Name, TyThing)]
    zipRecTyClss [TyCon]
    tc_tycons [TyCon]
    rec_tyclss) (TcM ([TyCon], [[DerivInfo]]) -> TcM ([TyCon], [[DerivInfo]]))
    -> TcM ([TyCon], [[DerivInfo]]) -> TcM ([TyCon], [[DerivInfo]])
    forall a b. (a -> b) -> a -> b
    $

                     -- 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]
                 [TyCon]
    -> TcM ([TyCon], [[DerivInfo]]) -> TcM ([TyCon], [[DerivInfo]])
    forall a. [TyCon] -> TcM a -> TcM a
    tcExtendKindEnvWithTyCons [TyCon]
    tc_tycons (TcM ([TyCon], [[DerivInfo]]) -> TcM ([TyCon], [[DerivInfo]]))
    -> TcM ([TyCon], [[DerivInfo]]) -> TcM ([TyCon], [[DerivInfo]])
    forall a b. (a -> b) -> a -> b
    $

                     -- Kind and type check declarations for this group
                   (GenLocated SrcSpanAnnA (TyClDecl GhcRn)
     -> IOEnv (Env TcGblEnv TcLclEnv) (TyCon, [DerivInfo]))
    -> [GenLocated SrcSpanAnnA (TyClDecl GhcRn)]
    -> TcM ([TyCon], [[DerivInfo]])
    forall (m :: * -> *) a b c.
    Applicative m =>
    (a -> m (b, c)) -> [a] -> m ([b], [c])
    mapAndUnzipM ((Name -> [Role])
    -> LTyClDecl GhcRn
    -> IOEnv (Env TcGblEnv TcLclEnv) (TyCon, [DerivInfo])
    tcTyClDecl Name -> [Role]
    roles) [GenLocated SrcSpanAnnA (TyClDecl GhcRn)]
    [LTyClDecl GhcRn]
    tyclds
               ; ([TyCon], [DerivInfo], NameSet)
    -> TcM ([TyCon], [DerivInfo], NameSet)
    forall (m :: * -> *) a. Monad m => a -> m a
    return ([TyCon]
    tycons, [[DerivInfo]] -> [DerivInfo]
    forall (t :: * -> *) a. Foldable t => t [a] -> [a]
    concat [[DerivInfo]]
    data_deriv_infos, NameSet
    kindless)
               } }
      where
        ppr_tc_tycon :: TyCon -> SDoc
    ppr_tc_tycon TyCon
    tc = SDoc -> SDoc
    parens ([SDoc] -> SDoc
    sep [ Name -> SDoc
    forall a. Outputable a => a -> SDoc
    ppr (TyCon -> Name
    tyConName TyCon
    tc) SDoc -> SDoc -> SDoc
    <> SDoc
    comma
                                      , [TyConBinder] -> SDoc
    forall a. Outputable a => a -> SDoc
    ppr (TyCon -> [TyConBinder]
    tyConBinders TyCon
    tc) SDoc -> SDoc -> SDoc
    <> SDoc
    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 (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 (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
    <+> 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 [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 determinded 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 [How TcTyCons work]
    ~~~~~~~~~~~~~~~~~~~~~~~~
    TcTyCons are used for two distinct purposes

    1.  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 TcTyCon for this;
        see makeRecoveryTyCon.

    2.  When checking a type/class declaration (in module GHC.Tc.TyCl), we come
        upon knowledge of the eventual tycon in bits and pieces.

          S1) First, we use inferInitialKinds to look over the user-provided
              kind signature of a tycon (including, for example, the number
              of parameters written to the tycon) to get an initial shape of
              the tycon's kind.  We record that shape in a TcTyCon.

              For CUSK tycons, the TcTyCon has the final, generalised kind.
              For non-CUSK tycons, the TcTyCon has as its tyConBinders only
              the explicit arguments given -- no kind variables, etc.

          S2) Then, using these initial kinds, we kind-check the body of the
              tycon (class methods, data constructors, etc.), filling in the
              metavariables in the tycon's initial kind.

          S3) We then generalize to get the (non-CUSK) tycon's final, fixed
              kind. Finally, once this has happened for all tycons in a
              mutually recursive group, we can desugar the lot.

        For convenience, we store partially-known tycons in TcTyCons, which
        might store meta-variables. These TcTyCons are stored in the local
        environment in GHC.Tc.TyCl, until the real full TyCons can be created
        during desugaring. A desugared program should never have a TcTyCon.

    3.  In a TcTyCon, everything is zonked after the kind-checking pass (S2).

    4.  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 the TcTyCon.
        These tyvars are brought into scope in GHC.Tc.Gen.HsType.bindTyClTyVars.

        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 [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 [Single function non-recursive binding special-case]:

         * 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 sepearately.
    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 ([TcTyCon], 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  { Module
    mod <- IOEnv (Env TcGblEnv TcLclEnv) Module
    forall (m :: * -> *). HasModule m => m Module
    getModule
            ; String -> SDoc -> TcRn ()
    traceTc String
    "---- kcTyClGroup ---- {"
                      (String -> SDoc
    text String
    "module" SDoc -> SDoc -> SDoc
    <+> Module -> SDoc
    forall a. Outputable a => a -> SDoc
    ppr Module
    mod SDoc -> SDoc -> SDoc
    $$ [SDoc] -> SDoc
    vcat ((GenLocated SrcSpanAnnA (TyClDecl GhcRn) -> SDoc)
    -> [GenLocated SrcSpanAnnA (TyClDecl GhcRn)] -> [SDoc]
    forall a b. (a -> b) -> [a] -> [b]
    map GenLocated SrcSpanAnnA (TyClDecl GhcRn) -> SDoc
    forall a. Outputable a => a -> SDoc
    ppr [GenLocated SrcSpanAnnA (TyClDecl GhcRn)]
    [LTyClDecl GhcRn]
    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]

            ; Bool
    cusks_enabled <- Extension -> TcRnIf TcGblEnv TcLclEnv Bool
    forall gbl lcl. Extension -> TcRnIf gbl lcl Bool
    xoptM Extension
    LangExt.CUSKs TcRnIf TcGblEnv TcLclEnv Bool
    -> TcRnIf TcGblEnv TcLclEnv Bool -> TcRnIf TcGblEnv TcLclEnv Bool
    forall (f :: * -> *). Applicative f => f Bool -> f Bool -> f Bool
    <&&> Extension -> TcRnIf TcGblEnv TcLclEnv Bool
    forall gbl lcl. Extension -> TcRnIf gbl lcl Bool
    xoptM Extension
    LangExt.PolyKinds
                        -- See Note [CUSKs and PolyKinds]
            ; let ([GenLocated SrcSpanAnnA (TyClDecl GhcRn)]
    kindless_decls, [(GenLocated SrcSpanAnnA (TyClDecl GhcRn), SAKS_or_CUSK)]
    kinded_decls) = (GenLocated SrcSpanAnnA (TyClDecl GhcRn)
     -> Either
          (GenLocated SrcSpanAnnA (TyClDecl GhcRn))
          (GenLocated SrcSpanAnnA (TyClDecl GhcRn), SAKS_or_CUSK))
    -> [GenLocated SrcSpanAnnA (TyClDecl GhcRn)]
    -> ([GenLocated SrcSpanAnnA (TyClDecl GhcRn)],
        [(GenLocated SrcSpanAnnA (TyClDecl GhcRn), SAKS_or_CUSK)])
    forall a b c. (a -> Either b c) -> [a] -> ([b], [c])
    partitionWith GenLocated SrcSpanAnnA (TyClDecl GhcRn)
    -> Either
         (GenLocated SrcSpanAnnA (TyClDecl GhcRn))
         (GenLocated SrcSpanAnnA (TyClDecl GhcRn), SAKS_or_CUSK)
    get_kind [GenLocated SrcSpanAnnA (TyClDecl GhcRn)]
    [LTyClDecl GhcRn]
    decls
                  kindless_names :: NameSet
    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
    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)) -> IdP (GhcPass p)
    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)
    -> Either
         (GenLocated SrcSpanAnnA (TyClDecl GhcRn))
         (GenLocated SrcSpanAnnA (TyClDecl GhcRn), SAKS_or_CUSK)
    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

            ; [TyCon]
    checked_tcs <- IOEnv (Env TcGblEnv TcLclEnv) [TyCon]
    -> IOEnv (Env TcGblEnv TcLclEnv) [TyCon]
    forall r. TcM r -> TcM r
    checkNoErrs (IOEnv (Env TcGblEnv TcLclEnv) [TyCon]
     -> IOEnv (Env TcGblEnv TcLclEnv) [TyCon])
    -> IOEnv (Env TcGblEnv TcLclEnv) [TyCon]
    -> IOEnv (Env TcGblEnv TcLclEnv) [TyCon]
    forall a b. (a -> b) -> a -> b
    $
                             [(LTyClDecl GhcRn, SAKS_or_CUSK)]
    -> IOEnv (Env TcGblEnv TcLclEnv) [TyCon]
    checkInitialKinds [(GenLocated SrcSpanAnnA (TyClDecl GhcRn), SAKS_or_CUSK)]
    [(LTyClDecl GhcRn, SAKS_or_CUSK)]
    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

            ; [TyCon]
    inferred_tcs
                <- [TyCon]
    -> IOEnv (Env TcGblEnv TcLclEnv) [TyCon]
    -> IOEnv (Env TcGblEnv TcLclEnv) [TyCon]
    forall a. [TyCon] -> TcM a -> TcM a
    tcExtendKindEnvWithTyCons [TyCon]
    checked_tcs  (IOEnv (Env TcGblEnv TcLclEnv) [TyCon]
     -> IOEnv (Env TcGblEnv TcLclEnv) [TyCon])
    -> IOEnv (Env TcGblEnv TcLclEnv) [TyCon]
    -> IOEnv (Env TcGblEnv TcLclEnv) [TyCon]
    forall a b. (a -> b) -> a -> b
    $
                   SkolemInfo
    -> [TyVar]
    -> IOEnv (Env TcGblEnv TcLclEnv) [TyCon]
    -> IOEnv (Env TcGblEnv TcLclEnv) [TyCon]
    forall a. SkolemInfo -> [TyVar] -> TcM a -> TcM a
    pushLevelAndSolveEqualities SkolemInfo
    UnkSkol [] (IOEnv (Env TcGblEnv TcLclEnv) [TyCon]
     -> IOEnv (Env TcGblEnv TcLclEnv) [TyCon])
    -> IOEnv (Env TcGblEnv TcLclEnv) [TyCon]
    -> IOEnv (Env TcGblEnv TcLclEnv) [TyCon]
    forall a b. (a -> b) -> a -> b
    $
                         -- 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
                        [TyCon]
    mono_tcs <- [LTyClDecl GhcRn] -> IOEnv (Env TcGblEnv TcLclEnv) [TyCon]
    inferInitialKinds [GenLocated SrcSpanAnnA (TyClDecl GhcRn)]
    [LTyClDecl GhcRn]
    kindless_decls

                      ; String -> SDoc -> TcRn ()
    traceTc String
    "kcTyClGroup: initial kinds" (SDoc -> TcRn ()) -> SDoc -> TcRn ()
    forall a b. (a -> b) -> a -> b
    $
                        [TyCon] -> SDoc
    ppr_tc_kinds [TyCon]
    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]
                      ; TcRn () -> TcRn ()
    forall r. TcM r -> TcM r
    checkNoErrs (TcRn () -> TcRn ()) -> TcRn () -> TcRn ()
    forall a b. (a -> b) -> a -> b
    $
                        [TyCon] -> TcRn () -> TcRn ()
    forall a. [TyCon] -> TcM a -> TcM a
    tcExtendKindEnvWithTyCons [TyCon]
    mono_tcs (TcRn () -> TcRn ()) -> TcRn () -> TcRn ()
    forall a b. (a -> b) -> a -> b
    $
                        (GenLocated SrcSpanAnnA (TyClDecl GhcRn) -> TcRn ())
    -> [GenLocated SrcSpanAnnA (TyClDecl GhcRn)] -> TcRn ()
    forall (t :: * -> *) (m :: * -> *) a b.
    (Foldable t, Monad m) =>
    (a -> m b) -> t a -> m ()
    mapM_ GenLocated SrcSpanAnnA (TyClDecl GhcRn) -> TcRn ()
    LTyClDecl GhcRn -> TcRn ()
    kcLTyClDecl [GenLocated SrcSpanAnnA (TyClDecl GhcRn)]
    kindless_decls

                      ; [TyCon] -> IOEnv (Env TcGblEnv TcLclEnv) [TyCon]
    forall (m :: * -> *) a. Monad m => a -> m a
    return [TyCon]
    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 :: NameEnv TyCon
    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
            ; [TyCon]
    generalized_tcs <- (GenLocated SrcSpanAnnA (TyClDecl GhcRn)
     -> IOEnv (Env TcGblEnv TcLclEnv) [TyCon])
    -> [GenLocated SrcSpanAnnA (TyClDecl GhcRn)]
    -> IOEnv (Env TcGblEnv TcLclEnv) [TyCon]
    forall (m :: * -> *) a b. Monad m => (a -> m [b]) -> [a] -> m [b]
    concatMapM (NameEnv TyCon
    -> LTyClDecl GhcRn -> IOEnv (Env TcGblEnv TcLclEnv) [TyCon]
    generaliseTyClDecl NameEnv TyCon
    inferred_tc_env)
                                            [GenLocated SrcSpanAnnA (TyClDecl GhcRn)]
    kindless_decls

            ; let poly_tcs :: [TyCon]
    poly_tcs = [TyCon]
    checked_tcs [TyCon] -> [TyCon] -> [TyCon]
    forall a. [a] -> [a] -> [a]
    ++ [TyCon]
    generalized_tcs
            ; String -> SDoc -> TcRn ()
    traceTc String
    "---- kcTyClGroup end ---- }" ([TyCon] -> SDoc
    ppr_tc_kinds [TyCon]
    poly_tcs)
            ; ([TyCon], NameSet) -> TcM ([TyCon], NameSet)
    forall (m :: * -> *) a. Monad m => a -> m a
    return ([TyCon]
    poly_tcs, NameSet
    kindless_names) }
      where
        ppr_tc_kinds :: [TyCon] -> SDoc
    ppr_tc_kinds [TyCon]
    tcs = [SDoc] -> SDoc
    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
    <+> SDoc
    dcolon SDoc -> SDoc -> SDoc
    <+> 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 TcTyCon -> LTyClDecl GhcRn -> TcM [TcTyCon]
    -- See Note [Swizzling the tyvars before generaliseTcTyCon]
    generaliseTyClDecl :: NameEnv TyCon
    -> LTyClDecl GhcRn -> IOEnv (Env TcGblEnv TcLclEnv) [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

           -- Extract the specified/required binders and skolemise them
           ; [(TyCon, [(Name, TyVar)])]
    tc_with_tvs  <- (Name -> IOEnv (Env TcGblEnv TcLclEnv) (TyCon, [(Name, TyVar)]))
    -> [Name]
    -> IOEnv (Env TcGblEnv TcLclEnv) [(TyCon, [(Name, TyVar)])]
    forall (t :: * -> *) (m :: * -> *) a b.
    (Traversable t, Monad m) =>
    (a -> m b) -> t a -> m (t b)
    mapM Name -> IOEnv (Env TcGblEnv TcLclEnv) (TyCon, [(Name, TyVar)])
    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.
           ; [(TyCon, [(Name, TyVar)], Type)]
    tc_infos <- ((TyCon, [(Name, TyVar)])
     -> IOEnv (Env TcGblEnv TcLclEnv) (TyCon, [(Name, TyVar)], Type))
    -> [(TyCon, [(Name, TyVar)])]
    -> IOEnv (Env TcGblEnv TcLclEnv) [(TyCon, [(Name, TyVar)], Type)]
    forall (t :: * -> *) (m :: * -> *) a b.
    (Traversable t, Monad m) =>
    (a -> m b) -> t a -> m (t b)
    mapM (TyCon, [(Name, TyVar)])
    -> IOEnv (Env TcGblEnv TcLclEnv) (TyCon, [(Name, TyVar)], Type)
    zonk_tc_tycon [(TyCon, [(Name, TyVar)])]
    tc_with_tvs

           -- Swizzle
           ; [(TyCon, [(Name, TyVar)], Type)]
    swizzled_infos <- TyClDecl GhcRn
    -> IOEnv (Env TcGblEnv TcLclEnv) [(TyCon, [(Name, TyVar)], Type)]
    -> IOEnv (Env TcGblEnv TcLclEnv) [(TyCon, [(Name, TyVar)], Type)]
    forall a. TyClDecl GhcRn -> TcM a -> TcM a
    tcAddDeclCtxt TyClDecl GhcRn
    decl ([(TyCon, [(Name, TyVar)], Type)]
    -> IOEnv (Env TcGblEnv TcLclEnv) [(TyCon, [(Name, TyVar)], Type)]
    swizzleTcTyConBndrs [(TyCon, [(Name, TyVar)], Type)]
    tc_infos)

           -- And finally generalise
           ; ((TyCon, [(Name, TyVar)], Type) -> TcRn TyCon)
    -> [(TyCon, [(Name, TyVar)], Type)]
    -> IOEnv (Env TcGblEnv TcLclEnv) [TyCon]
    forall a b. (a -> TcRn b) -> [a] -> TcRn [b]
    mapAndReportM (TyCon, [(Name, TyVar)], Type) -> TcRn TyCon
    generaliseTcTyCon [(TyCon, [(Name, TyVar)], Type)]
    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 -> 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) [GenLocated SrcSpanAnnA (FamilyDecl GhcRn)]
    [LFamilyDecl GhcRn]
    ats
        at_names TyClDecl GhcRn
    _ = []  -- Only class decls have associated types

        skolemise_tc_tycon :: Name -> TcM (TcTyCon, ScopedPairs)
        -- Zonk and skolemise the Specified and Required binders
        skolemise_tc_tycon :: Name -> IOEnv (Env TcGblEnv TcLclEnv) (TyCon, [(Name, TyVar)])
    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
               ; [(Name, TyVar)]
    scoped_prs <- (TyVar -> IOEnv (Env TcGblEnv TcLclEnv) TyVar)
    -> [(Name, TyVar)] -> IOEnv (Env TcGblEnv TcLclEnv) [(Name, TyVar)]
    forall (m :: * -> *) b c a.
    Monad m =>
    (b -> m c) -> [(a, b)] -> m [(a, c)]
    mapSndM TyVar -> IOEnv (Env TcGblEnv TcLclEnv) TyVar
    zonkAndSkolemise (TyCon -> [(Name, TyVar)]
    tcTyConScopedTyVars TyCon
    tc)
               ; (TyCon, [(Name, TyVar)])
    -> IOEnv (Env TcGblEnv TcLclEnv) (TyCon, [(Name, TyVar)])
    forall (m :: * -> *) a. Monad m => a -> m a
    return (TyCon
    tc, [(Name, TyVar)]
    scoped_prs) }

        zonk_tc_tycon :: (TcTyCon, ScopedPairs) -> TcM (TcTyCon, ScopedPairs, TcKind)
        zonk_tc_tycon :: (TyCon, [(Name, TyVar)])
    -> IOEnv (Env TcGblEnv TcLclEnv) (TyCon, [(Name, TyVar)], Type)
    zonk_tc_tycon (TyCon
    tc, [(Name, TyVar)]
    scoped_prs)
          = do { [(Name, TyVar)]
    scoped_prs <- (TyVar -> IOEnv (Env TcGblEnv TcLclEnv) TyVar)
    -> [(Name, TyVar)] -> IOEnv (Env TcGblEnv TcLclEnv) [(Name, TyVar)]
    forall (m :: * -> *) b c a.
    Monad m =>
    (b -> m c) -> [(a, b)] -> m [(a, c)]
    mapSndM HasDebugCallStack => TyVar -> IOEnv (Env TcGblEnv TcLclEnv) TyVar
    TyVar -> IOEnv (Env TcGblEnv TcLclEnv) TyVar
    zonkTcTyVarToTyVar [(Name, TyVar)]
    scoped_prs
                               -- We really have to do this again, even though
                               -- we have just done zonkAndSkolemise
               ; Type
    res_kind   <- Type -> TcM Type
    zonkTcType (TyCon -> Type
    tyConResKind TyCon
    tc)
               ; (TyCon, [(Name, TyVar)], Type)
    -> IOEnv (Env TcGblEnv TcLclEnv) (TyCon, [(Name, TyVar)], Type)
    forall (m :: * -> *) a. Monad m => a -> m a
    return (TyCon
    tc, [(Name, TyVar)]
    scoped_prs, Type
    res_kind) }

    swizzleTcTyConBndrs :: [(TcTyCon, ScopedPairs, TcKind)]
                    -> TcM [(TcTyCon, ScopedPairs, TcKind)]
    swizzleTcTyConBndrs :: [(TyCon, [(Name, TyVar)], Type)]
    -> IOEnv (Env TcGblEnv TcLclEnv) [(TyCon, [(Name, TyVar)], Type)]
    swizzleTcTyConBndrs [(TyCon, [(Name, TyVar)], Type)]
    tc_infos
      | ((Name, TyVar) -> Bool) -> [(Name, TyVar)] -> Bool
    forall (t :: * -> *) a. Foldable t => (a -> Bool) -> t a -> Bool
    all (Name, TyVar) -> Bool
    no_swizzle [(Name, TyVar)]
    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] -> SDoc
    forall a. Outputable a => a -> SDoc
    ppr (((TyCon, [(Name, TyVar)], Type) -> TyCon)
    -> [(TyCon, [(Name, TyVar)], Type)] -> [TyCon]
    forall a b. (a -> b) -> [a] -> [b]
    map (TyCon, [(Name, TyVar)], Type) -> TyCon
    forall a b c. (a, b, c) -> a
    fstOf3 [(TyCon, [(Name, TyVar)], Type)]
    tc_infos))
           ; [(TyCon, [(Name, TyVar)], Type)]
    -> IOEnv (Env TcGblEnv TcLclEnv) [(TyCon, [(Name, TyVar)], Type)]
    forall (m :: * -> *) a. Monad m => a -> m a
    return [(TyCon, [(Name, TyVar)], Type)]
    tc_infos }

      | Bool
    otherwise
      = do { TcRn ()
    check_duplicate_tc_binders

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

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

      where
        swizzled_infos :: [(TyCon, [(Name, TyVar)], Type)]
    swizzled_infos =  [ (TyCon
    tc, (TyVar -> TyVar) -> [(Name, TyVar)] -> [(Name, TyVar)]
    forall b c a. (b -> c) -> [(a, b)] -> [(a, c)]
    mapSnd TyVar -> TyVar
    swizzle_var [(Name, TyVar)]
    scoped_prs, Type -> Type
    swizzle_ty Type
    kind)
                          | (TyCon
    tc, [(Name, TyVar)]
    scoped_prs, Type
    kind) <- [(TyCon, [(Name, TyVar)], 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, TyVar)]
    swizzle_prs = [ (Name, TyVar)
    pr | (TyCon
    _, [(Name, TyVar)]
    prs, Type
    _) <- [(TyCon, [(Name, TyVar)], Type)]
    tc_infos, (Name, TyVar)
    pr <- [(Name, TyVar)]
    prs ]

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

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

        -- Check for duplicates
        -- E.g. data SameKind (a::k) (b::k)
        --      data T (a::k1) (b::k2) = MkT (SameKind a b)
        -- Here k1 and k2 start as TyVarTvs, and get unified with each other
        -- If this happens, things get very confused later, so fail fast
        check_duplicate_tc_binders :: TcM ()
        check_duplicate_tc_binders :: TcRn ()
    check_duplicate_tc_binders = Bool -> TcRn () -> TcRn ()
    forall (f :: * -> *). Applicative f => Bool -> f () -> f ()
    unless ([(Name, Name)] -> Bool
    forall (t :: * -> *) a. Foldable t => t a -> Bool
    null [(Name, Name)]
    err_prs) (TcRn () -> TcRn ()) -> TcRn () -> TcRn ()
    forall a b. (a -> b) -> a -> b
    $
                                     do { ((Name, Name) -> TcRn ()) -> [(Name, Name)] -> TcRn ()
    forall (t :: * -> *) (m :: * -> *) a b.
    (Foldable t, Monad m) =>
    (a -> m b) -> t a -> m ()
    mapM_ (Name, Name) -> TcRn ()
    report_dup [(Name, Name)]
    err_prs; TcRn ()
    forall env a. IOEnv env a
    failM }

        -------------- Error reporting ------------
        err_prs :: [(Name,Name)]
        err_prs :: [(Name, Name)]
    err_prs = [ (Name
    n1,Name
    n2)
                  | (Name, TyVar)
    pr :| [(Name, TyVar)]
    prs <- ((Name, TyVar) -> (Name, TyVar) -> Bool)
    -> [(Name, TyVar)] -> [NonEmpty (Name, TyVar)]
    forall a. (a -> a -> Bool) -> [a] -> [NonEmpty a]
    findDupsEq (TyVar -> TyVar -> Bool
    forall a. Eq a => a -> a -> Bool
    (==) (TyVar -> TyVar -> Bool)
    -> ((Name, TyVar) -> TyVar)
    -> (Name, TyVar)
    -> (Name, TyVar)
    -> Bool
    forall b c a. (b -> b -> c) -> (a -> b) -> a -> a -> c
    `on` (Name, TyVar) -> TyVar
    forall a b. (a, b) -> b
    snd) [(Name, TyVar)]
    swizzle_prs
                  , (Name
    n1,TyVar
    _):(Name
    n2,TyVar
    _):[(Name, TyVar)]
    _ <- [((Name, TyVar) -> (Name, TyVar) -> Bool)
    -> [(Name, TyVar)] -> [(Name, TyVar)]
    forall a. (a -> a -> Bool) -> [a] -> [a]
    nubBy (Name -> Name -> Bool
    forall a. Eq a => a -> a -> Bool
    (==) (Name -> Name -> Bool)
    -> ((Name, TyVar) -> Name)
    -> (Name, TyVar)
    -> (Name, TyVar)
    -> Bool
    forall b c a. (b -> b -> c) -> (a -> b) -> a -> a -> c
    `on` (Name, TyVar) -> Name
    forall a b. (a, b) -> a
    fst) ((Name, TyVar)
    pr(Name, TyVar) -> [(Name, TyVar)] -> [(Name, TyVar)]
    forall a. a -> [a] -> [a]
    :[(Name, TyVar)]
    prs)] ]
                  -- This nubBy avoids bogus error reports when we have
                  --    [("f", f), ..., ("f",f)....] in swizzle_prs
                  -- which happens with  class C f where { type T f }

        report_dup :: (Name,Name) -> TcM ()
        report_dup :: (Name, Name) -> TcRn ()
    report_dup (Name
    n1,Name
    n2)
          = SrcSpan -> TcRn () -> TcRn ()
    forall a. SrcSpan -> TcRn a -> TcRn a
    setSrcSpan (Name -> SrcSpan
    forall a. NamedThing a => a -> SrcSpan
    getSrcSpan Name
    n2) (TcRn () -> TcRn ()) -> TcRn () -> TcRn ()
    forall a b. (a -> b) -> a -> b
    $ SDoc -> TcRn ()
    addErrTc (SDoc -> TcRn ()) -> SDoc -> TcRn ()
    forall a b. (a -> b) -> a -> b
    $
            SDoc -> Arity -> SDoc -> SDoc
    hang (String -> SDoc
    text String
    "Different names for the same type variable:") Arity
    2 SDoc
    info
          where
            info :: SDoc
    info | Name -> OccName
    nameOccName Name
    n1 OccName -> OccName -> Bool
    forall a. Eq a => a -> a -> Bool
    /= Name -> OccName
    nameOccName Name
    n2
                 = SDoc -> SDoc
    quotes (Name -> SDoc
    forall a. Outputable a => a -> SDoc
    ppr Name
    n1) SDoc -> SDoc -> SDoc
    <+> String -> SDoc
    text String
    "and" SDoc -> SDoc -> SDoc
    <+> SDoc -> SDoc
    quotes (Name -> SDoc
    forall a. Outputable a => a -> SDoc
    ppr Name
    n2)
                 | Bool
    otherwise -- Same OccNames! See C2 in
                             -- Note [Swizzling the tyvars before generaliseTcTyCon]
                 = [SDoc] -> SDoc
    vcat [ SDoc -> SDoc
    quotes (Name -> SDoc
    forall a. Outputable a => a -> SDoc
    ppr Name
    n1) SDoc -> SDoc -> SDoc
    <+> String -> SDoc
    text String
    "bound at" SDoc -> SDoc -> SDoc
    <+> SrcLoc -> SDoc
    forall a. Outputable a => a -> SDoc
    ppr (Name -> SrcLoc
    forall a. NamedThing a => a -> SrcLoc
    getSrcLoc Name
    n1)
                        , SDoc -> SDoc
    quotes (Name -> SDoc
    forall a. Outputable a => a -> SDoc
    ppr Name
    n2) SDoc -> SDoc -> SDoc
    <+> String -> SDoc
    text String
    "bound at" SDoc -> SDoc -> SDoc
    <+> SrcLoc -> SDoc
    forall a. Outputable a => a -> SDoc
    ppr (Name -> SrcLoc
    forall a. NamedThing a => a -> SrcLoc
    getSrcLoc Name
    n2) ]

        -------------- 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 = [(TyVar, Name)] -> VarEnv Name
    forall a. [(TyVar, a)] -> VarEnv a
    mkVarEnv (((Name, TyVar) -> (TyVar, Name))
    -> [(Name, TyVar)] -> [(TyVar, Name)]
    forall a b. (a -> b) -> [a] -> [b]
    map (Name, TyVar) -> (TyVar, Name)
    forall a b. (a, b) -> (b, a)
    swap [(Name, TyVar)]
    swizzle_prs)

        swizzleMapper :: TyCoMapper () Identity
        swizzleMapper :: TyCoMapper () Identity
    swizzleMapper = TyCoMapper { tcm_tyvar :: () -> TyVar -> Identity Type
    tcm_tyvar = () -> TyVar -> Identity Type
    forall {m :: * -> *} {p}. Monad m => p -> TyVar -> m Type
    swizzle_tv
                                   , tcm_covar :: () -> TyVar -> Identity Coercion
    tcm_covar = () -> TyVar -> Identity Coercion
    forall {m :: * -> *} {p}. Monad m => p -> TyVar -> 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 :: () -> TyVar -> ArgFlag -> Identity ((), TyVar)
    tcm_tycobinder = () -> TyVar -> ArgFlag -> Identity ((), TyVar)
    forall {m :: * -> *} {p} {p}.
    Monad m =>
    p -> TyVar -> p -> m ((), TyVar)
    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 -> TyVar -> m Type
    swizzle_tv p
    _ TyVar
    tv = Type -> m Type
    forall (m :: * -> *) a. Monad m => a -> m a
    return (TyVar -> Type
    mkTyVarTy (TyVar -> TyVar
    swizzle_var TyVar
    tv))
        swizzle_cv :: p -> TyVar -> m Coercion
    swizzle_cv p
    _ TyVar
    cv = Coercion -> m Coercion
    forall (m :: * -> *) a. Monad m => a -> m a
    return (TyVar -> Coercion
    mkCoVarCo (TyVar -> TyVar
    swizzle_var TyVar
    cv))

        swizzle_bndr :: p -> TyVar -> p -> m ((), TyVar)
    swizzle_bndr p
    _ TyVar
    tcv p
    _
          = ((), TyVar) -> m ((), TyVar)
    forall (m :: * -> *) a. Monad m => a -> m a
    return ((), TyVar -> TyVar
    swizzle_var TyVar
    tcv)

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

        (Type -> Identity Type
    map_type, [Type] -> Identity [Type]
    _, Coercion -> Identity Coercion
    _, [Coercion] -> Identity [Coercion]
    _) = TyCoMapper () Identity
    -> (Type -> Identity Type, [Type] -> Identity [Type],
        Coercion -> Identity Coercion, [Coercion] -> Identity [Coercion])
    forall (m :: * -> *).
    Monad m =>
    TyCoMapper () m
    -> (Type -> m Type, [Type] -> m [Type], 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 :: (TcTyCon, ScopedPairs, TcKind) -> TcM TcTyCon
    generaliseTcTyCon :: (TyCon, [(Name, TyVar)], Type) -> TcRn TyCon
    generaliseTcTyCon (TyCon
    tc, [(Name, TyVar)]
    scoped_prs, Type
    tc_res_kind)
      -- 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 :: [TyVar]
    spec_req_tvs        = ((Name, TyVar) -> TyVar) -> [(Name, TyVar)] -> [TyVar]
    forall a b. (a -> b) -> [a] -> [b]
    map (Name, TyVar) -> TyVar
    forall a b. (a, b) -> b
    snd [(Name, TyVar)]
    scoped_prs
                 n_spec :: Arity
    n_spec              = [TyVar] -> Arity
    forall (t :: * -> *) a. Foldable t => t a -> Arity
    length [TyVar]
    spec_req_tvs Arity -> Arity -> Arity
    forall a. Num a => a -> a -> a
    - TyCon -> Arity
    tyConArity TyCon
    tc
                 ([TyVar]
    spec_tvs, [TyVar]
    req_tvs) = Arity -> [TyVar] -> ([TyVar], [TyVar])
    forall a. Arity -> [a] -> ([a], [a])
    splitAt Arity
    n_spec [TyVar]
    spec_req_tvs
                 sorted_spec_tvs :: [TyVar]
    sorted_spec_tvs     = [TyVar] -> [TyVar]
    scopedSort [TyVar]
    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
           ; CandidatesQTvs
    dvs1 <- [Type] -> TcM CandidatesQTvs
    candidateQTyVarsOfKinds ([Type] -> TcM CandidatesQTvs) -> [Type] -> TcM CandidatesQTvs
    forall a b. (a -> b) -> a -> b
    $
                     (Type
    tc_res_kind Type -> [Type] -> [Type]
    forall a. a -> [a] -> [a]
    : (TyVar -> Type) -> [TyVar] -> [Type]
    forall a b. (a -> b) -> [a] -> [b]
    map TyVar -> Type
    tyVarKind [TyVar]
    spec_req_tvs)
           ; let dvs2 :: CandidatesQTvs
    dvs2 = CandidatesQTvs
    dvs1 CandidatesQTvs -> [TyVar] -> CandidatesQTvs
    `delCandidates` [TyVar]
    spec_req_tvs

           -- Step 2b: quantify, mainly meaning skolemise the free variables
           -- Returned 'inferred' are scope-sorted and skolemised
           ; [TyVar]
    inferred <- CandidatesQTvs -> TcM [TyVar]
    quantifyTyVars CandidatesQTvs
    dvs2

           ; String -> SDoc -> TcRn ()
    traceTc String
    "generaliseTcTyCon: pre zonk"
               ([SDoc] -> SDoc
    vcat [ String -> SDoc
    text String
    "tycon =" SDoc -> SDoc -> SDoc
    <+> TyCon -> SDoc
    forall a. Outputable a => a -> SDoc
    ppr TyCon
    tc
                     , String -> SDoc
    text String
    "spec_req_tvs =" SDoc -> SDoc -> SDoc
    <+> [TyVar] -> SDoc
    pprTyVars [TyVar]
    spec_req_tvs
                     , String -> SDoc
    text String
    "tc_res_kind =" SDoc -> SDoc -> SDoc
    <+> Type -> SDoc
    forall a. Outputable a => a -> SDoc
    ppr Type
    tc_res_kind
                     , String -> SDoc
    text String
    "dvs1 =" SDoc -> SDoc -> SDoc
    <+> CandidatesQTvs -> SDoc
    forall a. Outputable a => a -> SDoc
    ppr CandidatesQTvs
    dvs1
                     , String -> SDoc
    text String
    "inferred =" SDoc -> SDoc -> SDoc
    <+> [TyVar] -> SDoc
    pprTyVars [TyVar]
    inferred ])

           -- Step 3: Final zonk (following kind generalisation)
           -- See Note [Swizzling the tyvars before generaliseTcTyCon]
           ; ZonkEnv
    ze <- ZonkFlexi -> TcM ZonkEnv
    mkEmptyZonkEnv ZonkFlexi
    NoFlexi
           ; (ZonkEnv
    ze, [TyVar]
    inferred)        <- ZonkEnv -> [TyVar] -> TcM (ZonkEnv, [TyVar])
    zonkTyBndrsX      ZonkEnv
    ze [TyVar]
    inferred
           ; (ZonkEnv
    ze, [TyVar]
    sorted_spec_tvs) <- ZonkEnv -> [TyVar] -> TcM (ZonkEnv, [TyVar])
    zonkTyBndrsX      ZonkEnv
    ze [TyVar]
    sorted_spec_tvs
           ; (ZonkEnv
    ze, [TyVar]
    req_tvs)         <- ZonkEnv -> [TyVar] -> TcM (ZonkEnv, [TyVar])
    zonkTyBndrsX      ZonkEnv
    ze [TyVar]
    req_tvs
           ; Type
    tc_res_kind           <- ZonkEnv -> Type -> TcM Type
    zonkTcTypeToTypeX ZonkEnv
    ze Type
    tc_res_kind

           ; String -> SDoc -> TcRn ()
    traceTc String
    "generaliseTcTyCon: post zonk" (SDoc -> TcRn ()) -> SDoc -> TcRn ()
    forall a b. (a -> b) -> a -> b
    $
             [SDoc] -> SDoc
    vcat [ String -> SDoc
    text String
    "tycon =" SDoc -> SDoc -> SDoc
    <+> TyCon -> SDoc
    forall a. Outputable a => a -> SDoc
    ppr TyCon
    tc
                  , String -> SDoc
    text String
    "inferred =" SDoc -> SDoc -> SDoc
    <+> [TyVar] -> SDoc
    pprTyVars [TyVar]
    inferred
                  , String -> SDoc
    text String
    "spec_req_tvs =" SDoc -> SDoc -> SDoc
    <+> [TyVar] -> SDoc
    pprTyVars [TyVar]
    spec_req_tvs
                  , String -> SDoc
    text String
    "sorted_spec_tvs =" SDoc -> SDoc -> SDoc
    <+> [TyVar] -> SDoc
    pprTyVars [TyVar]
    sorted_spec_tvs
                  , String -> SDoc
    text String
    "req_tvs =" SDoc -> SDoc -> SDoc
    <+> [TyVar] -> SDoc
    forall a. Outputable a => a -> SDoc
    ppr [TyVar]
    req_tvs
                  , String -> SDoc
    text String
    "zonk-env =" SDoc -> SDoc -> SDoc
    <+> ZonkEnv -> SDoc
    forall a. Outputable a => a -> SDoc
    ppr ZonkEnv
    ze ]

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

           -- Step 5: Assemble the final list.
                 final_tcbs :: [TyConBinder]
    final_tcbs = [[TyConBinder]] -> [TyConBinder]
    forall (t :: * -> *) a. Foldable t => t [a] -> [a]
    concat [ [TyConBinder]
    inferred_tcbs
                                     , [TyConBinder]
    specified_tcbs
                                     , [TyConBinder]
    required_tcbs ]

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

           ; String -> SDoc -> TcRn ()
    traceTc String
    "generaliseTcTyCon done" (SDoc -> TcRn ()) -> SDoc -> TcRn ()
    forall a b. (a -> b) -> a -> b
    $
             [SDoc] -> SDoc
    vcat [ String -> SDoc
    text String
    "tycon =" SDoc -> SDoc -> SDoc
    <+> TyCon -> SDoc
    forall a. Outputable a => a -> SDoc
    ppr TyCon
    tc
                  , String -> SDoc
    text String
    "tc_res_kind =" SDoc -> SDoc -> SDoc
    <+> Type -> SDoc
    forall a. Outputable a => a -> SDoc
    ppr Type
    tc_res_kind
                  , String -> SDoc
    text String
    "dep_fv_set =" SDoc -> SDoc -> SDoc
    <+> VarSet -> SDoc
    forall a. Outputable a => a -> SDoc
    ppr VarSet
    dep_fv_set
                  , String -> SDoc
    text String
    "inferred_tcbs =" SDoc -> SDoc -> SDoc
    <+> [TyConBinder] -> SDoc
    forall a. Outputable a => a -> SDoc
    ppr [TyConBinder]
    inferred_tcbs
                  , String -> SDoc
    text String
    "specified_tcbs =" SDoc -> SDoc -> SDoc
    <+> [TyConBinder] -> SDoc
    forall a. Outputable a => a -> SDoc
    ppr [TyConBinder]
    specified_tcbs
                  , String -> SDoc
    text String
    "required_tcbs =" SDoc -> SDoc -> SDoc
    <+> [TyConBinder] -> SDoc
    forall a. Outputable a => a -> SDoc
    ppr [TyConBinder]
    required_tcbs
                  , String -> SDoc
    text String
    "final_tcbs =" SDoc -> SDoc -> SDoc
    <+> [TyConBinder] -> SDoc
    forall a. Outputable a => a -> SDoc
    ppr [TyConBinder]
    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
           ; TyCon -> TcRn ()
    checkTyConTelescope TyCon
    tycon

           ; TyCon -> TcRn TyCon
    forall (m :: * -> *) a. Monad m => a -> m a
    return TyCon
    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, TyCoVarBinders, 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 depdendency 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 compilicated; 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.  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 (findDupTyVarTvs),
      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
    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
    SAK).

    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 a. [TyCon] -> TcM a -> TcM a
    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] -> TcTypeEnv
    mkPromotionErrorEnv [LTyClDecl GhcRn]
    decls
      = (GenLocated SrcSpanAnnA (TyClDecl GhcRn) -> TcTypeEnv -> TcTypeEnv)
    -> TcTypeEnv
    -> [GenLocated SrcSpanAnnA (TyClDecl GhcRn)]
    -> TcTypeEnv
    forall (t :: * -> *) a b.
    Foldable t =>
    (a -> b -> b) -> b -> t a -> b
    foldr (TcTypeEnv -> TcTypeEnv -> TcTypeEnv
    forall a. NameEnv a -> NameEnv a -> NameEnv a
    plusNameEnv (TcTypeEnv -> TcTypeEnv -> TcTypeEnv)
    -> (GenLocated SrcSpanAnnA (TyClDecl GhcRn) -> TcTypeEnv)
    -> GenLocated SrcSpanAnnA (TyClDecl GhcRn)
    -> TcTypeEnv
    -> TcTypeEnv
    forall b c a. (b -> c) -> (a -> b) -> a -> c
    . TyClDecl GhcRn -> TcTypeEnv
    mk_prom_err_env (TyClDecl GhcRn -> TcTypeEnv)
    -> (GenLocated SrcSpanAnnA (TyClDecl GhcRn) -> TyClDecl GhcRn)
    -> GenLocated SrcSpanAnnA (TyClDecl GhcRn)
    -> TcTypeEnv
    forall b c a. (b -> c) -> (a -> b) -> a -> c
    . GenLocated SrcSpanAnnA (TyClDecl GhcRn) -> TyClDecl GhcRn
    forall l e. GenLocated l e -> e
    unLoc)
              TcTypeEnv
    forall a. NameEnv a
    emptyNameEnv [GenLocated SrcSpanAnnA (TyClDecl GhcRn)]
    [LTyClDecl GhcRn]
    decls

    mk_prom_err_env :: TyClDecl GhcRn -> TcTypeEnv
    mk_prom_err_env :: TyClDecl GhcRn -> TcTypeEnv
    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 -> TcTypeEnv
    forall a. Name -> a -> NameEnv a
    unitNameEnv Name
    nm (PromotionErr -> TcTyThing
    APromotionErr PromotionErr
    ClassPE)
        TcTypeEnv -> TcTypeEnv -> TcTypeEnv
    forall a. NameEnv a -> NameEnv a -> NameEnv a
    `plusNameEnv`
        [(Name, TcTyThing)] -> TcTypeEnv
    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 <- [GenLocated SrcSpanAnnA (FamilyDecl GhcRn)]
    [LFamilyDecl 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 -> [LConDecl pass]
    dd_cons = [LConDecl GhcRn]
    cons } })
      = Name -> TcTyThing -> TcTypeEnv
    forall a. Name -> a -> NameEnv a
    unitNameEnv Name
    name (PromotionErr -> TcTyThing
    APromotionErr PromotionErr
    TyConPE)
        TcTypeEnv -> TcTypeEnv -> TcTypeEnv
    forall a. NameEnv a -> NameEnv a -> NameEnv a
    `plusNameEnv`
        [(Name, TcTyThing)] -> TcTypeEnv
    forall a. [(Name, a)] -> NameEnv a
    mkNameEnv [ (Name
    con, PromotionErr -> TcTyThing
    APromotionErr PromotionErr
    RecDataConPE)
                  | L SrcSpanAnnA
    _ ConDecl GhcRn
    con' <- [GenLocated SrcSpanAnnA (ConDecl GhcRn)]
    [LConDecl GhcRn]
    cons
                  , L SrcSpanAnnN
    _ Name
    con  <- ConDecl GhcRn -> [GenLocated SrcSpanAnnN Name]
    getConNames ConDecl GhcRn
    con' ]

    mk_prom_err_env TyClDecl GhcRn
    decl
      = Name -> TcTyThing -> TcTypeEnv
    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 [TcTyCon]
    -- Returns a TcTyCon for each TyCon bound by the decls,
    -- each with its initial kind

    inferInitialKinds :: [LTyClDecl GhcRn] -> IOEnv (Env TcGblEnv TcLclEnv) [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 -> 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) [GenLocated SrcSpanAnnA (TyClDecl GhcRn)]
    [LTyClDecl GhcRn]
    decls)
           ; [TyCon]
    tcs <- (GenLocated SrcSpanAnnA (TyClDecl GhcRn)
     -> IOEnv (Env TcGblEnv TcLclEnv) [TyCon])
    -> [GenLocated SrcSpanAnnA (TyClDecl GhcRn)]
    -> IOEnv (Env TcGblEnv TcLclEnv) [TyCon]
    forall (m :: * -> *) a b. Monad m => (a -> m [b]) -> [a] -> m [b]
    concatMapM GenLocated SrcSpanAnnA (TyClDecl GhcRn)
    -> IOEnv (Env TcGblEnv TcLclEnv) [TyCon]
    forall {ann}.
    GenLocated (SrcSpanAnn' ann) (TyClDecl GhcRn)
    -> IOEnv (Env TcGblEnv TcLclEnv) [TyCon]
    infer_initial_kind [GenLocated SrcSpanAnnA (TyClDecl GhcRn)]
    [LTyClDecl GhcRn]
    decls
           ; String -> SDoc -> TcRn ()
    traceTc String
    "inferInitialKinds done }" SDoc
    empty
           ; [TyCon] -> IOEnv (Env TcGblEnv TcLclEnv) [TyCon]
    forall (m :: * -> *) a. Monad m => a -> m a
    return [TyCon]
    tcs }
      where
        infer_initial_kind :: GenLocated (SrcSpanAnn' ann) (TyClDecl GhcRn)
    -> IOEnv (Env TcGblEnv TcLclEnv) [TyCon]
    infer_initial_kind = (TyClDecl GhcRn -> IOEnv (Env TcGblEnv TcLclEnv) [TyCon])
    -> GenLocated (SrcSpanAnn' ann) (TyClDecl GhcRn)
    -> IOEnv (Env TcGblEnv TcLclEnv) [TyCon]
    forall a b ann.
    (a -> TcM b) -> GenLocated (SrcSpanAnn' ann) a -> TcM b
    addLocMA (InitialKindStrategy
    -> TyClDecl GhcRn -> IOEnv (Env TcGblEnv TcLclEnv) [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 [TcTyCon]
    checkInitialKinds :: [(LTyClDecl GhcRn, SAKS_or_CUSK)]
    -> IOEnv (Env TcGblEnv TcLclEnv) [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 a c b. (a -> c) -> [(a, b)] -> [(c, b)]
    mapFst (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) [(GenLocated SrcSpanAnnA (TyClDecl GhcRn), SAKS_or_CUSK)]
    [(LTyClDecl GhcRn, SAKS_or_CUSK)]
    decls)
           ; [TyCon]
    tcs <- ((GenLocated SrcSpanAnnA (TyClDecl GhcRn), SAKS_or_CUSK)
     -> IOEnv (Env TcGblEnv TcLclEnv) [TyCon])
    -> [(GenLocated SrcSpanAnnA (TyClDecl GhcRn), SAKS_or_CUSK)]
    -> IOEnv (Env TcGblEnv TcLclEnv) [TyCon]
    forall (m :: * -> *) a b. Monad m => (a -> m [b]) -> [a] -> m [b]
    concatMapM (GenLocated SrcSpanAnnA (TyClDecl GhcRn), SAKS_or_CUSK)
    -> IOEnv (Env TcGblEnv TcLclEnv) [TyCon]
    forall {ann}.
    (GenLocated (SrcSpanAnn' ann) (TyClDecl GhcRn), SAKS_or_CUSK)
    -> IOEnv (Env TcGblEnv TcLclEnv) [TyCon]
    check_initial_kind [(GenLocated SrcSpanAnnA (TyClDecl GhcRn), SAKS_or_CUSK)]
    [(LTyClDecl GhcRn, SAKS_or_CUSK)]
    decls
           ; String -> SDoc -> TcRn ()
    traceTc String
    "checkInitialKinds done }" SDoc
    empty
           ; [TyCon] -> IOEnv (Env TcGblEnv TcLclEnv) [TyCon]
    forall (m :: * -> *) a. Monad m => a -> m a
    return [TyCon]
    tcs }
      where
        check_initial_kind :: (GenLocated (SrcSpanAnn' ann) (TyClDecl GhcRn), SAKS_or_CUSK)
    -> IOEnv (Env TcGblEnv TcLclEnv) [TyCon]
    check_initial_kind (GenLocated (SrcSpanAnn' ann) (TyClDecl GhcRn)
    ldecl, SAKS_or_CUSK
    msig) =
          (TyClDecl GhcRn -> IOEnv (Env TcGblEnv TcLclEnv) [TyCon])
    -> GenLocated (SrcSpanAnn' ann) (TyClDecl GhcRn)
    -> IOEnv (Env TcGblEnv TcLclEnv) [TyCon]
    forall a b ann.
    (a -> TcM b) -> GenLocated (SrcSpanAnn' ann) a -> TcM b
    addLocMA (InitialKindStrategy
    -> TyClDecl GhcRn -> IOEnv (Env TcGblEnv TcLclEnv) [TyCon]
    getInitialKind (SAKS_or_CUSK -> InitialKindStrategy
    InitialKindCheck SAKS_or_CUSK
    msig)) GenLocated (SrcSpanAnn' ann) (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 -> IOEnv (Env TcGblEnv TcLclEnv) [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 { TyCon
    cls <- InitialKindStrategy
    -> Name
    -> TyConFlavour
    -> LHsQTyVars GhcRn
    -> TcM ContextKind
    -> TcRn TyCon
    kcDeclHeader InitialKindStrategy
    strategy Name
    name TyConFlavour
    ClassFlavour LHsQTyVars GhcRn
    ktvs (TcM ContextKind -> TcRn TyCon) -> TcM ContextKind -> TcRn TyCon
    forall a b. (a -> b) -> a -> b
    $
                    ContextKind -> TcM ContextKind
    forall (m :: * -> *) a. Monad m => a -> m a
    return (Type -> ContextKind
    TheKind Type
    constraintKind)
           ; let parent_tv_prs :: [(Name, TyVar)]
    parent_tv_prs = TyCon -> [(Name, TyVar)]
    tcTyConScopedTyVars TyCon
    cls
                -- See Note [Don't process associated types in getInitialKind]
           ; [TyCon]
    inner_tcs <-
               [(Name, TyVar)]
    -> IOEnv (Env TcGblEnv TcLclEnv) [TyCon]
    -> IOEnv (Env TcGblEnv TcLclEnv) [TyCon]
    forall r. [(Name, TyVar)] -> TcM r -> TcM r
    tcExtendNameTyVarEnv [(Name, TyVar)]
    parent_tv_prs (IOEnv (Env TcGblEnv TcLclEnv) [TyCon]
     -> IOEnv (Env TcGblEnv TcLclEnv) [TyCon])
    -> IOEnv (Env TcGblEnv TcLclEnv) [TyCon]
    -> IOEnv (Env TcGblEnv TcLclEnv) [TyCon]
    forall a b. (a -> b) -> a -> b
    $
               (GenLocated SrcSpanAnnA (FamilyDecl GhcRn) -> TcRn TyCon)
    -> [GenLocated SrcSpanAnnA (FamilyDecl GhcRn)]
    -> IOEnv (Env TcGblEnv TcLclEnv) [TyCon]
    forall (t :: * -> *) (m :: * -> *) a b.
    (Traversable t, Monad m) =>
    (a -> m b) -> t a -> m (t b)
    mapM ((FamilyDecl GhcRn -> TcRn TyCon)
    -> GenLocated SrcSpanAnnA (FamilyDecl GhcRn) -> TcRn TyCon
    forall a b ann.
    (a -> TcM b) -> GenLocated (SrcSpanAnn' ann) a -> TcM b
    addLocMA (TyCon -> FamilyDecl GhcRn -> TcRn TyCon
    getAssocFamInitialKind TyCon
    cls)) [GenLocated SrcSpanAnnA (FamilyDecl GhcRn)]
    [LFamilyDecl GhcRn]
    ats
           ; [TyCon] -> IOEnv (Env TcGblEnv TcLclEnv) [TyCon]
    forall (m :: * -> *) a. Monad m => a -> m a
    return (TyCon
    cls TyCon -> [TyCon] -> [TyCon]
    forall a. a -> [a] -> [a]
    : [TyCon]
    inner_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_ND :: forall pass. HsDataDefn pass -> NewOrData
    dd_ND = NewOrData
    new_or_data } })
      = do  { let flav :: TyConFlavour
    flav = NewOrData -> TyConFlavour
    newOrDataToFlavour NewOrData
    new_or_data
                  ctxt :: UserTypeCtxt
    ctxt = Name -> UserTypeCtxt
    DataKindCtxt Name
    name
            ; TyCon
    tc <- InitialKindStrategy
    -> Name
    -> TyConFlavour
    -> LHsQTyVars GhcRn
    -> TcM ContextKind
    -> TcRn TyCon
    kcDeclHeader InitialKindStrategy
    strategy Name
    name TyConFlavour
    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) -> TcM Type -> TcM ContextKind
    forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
    <$> UserTypeCtxt -> LHsKind GhcRn -> TcM Type
    tcLHsKindSig UserTypeCtxt
    ctxt LHsKind GhcRn
    ksig
                      Maybe (LHsKind GhcRn)
    Nothing   -> ContextKind -> TcM ContextKind
    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 NewOrData
    new_or_data
            ; [TyCon] -> IOEnv (Env TcGblEnv TcLclEnv) [TyCon]
    forall (m :: * -> *) a. Monad m => a -> m a
    return [TyCon
    tc] }

    getInitialKind InitialKindStrategy
    InitialKindInfer (FamDecl { tcdFam :: forall pass. TyClDecl pass -> FamilyDecl pass
    tcdFam = FamilyDecl GhcRn
    decl })
      = do { TyCon
    tc <- Maybe TyCon -> FamilyDecl GhcRn -> TcRn TyCon
    get_fam_decl_initial_kind Maybe TyCon
    forall a. Maybe a
    Nothing FamilyDecl GhcRn
    decl
           ; [TyCon] -> IOEnv (Env TcGblEnv TcLclEnv) [TyCon]
    forall (m :: * -> *) a. Monad m => a -> m a
    return [TyCon
    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
    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
    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
    flav = Maybe TyCon -> FamilyInfo GhcRn -> TyConFlavour
    forall pass. Maybe TyCon -> FamilyInfo pass -> TyConFlavour
    getFamFlav Maybe TyCon
    forall a. Maybe a
    Nothing FamilyInfo GhcRn
    info
                 ctxt :: UserTypeCtxt
    ctxt = Name -> UserTypeCtxt
    TyFamResKindCtxt Name
    name
           ; TyCon
    tc <- InitialKindStrategy
    -> Name
    -> TyConFlavour
    -> LHsQTyVars GhcRn
    -> TcM ContextKind
    -> TcRn TyCon
    kcDeclHeader (SAKS_or_CUSK -> InitialKindStrategy
    InitialKindCheck SAKS_or_CUSK
    msig) Name
    name TyConFlavour
    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) -> TcM Type -> TcM ContextKind
    forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
    <$> UserTypeCtxt -> LHsKind GhcRn -> TcM 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 (m :: * -> *) a. Monad m => a -> m a
    return (Type -> ContextKind
    TheKind Type
    liftedTypeKind)
                         SAKS Type
    _ -> ContextKind -> TcM ContextKind
    forall (m :: * -> *) a. Monad m => a -> m a
    return ContextKind
    AnyKind
           ; [TyCon] -> IOEnv (Env TcGblEnv TcLclEnv) [TyCon]
    forall (m :: * -> *) a. Monad m => a -> m a
    return [TyCon
    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
           ; TyCon
    tc <- InitialKindStrategy
    -> Name
    -> TyConFlavour
    -> LHsQTyVars GhcRn
    -> TcM ContextKind
    -> TcRn TyCon
    kcDeclHeader InitialKindStrategy
    strategy Name
    name TyConFlavour
    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) -> TcM Type -> TcM ContextKind
    forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
    <$> UserTypeCtxt -> LHsKind GhcRn -> TcM Type
    tcLHsKindSig UserTypeCtxt
    ctxt LHsKind GhcRn
    rhs_sig
                     Maybe (LHsKind GhcRn)
    Nothing -> ContextKind -> TcM ContextKind
    forall (m :: * -> *) a. Monad m => a -> m a
    return ContextKind
    AnyKind
           ; [TyCon] -> IOEnv (Env TcGblEnv TcLclEnv) [TyCon]
    forall (m :: * -> *) a. Monad m => a -> m a
    return [TyCon
    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 SrcSpan
    _ FamilyResultSig GhcRn
    resultSig
                   , fdInfo :: forall pass. FamilyDecl pass -> FamilyInfo pass
    fdInfo      = FamilyInfo GhcRn
    info }
      = InitialKindStrategy
    -> Name
    -> TyConFlavour
    -> LHsQTyVars GhcRn
    -> TcM ContextKind
    -> TcRn TyCon
    kcDeclHeader InitialKindStrategy
    InitialKindInfer Name
    name TyConFlavour
    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) -> TcM Type -> TcM ContextKind
    forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
    <$> UserTypeCtxt -> LHsKind GhcRn -> TcM 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) -> TcM Type -> TcM ContextKind
    forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
    <$> UserTypeCtxt -> LHsKind GhcRn -> TcM Type
    tcLHsKindSig UserTypeCtxt
    ctxt LHsKind GhcRn
    ki
          FamilyResultSig GhcRn
    _ -- open type families have * return kind by default
            | TyConFlavour -> Bool
    tcFlavourIsOpen TyConFlavour
    flav              -> ContextKind -> TcM ContextKind
    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 (m :: * -> *) a. Monad m => a -> m a
    return ContextKind
    AnyKind
      where
        flav :: TyConFlavour
    flav = Maybe TyCon -> FamilyInfo GhcRn -> TyConFlavour
    forall pass. Maybe TyCon -> FamilyInfo pass -> TyConFlavour
    getFamFlav 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
    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
    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
    -> LHsQTyVars GhcRn
    -> TcM ContextKind
    -> TcRn TyCon
    kcDeclHeader (SAKS_or_CUSK -> InitialKindStrategy
    InitialKindCheck SAKS_or_CUSK
    CUSK) Name
    name TyConFlavour
    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) -> TcM Type -> TcM ContextKind
    forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
    <$> UserTypeCtxt -> LHsKind GhcRn -> TcM Type
    tcLHsKindSig UserTypeCtxt
    ctxt LHsKind GhcRn
    ksig
          Maybe (LHsKind GhcRn)
    Nothing -> ContextKind -> TcM ContextKind
    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
    flav = Maybe TyCon -> FamilyInfo GhcRn -> TyConFlavour
    forall pass. Maybe TyCon -> FamilyInfo pass -> TyConFlavour
    getFamFlav (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).

    -}

    ---------------------------------
    getFamFlav
      :: Maybe TcTyCon    -- ^ Just cls <=> this is an associated family of class cls
      -> FamilyInfo pass
      -> TyConFlavour
    getFamFlav :: forall pass. Maybe TyCon -> FamilyInfo pass -> TyConFlavour
    getFamFlav Maybe TyCon
    mb_parent_tycon FamilyInfo pass
    info =
      case FamilyInfo pass
    info of
        FamilyInfo pass
    DataFamily         -> Maybe TyCon -> TyConFlavour
    DataFamilyFlavour Maybe TyCon
    mb_parent_tycon
        FamilyInfo pass
    OpenTypeFamily     -> Maybe TyCon -> TyConFlavour
    OpenTypeFamilyFlavour Maybe TyCon
    mb_parent_tycon
        ClosedTypeFamily Maybe [LTyFamInstEqn pass]
    _ -> ASSERT( isNothing mb_parent_tycon ) -- See Note [Closed type family mb_parent_tycon]
                              TyConFlavour
    ClosedTypeFamilyFlavour

    {- Note [Closed type family mb_parent_tycon]
    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    There's no way to write a closed type family inside a class declaration:

      class C a where
        type family F a where  -- error: parse error on input ‘where’

    In fact, it is not clear what the meaning of such a declaration would be.
    Therefore, 'mb_parent_tycon' of any closed type family has to be Nothing.
    -}

    ------------------------------------------------------------------------
    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. SrcSpanAnn' ann -> TcRn a -> TcRn a
    setSrcSpanA SrcSpanAnnA
    loc (TcRn () -> TcRn ()) -> TcRn () -> TcRn ()
    forall a b. (a -> b) -> a -> b
    $
        do { TyCon
    tycon <- HasDebugCallStack => Name -> TcRn TyCon
    Name -> TcRn TyCon
    tcLookupTcTyCon Name
    IdP GhcRn
    tc_name
           ; String -> SDoc -> TcRn ()
    traceTc String
    "kcTyClDecl {" (Name -> SDoc
    forall a. Outputable a => a -> SDoc
    ppr Name
    IdP GhcRn
    tc_name)
           ; TyCon -> TcRn () -> TcRn ()
    forall a. TyCon -> TcM a -> TcM a
    addVDQNote TyCon
    tycon (TcRn () -> TcRn ()) -> TcRn () -> TcRn ()
    forall a b. (a -> b) -> a -> b
    $   -- See Note [Inferring visible dependent quantification]
             SDoc -> TcRn () -> TcRn ()
    forall a. SDoc -> TcM a -> TcM a
    addErrCtxt (TyClDecl GhcRn -> SDoc
    tcMkDeclCtxt TyClDecl GhcRn
    decl) (TcRn () -> TcRn ()) -> TcRn () -> TcRn ()
    forall a b. (a -> b) -> a -> b
    $
             TyClDecl GhcRn -> TyCon -> TcRn ()
    kcTyClDecl TyClDecl GhcRn
    decl TyCon
    tycon
           ; String -> SDoc -> TcRn ()
    traceTc String
    "kcTyClDecl done }" (Name -> SDoc
    forall a. Outputable a => a -> SDoc
    ppr Name
    IdP GhcRn
    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 -> TcTyCon -> 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.

    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 GhcRn
    defn }) TyCon
    tycon
      | HsDataDefn { dd_ctxt :: forall pass. HsDataDefn pass -> Maybe (LHsContext pass)
    dd_ctxt = Maybe (LHsContext GhcRn)
    ctxt, dd_cons :: forall pass. HsDataDefn pass -> [LConDecl pass]
    dd_cons = [LConDecl GhcRn]
    cons, dd_ND :: forall pass. HsDataDefn pass -> NewOrData
    dd_ND = NewOrData
    new_or_data } <- HsDataDefn GhcRn
    defn
      = Name -> (TyCon -> [TyConBinder] -> Type -> TcRn ()) -> TcRn ()
    forall a.
    Name -> (TyCon -> [TyConBinder] -> Type -> TcM a) -> TcM a
    bindTyClTyVars Name
    name ((TyCon -> [TyConBinder] -> Type -> TcRn ()) -> TcRn ())
    -> (TyCon -> [TyConBinder] -> Type -> TcRn ()) -> TcRn ()
    forall a b. (a -> b) -> a -> b
    $ \ TyCon
    _ [TyConBinder]
    _ Type
    _ ->
           -- 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
    $$ [TyVar] -> SDoc
    forall a. Outputable a => a -> SDoc
    ppr (TyCon -> [TyVar]
    tyConTyVars TyCon
    tycon) SDoc -> SDoc -> SDoc
    $$ Type -> SDoc
    forall a. Outputable a => a -> SDoc
    ppr (TyCon -> Type
    tyConResKind TyCon
    tycon))
           ; [Type]
    _ <- Maybe (LHsContext GhcRn) -> TcM [Type]
    tcHsContext Maybe (LHsContext GhcRn)
    ctxt
           ; NewOrData -> Type -> [LConDecl GhcRn] -> TcRn ()
    kcConDecls NewOrData
    new_or_data (TyCon -> Type
    tyConResKind TyCon
    tycon) [LConDecl GhcRn]
    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 -> (TyCon -> [TyConBinder] -> Type -> TcRn ()) -> TcRn ()
    forall a.
    Name -> (TyCon -> [TyConBinder] -> Type -> TcM a) -> TcM a
    bindTyClTyVars Name
    name ((TyCon -> [TyConBinder] -> Type -> TcRn ()) -> TcRn ())
    -> (TyCon -> [TyConBinder] -> Type -> TcRn ()) -> TcRn ()
    forall a b. (a -> b) -> a -> b
    $ \ TyCon
    _ [TyConBinder]
    _ Type
    res_kind ->
        TcM Type -> TcRn ()
    forall a. TcM a -> TcRn ()
    discardResult (TcM Type -> TcRn ()) -> TcM Type -> TcRn ()
    forall a b. (a -> b) -> a -> b
    $ LHsKind GhcRn -> ContextKind -> TcM 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 -> (TyCon -> [TyConBinder] -> Type -> TcRn ()) -> TcRn ()
    forall a.
    Name -> (TyCon -> [TyConBinder] -> Type -> TcM a) -> TcM a
    bindTyClTyVars Name
    name ((TyCon -> [TyConBinder] -> Type -> TcRn ()) -> TcRn ())
    -> (TyCon -> [TyConBinder] -> Type -> TcRn ()) -> TcRn ()
    forall a b. (a -> b) -> a -> b
    $ \ TyCon
    _ [TyConBinder]
    _ Type
    _ ->
        do  { [Type]
    _ <- Maybe (LHsContext GhcRn) -> TcM [Type]
    tcHsContext Maybe (LHsContext GhcRn)
    ctxt
            ; (LocatedA (Sig GhcRn) -> TcRn ())
    -> [LocatedA (Sig GhcRn)] -> TcRn ()
    forall (t :: * -> *) (m :: * -> *) a b.
    (Foldable t, Monad m) =>
    (a -> m b) -> t a -> m ()
    mapM_ ((Sig GhcRn -> TcRn ()) -> LocatedA (Sig GhcRn) -> TcRn ()
    forall a. (a -> TcRn ()) -> LocatedA a -> TcRn ()
    wrapLocMA_ Sig GhcRn -> TcRn ()
    kc_sig) [LocatedA (Sig GhcRn)]
    [LSig GhcRn]
    sigs }
      where
        kc_sig :: Sig GhcRn -> TcRn ()
    kc_sig (ClassOpSig XClassOpSig GhcRn
    _ Bool
    _ [LIdP GhcRn]
    nms LHsSigType GhcRn
    op_ty) = [GenLocated SrcSpanAnnN Name] -> LHsSigType GhcRn -> TcRn ()
    kcClassSigType [GenLocated SrcSpanAnnN Name]
    [LIdP GhcRn]
    nms LHsSigType GhcRn
    op_ty
        kc_sig Sig GhcRn
    _                          = () -> TcRn ()
    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) [GenLocated
       SrcSpanAnnA (FamEqn GhcRn (GenLocated SrcSpanAnnA (HsType GhcRn)))]
    [LTyFamInstEqn GhcRn]
    eqns
          FamilyInfo GhcRn
    _ -> () -> TcRn ()
    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 -> Kind -> [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))
        -> TcM Type)
    -> TcRn ()
    forall (t :: * -> *) (m :: * -> *) a b.
    (Foldable t, Monad m) =>
    t a -> (a -> m b) -> m ()
    forM_ [HsScaled GhcRn (GenLocated SrcSpanAnnA (HsType GhcRn))]
    [HsScaled GhcRn (LHsKind GhcRn)]
    arg_tys (\(HsScaled HsArrow GhcRn
    mult GenLocated SrcSpanAnnA (HsType GhcRn)
    ty) -> do Type
    _ <- LHsKind GhcRn -> ContextKind -> TcM Type
    tcCheckLHsType (LHsKind GhcRn -> LHsKind GhcRn
    forall (p :: Pass). LHsType (GhcPass p) -> LHsType (GhcPass p)
    getBangType GenLocated SrcSpanAnnA (HsType GhcRn)
    LHsKind GhcRn
    ty) ContextKind
    exp_kind
                                                 HsArrow GhcRn -> TcM Type
    tcMult HsArrow GhcRn
    mult)
        -- See Note [Implementation of UnliftedNewtypes], STEP 2
      }

    -- Kind-check the types of arguments to a Haskell98 data constructor.
    kcConH98Args :: NewOrData -> Kind -> 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 a pass. a -> HsScaled pass 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 -> 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 -> Kind -> 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 [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 (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 a pass. a -> HsScaled pass 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 -> 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 :: NewOrData
               -> Kind             -- The result kind signature
                                   --   Used only in H98 case
               -> [LConDecl GhcRn] -- The data constructors
               -> TcM ()
    -- See Note [kcConDecls: kind-checking data type decls]
    kcConDecls :: NewOrData -> Type -> [LConDecl GhcRn] -> TcRn ()
    kcConDecls NewOrData
    new_or_data Type
    tc_res_kind [LConDecl GhcRn]
    cons
      = (GenLocated SrcSpanAnnA (ConDecl GhcRn) -> TcRn ())
    -> [GenLocated SrcSpanAnnA (ConDecl GhcRn)] -> TcRn ()
    forall (t :: * -> *) (m :: * -> *) a b.
    (Foldable t, Monad m) =>
    (a -> m b) -> t a -> m ()
    mapM_ ((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)) [GenLocated SrcSpanAnnA (ConDecl GhcRn)]
    [LConDecl GhcRn]
    cons

    -- 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
              -> Kind  -- 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 ([GenLocated SrcSpanAnnN Name] -> SDoc
    dataConCtxt [GenLocated SrcSpanAnnN Name
    LIdP GhcRn
    name]) (TcRn () -> TcRn ()) -> TcRn () -> TcRn ()
    forall a b. (a -> b) -> a -> b
    $
        TcM ([VarBndr TyVar Specificity], ()) -> TcRn ()
    forall a. TcM a -> TcRn ()
    discardResult                   (TcM ([VarBndr TyVar Specificity], ()) -> TcRn ())
    -> TcM ([VarBndr TyVar Specificity], ()) -> TcRn ()
    forall a b. (a -> b) -> a -> b
    $
        [LHsTyVarBndr Specificity GhcRn]
    -> TcRn () -> TcM ([VarBndr TyVar Specificity], ())
    forall flag a.
    OutputableBndrFlag flag 'Renamed =>
    [LHsTyVarBndr flag GhcRn] -> TcM a -> TcM ([VarBndr TyVar flag], a)
    bindExplicitTKBndrs_Tv [LHsTyVarBndr Specificity GhcRn]
    ex_tvs (TcRn () -> TcM ([VarBndr TyVar Specificity], ()))
    -> TcRn () -> TcM ([VarBndr TyVar Specificity], ())
    forall a b. (a -> b) -> a -> b
    $
        do { [Type]
    _ <- Maybe (LHsContext GhcRn) -> TcM [Type]
    tcHsContext Maybe (LHsContext GhcRn)
    ex_ctxt
           ; NewOrData -> Type -> HsConDeclH98Details GhcRn -> TcRn ()
    kcConH98Args NewOrData
    new_or_data Type
    tc_res_kind HsConDeclH98Details GhcRn
    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 -> [LIdP pass]
    con_names = [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 ([GenLocated SrcSpanAnnN Name] -> SDoc
    dataConCtxt [GenLocated SrcSpanAnnN Name]
    [LIdP GhcRn]
    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
    $
        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 { [Type]
    _ <- Maybe (LHsContext GhcRn) -> TcM [Type]
    tcHsContext Maybe (LHsContext GhcRn)
    cxt
           ; String -> SDoc -> TcRn ()
    traceTc String
    "kcConDecl:GADT {" ([GenLocated SrcSpanAnnN Name] -> SDoc
    forall a. Outputable a => a -> SDoc
    ppr [GenLocated SrcSpanAnnN Name]
    [LIdP GhcRn]
    names SDoc -> SDoc -> SDoc
    $$ GenLocated SrcSpanAnnA (HsType GhcRn) -> SDoc
    forall a. Outputable a => a -> SDoc
    ppr GenLocated SrcSpanAnnA (HsType GhcRn)
    LHsKind GhcRn
    res_ty)
           ; Type
    con_res_kind <- TcM Type
    newOpenTypeKind
           ; Type
    _ <- LHsKind GhcRn -> ContextKind -> TcM Type
    tcCheckLHsType LHsKind GhcRn
    res_ty (Type -> ContextKind
    TheKind Type
    con_res_kind)
           ; NewOrData -> Type -> HsConDeclGADTDetails GhcRn -> TcRn ()
    kcConGADTArgs NewOrData
    new_or_data Type
    con_res_kind HsConDeclGADTDetails GhcRn
    args
           ; String -> SDoc -> TcRn ()
    traceTc String
    "kcConDecl:GADT }" ([GenLocated SrcSpanAnnN Name] -> SDoc
    forall a. Outputable a => a -> SDoc
    ppr [GenLocated SrcSpanAnnN Name]
    [LIdP GhcRn]
    names SDoc -> SDoc -> SDoc
    $$ Type -> SDoc
    forall a. Outputable a => a -> SDoc
    ppr Type
    con_res_kind)
           ; () -> TcRn ()
    forall (m :: * -> *) a. Monad m => a -> m a
    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.

    ************************************************************************
    *                                                                      *
    \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 elaboarate (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.Utils.Zonk.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 [TyConBinders for the result kind signatures of a data type]
        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 etaExpandAlgTyCon
    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 ommission 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, [DerivInfo])
    tcTyClDecl :: (Name -> [Role])
    -> LTyClDecl GhcRn
    -> IOEnv (Env TcGblEnv TcLclEnv) (TyCon, [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, [DerivInfo])
    -> IOEnv (Env TcGblEnv TcLclEnv) (TyCon, [DerivInfo])
    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, [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, [DerivInfo])
    -> IOEnv (Env TcGblEnv TcLclEnv) (TyCon, [DerivInfo])
    forall ann a. SrcSpanAnn' ann -> TcRn a -> TcRn a
    setSrcSpanA SrcSpanAnnA
    loc (IOEnv (Env TcGblEnv TcLclEnv) (TyCon, [DerivInfo])
     -> IOEnv (Env TcGblEnv TcLclEnv) (TyCon, [DerivInfo]))
    -> IOEnv (Env TcGblEnv TcLclEnv) (TyCon, [DerivInfo])
    -> IOEnv (Env TcGblEnv TcLclEnv) (TyCon, [DerivInfo])
    forall a b. (a -> b) -> a -> b
    $ TyClDecl GhcRn
    -> IOEnv (Env TcGblEnv TcLclEnv) (TyCon, [DerivInfo])
    -> IOEnv (Env TcGblEnv TcLclEnv) (TyCon, [DerivInfo])
    forall a. TyClDecl GhcRn -> TcM a -> TcM a
    tcAddDeclCtxt TyClDecl GhcRn
    decl (IOEnv (Env TcGblEnv TcLclEnv) (TyCon, [DerivInfo])
     -> IOEnv (Env TcGblEnv TcLclEnv) (TyCon, [DerivInfo]))
    -> IOEnv (Env TcGblEnv TcLclEnv) (TyCon, [DerivInfo])
    -> IOEnv (Env TcGblEnv TcLclEnv) (TyCon, [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)
           ; (TyCon
    tc, [DerivInfo]
    deriv_infos) <- Maybe Class
    -> (Name -> [Role])
    -> TyClDecl GhcRn
    -> IOEnv (Env TcGblEnv TcLclEnv) (TyCon, [DerivInfo])
    tcTyClDecl1 Maybe Class
    forall a. Maybe a
    Nothing Name -> [Role]
    roles_info TyClDecl GhcRn
    decl
           ; String -> SDoc -> TcRn ()
    traceTc String
    "---- tcTyClDecl end ---- }" (TyCon -> SDoc
    forall a. Outputable a => a -> SDoc
    ppr TyCon
    tc)
           ; (TyCon, [DerivInfo])
    -> IOEnv (Env TcGblEnv TcLclEnv) (TyCon, [DerivInfo])
    forall (m :: * -> *) a. Monad m => a -> m a
    return (TyCon
    tc, [DerivInfo]
    deriv_infos) }

    noDerivInfos :: a -> (a, [DerivInfo])
    noDerivInfos :: forall a. a -> (a, [DerivInfo])
    noDerivInfos 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, TyVar)]
    di_scoped_tvs =
                        if TyCon -> Bool
    isFunTyCon TyCon
    tycon Bool -> Bool -> Bool
    || TyCon -> Bool
    isPrimTyCon TyCon
    tycon
                           then []  -- no tyConTyVars
                           else [TyVar] -> [(Name, TyVar)]
    mkTyVarNamePairs (TyCon -> [TyVar]
    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, [DerivInfo])
    tcTyClDecl1 :: Maybe Class
    -> (Name -> [Role])
    -> TyClDecl GhcRn
    -> IOEnv (Env TcGblEnv TcLclEnv) (TyCon, [DerivInfo])
    tcTyClDecl1 Maybe Class
    parent Name -> [Role]
    _roles_info (FamDecl { tcdFam :: forall pass. TyClDecl pass -> FamilyDecl pass
    tcdFam = FamilyDecl GhcRn
    fd })
      = (TyCon -> (TyCon, [DerivInfo]))
    -> TcRn TyCon -> IOEnv (Env TcGblEnv TcLclEnv) (TyCon, [DerivInfo])
    forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
    fmap TyCon -> (TyCon, [DerivInfo])
    forall a. a -> (a, [DerivInfo])
    noDerivInfos (TcRn TyCon -> IOEnv (Env TcGblEnv TcLclEnv) (TyCon, [DerivInfo]))
    -> TcRn TyCon -> IOEnv (Env TcGblEnv TcLclEnv) (TyCon, [DerivInfo])
    forall a b. (a -> b) -> a -> b
    $
        Maybe Class -> FamilyDecl GhcRn -> TcRn TyCon
    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 })
      = ASSERT( isNothing _parent )
        (TyCon -> (TyCon, [DerivInfo]))
    -> TcRn TyCon -> IOEnv (Env TcGblEnv TcLclEnv) (TyCon, [DerivInfo])
    forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
    fmap TyCon -> (TyCon, [DerivInfo])
    forall a. a -> (a, [DerivInfo])
    noDerivInfos (TcRn TyCon -> IOEnv (Env TcGblEnv TcLclEnv) (TyCon, [DerivInfo]))
    -> TcRn TyCon -> IOEnv (Env TcGblEnv TcLclEnv) (TyCon, [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 })
      = ASSERT( isNothing _parent )
        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 })
      = ASSERT( isNothing _parent )
        do { Class
    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
           ; (TyCon, [DerivInfo])
    -> IOEnv (Env TcGblEnv TcLclEnv) (TyCon, [DerivInfo])
    forall (m :: * -> *) a. Monad m => a -> m a
    return (TyCon -> (TyCon, [DerivInfo])
    forall a. a -> (a, [DerivInfo])
    noDerivInfos (Class -> TyCon
    classTyCon Class
    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 -> (TyCon -> [TyConBinder] -> Type -> TcM Class) -> TcM Class
    forall a.
    Name -> (TyCon -> [TyConBinder] -> Type -> TcM a) -> TcM a
    bindTyClTyVars Name
    class_name ((TyCon -> [TyConBinder] -> Type -> TcM Class) -> TcM Class)
    -> (TyCon -> [TyConBinder] -> Type -> TcM Class) -> TcM Class
    forall a b. (a -> b) -> a -> b
    $ \ TyCon
    _ [TyConBinder]
    binders 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
    $$ [TyConBinder] -> SDoc
    forall a. Outputable a => a -> SDoc
    ppr [TyConBinder]
    binders)
           ; 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

           ; ([Type]
    ctxt, [([TyVar], [TyVar])]
    fds, [TcMethInfo]
    sig_stuff, [ClassATItem]
    at_stuff)
                <- SkolemInfo
    -> [TyVar]
    -> TcM ([Type], [([TyVar], [TyVar])], [TcMethInfo], [ClassATItem])
    -> TcM ([Type], [([TyVar], [TyVar])], [TcMethInfo], [ClassATItem])
    forall a. SkolemInfo -> [TyVar] -> TcM a -> TcM a
    pushLevelAndSolveEqualities SkolemInfo
    skol_info ([TyConBinder] -> [TyVar]
    forall tv argf. [VarBndr tv argf] -> [tv]
    binderVars [TyConBinder]
    binders) (TcM ([Type], [([TyVar], [TyVar])], [TcMethInfo], [ClassATItem])
     -> TcM ([Type], [([TyVar], [TyVar])], [TcMethInfo], [ClassATItem]))
    -> TcM ([Type], [([TyVar], [TyVar])], [TcMethInfo], [ClassATItem])
    -> TcM ([Type], [([TyVar], [TyVar])], [TcMethInfo], [ClassATItem])
    forall a b. (a -> b) -> a -> b
    $
                   -- The (binderVars binders) is needed bring into scope the
                   -- skolems bound by the class decl header (#17841)
                   do { [Type]
    ctxt <- Maybe (LHsContext GhcRn) -> TcM [Type]
    tcHsContext Maybe (LHsContext GhcRn)
    hs_ctxt
                      ; [([TyVar], [TyVar])]
    fds  <- (GenLocated SrcSpanAnnA (FunDep GhcRn)
     -> IOEnv (Env TcGblEnv TcLclEnv) ([TyVar], [TyVar]))
    -> [GenLocated SrcSpanAnnA (FunDep GhcRn)]
    -> IOEnv (Env TcGblEnv TcLclEnv) [([TyVar], [TyVar])]
    forall (t :: * -> *) (m :: * -> *) a b.
    (Traversable t, Monad m) =>
    (a -> m b) -> t a -> m (t b)
    mapM ((FunDep GhcRn -> IOEnv (Env TcGblEnv TcLclEnv) ([TyVar], [TyVar]))
    -> GenLocated SrcSpanAnnA (FunDep GhcRn)
    -> IOEnv (Env TcGblEnv TcLclEnv) ([TyVar], [TyVar])
    forall a b ann.
    (a -> TcM b) -> GenLocated (SrcSpanAnn' ann) a -> TcM b
    addLocMA FunDep GhcRn -> IOEnv (Env TcGblEnv TcLclEnv) ([TyVar], [TyVar])
    tc_fundep) [GenLocated SrcSpanAnnA (FunDep GhcRn)]
    [LHsFunDep GhcRn]
    fundeps
                      ; [TcMethInfo]
    sig_stuff <- Name -> [LSig GhcRn] -> LHsBinds GhcRn -> TcM [TcMethInfo]
    tcClassSigs Name
    class_name [LSig GhcRn]
    sigs LHsBinds GhcRn
    meths
                      ; [ClassATItem]
    at_stuff  <- Name
    -> Class
    -> [LFamilyDecl GhcRn]
    -> [LTyFamDefltDecl GhcRn]
    -> TcM [ClassATItem]
    tcClassATs Name
    class_name Class
    clas [LFamilyDecl GhcRn]
    ats [LTyFamDefltDecl GhcRn]
    at_defs
                      ; ([Type], [([TyVar], [TyVar])], [TcMethInfo], [ClassATItem])
    -> TcM ([Type], [([TyVar], [TyVar])], [TcMethInfo], [ClassATItem])
    forall (m :: * -> *) a. Monad m => a -> m a
    return ([Type]
    ctxt, [([TyVar], [TyVar])]
    fds, [TcMethInfo]
    sig_stuff, [ClassATItem]
    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.
           ; CandidatesQTvs
    dvs <- [Type] -> TcM CandidatesQTvs
    candidateQTyVarsOfTypes [Type]
    ctxt
           ; let mk_doc :: TidyEnv -> IOEnv (Env TcGblEnv TcLclEnv) (TidyEnv, SDoc)
    mk_doc TidyEnv
    tidy_env = do { (TidyEnv
    tidy_env2, [Type]
    ctxt) <- TidyEnv -> [Type] -> TcM (TidyEnv, [Type])
    zonkTidyTcTypes TidyEnv
    tidy_env [Type]
    ctxt
                                      ; (TidyEnv, SDoc) -> IOEnv (Env TcGblEnv TcLclEnv) (TidyEnv, SDoc)
    forall (m :: * -> *) a. Monad m => a -> m a
    return ( TidyEnv
    tidy_env2
                                               , [SDoc] -> SDoc
    sep [ String -> SDoc
    text String
    "the class context:"
                                                     , [Type] -> SDoc
    pprTheta [Type]
    ctxt ] ) }
           ; CandidatesQTvs
    -> (TidyEnv -> IOEnv (Env TcGblEnv TcLclEnv) (TidyEnv, SDoc))
    -> TcRn ()
    doNotQuantifyTyVars CandidatesQTvs
    dvs TidyEnv -> IOEnv (Env TcGblEnv TcLclEnv) (TidyEnv, SDoc)
    mk_doc

           -- 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.
           ; ZonkEnv
    ze        <- ZonkFlexi -> TcM ZonkEnv
    mkEmptyZonkEnv ZonkFlexi
    NoFlexi
           ; [Type]
    ctxt      <- ZonkEnv -> [Type] -> TcM [Type]
    zonkTcTypesToTypesX ZonkEnv
    ze [Type]
    ctxt
           ; [TcMethInfo]
    sig_stuff <- (TcMethInfo -> IOEnv (Env TcGblEnv TcLclEnv) TcMethInfo)
    -> [TcMethInfo] -> TcM [TcMethInfo]
    forall (t :: * -> *) (m :: * -> *) a b.
    (Traversable t, Monad m) =>
    (a -> m b) -> t a -> m (t b)
    mapM (ZonkEnv -> TcMethInfo -> IOEnv (Env TcGblEnv TcLclEnv) TcMethInfo
    zonkTcMethInfoToMethInfoX ZonkEnv
    ze) [TcMethInfo]
    sig_stuff
             -- ToDo: do we need to zonk at_stuff?

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

           ; ClassMinimalDef
    mindef <- Name -> [LSig GhcRn] -> [TcMethInfo] -> TcM ClassMinimalDef
    tcClassMinimalDef Name
    class_name [LSig GhcRn]
    sigs [TcMethInfo]
    sig_stuff
           ; Bool
    is_boot <- TcRnIf TcGblEnv TcLclEnv Bool
    tcIsHsBootOrSig
           ; let body :: Maybe ([Type], [ClassATItem], [TcMethInfo], ClassMinimalDef)
    body | Bool
    is_boot, [Type] -> Bool
    forall (t :: * -> *) a. Foldable t => t a -> Bool
    null [Type]
    ctxt, [ClassATItem] -> Bool
    forall (t :: * -> *) a. Foldable t => t a -> Bool
    null [ClassATItem]
    at_stuff, [TcMethInfo] -> Bool
    forall (t :: * -> *) a. Foldable t => t a -> Bool
    null [TcMethInfo]
    sig_stuff
                      = Maybe ([Type], [ClassATItem], [TcMethInfo], ClassMinimalDef)
    forall a. Maybe a
    Nothing
                      | Bool
    otherwise
                      = ([Type], [ClassATItem], [TcMethInfo], ClassMinimalDef)
    -> Maybe ([Type], [ClassATItem], [TcMethInfo], ClassMinimalDef)
    forall a. a -> Maybe a
    Just ([Type]
    ctxt, [ClassATItem]
    at_stuff, [TcMethInfo]
    sig_stuff, ClassMinimalDef
    mindef)

           ; Class
    clas <- Name
    -> [TyConBinder]
    -> [Role]
    -> [([TyVar], [TyVar])]
    -> Maybe ([Type], [ClassATItem], [TcMethInfo], ClassMinimalDef)
    -> TcM Class
    forall m n.
    Name
    -> [TyConBinder]
    -> [Role]
    -> [([TyVar], [TyVar])]
    -> Maybe ([Type], [ClassATItem], [TcMethInfo], ClassMinimalDef)
    -> TcRnIf m n Class
    buildClass Name
    class_name [TyConBinder]
    binders [Role]
    roles [([TyVar], [TyVar])]
    fds Maybe ([Type], [ClassATItem], [TcMethInfo], ClassMinimalDef)
    body
           ; String -> SDoc -> TcRn ()
    traceTc String
    "tcClassDecl" ([GenLocated SrcSpanAnnA (FunDep GhcRn)] -> SDoc
    forall a. Outputable a => a -> SDoc
    ppr [GenLocated SrcSpanAnnA (FunDep GhcRn)]
    [LHsFunDep GhcRn]
    fundeps SDoc -> SDoc -> SDoc
    $$ [TyConBinder] -> SDoc
    forall a. Outputable a => a -> SDoc
    ppr [TyConBinder]
    binders SDoc -> SDoc -> SDoc
    $$
                                    [([TyVar], [TyVar])] -> SDoc
    forall a. Outputable a => a -> SDoc
    ppr [([TyVar], [TyVar])]
    fds)
           ; Class -> TcM Class
    forall (m :: * -> *) a. Monad m => a -> m a
    return Class
    clas }
      where
        skol_info :: SkolemInfo
    skol_info = TyConFlavour -> Name -> SkolemInfo
    TyConSkol TyConFlavour
    ClassFlavour Name
    class_name
        tc_fundep :: GHC.Hs.FunDep GhcRn -> TcM ([Var],[Var])
        tc_fundep :: FunDep GhcRn -> IOEnv (Env TcGblEnv TcLclEnv) ([TyVar], [TyVar])
    tc_fundep (FunDep XCFunDep GhcRn
    _ [LIdP GhcRn]
    tvs1 [LIdP GhcRn]
    tvs2)
                               = do { [TyVar]
    tvs1' <- (GenLocated SrcSpanAnnN Name
     -> IOEnv (Env TcGblEnv TcLclEnv) TyVar)
    -> [GenLocated SrcSpanAnnN Name] -> TcM [TyVar]
    forall (t :: * -> *) (m :: * -> *) a b.
    (Traversable t, Monad m) =>
    (a -> m b) -> t a -> m (t b)
    mapM (Name -> IOEnv (Env TcGblEnv TcLclEnv) TyVar
    tcLookupTyVar (Name -> IOEnv (Env TcGblEnv TcLclEnv) TyVar)
    -> (GenLocated SrcSpanAnnN Name -> Name)
    -> GenLocated SrcSpanAnnN Name
    -> IOEnv (Env TcGblEnv TcLclEnv) TyVar
    forall b c a. (b -> c) -> (a -> b) -> a -> c
    . GenLocated SrcSpanAnnN Name -> Name
    forall l e. GenLocated l e -> e
    unLoc) [GenLocated SrcSpanAnnN Name]
    [LIdP GhcRn]
    tvs1 ;
                                    ; [TyVar]
    tvs2' <- (GenLocated SrcSpanAnnN Name
     -> IOEnv (Env TcGblEnv TcLclEnv) TyVar)
    -> [GenLocated SrcSpanAnnN Name] -> TcM [TyVar]
    forall (t :: * -> *) (m :: * -> *) a b.
    (Traversable t, Monad m) =>
    (a -> m b) -> t a -> m (t b)
    mapM (Name -> IOEnv (Env TcGblEnv TcLclEnv) TyVar
    tcLookupTyVar (Name -> IOEnv (Env TcGblEnv TcLclEnv) TyVar)
    -> (GenLocated SrcSpanAnnN Name -> Name)
    -> GenLocated SrcSpanAnnN Name
    -> IOEnv (Env TcGblEnv TcLclEnv) TyVar
    forall b c a. (b -> c) -> (a -> b) -> a -> c
    . GenLocated SrcSpanAnnN Name -> Name
    forall l e. GenLocated l e -> e
    unLoc) [GenLocated SrcSpanAnnN Name]
    [LIdP GhcRn]
    tvs2 ;
                                    ; ([TyVar], [TyVar])
    -> IOEnv (Env TcGblEnv TcLclEnv) ([TyVar], [TyVar])
    forall (m :: * -> *) a. Monad m => a -> m a
    return ([TyVar]
    tvs1',[TyVar]
    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_ [ SDoc -> IOEnv (Env TcGblEnv TcLclEnv) Any
    forall a. SDoc -> TcM a
    failWithTc (Name -> Name -> SDoc
    badATErr 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 GenLocated SrcSpanAnnA (TyFamInstDecl GhcRn) -> Name
    LTyFamDefltDecl GhcRn -> Name
    at_def_tycon [GenLocated SrcSpanAnnA (TyFamInstDecl GhcRn)]
    [LTyFamDefltDecl 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)
    mapM GenLocated SrcSpanAnnA (FamilyDecl GhcRn)
    -> IOEnv (Env TcGblEnv TcLclEnv) ClassATItem
    tc_at [GenLocated SrcSpanAnnA (FamilyDecl GhcRn)]
    [LFamilyDecl GhcRn]
    ats }
      where
        at_def_tycon :: LTyFamDefltDecl GhcRn -> Name
        at_def_tycon :: LTyFamDefltDecl GhcRn -> Name
    at_def_tycon = 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 -> 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 GenLocated SrcSpanAnnA (FamilyDecl GhcRn) -> Name
    LFamilyDecl GhcRn -> Name
    at_fam_name [GenLocated SrcSpanAnnA (FamilyDecl GhcRn)]
    [LFamilyDecl 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 (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 GenLocated SrcSpanAnnA (TyFamInstDecl GhcRn)
    LTyFamDefltDecl GhcRn
    at_def) [GenLocated SrcSpanAnnA (TyFamInstDecl GhcRn)
    at_def])
                            NameEnv [GenLocated SrcSpanAnnA (TyFamInstDecl GhcRn)]
    forall a. NameEnv a
    emptyNameEnv [GenLocated SrcSpanAnnA (TyFamInstDecl GhcRn)]
    [LTyFamDefltDecl GhcRn]
    at_defs

        tc_at :: GenLocated SrcSpanAnnA (FamilyDecl GhcRn)
    -> IOEnv (Env TcGblEnv TcLclEnv) ClassATItem
    tc_at GenLocated SrcSpanAnnA (FamilyDecl GhcRn)
    at = do { TyCon
    fam_tc <- (FamilyDecl GhcRn -> TcRn TyCon)
    -> GenLocated SrcSpanAnnA (FamilyDecl GhcRn) -> TcRn TyCon
    forall a b ann.
    (a -> TcM b) -> GenLocated (SrcSpanAnn' ann) a -> TcM b
    addLocMA (Maybe Class -> FamilyDecl GhcRn -> TcRn TyCon
    tcFamDecl1 (Class -> Maybe Class
    forall a. a -> Maybe a
    Just Class
    cls)) GenLocated SrcSpanAnnA (FamilyDecl GhcRn)
    at
                      ; let at_defs :: [GenLocated SrcSpanAnnA (TyFamInstDecl GhcRn)]
    at_defs = NameEnv [GenLocated SrcSpanAnnA (TyFamInstDecl GhcRn)]
    -> Name -> Maybe [GenLocated SrcSpanAnnA (TyFamInstDecl GhcRn)]
    forall a. NameEnv a -> Name -> Maybe a
    lookupNameEnv NameEnv [GenLocated SrcSpanAnnA (TyFamInstDecl GhcRn)]
    NameEnv [LTyFamDefltDecl GhcRn]
    at_defs_map (LFamilyDecl GhcRn -> Name
    at_fam_name GenLocated SrcSpanAnnA (FamilyDecl GhcRn)
    LFamilyDecl GhcRn
    at)
                                      Maybe [GenLocated SrcSpanAnnA (TyFamInstDecl GhcRn)]
    -> [GenLocated SrcSpanAnnA (TyFamInstDecl GhcRn)]
    -> [GenLocated SrcSpanAnnA (TyFamInstDecl GhcRn)]
    forall a. Maybe a -> a -> a
    `orElse` []
                      ; Maybe (Type, ATValidityInfo)
    atd <- TyCon
    -> [LTyFamDefltDecl GhcRn] -> TcM (Maybe (Type, ATValidityInfo))
    tcDefaultAssocDecl TyCon
    fam_tc [GenLocated SrcSpanAnnA (TyFamInstDecl GhcRn)]
    [LTyFamDefltDecl GhcRn]
    at_defs
                      ; ClassATItem -> IOEnv (Env TcGblEnv TcLclEnv) ClassATItem
    forall (m :: * -> *) a. Monad m => a -> m a
    return (TyCon -> Maybe (Type, ATValidityInfo) -> ClassATItem
    ATI TyCon
    fam_tc Maybe (Type, ATValidityInfo)
    atd) }

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

    tcDefaultAssocDecl TyCon
    _ (LTyFamDefltDecl GhcRn
    d1:LTyFamDefltDecl GhcRn
    _:[LTyFamDefltDecl GhcRn]
    _)
      = SDoc -> TcM (Maybe (Type, ATValidityInfo))
    forall a. SDoc -> TcM a
    failWithTc (String -> SDoc
    text String
    "More than one default declaration for"
                    SDoc -> SDoc -> SDoc
    <+> IdGhcP 'Renamed -> SDoc
    forall a. Outputable a => a -> SDoc
    ppr (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 GenLocated SrcSpanAnnA (TyFamInstDecl GhcRn)
    LTyFamDefltDecl 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 -> HsTyPats pass
    feqn_pats  = HsTyPats 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, ATValidityInfo))
    -> TcM (Maybe (Type, ATValidityInfo))
    forall ann a. SrcSpanAnn' ann -> TcRn a -> TcRn a
    setSrcSpanA SrcSpanAnnA
    loc (TcM (Maybe (Type, ATValidityInfo))
     -> TcM (Maybe (Type, ATValidityInfo)))
    -> TcM (Maybe (Type, ATValidityInfo))
    -> TcM (Maybe (Type, ATValidityInfo))
    forall a b. (a -> b) -> a -> b
    $
        SDoc
    -> Name
    -> TcM (Maybe (Type, ATValidityInfo))
    -> TcM (Maybe (Type, ATValidityInfo))
    forall a. SDoc -> Name -> TcM a -> TcM a
    tcAddFamInstCtxt (String -> SDoc
    text String
    "default type instance") Name
    tc_name (TcM (Maybe (Type, ATValidityInfo))
     -> TcM (Maybe (Type, ATValidityInfo)))
    -> TcM (Maybe (Type, ATValidityInfo))
    -> TcM (Maybe (Type, ATValidityInfo))
    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 :: Arity
    vis_arity = [TyVar] -> Arity
    forall (t :: * -> *) a. Foldable t => t a -> Arity
    length (TyCon -> [TyVar]
    tyConVisibleTyVars TyCon
    fam_tc)
                 vis_pats :: Arity
    vis_pats  = [HsArg
       (GenLocated SrcSpanAnnA (HsType GhcRn))
       (GenLocated SrcSpanAnnA (HsType GhcRn))]
    -> Arity
    forall tm ty. [HsArg tm ty] -> Arity
    numVisibleArgs [HsArg
       (GenLocated SrcSpanAnnA (HsType GhcRn))
       (GenLocated SrcSpanAnnA (HsType GhcRn))]
    HsTyPats GhcRn
    hs_pats

           -- Kind of family check
           ; ASSERT( fam_tc_name == tc_name )
             Bool -> SDoc -> TcRn ()
    checkTc (TyCon -> Bool
    isTypeFamilyTyCon TyCon
    fam_tc) (TyCon -> SDoc
    wrongKindOfFamily TyCon
    fam_tc)

           -- Arity check
           ; Bool -> SDoc -> TcRn ()
    checkTc (Arity
    vis_pats Arity -> Arity -> Bool
    forall a. Eq a => a -> a -> Bool
    == Arity
    vis_arity)
                     (Arity -> SDoc
    wrongNumberOfParmsErr Arity
    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.
           ; ([TyVar]
    qtvs, [Type]
    pats, Type
    rhs_ty) <- TyCon
    -> AssocInstInfo
    -> HsOuterFamEqnTyVarBndrs GhcRn
    -> HsTyPats GhcRn
    -> LHsKind GhcRn
    -> TcM ([TyVar], [Type], Type)
    tcTyFamInstEqnGuts TyCon
    fam_tc AssocInstInfo
    NotAssociated
                                          HsOuterFamEqnTyVarBndrs GhcRn
    outer_bndrs HsTyPats GhcRn
    hs_pats LHsKind GhcRn
    hs_rhs_ty

           ; let fam_tvs :: [TyVar]
    fam_tvs = TyCon -> [TyVar]
    tyConTyVars TyCon
    fam_tc
           ; String -> SDoc -> TcRn ()
    traceTc String
    "tcDefaultAssocDecl 2" ([SDoc] -> SDoc
    vcat
               [ String -> SDoc
    text String
    "hs_pats"   SDoc -> SDoc -> SDoc
    <+> [HsArg
       (GenLocated SrcSpanAnnA (HsType GhcRn))
       (GenLocated SrcSpanAnnA (HsType GhcRn))]
    -> SDoc
    forall a. Outputable a => a -> SDoc
    ppr [HsArg
       (GenLocated SrcSpanAnnA (HsType GhcRn))
       (GenLocated SrcSpanAnnA (HsType GhcRn))]
    HsTyPats GhcRn
    hs_pats
               , String -> SDoc
    text String
    "hs_rhs_ty" SDoc -> SDoc -> SDoc
    <+> GenLocated SrcSpanAnnA (HsType GhcRn) -> SDoc
    forall a. Outputable a => a -> SDoc
    ppr GenLocated SrcSpanAnnA (HsType GhcRn)
    LHsKind GhcRn
    hs_rhs_ty
               , String -> SDoc
    text String
    "fam_tvs" SDoc -> SDoc -> SDoc
    <+> [TyVar] -> SDoc
    forall a. Outputable a => a -> SDoc
    ppr [TyVar]
    fam_tvs
               , String -> SDoc
    text String
    "qtvs"    SDoc -> SDoc -> SDoc
    <+> [TyVar] -> SDoc
    forall a. Outputable a => a -> SDoc
    ppr [TyVar]
    qtvs
                 -- NB: Do *not* print `pats` or rhs_ty here, as they can mention
                 -- knot-tied TyCons. See #18648.
               ])
           ; let subst :: TCvSubst
    subst = case (Type -> Maybe TyVar) -> [Type] -> Maybe [TyVar]
    forall (t :: * -> *) (f :: * -> *) a b.
    (Traversable t, Applicative f) =>
    (a -> f b) -> t a -> f (t b)
    traverse Type -> Maybe TyVar
    getTyVar_maybe [Type]
    pats of
                           Just [TyVar]
    cpt_tvs -> [TyVar] -> [Type] -> TCvSubst
    HasDebugCallStack => [TyVar] -> [Type] -> TCvSubst
    zipTvSubst [TyVar]
    cpt_tvs ([TyVar] -> [Type]
    mkTyVarTys [TyVar]
    fam_tvs)
                           Maybe [TyVar]
    Nothing      -> TCvSubst
    emptyTCvSubst
                           -- 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].
           ; Maybe (Type, ATValidityInfo) -> TcM (Maybe (Type, ATValidityInfo))
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure (Maybe (Type, ATValidityInfo)
     -> TcM (Maybe (Type, ATValidityInfo)))
    -> Maybe (Type, ATValidityInfo)
    -> TcM (Maybe (Type, ATValidityInfo))
    forall a b. (a -> b) -> a -> b
    $ (Type, ATValidityInfo) -> Maybe (Type, ATValidityInfo)
    forall a. a -> Maybe a
    Just (TCvSubst -> Type -> Type
    substTyUnchecked TCvSubst
    subst Type
    rhs_ty, SrcSpan -> [Type] -> ATValidityInfo
    ATVI (SrcSpanAnnA -> SrcSpan
    forall a. SrcSpanAnn' a -> SrcSpan
    locA SrcSpanAnnA
    loc) [Type]
    pats)
               -- 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
    tcFamDecl1 :: Maybe Class -> FamilyDecl GhcRn -> TcRn TyCon
    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 SrcSpan
    _ FamilyResultSig GhcRn
    sig
                                  , fdInjectivityAnn :: forall pass. FamilyDecl pass -> Maybe (LInjectivityAnn pass)
    fdInjectivityAnn = Maybe (LInjectivityAnn GhcRn)
    inj })
      | FamilyInfo GhcRn
    DataFamily <- FamilyInfo GhcRn
    fam_info
      = Name
    -> (TyCon -> [TyConBinder] -> Type -> TcRn TyCon) -> TcRn TyCon
    forall a.
    Name -> (TyCon -> [TyConBinder] -> Type -> TcM a) -> TcM a
    bindTyClTyVars Name
    tc_name ((TyCon -> [TyConBinder] -> Type -> TcRn TyCon) -> TcRn TyCon)
    -> (TyCon -> [TyConBinder] -> Type -> TcRn TyCon) -> TcRn TyCon
    forall a b. (a -> b) -> a -> b
    $ \ TyCon
    _ [TyConBinder]
    binders Type
    res_kind -> do
      { String -> SDoc -> TcRn ()
    traceTc String
    "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
      ; Name
    tc_rep_name <- Name -> TcRnIf TcGblEnv TcLclEnv Name
    forall gbl lcl. Name -> TcRnIf gbl lcl Name
    newTyConRepName Name
    tc_name
      ; let inj :: Injectivity
    inj   = [Bool] -> Injectivity
    Injective ([Bool] -> Injectivity) -> [Bool] -> Injectivity
    forall a b. (a -> b) -> a -> b
    $ Arity -> Bool -> [Bool]
    forall a. Arity -> a -> [a]
    replicate ([TyConBinder] -> Arity
    forall (t :: * -> *) a. Foldable t => t a -> Arity
    length [TyConBinder]
    binders) Bool
    True
            tycon :: TyCon
    tycon = Name
    -> [TyConBinder]
    -> Type
    -> Maybe Name
    -> FamTyConFlav
    -> Maybe Class
    -> Injectivity
    -> TyCon
    mkFamilyTyCon Name
    tc_name [TyConBinder]
    binders
                                  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
      ; TyCon -> TcRn TyCon
    forall (m :: * -> *) a. Monad m => a -> m a
    return TyCon
    tycon }

      | FamilyInfo GhcRn
    OpenTypeFamily <- FamilyInfo GhcRn
    fam_info
      = Name
    -> (TyCon -> [TyConBinder] -> Type -> TcRn TyCon) -> TcRn TyCon
    forall a.
    Name -> (TyCon -> [TyConBinder] -> Type -> TcM a) -> TcM a
    bindTyClTyVars Name
    tc_name ((TyCon -> [TyConBinder] -> Type -> TcRn TyCon) -> TcRn TyCon)
    -> (TyCon -> [TyConBinder] -> Type -> TcRn TyCon) -> TcRn TyCon
    forall a b. (a -> b) -> a -> b
    $ \ TyCon
    _ [TyConBinder]
    binders Type
    res_kind -> do
      { String -> SDoc -> TcRn ()
    traceTc String
    "open type family:" (Name -> SDoc
    forall a. Outputable a => a -> SDoc
    ppr Name
    tc_name)
      ; Name -> TcRn ()
    checkFamFlag Name
    tc_name
      ; Injectivity
    inj' <- [TyConBinder] -> Maybe (LInjectivityAnn GhcRn) -> TcM Injectivity
    tcInjectivity [TyConBinder]
    binders Maybe (LInjectivityAnn GhcRn)
    inj
      ; Name -> FamilyResultSig GhcRn -> TcRn ()
    checkResultSigFlag Name
    tc_name FamilyResultSig GhcRn
    sig  -- check after injectivity for better errors
      ; let tycon :: TyCon
    tycon = Name
    -> [TyConBinder]
    -> Type
    -> Maybe Name
    -> FamTyConFlav
    -> Maybe Class
    -> Injectivity
    -> TyCon
    mkFamilyTyCon Name
    tc_name [TyConBinder]
    binders 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'
      ; TyCon -> TcRn TyCon
    forall (m :: * -> *) a. Monad m => a -> m a
    return TyCon
    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
    "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
           ; (Injectivity
    inj', [TyConBinder]
    binders, Type
    res_kind)
                <- Name
    -> (TyCon
        -> [TyConBinder] -> Type -> TcM (Injectivity, [TyConBinder], Type))
    -> TcM (Injectivity, [TyConBinder], Type)
    forall a.
    Name -> (TyCon -> [TyConBinder] -> Type -> TcM a) -> TcM a
    bindTyClTyVars Name
    tc_name ((TyCon
      -> [TyConBinder] -> Type -> TcM (Injectivity, [TyConBinder], Type))
     -> TcM (Injectivity, [TyConBinder], Type))
    -> (TyCon
        -> [TyConBinder] -> Type -> TcM (Injectivity, [TyConBinder], Type))
    -> TcM (Injectivity, [TyConBinder], Type)
    forall a b. (a -> b) -> a -> b
    $ \ TyCon
    _ [TyConBinder]
    binders Type
    res_kind ->
                   do { Injectivity
    inj' <- [TyConBinder] -> Maybe (LInjectivityAnn GhcRn) -> TcM Injectivity
    tcInjectivity [TyConBinder]
    binders Maybe (LInjectivityAnn GhcRn)
    inj
                      ; (Injectivity, [TyConBinder], Type)
    -> TcM (Injectivity, [TyConBinder], Type)
    forall (m :: * -> *) a. Monad m => a -> m a
    return (Injectivity
    inj', [TyConBinder]
    binders, Type
    res_kind) }

           ; Name -> TcRn ()
    checkFamFlag Name
    tc_name -- make sure we have -XTypeFamilies
           ; Name -> FamilyResultSig GhcRn -> TcRn ()
    checkResultSigFlag Name
    tc_name FamilyResultSig GhcRn
    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 Maybe [LTyFamInstEqn GhcRn]
    mb_eqns of
               Maybe [LTyFamInstEqn GhcRn]
    Nothing   ->
                   TyCon -> TcRn TyCon
    forall (m :: * -> *) a. Monad m => a -> m a
    return (TyCon -> TcRn TyCon) -> TyCon -> TcRn TyCon
    forall a b. (a -> b) -> a -> b
    $ Name
    -> [TyConBinder]
    -> Type
    -> Maybe Name
    -> FamTyConFlav
    -> Maybe Class
    -> Injectivity
    -> TyCon
    mkFamilyTyCon Name
    tc_name [TyConBinder]
    binders 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'
               Just [LTyFamInstEqn GhcRn]
    eqns -> do {

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

           ; [KnotTied CoAxBranch]
    branches <- (GenLocated
       SrcSpanAnnA (FamEqn GhcRn (GenLocated SrcSpanAnnA (HsType GhcRn)))
     -> TcRn (KnotTied CoAxBranch))
    -> [GenLocated
          SrcSpanAnnA (FamEqn GhcRn (GenLocated SrcSpanAnnA (HsType GhcRn)))]
    -> TcRn [KnotTied CoAxBranch]
    forall a b. (a -> TcRn b) -> [a] -> TcRn [b]
    mapAndReportM (TyCon
    -> AssocInstInfo
    -> LTyFamInstEqn GhcRn
    -> TcRn (KnotTied CoAxBranch)
    tcTyFamInstEqn TyCon
    tc_fam_tc AssocInstInfo
    NotAssociated) [GenLocated
       SrcSpanAnnA (FamEqn GhcRn (GenLocated SrcSpanAnnA (HsType GhcRn)))]
    [LTyFamInstEqn 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.
           ; Name
    co_ax_name <- GenLocated SrcSpanAnnN Name
    -> [[Type]] -> TcRnIf TcGblEnv TcLclEnv Name
    newFamInstAxiomName GenLocated SrcSpanAnnN Name
    LIdP GhcRn
    tc_lname []

           ; let mb_co_ax :: Maybe (CoAxiom Branched)
    mb_co_ax
                  | [GenLocated
       SrcSpanAnnA (FamEqn GhcRn (GenLocated SrcSpanAnnA (HsType GhcRn)))]
    -> Bool
    forall (t :: * -> *) a. Foldable t => t a -> Bool
    null [GenLocated
       SrcSpanAnnA (FamEqn GhcRn (GenLocated SrcSpanAnnA (HsType GhcRn)))]
    [LTyFamInstEqn 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 :: TyCon
    fam_tc = Name
    -> [TyConBinder]
    -> Type
    -> Maybe Name
    -> FamTyConFlav
    -> Maybe Class
    -> Injectivity
    -> TyCon
    mkFamilyTyCon Name
    tc_name [TyConBinder]
    binders 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
           ; TyCon -> TcRn TyCon
    forall (m :: * -> *) a. Monad m => a -> m a
    return TyCon
    fam_tc } }

    #if __GLASGOW_HASKELL__ <= 810
      | otherwise = panic "tcFamInst1"  -- Silence pattern-exhaustiveness checker
    #endif

    -- | 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 (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 SrcSpan
    loc (InjectivityAnn XCInjectivityAnn GhcRn
    _ LIdP GhcRn
    _ [LIdP GhcRn]
    lInjNames)))
      = SrcSpan -> TcM Injectivity -> TcM Injectivity
    forall a. SrcSpan -> TcRn a -> TcRn a
    setSrcSpan SrcSpan
    loc (TcM Injectivity -> TcM Injectivity)
    -> TcM Injectivity -> TcM Injectivity
    forall a b. (a -> b) -> a -> b
    $
        do { let tvs :: [TyVar]
    tvs = [TyConBinder] -> [TyVar]
    forall tv argf. [VarBndr tv argf] -> [tv]
    binderVars [TyConBinder]
    tcbs
           ; DynFlags
    dflags <- IOEnv (Env TcGblEnv TcLclEnv) DynFlags
    forall (m :: * -> *). HasDynFlags m => m DynFlags
    getDynFlags
           ; Bool -> SDoc -> TcRn ()
    checkTc (Extension -> DynFlags -> Bool
    xopt Extension
    LangExt.TypeFamilyDependencies DynFlags
    dflags)
                     (String -> SDoc
    text String
    "Illegal injectivity annotation" SDoc -> SDoc -> SDoc
    $$
                      String -> SDoc
    text String
    "Use TypeFamilyDependencies to allow this")
           ; [TyVar]
    inj_tvs <- (GenLocated SrcSpanAnnN Name
     -> IOEnv (Env TcGblEnv TcLclEnv) TyVar)
    -> [GenLocated SrcSpanAnnN Name] -> TcM [TyVar]
    forall (t :: * -> *) (m :: * -> *) a b.
    (Traversable t, Monad m) =>
    (a -> m b) -> t a -> m (t b)
    mapM (Name -> IOEnv (Env TcGblEnv TcLclEnv) TyVar
    tcLookupTyVar (Name -> IOEnv (Env TcGblEnv TcLclEnv) TyVar)
    -> (GenLocated SrcSpanAnnN Name -> Name)
    -> GenLocated SrcSpanAnnN Name
    -> IOEnv (Env TcGblEnv TcLclEnv) TyVar
    forall b c a. (b -> c) -> (a -> b) -> a -> c
    . GenLocated SrcSpanAnnN Name -> Name
    forall l e. GenLocated l e -> e
    unLoc) [GenLocated SrcSpanAnnN Name]
    [LIdP GhcRn]
    lInjNames
           ; [TyVar]
    inj_tvs <- (TyVar -> IOEnv (Env TcGblEnv TcLclEnv) TyVar)
    -> [TyVar] -> TcM [TyVar]
    forall (t :: * -> *) (m :: * -> *) a b.
    (Traversable t, Monad m) =>
    (a -> m b) -> t a -> m (t b)
    mapM HasDebugCallStack => TyVar -> IOEnv (Env TcGblEnv TcLclEnv) TyVar
    TyVar -> IOEnv (Env TcGblEnv TcLclEnv) TyVar
    zonkTcTyVarToTyVar [TyVar]
    inj_tvs -- zonk the kinds
           ; let inj_ktvs :: VarSet
    inj_ktvs = (TyVar -> Bool) -> VarSet -> VarSet
    filterVarSet TyVar -> Bool
    isTyVar (VarSet -> VarSet) -> VarSet -> VarSet
    forall a b. (a -> b) -> a -> b
    $  -- no injective coercion vars
                            VarSet -> VarSet
    closeOverKinds ([TyVar] -> VarSet
    mkVarSet [TyVar]
    inj_tvs)
           ; let inj_bools :: [Bool]
    inj_bools = (TyVar -> Bool) -> [TyVar] -> [Bool]
    forall a b. (a -> b) -> [a] -> [b]
    map (TyVar -> VarSet -> Bool
    `elemVarSet` VarSet
    inj_ktvs) [TyVar]
    tvs
           ; String -> SDoc -> TcRn ()
    traceTc String
    "tcInjectivity" ([SDoc] -> SDoc
    vcat [ [TyVar] -> SDoc
    forall a. Outputable a => a -> SDoc
    ppr [TyVar]
    tvs, [GenLocated SrcSpanAnnN Name] -> SDoc
    forall a. Outputable a => a -> SDoc
    ppr [GenLocated SrcSpanAnnN Name]
    [LIdP GhcRn]
    lInjNames, [TyVar] -> SDoc
    forall a. Outputable a => a -> SDoc
    ppr [TyVar]
    inj_tvs
                                           , VarSet -> SDoc
    forall a. Outputable a => a -> SDoc
    ppr VarSet
    inj_ktvs, [Bool] -> SDoc
    forall a. Outputable a => a -> SDoc
    ppr [Bool]
    inj_bools ])
           ; Injectivity -> TcM Injectivity
    forall (m :: * -> *) a. Monad m => a -> m a
    return (Injectivity -> TcM Injectivity) -> Injectivity -> TcM Injectivity
    forall a b. (a -> b) -> a -> b
    $ [Bool] -> Injectivity
    Injective [Bool]
    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
    -> (TyCon -> [TyConBinder] -> Type -> TcRn TyCon) -> TcRn TyCon
    forall a.
    Name -> (TyCon -> [TyConBinder] -> Type -> TcM a) -> TcM a
    bindTyClTyVars Name
    tc_name ((TyCon -> [TyConBinder] -> Type -> TcRn TyCon) -> TcRn TyCon)
    -> (TyCon -> [TyConBinder] -> Type -> TcRn TyCon) -> TcRn TyCon
    forall a b. (a -> b) -> a -> b
    $ \ TyCon
    _ [TyConBinder]
    binders Type
    res_kind ->
        do { TcLclEnv
    env <- TcRnIf TcGblEnv TcLclEnv TcLclEnv
    forall gbl lcl. TcRnIf gbl lcl lcl
    getLclEnv
           ; String -> SDoc -> TcRn ()
    traceTc String
    "tc-syn" (Name -> SDoc
    forall a. Outputable a => a -> SDoc
    ppr Name
    tc_name SDoc -> SDoc -> SDoc
    $$ TcTypeEnv -> SDoc
    forall a. Outputable a => a -> SDoc
    ppr (TcLclEnv -> TcTypeEnv
    tcl_env TcLclEnv
    env))
           ; Type
    rhs_ty <- SkolemInfo -> [TyVar] -> TcM Type -> TcM Type
    forall a. SkolemInfo -> [TyVar] -> TcM a -> TcM a
    pushLevelAndSolveEqualities SkolemInfo
    skol_info ([TyConBinder] -> [TyVar]
    forall tv argf. [VarBndr tv argf] -> [tv]
    binderVars [TyConBinder]
    binders) (TcM Type -> TcM Type) -> TcM Type -> TcM Type
    forall a b. (a -> b) -> a -> b
    $
                       LHsKind GhcRn -> ContextKind -> TcM Type
    tcCheckLHsType LHsKind GhcRn
    hs_ty (Type -> ContextKind
    TheKind Type
    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.
           ; CandidatesQTvs
    dvs <- Type -> TcM CandidatesQTvs
    candidateQTyVarsOfType Type
    rhs_ty
           ; let mk_doc :: TidyEnv -> IOEnv (Env TcGblEnv TcLclEnv) (TidyEnv, SDoc)
    mk_doc TidyEnv
    tidy_env = do { (TidyEnv
    tidy_env2, Type
    rhs_ty) <- TidyEnv -> Type -> TcM (TidyEnv, Type)
    zonkTidyTcType TidyEnv
    tidy_env Type
    rhs_ty
                                      ; (TidyEnv, SDoc) -> IOEnv (Env TcGblEnv TcLclEnv) (TidyEnv, SDoc)
    forall (m :: * -> *) a. Monad m => a -> m a
    return ( TidyEnv
    tidy_env2
                                               , [SDoc] -> SDoc
    sep [ String -> SDoc
    text String
    "the type synonym right-hand side:"
                                                     , Type -> SDoc
    forall a. Outputable a => a -> SDoc
    ppr Type
    rhs_ty ] ) }
           ; CandidatesQTvs
    -> (TidyEnv -> IOEnv (Env TcGblEnv TcLclEnv) (TidyEnv, SDoc))
    -> TcRn ()
    doNotQuantifyTyVars CandidatesQTvs
    dvs TidyEnv -> IOEnv (Env TcGblEnv TcLclEnv) (TidyEnv, SDoc)
    mk_doc

           ; ZonkEnv
    ze <- ZonkFlexi -> TcM ZonkEnv
    mkEmptyZonkEnv ZonkFlexi
    NoFlexi
           ; Type
    rhs_ty <- ZonkEnv -> Type -> TcM Type
    zonkTcTypeToTypeX ZonkEnv
    ze Type
    rhs_ty
           ; let roles :: [Role]
    roles = Name -> [Role]
    roles_info Name
    tc_name
           ; TyCon -> TcRn TyCon
    forall (m :: * -> *) a. Monad m => a -> m a
    return (Name -> [TyConBinder] -> Type -> [Role] -> Type -> TyCon
    buildSynTyCon Name
    tc_name [TyConBinder]
    binders Type
    res_kind [Role]
    roles Type
    rhs_ty) }
      where
        skol_info :: SkolemInfo
    skol_info = TyConFlavour -> Name -> SkolemInfo
    TyConSkol TyConFlavour
    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_ND :: forall pass. HsDataDefn pass -> NewOrData
    dd_ND = NewOrData
    new_or_data, 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 -> [LConDecl pass]
    dd_cons = [LConDecl GhcRn]
    cons
                           , dd_derivs :: forall pass. HsDataDefn pass -> HsDeriving pass
    dd_derivs = HsDeriving GhcRn
    derivs })
      = Name
    -> (TyCon
        -> [TyConBinder]
        -> Type
        -> IOEnv (Env TcGblEnv TcLclEnv) (TyCon, [DerivInfo]))
    -> IOEnv (Env TcGblEnv TcLclEnv) (TyCon, [DerivInfo])
    forall a.
    Name -> (TyCon -> [TyConBinder] -> Type -> TcM a) -> TcM a
    bindTyClTyVars Name
    tc_name ((TyCon
      -> [TyConBinder]
      -> Type
      -> IOEnv (Env TcGblEnv TcLclEnv) (TyCon, [DerivInfo]))
     -> IOEnv (Env TcGblEnv TcLclEnv) (TyCon, [DerivInfo]))
    -> (TyCon
        -> [TyConBinder]
        -> Type
        -> IOEnv (Env TcGblEnv TcLclEnv) (TyCon, [DerivInfo]))
    -> IOEnv (Env TcGblEnv TcLclEnv) (TyCon, [DerivInfo])
    forall a b. (a -> b) -> a -> b
    $ \ TyCon
    tctc [TyConBinder]
    tycon_binders Type
    res_kind ->
           -- 'tctc' is a 'TcTyCon' and has the 'tcTyConScopedTyVars' that we need
           -- unlike the finalized 'tycon' defined above which is an 'AlgTyCon'
           --
           -- 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 { Bool
    gadt_syntax <- Name
    -> NewOrData
    -> Maybe (LHsContext GhcRn)
    -> [LConDecl GhcRn]
    -> TcRnIf TcGblEnv TcLclEnv Bool
    dataDeclChecks Name
    tc_name NewOrData
    new_or_data Maybe (LHsContext GhcRn)
    ctxt [LConDecl GhcRn]
    cons
             -- see Note [Datatype return kinds]
           ; ([TyConBinder]
    extra_bndrs, Type
    final_res_kind) <- [TyConBinder] -> Type -> TcM ([TyConBinder], Type)
    etaExpandAlgTyCon [TyConBinder]
    tycon_binders Type
    res_kind

           ; TcGblEnv
    tcg_env <- TcRnIf TcGblEnv TcLclEnv TcGblEnv
    forall gbl lcl. TcRnIf gbl lcl gbl
    getGblEnv
           ; let hsc_src :: HscSource
    hsc_src = TcGblEnv -> HscSource
    tcg_src TcGblEnv
    tcg_env
           ; Bool -> TcRn () -> TcRn ()
    forall (f :: * -> *). Applicative f => Bool -> f () -> f ()
    unless (HscSource -> [GenLocated SrcSpanAnnA (ConDecl GhcRn)] -> Bool
    forall {a}. HscSource -> [a] -> Bool
    mk_permissive_kind HscSource
    hsc_src [GenLocated SrcSpanAnnA (ConDecl GhcRn)]
    [LConDecl GhcRn]
    cons) (TcRn () -> TcRn ()) -> TcRn () -> TcRn ()
    forall a b. (a -> b) -> a -> b
    $
             DataSort -> Type -> TcRn ()
    checkDataKindSig (NewOrData -> DataSort
    DataDeclSort NewOrData
    new_or_data) Type
    final_res_kind

           ; let skol_tvs :: [TyVar]
    skol_tvs = [TyConBinder] -> [TyVar]
    forall tv argf. [VarBndr tv argf] -> [tv]
    binderVars [TyConBinder]
    tycon_binders
           ; [Type]
    stupid_tc_theta <- SkolemInfo -> [TyVar] -> TcM [Type] -> TcM [Type]
    forall a. SkolemInfo -> [TyVar] -> TcM a -> TcM a
    pushLevelAndSolveEqualities SkolemInfo
    skol_info [TyVar]
    skol_tvs (TcM [Type] -> TcM [Type]) -> TcM [Type] -> TcM [Type]
    forall a b. (a -> b) -> a -> b
    $
                                Maybe (LHsContext GhcRn) -> TcM [Type]
    tcHsContext Maybe (LHsContext GhcRn)
    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.
           ; CandidatesQTvs
    dvs <- [Type] -> TcM CandidatesQTvs
    candidateQTyVarsOfTypes [Type]
    stupid_tc_theta
           ; let mk_doc :: TidyEnv -> IOEnv (Env TcGblEnv TcLclEnv) (TidyEnv, SDoc)
    mk_doc TidyEnv
    tidy_env
                   = do { (TidyEnv
    tidy_env2, [Type]
    theta) <- TidyEnv -> [Type] -> TcM (TidyEnv, [Type])
    zonkTidyTcTypes TidyEnv
    tidy_env [Type]
    stupid_tc_theta
                        ; (TidyEnv, SDoc) -> IOEnv (Env TcGblEnv TcLclEnv) (TidyEnv, SDoc)
    forall (m :: * -> *) a. Monad m => a -> m a
    return ( TidyEnv
    tidy_env2
                                 , [SDoc] -> SDoc
    sep [ String -> SDoc
    text String
    "the datatype context:"
                                       , [Type] -> SDoc
    pprTheta [Type]
    theta ] ) }
           ; CandidatesQTvs
    -> (TidyEnv -> IOEnv (Env TcGblEnv TcLclEnv) (TidyEnv, SDoc))
    -> TcRn ()
    doNotQuantifyTyVars CandidatesQTvs
    dvs TidyEnv -> IOEnv (Env TcGblEnv TcLclEnv) (TidyEnv, SDoc)
    mk_doc

           ; ZonkEnv
    ze              <- ZonkFlexi -> TcM ZonkEnv
    mkEmptyZonkEnv ZonkFlexi
    NoFlexi
           ; [Type]
    stupid_theta    <- ZonkEnv -> [Type] -> TcM [Type]
    zonkTcTypesToTypesX ZonkEnv
    ze [Type]
    stupid_tc_theta

                 -- Check that we don't use kind signatures without the extension
           ; Bool
    kind_signatures <- Extension -> TcRnIf TcGblEnv TcLclEnv Bool
    forall gbl lcl. Extension -> TcRnIf gbl lcl Bool
    xoptM Extension
    LangExt.KindSignatures
           ; Bool -> TcRn () -> TcRn ()
    forall (f :: * -> *). Applicative f => Bool -> f () -> f ()
    when (Maybe (GenLocated SrcSpanAnnA (HsType GhcRn)) -> Bool
    forall a. Maybe a -> Bool
    isJust Maybe (GenLocated SrcSpanAnnA (HsType GhcRn))
    Maybe (LHsKind GhcRn)
    mb_ksig) (TcRn () -> TcRn ()) -> TcRn () -> TcRn ()
    forall a b. (a -> b) -> a -> b
    $
             Bool -> SDoc -> TcRn ()
    checkTc (Bool
    kind_signatures) (Name -> SDoc
    badSigTyDecl Name
    tc_name)

           ; TyCon
    tycon <- (TyCon -> TcRn TyCon) -> TcRn TyCon
    forall a env. (a -> IOEnv env a) -> IOEnv env a
    fixM ((TyCon -> TcRn TyCon) -> TcRn TyCon)
    -> (TyCon -> TcRn TyCon) -> TcRn TyCon
    forall a b. (a -> b) -> a -> b
    $ \ TyCon
    rec_tycon -> do
                 { let final_bndrs :: [TyConBinder]
    final_bndrs = [TyConBinder]
    tycon_binders [TyConBinder] -> [TyConBinder] -> [TyConBinder]
    forall a. [a] -> [a] -> [a]
    `chkAppend` [TyConBinder]
    extra_bndrs
                       roles :: [Role]
    roles       = Name -> [Role]
    roles_info Name
    tc_name
                 ; [DataCon]
    data_cons <- NewOrData
    -> DataDeclInfo
    -> TyCon
    -> [TyConBinder]
    -> Type
    -> [LConDecl GhcRn]
    -> TcM [DataCon]
    tcConDecls
                                  NewOrData
    new_or_data DataDeclInfo
    DDataType
                                  TyCon
    rec_tycon [TyConBinder]
    final_bndrs Type
    final_res_kind
                                  [LConDecl GhcRn]
    cons
                 ; AlgTyConRhs
    tc_rhs    <- HscSource
    -> TyCon -> [DataCon] -> IOEnv (Env TcGblEnv TcLclEnv) AlgTyConRhs
    mk_tc_rhs HscSource
    hsc_src TyCon
    rec_tycon [DataCon]
    data_cons
                 ; Name
    tc_rep_nm <- Name -> TcRnIf TcGblEnv TcLclEnv Name
    forall gbl lcl. Name -> TcRnIf gbl lcl Name
    newTyConRepName Name
    tc_name
                 ; TyCon -> TcRn TyCon
    forall (m :: * -> *) a. Monad m => a -> m a
    return (Name
    -> [TyConBinder]
    -> Type
    -> [Role]
    -> Maybe CType
    -> [Type]
    -> AlgTyConRhs
    -> AlgTyConFlav
    -> Bool
    -> TyCon
    mkAlgTyCon Name
    tc_name
                                      [TyConBinder]
    final_bndrs
                                      Type
    final_res_kind
                                      [Role]
    roles
                                      ((GenLocated SrcSpanAnnP CType -> CType)
    -> Maybe (GenLocated SrcSpanAnnP CType) -> Maybe CType
    forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
    fmap GenLocated SrcSpanAnnP CType -> CType
    forall l e. GenLocated l e -> e
    unLoc Maybe (GenLocated SrcSpanAnnP CType)
    Maybe (XRec GhcRn CType)
    cType)
                                      [Type]
    stupid_theta AlgTyConRhs
    tc_rhs
                                      (Name -> AlgTyConFlav
    VanillaAlgTyCon Name
    tc_rep_nm)
                                      Bool
    gadt_syntax) }
           ; let deriv_info :: DerivInfo
    deriv_info = DerivInfo { di_rep_tc :: TyCon
    di_rep_tc = TyCon
    tycon
                                        , di_scoped_tvs :: [(Name, TyVar)]
    di_scoped_tvs = TyCon -> [(Name, TyVar)]
    tcTyConScopedTyVars TyCon
    tctc
                                        , di_clauses :: HsDeriving GhcRn
    di_clauses = HsDeriving GhcRn
    derivs
                                        , di_ctxt :: SDoc
    di_ctxt = SDoc
    err_ctxt }
           ; String -> SDoc -> TcRn ()
    traceTc String
    "tcDataDefn" (Name -> SDoc
    forall a. Outputable a => a -> SDoc
    ppr Name
    tc_name SDoc -> SDoc -> SDoc
    $$ [TyConBinder] -> SDoc
    forall a. Outputable a => a -> SDoc
    ppr [TyConBinder]
    tycon_binders SDoc -> SDoc -> SDoc
    $$ [TyConBinder] -> SDoc
    forall a. Outputable a => a -> SDoc
    ppr [TyConBinder]
    extra_bndrs)
           ; (TyCon, [DerivInfo])
    -> IOEnv (Env TcGblEnv TcLclEnv) (TyCon, [DerivInfo])
    forall (m :: * -> *) a. Monad m => a -> m a
    return (TyCon
    tycon, [DerivInfo
    deriv_info]) }
      where
        skol_info :: SkolemInfo
    skol_info = TyConFlavour -> Name -> SkolemInfo
    TyConSkol TyConFlavour
    flav Name
    tc_name
        flav :: TyConFlavour
    flav = NewOrData -> TyConFlavour
    newOrDataToFlavour NewOrData
    new_or_data

        -- 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 -> [a] -> Bool
    mk_permissive_kind HscSource
    HsigFile [] = Bool
    True
        mk_permissive_kind HscSource
    _ [a]
    _ = Bool
    False

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

        mk_tc_rhs HscSource
    HsigFile TyCon
    _ [] -- ditto
          = AlgTyConRhs -> IOEnv (Env TcGblEnv TcLclEnv) AlgTyConRhs
    forall (m :: * -> *) a. Monad m => a -> m a
    return AlgTyConRhs
    AbstractTyCon

        mk_tc_rhs HscSource
    _ TyCon
    tycon [DataCon]
    data_cons
          = case NewOrData
    new_or_data of
              NewOrData
    DataType -> AlgTyConRhs -> IOEnv (Env TcGblEnv TcLclEnv) AlgTyConRhs
    forall (m :: * -> *) a. Monad m => a -> m a
    return ([DataCon] -> AlgTyConRhs
    mkDataTyConRhs [DataCon]
    data_cons)
              NewOrData
    NewType  -> ASSERT( not (null data_cons) )
                          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] -> DataCon
    forall a. [a] -> a
    head [DataCon]
    data_cons)

    -------------------------
    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 -> HsTyPats pass
    feqn_pats  = HsTyPats 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. SrcSpanAnn' 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
    vcat
               [ String -> SDoc
    text String
    "tc_name ="    SDoc -> SDoc -> SDoc
    <+> Name -> SDoc
    forall a. Outputable a => a -> SDoc
    ppr Name
    eqn_tc_name
               , String -> SDoc
    text String
    "fam_tc ="     SDoc -> SDoc -> SDoc
    <+> TyCon -> SDoc
    forall a. Outputable a => a -> SDoc
    ppr TyCon
    tc_fam_tc SDoc -> SDoc -> SDoc
    <+> SDoc
    dcolon SDoc -> SDoc -> SDoc
    <+> Type -> SDoc
    forall a. Outputable a => a -> SDoc
    ppr (TyCon -> Type
    tyConKind TyCon
    tc_fam_tc)
               , String -> SDoc
    text String
    "feqn_bndrs =" SDoc -> SDoc -> SDoc
    <+> HsOuterFamEqnTyVarBndrs GhcRn -> SDoc
    forall a. Outputable a => a -> SDoc
    ppr HsOuterFamEqnTyVarBndrs GhcRn
    outer_bndrs
               , String -> SDoc
    text String
    "feqn_pats ="  SDoc -> SDoc -> SDoc
    <+> [HsArg
       (GenLocated SrcSpanAnnA (HsType GhcRn))
       (GenLocated SrcSpanAnnA (HsType GhcRn))]
    -> SDoc
    forall a. Outputable a => a -> SDoc
    ppr [HsArg
       (GenLocated SrcSpanAnnA (HsType GhcRn))
       (GenLocated SrcSpanAnnA (HsType GhcRn))]
    HsTyPats GhcRn
    hs_pats ])

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

           ; TcM ([TyVar], Type) -> TcRn ()
    forall a. TcM a -> TcRn ()
    discardResult (TcM ([TyVar], Type) -> TcRn ()) -> TcM ([TyVar], Type) -> TcRn ()
    forall a b. (a -> b) -> a -> b
    $
             HsOuterFamEqnTyVarBndrs GhcRn -> TcM Type -> TcM ([TyVar], Type)
    forall a.
    HsOuterFamEqnTyVarBndrs GhcRn -> TcM a -> TcM ([TyVar], a)
    bindOuterFamEqnTKBndrs_Q_Tv HsOuterFamEqnTyVarBndrs GhcRn
    outer_bndrs (TcM Type -> TcM ([TyVar], Type))
    -> TcM Type -> TcM ([TyVar], Type)
    forall a b. (a -> b) -> a -> b
    $
             do { (Type
    _fam_app, Type
    res_kind) <- TyCon -> HsTyPats GhcRn -> TcM (Type, Type)
    tcFamTyPats TyCon
    tc_fam_tc HsTyPats GhcRn
    hs_pats
                ; LHsKind GhcRn -> ContextKind -> TcM Type
    tcCheckLHsType GenLocated SrcSpanAnnA (HsType GhcRn)
    LHsKind GhcRn
    hs_rhs_ty (Type -> ContextKind
    TheKind Type
    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)
    -- 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)
    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 -> HsTyPats pass
    feqn_pats   = HsTyPats 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) -> TcRn (KnotTied CoAxBranch)
    forall ann a. SrcSpanAnn' ann -> TcRn a -> TcRn a
    setSrcSpanA SrcSpanAnnA
    loc (TcRn (KnotTied CoAxBranch) -> TcRn (KnotTied CoAxBranch))
    -> TcRn (KnotTied CoAxBranch) -> TcRn (KnotTied CoAxBranch)
    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
    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
    <+> [HsArg
       (GenLocated SrcSpanAnnA (HsType GhcRn))
       (GenLocated SrcSpanAnnA (HsType GhcRn))]
    -> SDoc
    forall a. Outputable a => a -> SDoc
    ppr [HsArg
       (GenLocated SrcSpanAnnA (HsType GhcRn))
       (GenLocated SrcSpanAnnA (HsType GhcRn))]
    HsTyPats GhcRn
    hs_pats
                  , String -> SDoc
    text String
    "fam tc bndrs" SDoc -> SDoc -> SDoc
    <+> [TyVar] -> SDoc
    pprTyVars (TyCon -> [TyVar]
    tyConTyVars TyCon
    fam_tc)
                  , case AssocInstInfo
    mb_clsinfo of
                      NotAssociated {} -> SDoc
    empty
                      InClsInst { ai_class :: AssocInstInfo -> Class
    ai_class = Class
    cls } -> String -> SDoc
    text String
    "class" SDoc -> SDoc -> SDoc
    <+> Class -> SDoc
    forall a. Outputable a => a -> SDoc
    ppr Class
    cls SDoc -> SDoc -> SDoc
    <+> [TyVar] -> SDoc
    pprTyVars (Class -> [TyVar]
    classTyVars Class
    cls) ]

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

           ; ([TyVar]
    qtvs, [Type]
    pats, Type
    rhs_ty) <- TyCon
    -> AssocInstInfo
    -> HsOuterFamEqnTyVarBndrs GhcRn
    -> HsTyPats GhcRn
    -> LHsKind GhcRn
    -> TcM ([TyVar], [Type], Type)
    tcTyFamInstEqnGuts TyCon
    fam_tc AssocInstInfo
    mb_clsinfo
                                          HsOuterFamEqnTyVarBndrs GhcRn
    outer_bndrs HsTyPats GhcRn
    hs_pats GenLocated SrcSpanAnnA (HsType GhcRn)
    LHsKind GhcRn
    hs_rhs_ty
           -- Don't print results they may be knot-tied
           -- (tcFamInstEqnGuts zonks to Type)
           ; KnotTied CoAxBranch -> TcRn (KnotTied CoAxBranch)
    forall (m :: * -> *) a. Monad m => a -> m a
    return ([TyVar]
    -> [TyVar]
    -> [TyVar]
    -> [Type]
    -> Type
    -> [Role]
    -> SrcSpan
    -> KnotTied CoAxBranch
    mkCoAxBranch [TyVar]
    qtvs [] [] [Type]
    pats Type
    rhs_ty
                                  ((TyVar -> Role) -> [TyVar] -> [Role]
    forall a b. (a -> b) -> [a] -> [b]
    map (Role -> TyVar -> Role
    forall a b. a -> b -> a
    const Role
    Nominal) [TyVar]
    qtvs)
                                  (SrcSpanAnnA -> SrcSpan
    forall a. SrcSpanAnn' a -> SrcSpan
    locA SrcSpanAnnA
    loc)) }

    checkTyFamInstEqn :: TcTyCon -> Name -> [HsArg tm ty] -> TcM ()
    checkTyFamInstEqn :: forall tm ty. TyCon -> Name -> [HsArg tm ty] -> TcRn ()
    checkTyFamInstEqn TyCon
    tc_fam_tc Name
    eqn_tc_name [HsArg 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 -> SDoc -> TcRn ()
    checkTc (Name
    tc_fam_tc_name Name -> Name -> Bool
    forall a. Eq a => a -> a -> Bool
    == Name
    eqn_tc_name) (SDoc -> TcRn ()) -> SDoc -> TcRn ()
    forall a b. (a -> b) -> a -> b
    $
                   Name -> Name -> SDoc
    wrongTyFamName 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 :: Arity
    vis_arity = [TyVar] -> Arity
    forall (t :: * -> *) a. Foldable t => t a -> Arity
    length (TyCon -> [TyVar]
    tyConVisibleTyVars TyCon
    tc_fam_tc)
               vis_pats :: Arity
    vis_pats  = [HsArg tm ty] -> Arity
    forall tm ty. [HsArg tm ty] -> Arity
    numVisibleArgs [HsArg tm ty]
    hs_pats
         ; Bool -> SDoc -> TcRn ()
    checkTc (Arity
    vis_pats Arity -> Arity -> Bool
    forall a. Eq a => a -> a -> Bool
    == Arity
    vis_arity) (SDoc -> TcRn ()) -> SDoc -> TcRn ()
    forall a b. (a -> b) -> a -> b
    $
                   Arity -> SDoc
    wrongNumberOfParmsErr Arity
    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-quanfitifed 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
                       -> HsTyPats GhcRn                    -- Patterns
                       -> LHsType GhcRn                     -- RHS
                       -> TcM ([TyVar], [TcType], TcType)   -- (tyvars, pats, rhs)
    -- Used only for type families, not data families
    tcTyFamInstEqnGuts :: TyCon
    -> AssocInstInfo
    -> HsOuterFamEqnTyVarBndrs GhcRn
    -> HsTyPats GhcRn
    -> LHsKind GhcRn
    -> TcM ([TyVar], [Type], Type)
    tcTyFamInstEqnGuts TyCon
    fam_tc AssocInstInfo
    mb_clsinfo HsOuterFamEqnTyVarBndrs GhcRn
    outer_hs_bndrs HsTyPats 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)

           -- By now, for type families (but not data families) we should
           -- have checked that the number of patterns matches tyConArity

           -- This code is closely related to the code
           -- in GHC.Tc.Gen.HsType.kcCheckDeclHeader_cusk
           ; (TcLevel
    tclvl, WantedConstraints
    wanted, ([TyVar]
    outer_tvs, (Type
    lhs_ty, Type
    rhs_ty)))
                   <- String
    -> TcM ([TyVar], (Type, Type))
    -> TcM (TcLevel, WantedConstraints, ([TyVar], (Type, Type)))
    forall a. String -> TcM a -> TcM (TcLevel, WantedConstraints, a)
    pushLevelAndSolveEqualitiesX String
    "tcTyFamInstEqnGuts" (TcM ([TyVar], (Type, Type))
     -> TcM (TcLevel, WantedConstraints, ([TyVar], (Type, Type))))
    -> TcM ([TyVar], (Type, Type))
    -> TcM (TcLevel, WantedConstraints, ([TyVar], (Type, Type)))
    forall a b. (a -> b) -> a -> b
    $
                      HsOuterFamEqnTyVarBndrs GhcRn
    -> TcM (Type, Type) -> TcM ([TyVar], (Type, Type))
    forall a.
    HsOuterFamEqnTyVarBndrs GhcRn -> TcM a -> TcM ([TyVar], a)
    bindOuterFamEqnTKBndrs HsOuterFamEqnTyVarBndrs GhcRn
    outer_hs_bndrs             (TcM (Type, Type) -> TcM ([TyVar], (Type, Type)))
    -> TcM (Type, Type) -> TcM ([TyVar], (Type, Type))
    forall a b. (a -> b) -> a -> b
    $
                      do { (Type
    lhs_ty, Type
    rhs_kind) <- TyCon -> HsTyPats GhcRn -> TcM (Type, Type)
    tcFamTyPats TyCon
    fam_tc HsTyPats GhcRn
    hs_pats
                           -- Ensure that the instance is consistent with its
                           -- parent class (#16008)
                         ; AssocInstInfo -> Type -> TcRn ()
    addConsistencyConstraints AssocInstInfo
    mb_clsinfo Type
    lhs_ty
                         ; Type
    rhs_ty <- LHsKind GhcRn -> ContextKind -> TcM Type
    tcCheckLHsType LHsKind GhcRn
    hs_rhs_ty (Type -> ContextKind
    TheKind Type
    rhs_kind)
                         ; (Type, Type) -> TcM (Type, Type)
    forall (m :: * -> *) a. Monad m => a -> m a
    return (Type
    lhs_ty, Type
    rhs_ty) }

           -- 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]
           ; CandidatesQTvs
    dvs  <- [Type] -> TcM CandidatesQTvs
    candidateQTyVarsOfTypes (Type
    lhs_ty Type -> [Type] -> [Type]
    forall a. a -> [a] -> [a]
    : [TyVar] -> [Type]
    mkTyVarTys [TyVar]
    outer_tvs)
           ; [TyVar]
    qtvs <- CandidatesQTvs -> TcM [TyVar]
    quantifyTyVars CandidatesQTvs
    dvs
           ; SkolemInfo -> [TyVar] -> TcLevel -> WantedConstraints -> TcRn ()
    reportUnsolvedEqualities SkolemInfo
    FamInstSkol [TyVar]
    qtvs TcLevel
    tclvl WantedConstraints
    wanted
           ; TcLevel -> HsOuterFamEqnTyVarBndrs GhcRn -> [TyVar] -> TcRn ()
    checkFamTelescope TcLevel
    tclvl HsOuterFamEqnTyVarBndrs GhcRn
    outer_hs_bndrs [TyVar]
    outer_tvs

           ; String -> SDoc -> TcRn ()
    traceTc String
    "tcTyFamInstEqnGuts 2" (SDoc -> TcRn ()) -> SDoc -> TcRn ()
    forall a b. (a -> b) -> a -> b
    $
             [SDoc] -> SDoc
    vcat [ TyCon -> SDoc
    forall a. Outputable a => a -> SDoc
    ppr TyCon
    fam_tc
                  , String -> SDoc
    text String
    "lhs_ty"     SDoc -> SDoc -> SDoc
    <+> Type -> SDoc
    forall a. Outputable a => a -> SDoc
    ppr Type
    lhs_ty
                  , String -> SDoc
    text String
    "qtvs"       SDoc -> SDoc -> SDoc
    <+> [TyVar] -> SDoc
    pprTyVars [TyVar]
    qtvs ]

           -- See Note [Error on unconstrained meta-variables] in GHC.Tc.Utils.TcMType
           -- Example: typecheck/should_fail/T17301
           ; CandidatesQTvs
    dvs_rhs <- Type -> TcM CandidatesQTvs
    candidateQTyVarsOfType Type
    rhs_ty
           ; let mk_doc :: TidyEnv -> IOEnv (Env TcGblEnv TcLclEnv) (TidyEnv, SDoc)
    mk_doc TidyEnv
    tidy_env
                   = do { (TidyEnv
    tidy_env2, Type
    rhs_ty) <- TidyEnv -> Type -> TcM (TidyEnv, Type)
    zonkTidyTcType TidyEnv
    tidy_env Type
    rhs_ty
                        ; (TidyEnv, SDoc) -> IOEnv (Env TcGblEnv TcLclEnv) (TidyEnv, SDoc)
    forall (m :: * -> *) a. Monad m => a -> m a
    return ( TidyEnv
    tidy_env2
                                 , [SDoc] -> SDoc
    sep [ String -> SDoc
    text String
    "type family equation right-hand side:"
                                       , Type -> SDoc
    forall a. Outputable a => a -> SDoc
    ppr Type
    rhs_ty ] ) }
           ; CandidatesQTvs
    -> (TidyEnv -> IOEnv (Env TcGblEnv TcLclEnv) (TidyEnv, SDoc))
    -> TcRn ()
    doNotQuantifyTyVars CandidatesQTvs
    dvs_rhs TidyEnv -> IOEnv (Env TcGblEnv TcLclEnv) (TidyEnv, SDoc)
    mk_doc

           ; ZonkEnv
    ze         <- ZonkFlexi -> TcM ZonkEnv
    mkEmptyZonkEnv ZonkFlexi
    NoFlexi
           ; (ZonkEnv
    ze, [TyVar]
    qtvs) <- ZonkEnv -> [TyVar] -> TcM (ZonkEnv, [TyVar])
    zonkTyBndrsX      ZonkEnv
    ze [TyVar]
    qtvs
           ; Type
    lhs_ty     <- ZonkEnv -> Type -> TcM Type
    zonkTcTypeToTypeX ZonkEnv
    ze Type
    lhs_ty
           ; Type
    rhs_ty     <- ZonkEnv -> Type -> TcM Type
    zonkTcTypeToTypeX ZonkEnv
    ze Type
    rhs_ty

           ; let pats :: [Type]
    pats = Type -> [Type]
    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
           ; String -> SDoc -> TcRn ()
    traceTc String
    "tcTyFamInstEqnGuts }" (TyCon -> SDoc
    forall a. Outputable a => a -> SDoc
    ppr TyCon
    fam_tc SDoc -> SDoc -> SDoc
    <+> [TyVar] -> SDoc
    pprTyVars [TyVar]
    qtvs)
           ; ([TyVar], [Type], Type) -> TcM ([TyVar], [Type], Type)
    forall (m :: * -> *) a. Monad m => a -> m a
    return ([TyVar]
    qtvs, [Type]
    pats, Type
    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 -> [TyVar] -> TcRn ()
    checkFamTelescope TcLevel
    tclvl HsOuterFamEqnTyVarBndrs GhcRn
    hs_outer_bndrs [TyVar]
    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. [a] -> a
    last [GenLocated SrcSpanAnnA (HsTyVarBndr () GhcRn)]
    [LHsTyVarBndr () (NoGhcTc GhcRn)]
    bndrs
            skol_info :: SkolemInfo
    skol_info = SDoc -> SkolemInfo
    ForAllSkol ([SDoc] -> SDoc
    fsep ((GenLocated SrcSpanAnnA (HsTyVarBndr () GhcRn) -> SDoc)
    -> [GenLocated SrcSpanAnnA (HsTyVarBndr () GhcRn)] -> [SDoc]
    forall a b. (a -> b) -> [a] -> [b]
    map GenLocated SrcSpanAnnA (HsTyVarBndr () GhcRn) -> SDoc
    forall a. Outputable a => a -> SDoc
    ppr [GenLocated SrcSpanAnnA (HsTyVarBndr () GhcRn)]
    [LHsTyVarBndr () (NoGhcTc GhcRn)]
    bndrs))
      = SrcSpan -> TcRn () -> TcRn ()
    forall a. SrcSpan -> TcRn a -> TcRn a
    setSrcSpan (SrcSpan -> SrcSpan -> SrcSpan
    combineSrcSpans (GenLocated SrcSpanAnnA (HsTyVarBndr () GhcRn) -> SrcSpan
    forall a e. GenLocated (SrcSpanAnn' a) e -> SrcSpan
    getLocA GenLocated SrcSpanAnnA (HsTyVarBndr () GhcRn)
    LHsTyVarBndr () (NoGhcTc GhcRn)
    b_first) (GenLocated SrcSpanAnnA (HsTyVarBndr () GhcRn) -> SrcSpan
    forall a e. GenLocated (SrcSpanAnn' a) e -> SrcSpan
    getLocA GenLocated SrcSpanAnnA (HsTyVarBndr () GhcRn)
    b_last)) (TcRn () -> TcRn ()) -> TcRn () -> TcRn ()
    forall a b. (a -> b) -> a -> b
    $
        SkolemInfo -> [TyVar] -> TcLevel -> WantedConstraints -> TcRn ()
    emitResidualTvConstraint SkolemInfo
    skol_info [TyVar]
    outer_tvs TcLevel
    tclvl WantedConstraints
    emptyWC
      | Bool
    otherwise
      = () -> TcRn ()
    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 -> [Type]
    unravelFamInstPats Type
    fam_app
      = case HasDebugCallStack => Type -> Maybe (TyCon, [Type])
    Type -> Maybe (TyCon, [Type])
    splitTyConApp_maybe Type
    fam_app of
          Just (TyCon
    _, [Type]
    pats) -> [Type]
    pats
          Maybe (TyCon, [Type])
    Nothing -> String -> [Type]
    forall a. 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 trac 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
    --
    -- We emit /Derived/ constraints (a bit like fundeps) to encourage
    -- unification to happen, but without actually reporting errors.
    -- If, despite the efforts, corresponding positions do not match,
    -- checkConsistentFamInst will complain
    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, [Type]
    pats) <- HasCallStack => Type -> Maybe (TyCon, [Type])
    Type -> Maybe (TyCon, [Type])
    tcSplitTyConApp_maybe Type
    fam_app
      = do { let eqs :: [(Type, Type)]
    eqs = [ (Type
    cls_ty, Type
    pat)
                       | (TyVar
    fam_tc_tv, Type
    pat) <- TyCon -> [TyVar]
    tyConTyVars TyCon
    fam_tc [TyVar] -> [Type] -> [(TyVar, Type)]
    forall a b. [a] -> [b] -> [(a, b)]
    `zip` [Type]
    pats
                       , Just Type
    cls_ty <- [VarEnv Type -> TyVar -> Maybe Type
    forall a. VarEnv a -> TyVar -> Maybe a
    lookupVarEnv VarEnv Type
    inst_env TyVar
    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 ()
    emitDerivedEqs CtOrigin
    AssocFamPatOrigin [(Type, Type)]
    eqs }
        -- Improve inference
        -- Any mis-match is reports by checkConsistentFamInst
      | Bool
    otherwise
      = () -> TcRn ()
    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 -> NewOrData
                   -> Maybe (LHsContext GhcRn) -> [LConDecl GhcRn]
                   -> TcM Bool
    dataDeclChecks :: Name
    -> NewOrData
    -> Maybe (LHsContext GhcRn)
    -> [LConDecl GhcRn]
    -> TcRnIf TcGblEnv TcLclEnv Bool
    dataDeclChecks Name
    tc_name NewOrData
    new_or_data Maybe (LHsContext GhcRn)
    mctxt [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
           ;  Bool
    gadtSyntax_ok <- Extension -> TcRnIf TcGblEnv TcLclEnv Bool
    forall gbl lcl. Extension -> TcRnIf gbl lcl Bool
    xoptM Extension
    LangExt.GADTSyntax
           ; let gadt_syntax :: Bool
    gadt_syntax = [LConDecl GhcRn] -> Bool
    consUseGadtSyntax [LConDecl GhcRn]
    cons
           ; Bool -> SDoc -> TcRn ()
    checkTc (Bool
    gadtSyntax_ok Bool -> Bool -> Bool
    || Bool -> Bool
    not Bool
    gadt_syntax) (Name -> SDoc
    badGadtDecl Name
    tc_name)

               -- Check that the stupid theta is empty for a GADT-style declaration
           ; Bool -> SDoc -> TcRn ()
    checkTc ([GenLocated SrcSpanAnnA (HsType GhcRn)] -> Bool
    forall (t :: * -> *) a. Foldable t => t a -> Bool
    null [GenLocated SrcSpanAnnA (HsType GhcRn)]
    HsContext GhcRn
    stupid_theta Bool -> Bool -> Bool
    || Bool -> Bool
    not Bool
    gadt_syntax) (Name -> SDoc
    badStupidTheta Name
    tc_name)

             -- Check that a newtype has exactly one constructor
             -- Do this before checking for empty data decls, so that
             -- we don't suggest -XEmptyDataDecls for newtypes
           ; Bool -> SDoc -> TcRn ()
    checkTc (NewOrData
    new_or_data NewOrData -> NewOrData -> Bool
    forall a. Eq a => a -> a -> Bool
    == NewOrData
    DataType Bool -> Bool -> Bool
    || [GenLocated SrcSpanAnnA (ConDecl GhcRn)] -> Bool
    forall a. [a] -> Bool
    isSingleton [GenLocated SrcSpanAnnA (ConDecl GhcRn)]
    [LConDecl GhcRn]
    cons)
                    (Name -> Arity -> SDoc
    newtypeConError Name
    tc_name ([GenLocated SrcSpanAnnA (ConDecl GhcRn)] -> Arity
    forall (t :: * -> *) a. Foldable t => t a -> Arity
    length [GenLocated SrcSpanAnnA (ConDecl GhcRn)]
    [LConDecl GhcRn]
    cons))

             -- Check that there's at least one condecl,
             -- or else we're reading an hs-boot file, or -XEmptyDataDecls
           ; Bool
    empty_data_decls <- Extension -> TcRnIf TcGblEnv TcLclEnv Bool
    forall gbl lcl. Extension -> TcRnIf gbl lcl Bool
    xoptM Extension
    LangExt.EmptyDataDecls
           ; Bool
    is_boot <- TcRnIf TcGblEnv TcLclEnv Bool
    tcIsHsBootOrSig  -- Are we compiling an hs-boot file?
           ; Bool -> SDoc -> TcRn ()
    checkTc (Bool -> Bool
    not ([GenLocated SrcSpanAnnA (ConDecl GhcRn)] -> Bool
    forall (t :: * -> *) a. Foldable t => t a -> Bool
    null [GenLocated SrcSpanAnnA (ConDecl GhcRn)]
    [LConDecl GhcRn]
    cons) Bool -> Bool -> Bool
    || Bool
    empty_data_decls Bool -> Bool -> Bool
    || Bool
    is_boot)
                     (Name -> SDoc
    emptyConDeclsErr Name
    tc_name)
           ; Bool -> TcRnIf TcGblEnv TcLclEnv Bool
    forall (m :: * -> *) a. Monad m => a -> m a
    return Bool
    gadt_syntax }

    -----------------------------------
    consUseGadtSyntax :: [LConDecl GhcRn] -> Bool
    consUseGadtSyntax :: [LConDecl GhcRn] -> Bool
    consUseGadtSyntax (L SrcSpanAnnA
    _ (ConDeclGADT {}) : [LConDecl GhcRn]
    _) = Bool
    True
    consUseGadtSyntax [LConDecl GhcRn]
    _                          = Bool
    False
                     -- All constructors have same shape

    -----------------------------------
    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 -> [Type] -> Type
    mkTyConApp TyCon
    rep_tycon ([Type] -> Type) -> [Type] -> Type
    forall a b. (a -> b) -> a -> b
    $
                       [TyVar] -> [Type]
    mkTyVarTys ([TyConBinder] -> [TyVar]
    forall tv argf. [VarBndr tv argf] -> [tv]
    binderVars [TyConBinder]
    tc_bndrs)
          DDataInstance Type
    header_ty -> Type
    header_ty

    tcConDecls :: NewOrData
               -> DataDeclInfo
               -> KnotTied TyCon            -- Representation TyCon
               -> [TyConBinder]             -- Binders of representation TyCon
               -> TcKind                    -- Result kind
               -> [LConDecl GhcRn] -> TcM [DataCon]
    tcConDecls :: NewOrData
    -> DataDeclInfo
    -> TyCon
    -> [TyConBinder]
    -> Type
    -> [LConDecl GhcRn]
    -> TcM [DataCon]
    tcConDecls NewOrData
    new_or_data DataDeclInfo
    dd_info TyCon
    rep_tycon [TyConBinder]
    tmpl_bndrs Type
    res_kind
      = (LConDecl GhcRn -> TcM [DataCon])
    -> [LConDecl GhcRn] -> TcM [DataCon]
    forall (m :: * -> *) a b. Monad m => (a -> m [b]) -> [a] -> m [b]
    concatMapM ((LConDecl GhcRn -> TcM [DataCon])
     -> [LConDecl GhcRn] -> TcM [DataCon])
    -> (LConDecl GhcRn -> TcM [DataCon])
    -> [LConDecl GhcRn]
    -> TcM [DataCon]
    forall a b. (a -> b) -> a -> b
    $ (ConDecl GhcRn -> TcM [DataCon])
    -> GenLocated SrcSpanAnnA (ConDecl GhcRn) -> TcM [DataCon]
    forall a b ann.
    (a -> TcM b) -> GenLocated (SrcSpanAnn' ann) a -> TcM b
    addLocMA ((ConDecl GhcRn -> TcM [DataCon])
     -> GenLocated SrcSpanAnnA (ConDecl GhcRn) -> TcM [DataCon])
    -> (ConDecl GhcRn -> TcM [DataCon])
    -> GenLocated SrcSpanAnnA (ConDecl GhcRn)
    -> TcM [DataCon]
    forall a b. (a -> b) -> a -> b
    $
        NewOrData
    -> DataDeclInfo
    -> TyCon
    -> [TyConBinder]
    -> Type
    -> NameEnv Arity
    -> ConDecl GhcRn
    -> TcM [DataCon]
    tcConDecl NewOrData
    new_or_data DataDeclInfo
    dd_info TyCon
    rep_tycon [TyConBinder]
    tmpl_bndrs Type
    res_kind
                  (TyCon -> NameEnv Arity
    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

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

    tcConDecl :: NewOrData
    -> DataDeclInfo
    -> TyCon
    -> [TyConBinder]
    -> Type
    -> NameEnv Arity
    -> ConDecl GhcRn
    -> TcM [DataCon]
    tcConDecl NewOrData
    new_or_data DataDeclInfo
    dd_info TyCon
    rep_tycon [TyConBinder]
    tc_bndrs Type
    res_kind NameEnv Arity
    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 [DataCon] -> TcM [DataCon]
    forall a. SDoc -> TcM a -> TcM a
    addErrCtxt ([GenLocated SrcSpanAnnN Name] -> SDoc
    dataConCtxt [GenLocated SrcSpanAnnN Name
    LIdP GhcRn
    lname]) (TcM [DataCon] -> TcM [DataCon]) -> TcM [DataCon] -> TcM [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
    vcat [ Name -> SDoc
    forall a. Outputable a => a -> SDoc
    ppr Name
    name, [GenLocated SrcSpanAnnA (HsTyVarBndr Specificity GhcRn)] -> SDoc
    forall a. Outputable a => a -> SDoc
    ppr [GenLocated SrcSpanAnnA (HsTyVarBndr Specificity GhcRn)]
    [LHsTyVarBndr Specificity GhcRn]
    explicit_tkv_nms ])

           ; (TcLevel
    tclvl, WantedConstraints
    wanted, ([VarBndr TyVar Specificity]
    exp_tvbndrs, ([Type]
    ctxt, [Scaled Type]
    arg_tys, [FieldLabel]
    field_lbls, [HsSrcBang]
    stricts)))
               <- String
    -> TcM
         ([VarBndr TyVar Specificity],
          ([Type], [Scaled Type], [FieldLabel], [HsSrcBang]))
    -> TcM
         (TcLevel, WantedConstraints,
          ([VarBndr TyVar Specificity],
           ([Type], [Scaled Type], [FieldLabel], [HsSrcBang])))
    forall a. String -> TcM a -> TcM (TcLevel, WantedConstraints, a)
    pushLevelAndSolveEqualitiesX String
    "tcConDecl:H98"  (TcM
       ([VarBndr TyVar Specificity],
        ([Type], [Scaled Type], [FieldLabel], [HsSrcBang]))
     -> TcM
          (TcLevel, WantedConstraints,
           ([VarBndr TyVar Specificity],
            ([Type], [Scaled Type], [FieldLabel], [HsSrcBang]))))
    -> TcM
         ([VarBndr TyVar Specificity],
          ([Type], [Scaled Type], [FieldLabel], [HsSrcBang]))
    -> TcM
         (TcLevel, WantedConstraints,
          ([VarBndr TyVar Specificity],
           ([Type], [Scaled Type], [FieldLabel], [HsSrcBang])))
    forall a b. (a -> b) -> a -> b
    $
                  [LHsTyVarBndr Specificity GhcRn]
    -> TcM ([Type], [Scaled Type], [FieldLabel], [HsSrcBang])
    -> TcM
         ([VarBndr TyVar Specificity],
          ([Type], [Scaled Type], [FieldLabel], [HsSrcBang]))
    forall flag a.
    OutputableBndrFlag flag 'Renamed =>
    [LHsTyVarBndr flag GhcRn] -> TcM a -> TcM ([VarBndr TyVar flag], a)
    tcExplicitTKBndrs [LHsTyVarBndr Specificity GhcRn]
    explicit_tkv_nms            (TcM ([Type], [Scaled Type], [FieldLabel], [HsSrcBang])
     -> TcM
          ([VarBndr TyVar Specificity],
           ([Type], [Scaled Type], [FieldLabel], [HsSrcBang])))
    -> TcM ([Type], [Scaled Type], [FieldLabel], [HsSrcBang])
    -> TcM
         ([VarBndr TyVar Specificity],
          ([Type], [Scaled Type], [FieldLabel], [HsSrcBang]))
    forall a b. (a -> b) -> a -> b
    $
                  do { [Type]
    ctxt <- Maybe (LHsContext GhcRn) -> TcM [Type]
    tcHsContext Maybe (LHsContext GhcRn)
    hs_ctxt
                     ; let exp_kind :: ContextKind
    exp_kind = NewOrData -> Type -> ContextKind
    getArgExpKind NewOrData
    new_or_data Type
    res_kind
                     ; [(Scaled Type, HsSrcBang)]
    btys <- ContextKind
    -> HsConDeclH98Details GhcRn -> TcM [(Scaled Type, HsSrcBang)]
    tcConH98Args ContextKind
    exp_kind HsConDeclH98Details GhcRn
    hs_args
                     ; [FieldLabel]
    field_lbls <- Name -> RnM [FieldLabel]
    lookupConstructorFields Name
    name
                     ; let ([Scaled Type]
    arg_tys, [HsSrcBang]
    stricts) = [(Scaled Type, HsSrcBang)] -> ([Scaled Type], [HsSrcBang])
    forall a b. [(a, b)] -> ([a], [b])
    unzip [(Scaled Type, HsSrcBang)]
    btys
                     ; ([Type], [Scaled Type], [FieldLabel], [HsSrcBang])
    -> TcM ([Type], [Scaled Type], [FieldLabel], [HsSrcBang])
    forall (m :: * -> *) a. Monad m => a -> m a
    return ([Type]
    ctxt, [Scaled Type]
    arg_tys, [FieldLabel]
    field_lbls, [HsSrcBang]
    stricts)
                     }

           ; let tc_tvs :: [TyVar]
    tc_tvs   = [TyConBinder] -> [TyVar]
    forall tv argf. [VarBndr tv argf] -> [tv]
    binderVars [TyConBinder]
    tc_bndrs
                 fake_ty :: Type
    fake_ty  = [TyVar] -> Type -> Type
    mkSpecForAllTys  [TyVar]
    tc_tvs      (Type -> Type) -> Type -> Type
    forall a b. (a -> b) -> a -> b
    $
                            [VarBndr TyVar Specificity] -> Type -> Type
    mkInvisForAllTys [VarBndr TyVar Specificity]
    exp_tvbndrs (Type -> Type) -> Type -> Type
    forall a b. (a -> b) -> a -> b
    $
                            [Type] -> Type -> Type
    mkPhiTy [Type]
    ctxt (Type -> Type) -> Type -> Type
    forall a b. (a -> b) -> a -> b
    $
                            [Scaled Type] -> Type -> Type
    mkVisFunTys [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

           ; [TyVar]
    kvs <- Type -> TcM [TyVar]
    kindGeneralizeAll Type
    fake_ty

           ; let skol_tvs :: [TyVar]
    skol_tvs = [TyVar]
    tc_tvs [TyVar] -> [TyVar] -> [TyVar]
    forall a. [a] -> [a] -> [a]
    ++ [TyVar]
    kvs [TyVar] -> [TyVar] -> [TyVar]
    forall a. [a] -> [a] -> [a]
    ++ [VarBndr TyVar Specificity] -> [TyVar]
    forall tv argf. [VarBndr tv argf] -> [tv]
    binderVars [VarBndr TyVar Specificity]
    exp_tvbndrs
           ; SkolemInfo -> [TyVar] -> TcLevel -> WantedConstraints -> TcRn ()
    reportUnsolvedEqualities SkolemInfo
    skol_info [TyVar]
    skol_tvs TcLevel
    tclvl WantedConstraints
    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
           ; ZonkEnv
    ze                  <- ZonkFlexi -> TcM ZonkEnv
    mkEmptyZonkEnv ZonkFlexi
    NoFlexi
           ; (ZonkEnv
    ze, [TyVar]
    qkvs)          <- ZonkEnv -> [TyVar] -> TcM (ZonkEnv, [TyVar])
    zonkTyBndrsX              ZonkEnv
    ze [TyVar]
    kvs
           ; (ZonkEnv
    ze, [VarBndr TyVar Specificity]
    user_qtvbndrs) <- ZonkEnv
    -> [VarBndr TyVar Specificity]
    -> TcM (ZonkEnv, [VarBndr TyVar Specificity])
    forall vis.
    ZonkEnv
    -> [VarBndr TyVar vis] -> TcM (ZonkEnv, [VarBndr TyVar vis])
    zonkTyVarBindersX         ZonkEnv
    ze [VarBndr TyVar Specificity]
    exp_tvbndrs
           ; [Scaled Type]
    arg_tys             <- ZonkEnv -> [Scaled Type] -> TcM [Scaled Type]
    zonkScaledTcTypesToTypesX ZonkEnv
    ze [Scaled Type]
    arg_tys
           ; [Type]
    ctxt                <- ZonkEnv -> [Type] -> TcM [Type]
    zonkTcTypesToTypesX       ZonkEnv
    ze [Type]
    ctxt

           -- Can't print univ_tvs, arg_tys etc, because we are inside the knot here
           ; String -> SDoc -> TcRn ()
    traceTc String
    "tcConDecl 2" (Name -> SDoc
    forall a. Outputable a => a -> SDoc
    ppr Name
    name SDoc -> SDoc -> SDoc
    $$ [FieldLabel] -> SDoc
    forall a. Outputable a => a -> SDoc
    ppr [FieldLabel]
    field_lbls)
           ; let univ_tvbs :: [VarBndr TyVar Specificity]
    univ_tvbs = [TyConBinder] -> [VarBndr TyVar Specificity]
    tyConInvisTVBinders [TyConBinder]
    tc_bndrs
                 ex_tvbs :: [VarBndr TyVar Specificity]
    ex_tvbs   = Specificity -> [TyVar] -> [VarBndr TyVar Specificity]
    forall vis. vis -> [TyVar] -> [VarBndr TyVar vis]
    mkTyVarBinders Specificity
    InferredSpec [TyVar]
    qkvs [VarBndr TyVar Specificity]
    -> [VarBndr TyVar Specificity] -> [VarBndr TyVar Specificity]
    forall a. [a] -> [a] -> [a]
    ++ [VarBndr TyVar Specificity]
    user_qtvbndrs
                 ex_tvs :: [TyVar]
    ex_tvs    = [VarBndr TyVar Specificity] -> [TyVar]
    forall tv argf. [VarBndr tv argf] -> [tv]
    binderVars [VarBndr TyVar 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 TyVar Specificity]
    user_tvbs = [VarBndr TyVar Specificity]
    univ_tvbs [VarBndr TyVar Specificity]
    -> [VarBndr TyVar Specificity] -> [VarBndr TyVar Specificity]
    forall a. [a] -> [a] -> [a]
    ++ [VarBndr TyVar Specificity]
    ex_tvbs
                 user_res_ty :: Type
    user_res_ty = DataDeclInfo -> TyCon -> [TyConBinder] -> Type
    mkDDHeaderTy DataDeclInfo
    dd_info TyCon
    rep_tycon [TyConBinder]
    tc_bndrs

           ; String -> SDoc -> TcRn ()
    traceTc String
    "tcConDecl 2" (Name -> SDoc
    forall a. Outputable a => a -> SDoc
    ppr Name
    name)
           ; Bool
    is_infix <- Name -> HsConDeclH98Details GhcRn -> TcRnIf TcGblEnv TcLclEnv Bool
    tcConIsInfixH98 Name
    name HsConDeclH98Details GhcRn
    hs_args
           ; Name
    rep_nm   <- Name -> TcRnIf TcGblEnv TcLclEnv Name
    forall gbl lcl. Name -> TcRnIf gbl lcl Name
    newTyConRepName Name
    name
           ; FamInstEnvs
    fam_envs <- TcM FamInstEnvs
    tcGetFamInstEnvs
           ; DataCon
    dc <- FamInstEnvs
    -> Name
    -> Bool
    -> Name
    -> [HsSrcBang]
    -> Maybe [HsImplBang]
    -> [FieldLabel]
    -> [TyVar]
    -> [TyVar]
    -> [VarBndr TyVar Specificity]
    -> [EqSpec]
    -> [Type]
    -> [Scaled Type]
    -> Type
    -> TyCon
    -> NameEnv Arity
    -> TcRnIf TcGblEnv TcLclEnv DataCon
    forall m n.
    FamInstEnvs
    -> Name
    -> Bool
    -> Name
    -> [HsSrcBang]
    -> Maybe [HsImplBang]
    -> [FieldLabel]
    -> [TyVar]
    -> [TyVar]
    -> [VarBndr TyVar Specificity]
    -> [EqSpec]
    -> [Type]
    -> [Scaled Type]
    -> Type
    -> TyCon
    -> NameEnv Arity
    -> TcRnIf m n DataCon
    buildDataCon FamInstEnvs
    fam_envs Name
    name Bool
    is_infix Name
    rep_nm
                                [HsSrcBang]
    stricts Maybe [HsImplBang]
    forall a. Maybe a
    Nothing [FieldLabel]
    field_lbls
                                [TyVar]
    tc_tvs [TyVar]
    ex_tvs [VarBndr TyVar Specificity]
    user_tvbs
                                [{- no eq_preds -}] [Type]
    ctxt [Scaled Type]
    arg_tys
                                Type
    user_res_ty TyCon
    rep_tycon NameEnv Arity
    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.

           ; [DataCon] -> TcM [DataCon]
    forall (m :: * -> *) a. Monad m => a -> m a
    return [DataCon
    dc] }
      where
        skol_info :: SkolemInfo
    skol_info = Name -> SkolemInfo
    DataConSkol Name
    name

    tcConDecl NewOrData
    new_or_data DataDeclInfo
    dd_info TyCon
    rep_tycon [TyConBinder]
    tc_bndrs Type
    _res_kind NameEnv Arity
    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 -> [LIdP pass]
    con_names = [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 [DataCon] -> TcM [DataCon]
    forall a. SDoc -> TcM a -> TcM a
    addErrCtxt ([GenLocated SrcSpanAnnN Name] -> SDoc
    dataConCtxt [GenLocated SrcSpanAnnN Name]
    [LIdP GhcRn]
    names) (TcM [DataCon] -> TcM [DataCon]) -> TcM [DataCon] -> TcM [DataCon]
    forall a b. (a -> b) -> a -> b
    $
        do { String -> SDoc -> TcRn ()
    traceTc String
    "tcConDecl 1 gadt" ([GenLocated SrcSpanAnnN Name] -> SDoc
    forall a. Outputable a => a -> SDoc
    ppr [GenLocated SrcSpanAnnN Name]
    [LIdP GhcRn]
    names)
           ; let (L SrcSpanAnnN
    _ Name
    name : [LIdP GhcRn]
    _) = [LIdP GhcRn]
    names

           ; (TcLevel
    tclvl, WantedConstraints
    wanted, (HsOuterSigTyVarBndrs GhcTc
    outer_bndrs, ([Type]
    ctxt, [Scaled Type]
    arg_tys, Type
    res_ty, [FieldLabel]
    field_lbls, [HsSrcBang]
    stricts)))
               <- String
    -> TcM
         (HsOuterSigTyVarBndrs GhcTc,
          ([Type], [Scaled Type], Type, [FieldLabel], [HsSrcBang]))
    -> TcM
         (TcLevel, WantedConstraints,
          (HsOuterSigTyVarBndrs GhcTc,
           ([Type], [Scaled Type], Type, [FieldLabel], [HsSrcBang])))
    forall a. String -> TcM a -> TcM (TcLevel, WantedConstraints, a)
    pushLevelAndSolveEqualitiesX String
    "tcConDecl:GADT" (TcM
       (HsOuterSigTyVarBndrs GhcTc,
        ([Type], [Scaled Type], Type, [FieldLabel], [HsSrcBang]))
     -> TcM
          (TcLevel, WantedConstraints,
           (HsOuterSigTyVarBndrs GhcTc,
            ([Type], [Scaled Type], Type, [FieldLabel], [HsSrcBang]))))
    -> TcM
         (HsOuterSigTyVarBndrs GhcTc,
          ([Type], [Scaled Type], Type, [FieldLabel], [HsSrcBang]))
    -> TcM
         (TcLevel, WantedConstraints,
          (HsOuterSigTyVarBndrs GhcTc,
           ([Type], [Scaled Type], Type, [FieldLabel], [HsSrcBang])))
    forall a b. (a -> b) -> a -> b
    $
                  SkolemInfo
    -> HsOuterSigTyVarBndrs GhcRn
    -> TcM ([Type], [Scaled Type], Type, [FieldLabel], [HsSrcBang])
    -> TcM
         (HsOuterSigTyVarBndrs GhcTc,
          ([Type], [Scaled Type], Type, [FieldLabel], [HsSrcBang]))
    forall flag a.
    OutputableBndrFlag flag 'Renamed =>
    SkolemInfo
    -> HsOuterTyVarBndrs flag GhcRn
    -> TcM a
    -> TcM (HsOuterTyVarBndrs flag GhcTc, a)
    tcOuterTKBndrs SkolemInfo
    skol_info HsOuterSigTyVarBndrs GhcRn
    outer_hs_bndrs       (TcM ([Type], [Scaled Type], Type, [FieldLabel], [HsSrcBang])
     -> TcM
          (HsOuterSigTyVarBndrs GhcTc,
           ([Type], [Scaled Type], Type, [FieldLabel], [HsSrcBang])))
    -> TcM ([Type], [Scaled Type], Type, [FieldLabel], [HsSrcBang])
    -> TcM
         (HsOuterSigTyVarBndrs GhcTc,
          ([Type], [Scaled Type], Type, [FieldLabel], [HsSrcBang]))
    forall a b. (a -> b) -> a -> b
    $
                  do { [Type]
    ctxt <- Maybe (LHsContext GhcRn) -> TcM [Type]
    tcHsContext Maybe (LHsContext GhcRn)
    cxt
                     ; (Type
    res_ty, Type
    res_kind) <- LHsKind GhcRn -> TcM (Type, Type)
    tcInferLHsTypeKind LHsKind GhcRn
    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 DataDeclInfo
    dd_info of
                          DataDeclInfo
    DDataType -> () -> TcRn ()
    forall (m :: * -> *) a. Monad m => a -> m a
    return ()
                          DDataInstance Type
    hdr_ty ->
                            do { (TCvSubst
    subst, [TyVar]
    _meta_tvs) <- [TyVar] -> TcM (TCvSubst, [TyVar])
    newMetaTyVars ([TyConBinder] -> [TyVar]
    forall tv argf. [VarBndr tv argf] -> [tv]
    binderVars [TyConBinder]
    tc_bndrs)
                               ; let head_shape :: Type
    head_shape = HasCallStack => TCvSubst -> Type -> Type
    TCvSubst -> Type -> Type
    substTy TCvSubst
    subst Type
    hdr_ty
                               ; TcM Coercion -> TcRn ()
    forall a. TcM a -> TcRn ()
    discardResult (TcM Coercion -> TcRn ()) -> TcM Coercion -> TcRn ()
    forall a b. (a -> b) -> a -> b
    $
                                 TcM Coercion -> TcM Coercion
    forall r. TcM r -> TcM r
    popErrCtxt (TcM Coercion -> TcM Coercion) -> TcM Coercion -> TcM Coercion
    forall a b. (a -> b) -> a -> b
    $  -- Drop dataConCtxt
                                 SDoc -> TcM Coercion -> TcM Coercion
    forall a. SDoc -> TcM a -> TcM a
    addErrCtxt ([GenLocated SrcSpanAnnN Name] -> SDoc
    dataConResCtxt [GenLocated SrcSpanAnnN Name]
    [LIdP GhcRn]
    names) (TcM Coercion -> TcM Coercion) -> TcM Coercion -> TcM Coercion
    forall a b. (a -> b) -> a -> b
    $
                                 Maybe SDoc -> Type -> Type -> TcM Coercion
    unifyType Maybe SDoc
    forall a. Maybe a
    Nothing Type
    res_ty Type
    head_shape }

                       -- See Note [Datatype return kinds]
                     ; let exp_kind :: ContextKind
    exp_kind = NewOrData -> Type -> ContextKind
    getArgExpKind NewOrData
    new_or_data Type
    res_kind
                     ; [(Scaled Type, HsSrcBang)]
    btys <- ContextKind
    -> HsConDeclGADTDetails GhcRn -> TcM [(Scaled Type, HsSrcBang)]
    tcConGADTArgs ContextKind
    exp_kind HsConDeclGADTDetails GhcRn
    hs_args

                     ; let ([Scaled Type]
    arg_tys, [HsSrcBang]
    stricts) = [(Scaled Type, HsSrcBang)] -> ([Scaled Type], [HsSrcBang])
    forall a b. [(a, b)] -> ([a], [b])
    unzip [(Scaled Type, HsSrcBang)]
    btys
                     ; [FieldLabel]
    field_lbls <- Name -> RnM [FieldLabel]
    lookupConstructorFields Name
    name
                     ; ([Type], [Scaled Type], Type, [FieldLabel], [HsSrcBang])
    -> TcM ([Type], [Scaled Type], Type, [FieldLabel], [HsSrcBang])
    forall (m :: * -> *) a. Monad m => a -> m a
    return ([Type]
    ctxt, [Scaled Type]
    arg_tys, Type
    res_ty, [FieldLabel]
    field_lbls, [HsSrcBang]
    stricts)
                     }

           ; [VarBndr TyVar Specificity]
    outer_tv_bndrs <- HsOuterSigTyVarBndrs GhcTc -> TcM [VarBndr TyVar Specificity]
    scopedSortOuter HsOuterSigTyVarBndrs GhcTc
    outer_bndrs

           ; [TyVar]
    tkvs <- Type -> TcM [TyVar]
    kindGeneralizeAll ([VarBndr TyVar Specificity] -> Type -> Type
    mkInvisForAllTys [VarBndr TyVar Specificity]
    outer_tv_bndrs (Type -> Type) -> Type -> Type
    forall a b. (a -> b) -> a -> b
    $
                                        [Type] -> Type -> Type
    mkPhiTy [Type]
    ctxt (Type -> Type) -> Type -> Type
    forall a b. (a -> b) -> a -> b
    $
                                        [Scaled Type] -> Type -> Type
    mkVisFunTys [Scaled Type]
    arg_tys (Type -> Type) -> Type -> Type
    forall a b. (a -> b) -> a -> b
    $
                                        Type
    res_ty)
           ; String -> SDoc -> TcRn ()
    traceTc String
    "tcConDecl:GADT" ([GenLocated SrcSpanAnnN Name] -> SDoc
    forall a. Outputable a => a -> SDoc
    ppr [GenLocated SrcSpanAnnN Name]
    [LIdP GhcRn]
    names SDoc -> SDoc -> SDoc
    $$ Type -> SDoc
    forall a. Outputable a => a -> SDoc
    ppr Type
    res_ty SDoc -> SDoc -> SDoc
    $$ [TyVar] -> SDoc
    forall a. Outputable a => a -> SDoc
    ppr [TyVar]
    tkvs)
           ; SkolemInfo -> [TyVar] -> TcLevel -> WantedConstraints -> TcRn ()
    reportUnsolvedEqualities SkolemInfo
    skol_info [TyVar]
    tkvs TcLevel
    tclvl WantedConstraints
    wanted

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

                 -- Zonk to Types
           ; ZonkEnv
    ze            <- ZonkFlexi -> TcM ZonkEnv
    mkEmptyZonkEnv ZonkFlexi
    NoFlexi
           ; (ZonkEnv
    ze, [VarBndr TyVar Specificity]
    tvbndrs) <- ZonkEnv
    -> [VarBndr TyVar Specificity]
    -> TcM (ZonkEnv, [VarBndr TyVar Specificity])
    forall vis.
    ZonkEnv
    -> [VarBndr TyVar vis] -> TcM (ZonkEnv, [VarBndr TyVar vis])
    zonkTyVarBindersX         ZonkEnv
    ze [VarBndr TyVar Specificity]
    tvbndrs
           ; [Scaled Type]
    arg_tys       <- ZonkEnv -> [Scaled Type] -> TcM [Scaled Type]
    zonkScaledTcTypesToTypesX ZonkEnv
    ze [Scaled Type]
    arg_tys
           ; [Type]
    ctxt          <- ZonkEnv -> [Type] -> TcM [Type]
    zonkTcTypesToTypesX       ZonkEnv
    ze [Type]
    ctxt
           ; Type
    res_ty        <- ZonkEnv -> Type -> TcM Type
    zonkTcTypeToTypeX         ZonkEnv
    ze Type
    res_ty

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

                 ctxt' :: [Type]
    ctxt'      = HasCallStack => TCvSubst -> [Type] -> [Type]
    TCvSubst -> [Type] -> [Type]
    substTys TCvSubst
    arg_subst [Type]
    ctxt
                 arg_tys' :: [Scaled Type]
    arg_tys'   = HasCallStack => TCvSubst -> [Scaled Type] -> [Scaled Type]
    TCvSubst -> [Scaled Type] -> [Scaled Type]
    substScaledTys TCvSubst
    arg_subst [Scaled Type]
    arg_tys
                 res_ty' :: Type
    res_ty'    = HasCallStack => TCvSubst -> Type -> Type
    TCvSubst -> Type -> Type
    substTy  TCvSubst
    arg_subst Type
    res_ty

           -- Can't print univ_tvs, arg_tys etc, because we are inside the knot here
           ; String -> SDoc -> TcRn ()
    traceTc String
    "tcConDecl 2" ([GenLocated SrcSpanAnnN Name] -> SDoc
    forall a. Outputable a => a -> SDoc
    ppr [GenLocated SrcSpanAnnN Name]
    [LIdP GhcRn]
    names SDoc -> SDoc -> SDoc
    $$ [FieldLabel] -> SDoc
    forall a. Outputable a => a -> SDoc
    ppr [FieldLabel]
    field_lbls)
           ; FamInstEnvs
    fam_envs <- TcM FamInstEnvs
    tcGetFamInstEnvs
           ; let
               buildOneDataCon :: GenLocated SrcSpanAnnN Name -> TcRnIf TcGblEnv TcLclEnv DataCon
    buildOneDataCon (L SrcSpanAnnN
    _ Name
    name) = do
                 { Bool
    is_infix <- Name -> HsConDeclGADTDetails GhcRn -> TcRnIf TcGblEnv TcLclEnv Bool
    tcConIsInfixGADT Name
    name HsConDeclGADTDetails GhcRn
    hs_args
                 ; Name
    rep_nm   <- Name -> TcRnIf TcGblEnv TcLclEnv Name
    forall gbl lcl. Name -> TcRnIf gbl lcl Name
    newTyConRepName Name
    name

                 ; FamInstEnvs
    -> Name
    -> Bool
    -> Name
    -> [HsSrcBang]
    -> Maybe [HsImplBang]
    -> [FieldLabel]
    -> [TyVar]
    -> [TyVar]
    -> [VarBndr TyVar Specificity]
    -> [EqSpec]
    -> [Type]
    -> [Scaled Type]
    -> Type
    -> TyCon
    -> NameEnv Arity
    -> TcRnIf TcGblEnv TcLclEnv DataCon
    forall m n.
    FamInstEnvs
    -> Name
    -> Bool
    -> Name
    -> [HsSrcBang]
    -> Maybe [HsImplBang]
    -> [FieldLabel]
    -> [TyVar]
    -> [TyVar]
    -> [VarBndr TyVar Specificity]
    -> [EqSpec]
    -> [Type]
    -> [Scaled Type]
    -> Type
    -> TyCon
    -> NameEnv Arity
    -> TcRnIf m n DataCon
    buildDataCon FamInstEnvs
    fam_envs Name
    name Bool
    is_infix
                                Name
    rep_nm
                                [HsSrcBang]
    stricts Maybe [HsImplBang]
    forall a. Maybe a
    Nothing [FieldLabel]
    field_lbls
                                [TyVar]
    univ_tvs [TyVar]
    ex_tvs [VarBndr TyVar Specificity]
    tvbndrs' [EqSpec]
    eq_preds
                                [Type]
    ctxt' [Scaled Type]
    arg_tys' Type
    res_ty' TyCon
    rep_tycon NameEnv Arity
    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.
                 }
           ; (GenLocated SrcSpanAnnN Name -> TcRnIf TcGblEnv TcLclEnv DataCon)
    -> [GenLocated SrcSpanAnnN Name] -> TcM [DataCon]
    forall (t :: * -> *) (m :: * -> *) a b.
    (Traversable t, Monad m) =>
    (a -> m b) -> t a -> m (t b)
    mapM GenLocated SrcSpanAnnN Name -> TcRnIf TcGblEnv TcLclEnv DataCon
    buildOneDataCon [GenLocated SrcSpanAnnN Name]
    [LIdP GhcRn]
    names }
      where
        skol_info :: SkolemInfo
    skol_info = Name -> SkolemInfo
    DataConSkol (GenLocated SrcSpanAnnN Name -> Name
    forall l e. GenLocated l e -> e
    unLoc ([GenLocated SrcSpanAnnN Name] -> GenLocated SrcSpanAnnN Name
    forall a. [a] -> a
    head [GenLocated SrcSpanAnnN Name]
    [LIdP GhcRn]
    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 -> Kind -> 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 (m :: * -> *) a. Monad m => a -> m a
    return Bool
    True
               RecCon{}    -> Bool -> TcRnIf TcGblEnv TcLclEnv Bool
    forall (m :: * -> *) a. Monad m => a -> m a
    return Bool
    False
               PrefixCon{} -> Bool -> TcRnIf TcGblEnv TcLclEnv Bool
    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 (m :: * -> *) a. Monad m => a -> m a
    return Bool
    False
               PrefixConGADT [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 (GenLocated SrcSpanAnnA (HsType GhcRn))]
    [HsScaled GhcRn (LHsKind GhcRn)]
    arg_tys
                      -> do { FixityEnv
    fix_env <- TcRn FixityEnv
    getFixityEnv
                            ; Bool -> TcRnIf TcGblEnv TcLclEnv Bool
    forall (m :: * -> *) a. Monad m => a -> m a
    return (Name
    con Name -> FixityEnv -> Bool
    forall a. Name -> NameEnv a -> Bool
    `elemNameEnv` FixityEnv
    fix_env) }
                   | Bool
    otherwise -> Bool -> TcRnIf TcGblEnv TcLclEnv Bool
    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)
    mapM (ContextKind
    -> HsScaled GhcRn (LHsKind GhcRn)
    -> IOEnv (Env TcGblEnv TcLclEnv) (Scaled Type, HsSrcBang)
    tcConArg ContextKind
    exp_kind) [HsScaled GhcRn (GenLocated SrcSpanAnnA (HsType GhcRn))]
    [HsScaled GhcRn (LHsKind GhcRn)]
    btys
    tcConH98Args ContextKind
    exp_kind (InfixCon HsScaled GhcRn (LHsKind GhcRn)
    bty1 HsScaled GhcRn (LHsKind GhcRn)
    bty2)
      = do { (Scaled Type, HsSrcBang)
    bty1' <- ContextKind
    -> HsScaled GhcRn (LHsKind GhcRn)
    -> IOEnv (Env TcGblEnv TcLclEnv) (Scaled Type, HsSrcBang)
    tcConArg ContextKind
    exp_kind HsScaled GhcRn (LHsKind GhcRn)
    bty1
           ; (Scaled Type, HsSrcBang)
    bty2' <- ContextKind
    -> HsScaled GhcRn (LHsKind GhcRn)
    -> IOEnv (Env TcGblEnv TcLclEnv) (Scaled Type, HsSrcBang)
    tcConArg ContextKind
    exp_kind HsScaled GhcRn (LHsKind GhcRn)
    bty2
           ; [(Scaled Type, HsSrcBang)] -> TcM [(Scaled Type, HsSrcBang)]
    forall (m :: * -> *) a. Monad m => a -> m a
    return [(Scaled Type, HsSrcBang)
    bty1', (Scaled Type, HsSrcBang)
    bty2'] }
    tcConH98Args ContextKind
    exp_kind (RecCon XRec GhcRn [LConDeclField GhcRn]
    fields)
      = ContextKind
    -> LocatedL [LConDeclField GhcRn] -> TcM [(Scaled Type, HsSrcBang)]
    tcRecConDeclFields ContextKind
    exp_kind LocatedL [LConDeclField GhcRn]
    XRec GhcRn [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 [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)
    mapM (ContextKind
    -> HsScaled GhcRn (LHsKind GhcRn)
    -> IOEnv (Env TcGblEnv TcLclEnv) (Scaled Type, HsSrcBang)
    tcConArg ContextKind
    exp_kind) [HsScaled GhcRn (GenLocated SrcSpanAnnA (HsType GhcRn))]
    [HsScaled GhcRn (LHsKind GhcRn)]
    btys
    tcConGADTArgs ContextKind
    exp_kind (RecConGADT XRec GhcRn [LConDeclField GhcRn]
    fields)
      = ContextKind
    -> LocatedL [LConDeclField GhcRn] -> TcM [(Scaled Type, HsSrcBang)]
    tcRecConDeclFields ContextKind
    exp_kind LocatedL [LConDeclField GhcRn]
    XRec GhcRn [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 GenLocated SrcSpanAnnA (HsType GhcRn)
    LHsKind GhcRn
    bty)
            ; Type
    arg_ty <- LHsKind GhcRn -> ContextKind -> TcM Type
    tcCheckLHsType (LHsKind GhcRn -> LHsKind GhcRn
    forall (p :: Pass). LHsType (GhcPass p) -> LHsType (GhcPass p)
    getBangType LHsKind GhcRn
    bty) ContextKind
    exp_kind
            ; Type
    w' <- HsArrow GhcRn -> TcM Type
    tcDataConMult HsArrow GhcRn
    w
            ; String -> SDoc -> TcRn ()
    traceTc String
    "tcConArg 2" (GenLocated SrcSpanAnnA (HsType GhcRn) -> SDoc
    forall a. Outputable a => a -> SDoc
    ppr GenLocated SrcSpanAnnA (HsType GhcRn)
    LHsKind GhcRn
    bty)
            ; (Scaled Type, HsSrcBang)
    -> IOEnv (Env TcGblEnv TcLclEnv) (Scaled Type, HsSrcBang)
    forall (m :: * -> *) a. Monad m => a -> m a
    return (Type -> Type -> Scaled Type
    forall a. Type -> a -> Scaled a
    Scaled Type
    w' Type
    arg_ty, LHsKind GhcRn -> HsSrcBang
    forall (p :: Pass). LHsType (GhcPass p) -> HsSrcBang
    getBangStrictness LHsKind GhcRn
    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)
    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 a pass. a -> HsScaled pass 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 GenLocated
      SrcSpanAnnL [GenLocated SrcSpanAnnA (ConDeclField GhcRn)]
    LocatedL [LConDeclField 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 -> TcM Type
    tcDataConMult arr :: HsArrow GhcRn
    arr@(HsUnrestrictedArrow IsUnicodeSyntax
    _) = do
      -- See Note [Function arrows in GADT constructors]
      Bool
    linearEnabled <- Extension -> TcRnIf TcGblEnv TcLclEnv Bool
    forall gbl lcl. Extension -> TcRnIf gbl lcl Bool
    xoptM Extension
    LangExt.LinearTypes
      if Bool
    linearEnabled then HsArrow GhcRn -> TcM Type
    tcMult HsArrow GhcRn
    arr else Type -> TcM Type
    forall (m :: * -> *) a. Monad m => a -> m a
    return Type
    oneDataConTy
    tcDataConMult HsArrow GhcRn
    arr = HsArrow GhcRn -> TcM 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
                    TCvSubst)         -- 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 TyVar Specificity]
    -> Type
    -> ([TyVar], [TyVar], [VarBndr TyVar Specificity], [EqSpec],
        TCvSubst)
    rejigConRes [TyConBinder]
    tc_tvbndrs Type
    res_tmpl [VarBndr TyVar 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 TCvSubst
    subst <- Type -> Type -> Maybe TCvSubst
    tcMatchTy Type
    res_tmpl Type
    res_ty
      = let ([TyVar]
    univ_tvs, [EqSpec]
    raw_eqs, TCvSubst
    kind_subst) = [TyVar] -> [TyVar] -> TCvSubst -> ([TyVar], [EqSpec], TCvSubst)
    mkGADTVars [TyVar]
    tc_tvs [TyVar]
    dc_tvs TCvSubst
    subst
            raw_ex_tvs :: [TyVar]
    raw_ex_tvs = [TyVar]
    dc_tvs [TyVar] -> [TyVar] -> [TyVar]
    forall a. Ord a => [a] -> [a] -> [a]
    `minusList` [TyVar]
    univ_tvs
            (TCvSubst
    arg_subst, [TyVar]
    substed_ex_tvs) = HasCallStack => TCvSubst -> [TyVar] -> (TCvSubst, [TyVar])
    TCvSubst -> [TyVar] -> (TCvSubst, [TyVar])
    substTyVarBndrs TCvSubst
    kind_subst [TyVar]
    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 TyVar Specificity] -> [VarBndr TyVar Specificity]
    subst_user_tvs  = (TyVar -> TyVar)
    -> [VarBndr TyVar Specificity] -> [VarBndr TyVar Specificity]
    forall var var' flag.
    (var -> var') -> [VarBndr var flag] -> [VarBndr var' flag]
    mapVarBndrs (String -> Type -> TyVar
    getTyVar String
    "rejigConRes" (Type -> TyVar) -> (TyVar -> Type) -> TyVar -> TyVar
    forall b c a. (b -> c) -> (a -> b) -> a -> c
    . TCvSubst -> TyVar -> Type
    substTyVar TCvSubst
    arg_subst)
            substed_tvbndrs :: [VarBndr TyVar Specificity]
    substed_tvbndrs = [VarBndr TyVar Specificity] -> [VarBndr TyVar Specificity]
    subst_user_tvs [VarBndr TyVar Specificity]
    dc_tvbndrs

            substed_eqs :: [EqSpec]
    substed_eqs = (EqSpec -> EqSpec) -> [EqSpec] -> [EqSpec]
    forall a b. (a -> b) -> [a] -> [b]
    map (TCvSubst -> EqSpec -> EqSpec
    substEqSpec TCvSubst
    arg_subst) [EqSpec]
    raw_eqs
        in
        ([TyVar]
    univ_tvs, [TyVar]
    substed_ex_tvs, [VarBndr TyVar Specificity]
    substed_tvbndrs, [EqSpec]
    substed_eqs, TCvSubst
    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]
      = ([TyVar]
    tc_tvs, [TyVar]
    dc_tvs [TyVar] -> [TyVar] -> [TyVar]
    forall a. Ord a => [a] -> [a] -> [a]
    `minusList` [TyVar]
    tc_tvs, [VarBndr TyVar Specificity]
    dc_tvbndrs, [], TCvSubst
    emptyTCvSubst)
      where
        dc_tvs :: [TyVar]
    dc_tvs = [VarBndr TyVar Specificity] -> [TyVar]
    forall tv argf. [VarBndr tv argf] -> [tv]
    binderVars [VarBndr TyVar Specificity]
    dc_tvbndrs
        tc_tvs :: [TyVar]
    tc_tvs = [TyConBinder] -> [TyVar]
    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
               -> TCvSubst   -- ^ The matching between the template result type
                             -- and the actual result type
               -> ( [TyVar]
                  , [EqSpec]
                  , TCvSubst ) -- ^ The univ. variables, the GADT equalities,
                               -- and a subst to apply to the GADT equalities
                               -- and existentials.
    mkGADTVars :: [TyVar] -> [TyVar] -> TCvSubst -> ([TyVar], [EqSpec], TCvSubst)
    mkGADTVars [TyVar]
    tmpl_tvs [TyVar]
    dc_tvs TCvSubst
    subst
      = [TyVar]
    -> [EqSpec]
    -> TCvSubst
    -> TCvSubst
    -> [TyVar]
    -> ([TyVar], [EqSpec], TCvSubst)
    choose [] [] TCvSubst
    empty_subst TCvSubst
    empty_subst [TyVar]
    tmpl_tvs
      where
        in_scope :: InScopeSet
    in_scope = VarSet -> InScopeSet
    mkInScopeSet ([TyVar] -> VarSet
    mkVarSet [TyVar]
    tmpl_tvs VarSet -> VarSet -> VarSet
    `unionVarSet` [TyVar] -> VarSet
    mkVarSet [TyVar]
    dc_tvs)
                   InScopeSet -> InScopeSet -> InScopeSet
    `unionInScope` TCvSubst -> InScopeSet
    getTCvInScope TCvSubst
    subst
        empty_subst :: TCvSubst
    empty_subst = InScopeSet -> TCvSubst
    mkEmptyTCvSubst InScopeSet
    in_scope

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

        choose :: [TyVar]
    -> [EqSpec]
    -> TCvSubst
    -> TCvSubst
    -> [TyVar]
    -> ([TyVar], [EqSpec], TCvSubst)
    choose [TyVar]
    univs [EqSpec]
    eqs TCvSubst
    _t_sub TCvSubst
    r_sub []
          = ([TyVar] -> [TyVar]
    forall a. [a] -> [a]
    reverse [TyVar]
    univs, [EqSpec] -> [EqSpec]
    forall a. [a] -> [a]
    reverse [EqSpec]
    eqs, TCvSubst
    r_sub)
        choose [TyVar]
    univs [EqSpec]
    eqs TCvSubst
    t_sub TCvSubst
    r_sub (TyVar
    t_tv:[TyVar]
    t_tvs)
          | Just Type
    r_ty <- TCvSubst -> TyVar -> Maybe Type
    lookupTyVar TCvSubst
    subst TyVar
    t_tv
          = case Type -> Maybe TyVar
    getTyVar_maybe Type
    r_ty of
              Just TyVar
    r_tv
                |  Bool -> Bool
    not (TyVar
    r_tv TyVar -> [TyVar] -> Bool
    forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
    `elem` [TyVar]
    univs)
                ,  TyVar -> Type
    tyVarKind TyVar
    r_tv Type -> Type -> Bool
    `eqType` (HasCallStack => TCvSubst -> Type -> Type
    TCvSubst -> Type -> Type
    substTy TCvSubst
    t_sub (TyVar -> Type
    tyVarKind TyVar
    t_tv))
                -> -- simple, well-kinded variable substitution.
                   [TyVar]
    -> [EqSpec]
    -> TCvSubst
    -> TCvSubst
    -> [TyVar]
    -> ([TyVar], [EqSpec], TCvSubst)
    choose (TyVar
    r_tvTyVar -> [TyVar] -> [TyVar]
    forall a. a -> [a] -> [a]
    :[TyVar]
    univs) [EqSpec]
    eqs
                          (TCvSubst -> TyVar -> Type -> TCvSubst
    extendTvSubst TCvSubst
    t_sub TyVar
    t_tv Type
    r_ty')
                          (TCvSubst -> TyVar -> Type -> TCvSubst
    extendTvSubst TCvSubst
    r_sub TyVar
    r_tv Type
    r_ty')
                          [TyVar]
    t_tvs
                where
                  r_tv1 :: TyVar
    r_tv1  = TyVar -> Name -> TyVar
    setTyVarName TyVar
    r_tv (TyVar -> TyVar -> Name
    choose_tv_name TyVar
    r_tv TyVar
    t_tv)
                  r_ty' :: Type
    r_ty'  = TyVar -> Type
    mkTyVarTy TyVar
    r_tv1

                   -- Not a simple substitution: make an equality predicate
              Maybe TyVar
    _ -> [TyVar]
    -> [EqSpec]
    -> TCvSubst
    -> TCvSubst
    -> [TyVar]
    -> ([TyVar], [EqSpec], TCvSubst)
    choose (TyVar
    t_tv'TyVar -> [TyVar] -> [TyVar]
    forall a. a -> [a] -> [a]
    :[TyVar]
    univs) (TyVar -> Type -> EqSpec
    mkEqSpec TyVar
    t_tv' Type
    r_ty EqSpec -> [EqSpec] -> [EqSpec]
    forall a. a -> [a] -> [a]
    : [EqSpec]
    eqs)
                          (TCvSubst -> TyVar -> Type -> TCvSubst
    extendTvSubst TCvSubst
    t_sub TyVar
    t_tv (TyVar -> Type
    mkTyVarTy TyVar
    t_tv'))
                             -- We've updated the kind of t_tv,
                             -- so add it to t_sub (#14162)
                          TCvSubst
    r_sub [TyVar]
    t_tvs
                where
                  t_tv' :: TyVar
    t_tv' = (Type -> Type) -> TyVar -> TyVar
    updateTyVarKind (HasCallStack => TCvSubst -> Type -> Type
    TCvSubst -> Type -> Type
    substTy TCvSubst
    t_sub) TyVar
    t_tv

          | Bool
    otherwise
          = String -> SDoc -> ([TyVar], [EqSpec], TCvSubst)
    forall a. HasCallStack => String -> SDoc -> a
    pprPanic String
    "mkGADTVars" ([TyVar] -> SDoc
    forall a. Outputable a => a -> SDoc
    ppr [TyVar]
    tmpl_tvs SDoc -> SDoc -> SDoc
    $$ TCvSubst -> SDoc
    forall a. Outputable a => a -> SDoc
    ppr TCvSubst
    subst)

          -- 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 :: TyVar -> TyVar -> Name
    choose_tv_name TyVar
    r_tv TyVar
    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 = TyVar -> Name
    forall a. NamedThing a => a -> Name
    getName TyVar
    r_tv
            t_tv_name :: Name
    t_tv_name = TyVar -> Name
    forall a. NamedThing a => a -> Name
    getName TyVar
    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 -> IOEnv (Env TcGblEnv TcLclEnv) [TyCon]
    checkValidTyCl TyCon
    tc
      = SrcSpan
    -> IOEnv (Env TcGblEnv TcLclEnv) [TyCon]
    -> IOEnv (Env TcGblEnv TcLclEnv) [TyCon]
    forall a. SrcSpan -> TcRn a -> TcRn a
    setSrcSpan (TyCon -> SrcSpan
    forall a. NamedThing a => a -> SrcSpan
    getSrcSpan TyCon
    tc) (IOEnv (Env TcGblEnv TcLclEnv) [TyCon]
     -> IOEnv (Env TcGblEnv TcLclEnv) [TyCon])
    -> IOEnv (Env TcGblEnv TcLclEnv) [TyCon]
    -> IOEnv (Env TcGblEnv TcLclEnv) [TyCon]
    forall a b. (a -> b) -> a -> b
    $
        TyCon
    -> IOEnv (Env TcGblEnv TcLclEnv) [TyCon]
    -> IOEnv (Env TcGblEnv TcLclEnv) [TyCon]
    forall a. TyCon -> TcM a -> TcM a
    addTyConCtxt TyCon
    tc            (IOEnv (Env TcGblEnv TcLclEnv) [TyCon]
     -> IOEnv (Env TcGblEnv TcLclEnv) [TyCon])
    -> IOEnv (Env TcGblEnv TcLclEnv) [TyCon]
    -> IOEnv (Env TcGblEnv TcLclEnv) [TyCon]
    forall a b. (a -> b) -> a -> b
    $
        IOEnv (Env TcGblEnv TcLclEnv) [TyCon]
    -> IOEnv (Env TcGblEnv TcLclEnv) [TyCon]
    -> IOEnv (Env TcGblEnv TcLclEnv) [TyCon]
    forall r. TcRn r -> TcRn r -> TcRn r
    recoverM IOEnv (Env TcGblEnv TcLclEnv) [TyCon]
    recovery_code     (IOEnv (Env TcGblEnv TcLclEnv) [TyCon]
     -> IOEnv (Env TcGblEnv TcLclEnv) [TyCon])
    -> IOEnv (Env TcGblEnv TcLclEnv) [TyCon]
    -> IOEnv (Env TcGblEnv TcLclEnv) [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
           ; String -> SDoc -> TcRn ()
    traceTc String
    "Done validity for tycon" (TyCon -> SDoc
    forall a. Outputable a => a -> SDoc
    ppr TyCon
    tc)
           ; [TyCon] -> IOEnv (Env TcGblEnv TcLclEnv) [TyCon]
    forall (m :: * -> *) a. Monad m => a -> m a
    return [TyCon
    tc] }
      where
        recovery_code :: IOEnv (Env TcGblEnv TcLclEnv) [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] -> IOEnv (Env TcGblEnv TcLclEnv) [TyCon]
    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 levity-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

    checkValidTyCon :: TyCon -> TcM ()
    checkValidTyCon :: TyCon -> TcRn ()
    checkValidTyCon TyCon
    tc
      | TyCon -> Bool
    isPrimTyCon TyCon
    tc   -- Happens when Haddock'ing GHC.Prim
      = () -> TcRn ()
    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
    $$ 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 (m :: * -> *) a. Monad m => a -> m a
    return ()
                   ; FamTyConFlav
    AbstractClosedSynFamilyTyCon ->
                     do { Bool
    hsBoot <- TcRnIf TcGblEnv TcLclEnv Bool
    tcIsHsBootOrSig
                        ; Bool -> SDoc -> TcRn ()
    checkTc Bool
    hsBoot (SDoc -> TcRn ()) -> SDoc -> TcRn ()
    forall a b. (a -> b) -> a -> b
    $
                          String -> SDoc
    text String
    "You may define an abstract closed type family" SDoc -> SDoc -> SDoc
    $$
                          String -> SDoc
    text String
    "only in a .hs-boot file" }
                   ; DataFamilyTyCon {}           -> () -> TcRn ()
    forall (m :: * -> *) a. Monad m => a -> m a
    return ()
                   ; FamTyConFlav
    OpenSynFamilyTyCon           -> () -> TcRn ()
    forall (m :: * -> *) a. Monad m => a -> m a
    return ()
                   ; BuiltInSynFamTyCon BuiltInSynFamily
    _         -> () -> TcRn ()
    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 -> [Type] -> TcRn ()
    checkValidTheta (Name -> UserTypeCtxt
    DataTyCtxt Name
    name) (TyCon -> [Type]
    tyConStupidTheta TyCon
    tc)

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

                   ; DynFlags
    dflags          <- IOEnv (Env TcGblEnv TcLclEnv) DynFlags
    forall (m :: * -> *). HasDynFlags m => m DynFlags
    getDynFlags
                   ; Bool
    existential_ok  <- Extension -> TcRnIf TcGblEnv TcLclEnv Bool
    forall gbl lcl. Extension -> TcRnIf gbl lcl Bool
    xoptM Extension
    LangExt.ExistentialQuantification
                   ; Bool
    gadt_ok         <- Extension -> TcRnIf TcGblEnv TcLclEnv Bool
    forall gbl lcl. Extension -> TcRnIf gbl lcl Bool
    xoptM Extension
    LangExt.GADTs
                   ; let ex_ok :: Bool
    ex_ok = Bool
    existential_ok Bool -> Bool -> Bool
    || Bool
    gadt_ok
                         -- Data cons can have existential context
                   ; (DataCon -> TcRn ()) -> [DataCon] -> TcRn ()
    forall (t :: * -> *) (m :: * -> *) a b.
    (Foldable t, Monad m) =>
    (a -> m b) -> t a -> m ()
    mapM_ (DynFlags -> Bool -> TyCon -> DataCon -> TcRn ()
    checkValidDataCon DynFlags
    dflags Bool
    ex_ok TyCon
    tc) [DataCon]
    data_cons
                   ; (FieldLabel -> TcRn ()) -> [FieldLabel] -> TcRn ()
    forall (t :: * -> *) (m :: * -> *) a b.
    (Foldable t, Monad m) =>
    (a -> m b) -> t a -> m ()
    mapM_ ([DataCon] -> FieldLabel -> TcRn ()
    checkPartialRecordField [DataCon]
    data_cons) (TyCon -> [FieldLabel]
    tyConFieldLabels TyCon
    tc)

                    -- Check that fields with the same name share a type
                   ; (NonEmpty (FieldLabel, DataCon) -> TcRn ())
    -> [NonEmpty (FieldLabel, DataCon)] -> TcRn ()
    forall (t :: * -> *) (m :: * -> *) a b.
    (Foldable t, Monad m) =>
    (a -> m b) -> t a -> m ()
    mapM_ NonEmpty (FieldLabel, DataCon) -> TcRn ()
    check_fields [NonEmpty (FieldLabel, DataCon)]
    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)
        cmp_fld :: (FieldLabel, b) -> (FieldLabel, b) -> Ordering
    cmp_fld (FieldLabel
    f1,b
    _) (FieldLabel
    f2,b
    _) = FieldLabel -> FieldLabelString
    flLabel FieldLabel
    f1 FieldLabelString -> FieldLabelString -> Ordering
    `uniqCompareFS` 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 (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
    $
          WarningFlag -> Bool -> SDoc -> TcRn ()
    warnIfFlag WarningFlag
    Opt_WarnPartialFields
            (Bool -> Bool
    not Bool
    is_exhaustive Bool -> Bool -> Bool
    && Bool -> Bool
    not (OccName -> Bool
    startsWithUnderscore OccName
    occ_name))
            ([SDoc] -> SDoc
    sep [String -> SDoc
    text String
    "Use of partial record field selector" SDoc -> SDoc -> SDoc
    <> SDoc
    colon,
                  Arity -> SDoc -> SDoc
    nest Arity
    2 (SDoc -> SDoc) -> SDoc -> SDoc
    forall a b. (a -> b) -> a -> b
    $ SDoc -> SDoc
    quotes (OccName -> SDoc
    forall a. Outputable a => a -> SDoc
    ppr OccName
    occ_name)])
      where
        loc :: SrcSpan
    loc = Name -> SrcSpan
    forall a. NamedThing a => a -> SrcSpan
    getSrcSpan (FieldLabel -> Name
    flSelector FieldLabel
    fld)
        occ_name :: OccName
    occ_name = FieldLabel -> OccName
    forall name. HasOccName name => name -> OccName
    occName FieldLabel
    fld

        ([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 (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 ([Type] -> DataCon -> Bool
    dataConCannotMatch [Type]
    inst_tys) [DataCon]
    cons_without_field

        con1 :: DataCon
    con1 = ASSERT( not (null cons_with_field) ) head cons_with_field
        ([TyVar]
    univ_tvs, [TyVar]
    _, [EqSpec]
    eq_spec, [Type]
    _, [Scaled Type]
    _, Type
    _) = DataCon
    -> ([TyVar], [TyVar], [EqSpec], [Type], [Scaled Type], Type)
    dataConFullSig DataCon
    con1
        eq_subst :: TCvSubst
    eq_subst = [(TyVar, Type)] -> TCvSubst
    mkTvSubstPrs ((EqSpec -> (TyVar, Type)) -> [EqSpec] -> [(TyVar, Type)]
    forall a b. (a -> b) -> [a] -> [b]
    map EqSpec -> (TyVar, Type)
    eqSpecPair [EqSpec]
    eq_spec)
        inst_tys :: [Type]
    inst_tys = TCvSubst -> [TyVar] -> [Type]
    substTyVars TCvSubst
    eq_subst [TyVar]
    univ_tvs

    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 -> SDoc -> TcRn ()
    checkTc (Maybe TCvSubst -> Bool
    forall a. Maybe a -> Bool
    isJust Maybe TCvSubst
    mb_subst1) (FieldLabelString -> DataCon -> DataCon -> SDoc
    resultTypeMisMatch FieldLabelString
    fld DataCon
    con1 DataCon
    con2)
            ; Bool -> SDoc -> TcRn ()
    checkTc (Maybe TCvSubst -> Bool
    forall a. Maybe a -> Bool
    isJust Maybe TCvSubst
    mb_subst2) (FieldLabelString -> DataCon -> DataCon -> SDoc
    fieldTypeMisMatch FieldLabelString
    fld DataCon
    con1 DataCon
    con2) }
      where
        mb_subst1 :: Maybe TCvSubst
    mb_subst1 = Type -> Type -> Maybe TCvSubst
    tcMatchTy Type
    res1 Type
    res2
        mb_subst2 :: Maybe TCvSubst
    mb_subst2 = TCvSubst -> Type -> Type -> Maybe TCvSubst
    tcMatchTyX (String -> Maybe TCvSubst -> TCvSubst
    forall a. HasCallStack => String -> Maybe a -> a
    expectJust String
    "checkFieldCompat" Maybe TCvSubst
    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 ([GenLocated SrcSpanAnnN Name] -> SDoc
    dataConCtxt [SrcSpanAnnN -> Name -> GenLocated SrcSpanAnnN Name
    forall l e. l -> e -> GenLocated l e
    L (SrcSpan -> SrcSpanAnnN
    forall ann. SrcSpan -> SrcAnn ann
    noAnnSrcSpan SrcSpan
    con_loc) Name
    con_name]) (TcRn () -> TcRn ()) -> TcRn () -> TcRn ()
    forall a b. (a -> b) -> a -> b
    $
        do  { let tc_tvs :: [TyVar]
    tc_tvs      = TyCon -> [TyVar]
    tyConTyVars TyCon
    tc
                  res_ty_tmpl :: Type
    res_ty_tmpl = TyCon -> [Type] -> Type
    mkFamilyTyConApp TyCon
    tc ([TyVar] -> [Type]
    mkTyVarTys [TyVar]
    tc_tvs)
                  orig_res_ty :: Type
    orig_res_ty = DataCon -> Type
    dataConOrigResTy DataCon
    con
            ; String -> SDoc -> TcRn ()
    traceTc String
    "checkValidDataCon" ([SDoc] -> SDoc
    vcat
                  [ DataCon -> SDoc
    forall a. Outputable a => a -> SDoc
    ppr DataCon
    con, TyCon -> SDoc
    forall a. Outputable a => a -> SDoc
    ppr TyCon
    tc, [TyVar] -> SDoc
    forall a. Outputable a => a -> SDoc
    ppr [TyVar]
    tc_tvs
                  , Type -> SDoc
    forall a. Outputable a => a -> SDoc
    ppr Type
    res_ty_tmpl SDoc -> SDoc -> SDoc
    <+> SDoc
    dcolon SDoc -> SDoc -> SDoc
    <+> Type -> SDoc
    forall a. Outputable a => a -> SDoc
    ppr (HasDebugCallStack => Type -> Type
    Type -> Type
    tcTypeKind Type
    res_ty_tmpl)
                  , Type -> SDoc
    forall a. Outputable a => a -> SDoc
    ppr Type
    orig_res_ty SDoc -> SDoc -> SDoc
    <+> SDoc
    dcolon SDoc -> SDoc -> SDoc
    <+> Type -> SDoc
    forall a. Outputable a => a -> SDoc
    ppr (HasDebugCallStack => Type -> Type
    Type -> Type
    tcTypeKind 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 [rejigCon
            --  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 -> SDoc -> TcRn ()
    checkTc (Maybe TCvSubst -> Bool
    forall a. Maybe a -> Bool
    isJust (Type -> Type -> Maybe TCvSubst
    tcMatchTyKi Type
    res_ty_tmpl Type
    orig_res_ty))
                      (DataCon -> Type -> SDoc
    badDataConTyCon 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

              -- If we are dealing with a newtype, we allow levity polymorphism
              -- regardless of whether or not UnliftedNewtypes is enabled. A
              -- later check in checkNewDataCon handles this, producing a
              -- better error message than checkForLevPoly would.
            ; 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
    $
                (Type -> TcRn ()) -> [Type] -> TcRn ()
    forall (t :: * -> *) (m :: * -> *) a b.
    (Foldable t, Monad m) =>
    (a -> m b) -> t a -> m ()
    mapM_ (SDoc -> Type -> TcRn ()
    checkForLevPoly SDoc
    empty) ((Scaled Type -> Type) -> [Scaled Type] -> [Type]
    forall a b. (a -> b) -> [a] -> [b]
    map Scaled Type -> Type
    forall a. Scaled a -> a
    scaledThing ([Scaled Type] -> [Type]) -> [Scaled Type] -> [Type]
    forall a b. (a -> b) -> a -> b
    $ DataCon -> [Scaled Type]
    dataConOrigArgTys DataCon
    con)
                -- 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 levity-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 -> SDoc -> TcRn ()
    checkTc (Bool
    existential_ok Bool -> Bool -> Bool
    || DataCon -> Bool
    isVanillaDataCon DataCon
    con)
                      (DataCon -> SDoc
    badExistential DataCon
    con)

              -- Check that UNPACK pragmas and bangs work out
              -- E.g.  reject   data T = MkT {-# UNPACK #-} Int     -- No "!"
              --                data T = MkT {-# UNPACK #-} !a      -- Can't unpack
            ; HscEnv
    hsc_env <- IOEnv (Env TcGblEnv TcLclEnv) HscEnv
    forall gbl lcl. TcRnIf gbl lcl HscEnv
    getTopEnv
            ; let check_bang :: HsSrcBang -> HsImplBang -> Int -> TcM ()
                  check_bang :: HsSrcBang -> HsImplBang -> Arity -> TcRn ()
    check_bang HsSrcBang
    bang HsImplBang
    rep_bang Arity
    n
                   | HsSrcBang SourceText
    _ SrcUnpackedness
    _ SrcStrictness
    SrcLazy <- HsSrcBang
    bang
                   , Bool -> Bool
    not (Extension -> DynFlags -> Bool
    xopt Extension
    LangExt.StrictData DynFlags
    dflags)
                   = SDoc -> TcRn ()
    addErrTc (Arity -> SDoc -> SDoc
    bad_bang Arity
    n (String -> SDoc
    text String
    "Lazy annotation (~) without StrictData"))

                   | 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)
                   = WarnReason -> SDoc -> TcRn ()
    addWarnTc WarnReason
    NoReason (Arity -> SDoc -> SDoc
    bad_bang Arity
    n (String -> SDoc
    text String
    "UNPACK pragma lacks '!'"))

                   | HsSrcBang SourceText
    _ SrcUnpackedness
    want_unpack SrcStrictness
    _ <- HsSrcBang
    bang
                   , SrcUnpackedness -> Bool
    isSrcUnpacked SrcUnpackedness
    want_unpack
                   , case HsImplBang
    rep_bang of { HsUnpack {} -> Bool
    False; HsImplBang
    _ -> Bool
    True }
                   -- If not optimising, we don't unpack (rep_bang is never
                   -- HsUnpack), so don't complain!  This happens, e.g., in Haddock.
                   -- See dataConSrcToImplBang.
                   , Bool -> Bool
    not (GeneralFlag -> DynFlags -> Bool
    gopt GeneralFlag
    Opt_OmitInterfacePragmas DynFlags
    dflags)
                   -- 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)
                   = WarnReason -> SDoc -> TcRn ()
    addWarnTc WarnReason
    NoReason (Arity -> SDoc -> SDoc
    bad_bang Arity
    n (String -> SDoc
    text String
    "Ignoring unusable UNPACK pragma"))

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

            ; (HsSrcBang -> HsImplBang -> Arity -> TcRn ())
    -> [HsSrcBang] -> [HsImplBang] -> [Arity] -> TcRn ()
    forall (m :: * -> *) a b c d.
    Monad m =>
    (a -> b -> c -> m d) -> [a] -> [b] -> [c] -> m ()
    zipWith3M_ HsSrcBang -> HsImplBang -> Arity -> TcRn ()
    check_bang (DataCon -> [HsSrcBang]
    dataConSrcBangs DataCon
    con) (DataCon -> [HsImplBang]
    dataConImplBangs DataCon
    con) [Arity
    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
            ; Bool -> TcRn () -> TcRn ()
    forall (f :: * -> *). Applicative f => Bool -> f () -> f ()
    when Bool
    debugIsOn (TcRn () -> TcRn ()) -> TcRn () -> TcRn ()
    forall a b. (a -> b) -> a -> b
    $
              do { let ([TyVar]
    univs, [TyVar]
    exs, [EqSpec]
    eq_spec, [Type]
    _, [Scaled Type]
    _, Type
    _) = DataCon
    -> ([TyVar], [TyVar], [EqSpec], [Type], [Scaled Type], Type)
    dataConFullSig DataCon
    con
                       user_tvs :: [TyVar]
    user_tvs                       = DataCon -> [TyVar]
    dataConUserTyVars DataCon
    con
                       user_tvbs_invariant :: Bool
    user_tvbs_invariant
                         =    [TyVar] -> Set TyVar
    forall a. Ord a => [a] -> Set a
    Set.fromList ([EqSpec] -> [TyVar] -> [TyVar]
    filterEqSpec [EqSpec]
    eq_spec [TyVar]
    univs [TyVar] -> [TyVar] -> [TyVar]
    forall a. [a] -> [a] -> [a]
    ++ [TyVar]
    exs)
                           Set TyVar -> Set TyVar -> Bool
    forall a. Eq a => a -> a -> Bool
    == [TyVar] -> Set TyVar
    forall a. Ord a => [a] -> Set a
    Set.fromList [TyVar]
    user_tvs
                 ; MASSERT2( user_tvbs_invariant
                           , vcat ([ ppr con
                                   , ppr univs
                                   , ppr exs
                                   , ppr eq_spec
                                   , ppr user_tvs ])) }

            ; String -> SDoc -> TcRn ()
    traceTc String
    "Done validity of data con" (SDoc -> TcRn ()) -> SDoc -> TcRn ()
    forall a b. (a -> b) -> a -> b
    $
              [SDoc] -> SDoc
    vcat [ DataCon -> SDoc
    forall a. Outputable a => a -> SDoc
    ppr DataCon
    con
                   , String -> SDoc
    text String
    "Datacon wrapper type:" SDoc -> SDoc -> SDoc
    <+> Type -> SDoc
    forall a. Outputable a => a -> SDoc
    ppr (DataCon -> Type
    dataConWrapperType DataCon
    con)
                   , String -> SDoc
    text String
    "Datacon rep type:" SDoc -> SDoc -> SDoc
    <+> Type -> SDoc
    forall a. Outputable a => a -> SDoc
    ppr (DataCon -> Type
    dataConRepType DataCon
    con)
                   , String -> SDoc
    text String
    "Datacon display type:" SDoc -> SDoc -> SDoc
    <+> Type -> SDoc
    forall a. Outputable a => a -> SDoc
    ppr Type
    data_con_display_type
                   , String -> SDoc
    text String
    "Rep typcon binders:" SDoc -> SDoc -> SDoc
    <+> [TyConBinder] -> SDoc
    forall a. Outputable a => a -> SDoc
    ppr (TyCon -> [TyConBinder]
    tyConBinders (DataCon -> TyCon
    dataConTyCon DataCon
    con))
                   , case TyCon -> Maybe (TyCon, [Type])
    tyConFamInst_maybe (DataCon -> TyCon
    dataConTyCon DataCon
    con) of
                       Maybe (TyCon, [Type])
    Nothing -> String -> SDoc
    text String
    "not family"
                       Just (TyCon
    f, [Type]
    _) -> [TyConBinder] -> SDoc
    forall a. Outputable a => a -> SDoc
    ppr (TyCon -> [TyConBinder]
    tyConBinders TyCon
    f) ]
        }
      where
        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 -> Extension -> DynFlags -> Bool
    xopt Extension
    LangExt.StrictData DynFlags
    dflags
          SrcStrictness
    bang        -> SrcStrictness -> Bool
    isSrcStrict SrcStrictness
    bang

        bad_bang :: Arity -> SDoc -> SDoc
    bad_bang Arity
    n SDoc
    herald
          = SDoc -> Arity -> SDoc -> SDoc
    hang SDoc
    herald Arity
    2 (String -> SDoc
    text String
    "on the" SDoc -> SDoc -> SDoc
    <+> Arity -> SDoc
    speakNth Arity
    n
                           SDoc -> SDoc -> SDoc
    <+> String -> SDoc
    text String
    "argument of" SDoc -> SDoc -> SDoc
    <+> SDoc -> SDoc
    quotes (DataCon -> SDoc
    forall a. Outputable a => a -> SDoc
    ppr 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
    checkNewDataCon :: DataCon -> TcRn ()
    checkNewDataCon DataCon
    con
      = do  { Bool -> SDoc -> TcRn ()
    checkTc ([Scaled Type] -> Bool
    forall a. [a] -> Bool
    isSingleton [Scaled Type]
    arg_tys) (DataCon -> Arity -> SDoc
    newtypeFieldErr DataCon
    con ([Scaled Type] -> Arity
    forall (t :: * -> *) a. Foldable t => t a -> Arity
    length [Scaled Type]
    arg_tys))
                  -- One argument

            ; Bool
    unlifted_newtypes <- Extension -> TcRnIf TcGblEnv TcLclEnv Bool
    forall gbl lcl. Extension -> TcRnIf gbl lcl Bool
    xoptM Extension
    LangExt.UnliftedNewtypes
            ; let allowedArgType :: Bool
    allowedArgType =
                    Bool
    unlifted_newtypes Bool -> Bool -> Bool
    || HasDebugCallStack => Type -> Maybe Bool
    Type -> Maybe Bool
    isLiftedType_maybe (Scaled Type -> Type
    forall a. Scaled a -> a
    scaledThing Scaled Type
    arg_ty1) Maybe Bool -> Maybe Bool -> Bool
    forall a. Eq a => a -> a -> Bool
    == Bool -> Maybe Bool
    forall a. a -> Maybe a
    Just Bool
    True
            ; Bool -> SDoc -> TcRn ()
    checkTc Bool
    allowedArgType (SDoc -> TcRn ()) -> SDoc -> TcRn ()
    forall a b. (a -> b) -> a -> b
    $ [SDoc] -> SDoc
    vcat
              [ String -> SDoc
    text String
    "A newtype cannot have an unlifted argument type"
              , String -> SDoc
    text String
    "Perhaps you intended to use UnliftedNewtypes"
              ]
            ; Bool
    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

            ; let check_con :: Bool -> SDoc -> TcRn ()
    check_con Bool
    what SDoc
    msg =
                   Bool -> SDoc -> TcRn ()
    checkTc Bool
    what (SDoc
    msg SDoc -> SDoc -> SDoc
    $$ DataCon -> SDoc
    forall a. Outputable a => a -> SDoc
    ppr DataCon
    con SDoc -> SDoc -> SDoc
    <+> SDoc
    dcolon SDoc -> SDoc -> SDoc
    <+> Type -> SDoc
    forall a. Outputable a => a -> SDoc
    ppr (Bool -> DataCon -> Type
    dataConDisplayType Bool
    show_linear_types DataCon
    con))

            ; Bool -> SDoc -> TcRn ()
    checkTc (Type -> Bool
    ok_mult (Scaled Type -> Type
    forall a. Scaled a -> Type
    scaledMult Scaled Type
    arg_ty1)) (SDoc -> TcRn ()) -> SDoc -> TcRn ()
    forall a b. (a -> b) -> a -> b
    $
              String -> SDoc
    text String
    "A newtype constructor must be linear"

            ; Bool -> SDoc -> TcRn ()
    check_con ([EqSpec] -> Bool
    forall (t :: * -> *) a. Foldable t => t a -> Bool
    null [EqSpec]
    eq_spec) (SDoc -> TcRn ()) -> SDoc -> TcRn ()
    forall a b. (a -> b) -> a -> b
    $
              String -> SDoc
    text String
    "A newtype constructor must have a return type of form T a1 ... an"
                    -- Return type is (T a b c)

            ; Bool -> SDoc -> TcRn ()
    check_con ([Type] -> Bool
    forall (t :: * -> *) a. Foldable t => t a -> Bool
    null [Type]
    theta) (SDoc -> TcRn ()) -> SDoc -> TcRn ()
    forall a b. (a -> b) -> a -> b
    $
              String -> SDoc
    text String
    "A newtype constructor cannot have a context in its type"

            ; Bool -> SDoc -> TcRn ()
    check_con ([TyVar] -> Bool
    forall (t :: * -> *) a. Foldable t => t a -> Bool
    null [TyVar]
    ex_tvs) (SDoc -> TcRn ()) -> SDoc -> TcRn ()
    forall a b. (a -> b) -> a -> b
    $
              String -> SDoc
    text String
    "A newtype constructor cannot have existential type variables"
                    -- No existentials

            ; Bool -> SDoc -> TcRn ()
    checkTc ((HsSrcBang -> Bool) -> [HsSrcBang] -> Bool
    forall (t :: * -> *) a. Foldable t => (a -> Bool) -> t a -> Bool
    all HsSrcBang -> Bool
    ok_bang (DataCon -> [HsSrcBang]
    dataConSrcBangs DataCon
    con))
                      (DataCon -> SDoc
    newtypeStrictError DataCon
    con)
                    -- No strictness annotations
        }
      where
        ([TyVar]
    _univ_tvs, [TyVar]
    ex_tvs, [EqSpec]
    eq_spec, [Type]
    theta, [Scaled Type]
    arg_tys, Type
    _res_ty)
          = DataCon
    -> ([TyVar], [TyVar], [EqSpec], [Type], [Scaled Type], Type)
    dataConFullSig DataCon
    con

        (Scaled Type
    arg_ty1 : [Scaled Type]
    _) = [Scaled Type]
    arg_tys

        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
    One = Bool
    True
        ok_mult Type
    _   = Bool
    False

    -------------------------------
    checkValidClass :: Class -> TcM ()
    checkValidClass :: Class -> TcRn ()
    checkValidClass Class
    cls
      = do  { Bool
    constrained_class_methods <- Extension -> TcRnIf TcGblEnv TcLclEnv Bool
    forall gbl lcl. Extension -> TcRnIf gbl lcl Bool
    xoptM Extension
    LangExt.ConstrainedClassMethods
            ; Bool
    multi_param_type_classes  <- Extension -> TcRnIf TcGblEnv TcLclEnv Bool
    forall gbl lcl. Extension -> TcRnIf gbl lcl Bool
    xoptM Extension
    LangExt.MultiParamTypeClasses
            ; Bool
    nullary_type_classes      <- Extension -> TcRnIf TcGblEnv TcLclEnv Bool
    forall gbl lcl. Extension -> TcRnIf gbl lcl Bool
    xoptM Extension
    LangExt.NullaryTypeClasses
            ; Bool
    fundep_classes            <- Extension -> TcRnIf TcGblEnv TcLclEnv Bool
    forall gbl lcl. Extension -> TcRnIf gbl lcl Bool
    xoptM Extension
    LangExt.FunctionalDependencies
            ; Bool
    undecidable_super_classes <- Extension -> TcRnIf TcGblEnv TcLclEnv Bool
    forall gbl lcl. Extension -> TcRnIf gbl lcl Bool
    xoptM Extension
    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)
            ; Bool -> SDoc -> TcRn ()
    checkTc (Bool
    multi_param_type_classes Bool -> Bool -> Bool
    || Arity
    cls_arity Arity -> Arity -> Bool
    forall a. Eq a => a -> a -> Bool
    == Arity
    1 Bool -> Bool -> Bool
    ||
                        (Bool
    nullary_type_classes Bool -> Bool -> Bool
    && Arity
    cls_arity Arity -> Arity -> Bool
    forall a. Eq a => a -> a -> Bool
    == Arity
    0))
                      (Arity -> Class -> SDoc
    classArityErr Arity
    cls_arity Class
    cls)
            ; Bool -> SDoc -> TcRn ()
    checkTc (Bool
    fundep_classes Bool -> Bool -> Bool
    || [([TyVar], [TyVar])] -> Bool
    forall (t :: * -> *) a. Foldable t => t a -> Bool
    null [([TyVar], [TyVar])]
    fundeps) (Class -> SDoc
    classFunDepsErr Class
    cls)

            -- Check the super-classes
            ; UserTypeCtxt -> [Type] -> TcRn ()
    checkValidTheta (Name -> UserTypeCtxt
    ClassSCCtxt (Class -> Name
    className Class
    cls)) [Type]
    theta

              -- Now check for cyclic superclasses
              -- If there are superclass cycles, checkClassCycleErrs bails.
            ; Bool -> TcRn () -> TcRn ()
    forall (f :: * -> *). Applicative f => Bool -> f () -> f ()
    unless Bool
    undecidable_super_classes (TcRn () -> TcRn ()) -> TcRn () -> TcRn ()
    forall a b. (a -> b) -> a -> b
    $
              case Class -> Maybe SDoc
    checkClassCycles Class
    cls of
                 Just SDoc
    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
    $
                             SDoc -> TcRn ()
    addErrTc SDoc
    err
                 Maybe SDoc
    Nothing  -> () -> TcRn ()
    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]
            ; TcRn () -> TcRn ()
    whenNoErrs (TcRn () -> TcRn ()) -> TcRn () -> TcRn ()
    forall a b. (a -> b) -> a -> b
    $
              ((TyVar, DefMethInfo) -> TcRn ())
    -> [(TyVar, DefMethInfo)] -> TcRn ()
    forall (t :: * -> *) (m :: * -> *) a b.
    (Foldable t, Monad m) =>
    (a -> m b) -> t a -> m ()
    mapM_ (Bool -> (TyVar, DefMethInfo) -> TcRn ()
    check_op Bool
    constrained_class_methods) [(TyVar, DefMethInfo)]
    op_stuff

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

        check_op :: Bool -> (TyVar, DefMethInfo) -> TcRn ()
    check_op Bool
    constrained_class_methods (TyVar
    sel_id, DefMethInfo
    dm)
          = SrcSpan -> TcRn () -> TcRn ()
    forall a. SrcSpan -> TcRn a -> TcRn a
    setSrcSpan (TyVar -> SrcSpan
    forall a. NamedThing a => a -> SrcSpan
    getSrcSpan TyVar
    sel_id) (TcRn () -> TcRn ()) -> TcRn () -> TcRn ()
    forall a b. (a -> b) -> a -> b
    $
            SDoc -> TcRn () -> TcRn ()
    forall a. SDoc -> TcM a -> TcM a
    addErrCtxt (TyVar -> Type -> SDoc
    classOpCtxt TyVar
    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

               -- a method cannot be levity polymorphic, as we have to store the
               -- method in a dictionary
               -- example of what this prevents:
               --   class BoundedX (a :: TYPE r) where minBound :: a
               -- See Note [Levity polymorphism checking] in GHC.HsToCore.Monad
            ; SDoc -> Type -> TcRn ()
    checkForLevPoly SDoc
    empty Type
    tau1

            ; 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 ()) -> [Type] -> TcRn ()
    forall (t :: * -> *) (m :: * -> *) a b.
    (Foldable t, Monad m) =>
    (a -> m b) -> t a -> m ()
    mapM_ Type -> TcRn ()
    check_constraint ([Type] -> [Type]
    forall a. [a] -> [a]
    tail (Type
    cls_predType -> [Type] -> [Type]
    forall a. a -> [a] -> [a]
    :[Type]
    op_theta))

            ; UserTypeCtxt -> TyVar -> Type -> Type -> DefMethInfo -> TcRn ()
    check_dm UserTypeCtxt
    ctxt TyVar
    sel_id Type
    cls_pred Type
    tau2 DefMethInfo
    dm
            }
            where
              ctxt :: UserTypeCtxt
    ctxt    = Name -> Bool -> UserTypeCtxt
    FunSigCtxt Name
    op_name Bool
    True -- Report redundant class constraints
              op_name :: Name
    op_name = TyVar -> Name
    idName TyVar
    sel_id
              op_ty :: Type
    op_ty   = TyVar -> Type
    idType TyVar
    sel_id
              ([TyVar]
    _,Type
    cls_pred,Type
    tau1) = Type -> ([TyVar], Type, Type)
    tcSplitMethodTy Type
    op_ty
              -- See Note [Splitting nested sigma types in class type signatures]
              ([TyVar]
    _,[Type]
    op_theta,Type
    tau2) = Type -> ([TyVar], [Type], 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)
                       (SDoc -> TcRn ()
    addErrTc (TyVar -> Type -> SDoc
    badMethPred TyVar
    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, ATValidityInfo)
    m_dflt_rhs)
          = do { Bool -> SDoc -> TcRn ()
    checkTc (Arity
    cls_arity Arity -> Arity -> Bool
    forall a. Eq a => a -> a -> Bool
    == Arity
    0 Bool -> Bool -> Bool
    || (TyVar -> Bool) -> [TyVar] -> Bool
    forall (t :: * -> *) a. Foldable t => (a -> Bool) -> t a -> Bool
    any (TyVar -> VarSet -> Bool
    `elemVarSet` VarSet
    cls_tv_set) [TyVar]
    fam_tvs)
                         (Class -> TyCon -> SDoc
    noClassTyVarErr 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, ATValidityInfo)
    -> ((Type, ATValidityInfo) -> TcRn ()) -> TcRn ()
    forall (m :: * -> *) a. Monad m => Maybe a -> (a -> m ()) -> m ()
    whenIsJust Maybe (Type, ATValidityInfo)
    m_dflt_rhs (((Type, ATValidityInfo) -> TcRn ()) -> TcRn ())
    -> ((Type, ATValidityInfo) -> TcRn ()) -> TcRn ()
    forall a b. (a -> b) -> a -> b
    $ \ (Type
    rhs, ATValidityInfo
    at_validity_info) ->
                 case ATValidityInfo
    at_validity_info of
                   ATValidityInfo
    NoATVI -> () -> TcRn ()
    forall (f :: * -> *) a. Applicative f => a -> f a
    pure ()
                   ATVI SrcSpan
    loc [Type]
    pats ->
                     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
    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 -> [Type] -> TcRn ()
    checkValidAssocTyFamDeflt TyCon
    fam_tc [Type]
    pats
                        ; TyCon -> [TyVar] -> [Type] -> Type -> TcRn ()
    checkValidTyFamEqn TyCon
    fam_tc [TyVar]
    fam_tvs ([TyVar] -> [Type]
    mkTyVarTys [TyVar]
    fam_tvs) Type
    rhs }}
            where
              fam_tvs :: [TyVar]
    fam_tvs = TyCon -> [TyVar]
    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 -> TyVar -> Type -> Type -> DefMethInfo -> TcRn ()
    check_dm UserTypeCtxt
    ctxt TyVar
    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 -> [Type] -> Type
    mkClassPred Class
    cls ([Type] -> Type) -> [Type] -> Type
    forall a b. (a -> b) -> a -> b
    $ [TyVar] -> [Type]
    mkTyVarTys ([TyVar] -> [Type]) -> [TyVar] -> [Type]
    forall a b. (a -> b) -> a -> b
    $ Class -> [TyVar]
    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.
                  ([TyVar]
    _, [Type]
    _, Type
    dm_tau) = Type -> ([TyVar], [Type], 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 = [Type] -> Type -> Type
    mkPhiTy [Type
    vanilla_cls_pred] Type
    vanilla_tau
                  dm_phi_ty :: Type
    dm_phi_ty      = [Type] -> 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
    vcat
                  [ String -> SDoc
    text String
    "vanilla_phi_ty" SDoc -> SDoc -> SDoc
    <+> Type -> SDoc
    forall a. Outputable a => a -> SDoc
    ppr Type
    vanilla_phi_ty
                  , String -> SDoc
    text String
    "dm_phi_ty"      SDoc -> SDoc -> SDoc
    <+> 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 TCvSubst -> Bool
    forall a. Maybe a -> Bool
    isJust (Maybe TCvSubst -> Bool) -> Maybe TCvSubst -> Bool
    forall a b. (a -> b) -> a -> b
    $ [Type] -> [Type] -> Maybe TCvSubst
    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
    $ SDoc -> TcRn ()
    addErrTc (SDoc -> TcRn ()) -> SDoc -> TcRn ()
    forall a b. (a -> b) -> a -> b
    $
                   SDoc -> Arity -> SDoc -> SDoc
    hang (String -> SDoc
    text String
    "The default type signature for"
                         SDoc -> SDoc -> SDoc
    <+> TyVar -> SDoc
    forall a. Outputable a => a -> SDoc
    ppr TyVar
    sel_id SDoc -> SDoc -> SDoc
    <> SDoc
    colon)
                     Arity
    2 (Type -> SDoc
    forall a. Outputable a => a -> SDoc
    ppr Type
    dm_ty)
                SDoc -> SDoc -> SDoc
    $$ (String -> SDoc
    text String
    "does not match its corresponding"
                    SDoc -> SDoc -> SDoc
    <+> String -> SDoc
    text String
    "non-default type signature")

              -- Now do an ambiguity check on the default type signature.
              UserTypeCtxt -> Type -> TcRn ()
    checkValidType UserTypeCtxt
    ctxt (Class -> TyVar -> DefMethSpec Type -> Type
    mkDefaultMethodType Class
    cls TyVar
    sel_id DefMethSpec Type
    dm_spec)
        check_dm UserTypeCtxt
    _ TyVar
    _ Type
    _ Type
    _ DefMethInfo
    _ = () -> TcRn ()
    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 { Bool
    idx_tys <- Extension -> TcRnIf TcGblEnv TcLclEnv Bool
    forall gbl lcl. Extension -> TcRnIf gbl lcl Bool
    xoptM Extension
    LangExt.TypeFamilies
           ; Bool -> SDoc -> TcRn ()
    checkTc Bool
    idx_tys SDoc
    err_msg }
      where
        err_msg :: SDoc
    err_msg = SDoc -> Arity -> SDoc -> SDoc
    hang (String -> SDoc
    text String
    "Illegal family declaration for" SDoc -> SDoc -> SDoc
    <+> SDoc -> SDoc
    quotes (Name -> SDoc
    forall a. Outputable a => a -> SDoc
    ppr Name
    tc_name))
                     Arity
    2 (String -> SDoc
    text String
    "Enable TypeFamilies to allow indexed type families")

    checkResultSigFlag :: Name -> FamilyResultSig GhcRn -> TcM ()
    checkResultSigFlag :: Name -> FamilyResultSig GhcRn -> TcRn ()
    checkResultSigFlag Name
    tc_name (TyVarSig XTyVarSig GhcRn
    _ LHsTyVarBndr () GhcRn
    tvb)
      = do { Bool
    ty_fam_deps <- Extension -> TcRnIf TcGblEnv TcLclEnv Bool
    forall gbl lcl. Extension -> TcRnIf gbl lcl Bool
    xoptM Extension
    LangExt.TypeFamilyDependencies
           ; Bool -> SDoc -> TcRn ()
    checkTc Bool
    ty_fam_deps (SDoc -> TcRn ()) -> SDoc -> TcRn ()
    forall a b. (a -> b) -> a -> b
    $
             SDoc -> Arity -> SDoc -> SDoc
    hang (String -> SDoc
    text String
    "Illegal result type variable" SDoc -> SDoc -> SDoc
    <+> GenLocated SrcSpanAnnA (HsTyVarBndr () GhcRn) -> SDoc
    forall a. Outputable a => a -> SDoc
    ppr GenLocated SrcSpanAnnA (HsTyVarBndr () GhcRn)
    LHsTyVarBndr () GhcRn
    tvb SDoc -> SDoc -> SDoc
    <+> String -> SDoc
    text String
    "for" SDoc -> SDoc -> SDoc
    <+> SDoc -> SDoc
    quotes (Name -> SDoc
    forall a. Outputable a => a -> SDoc
    ppr Name
    tc_name))
                Arity
    2 (String -> SDoc
    text String
    "Enable TypeFamilyDependencies to allow result variable names") }
    checkResultSigFlag Name
    _ FamilyResultSig GhcRn
    _ = () -> TcRn ()
    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].

    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 (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, [TyVar]
    vis_vars)  = [(Role, TyVar)] -> ([Role], [TyVar])
    forall a b. [(a, b)] -> ([a], [b])
    unzip ([(Role, TyVar)] -> ([Role], [TyVar]))
    -> [(Role, TyVar)] -> ([Role], [TyVar])
    forall a b. (a -> b) -> a -> b
    $ ((Role, TyConBinder) -> Maybe (Role, TyVar))
    -> [(Role, TyConBinder)] -> [(Role, TyVar)]
    forall a b. (a -> Maybe b) -> [a] -> [b]
    mapMaybe (Role, TyConBinder) -> Maybe (Role, TyVar)
    pick_vis ([(Role, TyConBinder)] -> [(Role, TyVar)])
    -> [(Role, TyConBinder)] -> [(Role, TyVar)]
    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, TyVar)
    pick_vis (Role
    role, TyConBinder
    tvb)
          | TyConBinder -> Bool
    forall tv. VarBndr tv TyConBndrVis -> Bool
    isVisibleTyConBinder TyConBinder
    tvb = (Role, TyVar) -> Maybe (Role, TyVar)
    forall a. a -> Maybe a
    Just (Role
    role, TyConBinder -> TyVar
    forall tv argf. VarBndr tv argf -> tv
    binderVar TyConBinder
    tvb)
          | Bool
    otherwise                = Maybe (Role, TyVar)
    forall a. Maybe a
    Nothing

        check_roles :: TcRn ()
    check_roles
          = Maybe (GenLocated SrcSpanAnnA (RoleAnnotDecl GhcRn))
    -> (GenLocated SrcSpanAnnA (RoleAnnotDecl GhcRn) -> TcRn ())
    -> TcRn ()
    forall (m :: * -> *) a. Monad m => Maybe a -> (a -> m ()) -> m ()
    whenIsJust Maybe (GenLocated SrcSpanAnnA (RoleAnnotDecl GhcRn))
    Maybe (LRoleAnnotDecl GhcRn)
    role_annot_decl_maybe ((GenLocated SrcSpanAnnA (RoleAnnotDecl GhcRn) -> TcRn ())
     -> TcRn ())
    -> (GenLocated SrcSpanAnnA (RoleAnnotDecl GhcRn) -> TcRn ())
    -> TcRn ()
    forall a b. (a -> b) -> a -> b
    $
              \decl :: GenLocated SrcSpanAnnA (RoleAnnotDecl 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. SrcSpanAnn' ann -> TcRn a -> TcRn a
    setSrcSpanA SrcSpanAnnA
    loc (TcRn () -> TcRn ()) -> TcRn () -> TcRn ()
    forall a b. (a -> b) -> a -> b
    $ do
              { Bool
    role_annots_ok <- Extension -> TcRnIf TcGblEnv TcLclEnv Bool
    forall gbl lcl. Extension -> TcRnIf gbl lcl Bool
    xoptM Extension
    LangExt.RoleAnnotations
              ; Bool -> SDoc -> TcRn ()
    checkTc Bool
    role_annots_ok (SDoc -> TcRn ()) -> SDoc -> TcRn ()
    forall a b. (a -> b) -> a -> b
    $ TyCon -> SDoc
    needXRoleAnnotations TyCon
    tc
              ; Bool -> SDoc -> TcRn ()
    checkTc ([TyVar]
    vis_vars [TyVar] -> [GenLocated SrcSpan (Maybe Role)] -> Bool
    forall a b. [a] -> [b] -> Bool
    `equalLength` [GenLocated SrcSpan (Maybe Role)]
    [XRec GhcRn (Maybe Role)]
    the_role_annots)
                        ([TyVar] -> LRoleAnnotDecl GhcRn -> SDoc
    forall a. [a] -> LRoleAnnotDecl GhcRn -> SDoc
    wrongNumberOfRoles [TyVar]
    vis_vars GenLocated SrcSpanAnnA (RoleAnnotDecl GhcRn)
    LRoleAnnotDecl GhcRn
    decl)
              ; [()]
    _ <- (TyVar -> GenLocated SrcSpan (Maybe Role) -> Role -> TcRn ())
    -> [TyVar]
    -> [GenLocated SrcSpan (Maybe Role)]
    -> [Role]
    -> IOEnv (Env TcGblEnv TcLclEnv) [()]
    forall (m :: * -> *) a b c d.
    Monad m =>
    (a -> b -> c -> m d) -> [a] -> [b] -> [c] -> m [d]
    zipWith3M TyVar -> GenLocated SrcSpan (Maybe Role) -> Role -> TcRn ()
    checkRoleAnnot [TyVar]
    vis_vars [GenLocated SrcSpan (Maybe Role)]
    [XRec GhcRn (Maybe Role)]
    the_role_annots [Role]
    vis_roles
              -- Representational or phantom roles for class parameters
              -- quickly lead to incoherence. So, we require
              -- IncoherentInstances to have them. See #8773, #14292
              ; Bool
    incoherent_roles_ok <- Extension -> TcRnIf TcGblEnv TcLclEnv Bool
    forall gbl lcl. Extension -> TcRnIf gbl lcl Bool
    xoptM Extension
    LangExt.IncoherentInstances
              ; Bool -> SDoc -> TcRn ()
    checkTc (  Bool
    incoherent_roles_ok
                        Bool -> Bool -> Bool
    || (Bool -> Bool
    not (Bool -> Bool) -> Bool -> Bool
    forall a b. (a -> b) -> a -> b
    $ TyCon -> Bool
    isClassTyCon TyCon
    tc)
                        Bool -> Bool -> Bool
    || ((Role -> Bool) -> [Role] -> Bool
    forall (t :: * -> *) a. Foldable t => (a -> Bool) -> t a -> Bool
    all (Role -> Role -> Bool
    forall a. Eq a => a -> a -> Bool
    == Role
    Nominal) [Role]
    vis_roles))
                        SDoc
    incoherentRoles

              ; Bool
    lint <- GeneralFlag -> TcRnIf TcGblEnv TcLclEnv Bool
    forall gbl lcl. GeneralFlag -> TcRnIf gbl lcl Bool
    goptM GeneralFlag
    Opt_DoCoreLinting
              ; Bool -> TcRn () -> TcRn ()
    forall (f :: * -> *). Applicative f => Bool -> f () -> f ()
    when Bool
    lint (TcRn () -> TcRn ()) -> TcRn () -> TcRn ()
    forall a b. (a -> b) -> a -> b
    $ TyCon -> TcRn ()
    checkValidRoles TyCon
    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 (GenLocated SrcSpanAnnA (RoleAnnotDecl GhcRn))
    Maybe (LRoleAnnotDecl GhcRn)
    role_annot_decl_maybe GenLocated SrcSpanAnnA (RoleAnnotDecl GhcRn) -> TcRn ()
    LRoleAnnotDecl GhcRn -> TcRn ()
    illegalRoleAnnotDecl

    checkRoleAnnot :: TyVar -> Located (Maybe Role) -> Role -> TcM ()
    checkRoleAnnot :: TyVar -> GenLocated SrcSpan (Maybe Role) -> Role -> TcRn ()
    checkRoleAnnot TyVar
    _  (L SrcSpan
    _ Maybe Role
    Nothing)   Role
    _  = () -> TcRn ()
    forall (m :: * -> *) a. Monad m => a -> m a
    return ()
    checkRoleAnnot TyVar
    tv (L SrcSpan
    _ (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
    $
        SDoc -> TcRn ()
    addErrTc (SDoc -> TcRn ()) -> SDoc -> TcRn ()
    forall a b. (a -> b) -> a -> b
    $ Name -> Role -> Role -> SDoc
    badRoleAnnot (TyVar -> Name
    tyVarName TyVar
    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 ([TyVar] -> [Role] -> VarEnv Role
    forall a. [TyVar] -> [a] -> VarEnv a
    zipVarEnv (TyCon -> [TyVar]
    tyConTyVars TyCon
    tc) (TyCon -> [Role]
    tyConRoles TyCon
    tc)) Role
    Representational Type
    rhs
      | Bool
    otherwise
      = () -> TcRn ()
    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
    <+> [Role] -> SDoc
    forall a. Outputable a => a -> SDoc
    ppr (TyCon -> [Role]
    tyConRoles TyCon
    tc))
               ; (Type -> TcRn ()) -> [Type] -> 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) ([Type] -> TcRn ()) -> [Type] -> TcRn ()
    forall a b. (a -> b) -> a -> b
    $
                        [EqSpec] -> [Type]
    eqSpecPreds [EqSpec]
    eq_spec [Type] -> [Type] -> [Type]
    forall a. [a] -> [a] -> [a]
    ++ [Type]
    theta [Type] -> [Type] -> [Type]
    forall a. [a] -> [a] -> [a]
    ++ ((Scaled Type -> Type) -> [Scaled Type] -> [Type]
    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
            ([TyVar]
    univ_tvs, [TyVar]
    ex_tvs, [EqSpec]
    eq_spec, [Type]
    theta, [Scaled Type]
    arg_tys, Type
    _res_ty)
              = DataCon
    -> ([TyVar], [TyVar], [EqSpec], [Type], [Scaled Type], Type)
    dataConFullSig DataCon
    datacon
            univ_roles :: VarEnv Role
    univ_roles = [TyVar] -> [Role] -> VarEnv Role
    forall a. [TyVar] -> [a] -> VarEnv a
    zipVarEnv [TyVar]
    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   = [(TyVar, Role)] -> VarEnv Role
    forall a. [(TyVar, a)] -> VarEnv a
    mkVarEnv ((TyVar -> (TyVar, Role)) -> [TyVar] -> [(TyVar, Role)]
    forall a b. (a -> b) -> [a] -> [b]
    map (, Role
    Nominal) [TyVar]
    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 TyVar
    tv)
          = case VarEnv Role -> TyVar -> Maybe Role
    forall a. VarEnv a -> TyVar -> Maybe a
    lookupVarEnv VarEnv Role
    env TyVar
    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
    $
                            SDoc -> TcRn ()
    report_error (SDoc -> TcRn ()) -> SDoc -> TcRn ()
    forall a b. (a -> b) -> a -> b
    $ String -> SDoc
    text String
    "type variable" SDoc -> SDoc -> SDoc
    <+> SDoc -> SDoc
    quotes (TyVar -> SDoc
    forall a. Outputable a => a -> SDoc
    ppr TyVar
    tv) SDoc -> SDoc -> SDoc
    <+>
                                           String -> SDoc
    text String
    "cannot have role" SDoc -> SDoc -> SDoc
    <+> Role -> SDoc
    forall a. Outputable a => a -> SDoc
    ppr Role
    role SDoc -> SDoc -> SDoc
    <+>
                                           String -> SDoc
    text String
    "because it was assigned role" SDoc -> SDoc -> SDoc
    <+> Role -> SDoc
    forall a. Outputable a => a -> SDoc
    ppr Role
    role'
              Maybe Role
    Nothing    -> SDoc -> TcRn ()
    report_error (SDoc -> TcRn ()) -> SDoc -> TcRn ()
    forall a b. (a -> b) -> a -> b
    $ String -> SDoc
    text String
    "type variable" SDoc -> SDoc -> SDoc
    <+> SDoc -> SDoc
    quotes (TyVar -> SDoc
    forall a. Outputable a => a -> SDoc
    ppr TyVar
    tv) SDoc -> SDoc -> SDoc
    <+>
                                           String -> SDoc
    text String
    "missing in environment"

        check_ty_roles VarEnv Role
    env Role
    Representational (TyConApp TyCon
    tc [Type]
    tys)
          = let roles' :: [Role]
    roles' = TyCon -> [Role]
    tyConRoles TyCon
    tc in
            (Role -> Type -> TcRn ()) -> [Role] -> [Type] -> 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' [Type]
    tys

        check_ty_roles VarEnv Role
    env Role
    Nominal (TyConApp TyCon
    _ [Type]
    tys)
          = (Type -> TcRn ()) -> [Type] -> 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) [Type]
    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 (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 AnonArgFlag
    _ 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 (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 (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 TyVar
    tv ArgFlag
    _) Type
    ty)
          =  VarEnv Role -> Role -> Type -> TcRn ()
    check_ty_roles VarEnv Role
    env Role
    Nominal (TyVar -> Type
    tyVarKind TyVar
    tv)
          TcRn () -> TcRn () -> TcRn ()
    forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
    >> VarEnv Role -> Role -> Type -> TcRn ()
    check_ty_roles (VarEnv Role -> TyVar -> Role -> VarEnv Role
    forall a. VarEnv a -> TyVar -> a -> VarEnv a
    extendVarEnv VarEnv Role
    env TyVar
    tv Role
    Nominal) Role
    role Type
    ty

        check_ty_roles VarEnv Role
    _   Role
    _    (LitTy {}) = () -> TcRn ()
    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
    $
            SDoc -> TcRn ()
    report_error (SDoc -> TcRn ()) -> SDoc -> TcRn ()
    forall a b. (a -> b) -> a -> b
    $ String -> SDoc
    text String
    "coercion" SDoc -> SDoc -> SDoc
    <+> Coercion -> SDoc
    forall a. Outputable a => a -> SDoc
    ppr Coercion
    co SDoc -> SDoc -> SDoc
    <+> String -> SDoc
    text String
    "has bad role" SDoc -> SDoc -> SDoc
    <+> Role -> SDoc
    forall a. Outputable a => a -> SDoc
    ppr Role
    role

        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 :: SDoc -> TcRn ()
    report_error SDoc
    doc
          = SDoc -> TcRn ()
    addErrTc (SDoc -> TcRn ()) -> SDoc -> TcRn ()
    forall a b. (a -> b) -> a -> b
    $ [SDoc] -> SDoc
    vcat [String -> SDoc
    text String
    "Internal error in role inference:",
                             SDoc
    doc,
                             String -> SDoc
    text String
    "Please report this as a GHC bug:  https://www.haskell.org/ghc/reportabug"]

    {-
    ************************************************************************
    *                                                                      *
                    Error messages
    *                                                                      *
    ************************************************************************
    -}

    tcMkDeclCtxt :: TyClDecl GhcRn -> SDoc
    tcMkDeclCtxt :: TyClDecl GhcRn -> SDoc
    tcMkDeclCtxt TyClDecl GhcRn
    decl = [SDoc] -> SDoc
    hsep [String -> SDoc
    text String
    "In the", TyClDecl GhcRn -> SDoc
    forall (p :: Pass). TyClDecl (GhcPass p) -> SDoc
    pprTyClDeclFlavour TyClDecl GhcRn
    decl,
                          String -> SDoc
    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 SAK) here
    addVDQNote :: forall a. TyCon -> TcM a -> TcM a
    addVDQNote TyCon
    tycon TcM a
    thing_inside
      | ASSERT2( isTcTyCon tycon, ppr tycon )
        ASSERT2( not (tcTyConIsPoly tycon), ppr tycon $$ ppr 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 -> TyVar
    forall tv argf. VarBndr tv argf -> tv
    binderVar TyConBinder
    tcb TyVar -> 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
    vcat
          [ String -> SDoc
    text String
    "NB: Type" SDoc -> SDoc -> SDoc
    <+> SDoc -> SDoc
    quotes (TyCon -> SDoc
    forall a. Outputable a => a -> SDoc
    ppr TyCon
    tycon) SDoc -> SDoc -> SDoc
    <+>
            String -> SDoc
    text String
    "was inferred to use visible dependent quantification."
          , String -> SDoc
    text String
    "Most types with visible dependent quantification are"
          , String -> SDoc
    text String
    "polymorphically recursive and need a standalone kind"
          , String -> SDoc
    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
    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
    <+> String -> SDoc
    text String
    "instance")
                        (GenLocated SrcSpanAnnN 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
    hsep [ String -> SDoc
    text String
    "In the" SDoc -> SDoc -> SDoc
    <+> SDoc
    flavour SDoc -> SDoc -> SDoc
    <+> String -> SDoc
    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
    text String
    "In the equations for closed type family" SDoc -> SDoc -> SDoc
    <+>
               SDoc -> SDoc
    quotes (TyCon -> SDoc
    forall a. Outputable a => a -> SDoc
    ppr TyCon
    tc)

    resultTypeMisMatch :: FieldLabelString -> DataCon -> DataCon -> SDoc
    resultTypeMisMatch :: FieldLabelString -> DataCon -> DataCon -> SDoc
    resultTypeMisMatch FieldLabelString
    field_name DataCon
    con1 DataCon
    con2
      = [SDoc] -> SDoc
    vcat [[SDoc] -> SDoc
    sep [String -> SDoc
    text String
    "Constructors" SDoc -> SDoc -> SDoc
    <+> DataCon -> SDoc
    forall a. Outputable a => a -> SDoc
    ppr DataCon
    con1 SDoc -> SDoc -> SDoc
    <+> String -> SDoc
    text String
    "and" SDoc -> SDoc -> SDoc
    <+> DataCon -> SDoc
    forall a. Outputable a => a -> SDoc
    ppr DataCon
    con2,
                    String -> SDoc
    text String
    "have a common field" SDoc -> SDoc -> SDoc
    <+> SDoc -> SDoc
    quotes (FieldLabelString -> SDoc
    forall a. Outputable a => a -> SDoc
    ppr FieldLabelString
    field_name) SDoc -> SDoc -> SDoc
    <> SDoc
    comma],
              Arity -> SDoc -> SDoc
    nest Arity
    2 (SDoc -> SDoc) -> SDoc -> SDoc
    forall a b. (a -> b) -> a -> b
    $ String -> SDoc
    text String
    "but have different result types"]

    fieldTypeMisMatch :: FieldLabelString -> DataCon -> DataCon -> SDoc
    fieldTypeMisMatch :: FieldLabelString -> DataCon -> DataCon -> SDoc
    fieldTypeMisMatch FieldLabelString
    field_name DataCon
    con1 DataCon
    con2
      = [SDoc] -> SDoc
    sep [String -> SDoc
    text String
    "Constructors" SDoc -> SDoc -> SDoc
    <+> DataCon -> SDoc
    forall a. Outputable a => a -> SDoc
    ppr DataCon
    con1 SDoc -> SDoc -> SDoc
    <+> String -> SDoc
    text String
    "and" SDoc -> SDoc -> SDoc
    <+> DataCon -> SDoc
    forall a. Outputable a => a -> SDoc
    ppr DataCon
    con2,
             String -> SDoc
    text String
    "give different types for field", SDoc -> SDoc
    quotes (FieldLabelString -> SDoc
    forall a. Outputable a => a -> SDoc
    ppr FieldLabelString
    field_name)]

    dataConCtxt :: [LocatedN Name] -> SDoc
    dataConCtxt :: [GenLocated SrcSpanAnnN Name] -> SDoc
    dataConCtxt [GenLocated SrcSpanAnnN Name]
    cons = String -> SDoc
    text String
    "In the definition of data constructor" SDoc -> SDoc -> SDoc
    <> [GenLocated SrcSpanAnnN Name] -> SDoc
    forall a. [a] -> SDoc
    plural [GenLocated SrcSpanAnnN Name]
    cons
                       SDoc -> SDoc -> SDoc
    <+> [GenLocated SrcSpanAnnN Name] -> SDoc
    ppr_cons [GenLocated SrcSpanAnnN Name]
    cons

    dataConResCtxt :: [LocatedN Name] -> SDoc
    dataConResCtxt :: [GenLocated SrcSpanAnnN Name] -> SDoc
    dataConResCtxt [GenLocated SrcSpanAnnN Name]
    cons = String -> SDoc
    text String
    "In the result type of data constructor" SDoc -> SDoc -> SDoc
    <> [GenLocated SrcSpanAnnN Name] -> SDoc
    forall a. [a] -> SDoc
    plural [GenLocated SrcSpanAnnN Name]
    cons
                          SDoc -> SDoc -> SDoc
    <+> [GenLocated SrcSpanAnnN Name] -> SDoc
    ppr_cons [GenLocated SrcSpanAnnN Name]
    cons

    ppr_cons :: [LocatedN Name] -> SDoc
    ppr_cons :: [GenLocated SrcSpanAnnN Name] -> SDoc
    ppr_cons [GenLocated SrcSpanAnnN Name
    con] = SDoc -> SDoc
    quotes (GenLocated SrcSpanAnnN Name -> SDoc
    forall a. Outputable a => a -> SDoc
    ppr GenLocated SrcSpanAnnN Name
    con)
    ppr_cons [GenLocated SrcSpanAnnN Name]
    cons  = [GenLocated SrcSpanAnnN Name] -> SDoc
    forall a. Outputable a => [a] -> SDoc
    interpp'SP [GenLocated SrcSpanAnnN Name]
    cons

    classOpCtxt :: Var -> Type -> SDoc
    classOpCtxt :: TyVar -> Type -> SDoc
    classOpCtxt TyVar
    sel_id Type
    tau = [SDoc] -> SDoc
    sep [String -> SDoc
    text String
    "When checking the class method:",
                                  Arity -> SDoc -> SDoc
    nest Arity
    2 (TyVar -> SDoc
    forall a. OutputableBndr a => a -> SDoc
    pprPrefixOcc TyVar
    sel_id SDoc -> SDoc -> SDoc
    <+> SDoc
    dcolon SDoc -> SDoc -> SDoc
    <+> Type -> SDoc
    forall a. Outputable a => a -> SDoc
    ppr Type
    tau)]

    classArityErr :: Int -> Class -> SDoc
    classArityErr :: Arity -> Class -> SDoc
    classArityErr Arity
    n Class
    cls
        | Arity
    n Arity -> Arity -> Bool
    forall a. Eq a => a -> a -> Bool
    == Arity
    0 = String -> String -> SDoc
    mkErr String
    "No" String
    "no-parameter"
        | Bool
    otherwise = String -> String -> SDoc
    mkErr String
    "Too many" String
    "multi-parameter"
      where
        mkErr :: String -> String -> SDoc
    mkErr String
    howMany String
    allowWhat =
            [SDoc] -> SDoc
    vcat [String -> SDoc
    text (String
    howMany String -> String -> String
    forall a. [a] -> [a] -> [a]
    ++ String
    " parameters for class") SDoc -> SDoc -> SDoc
    <+> SDoc -> SDoc
    quotes (Class -> SDoc
    forall a. Outputable a => a -> SDoc
    ppr Class
    cls),
                  SDoc -> SDoc
    parens (String -> SDoc
    text (String
    "Enable MultiParamTypeClasses to allow "
                                        String -> String -> String
    forall a. [a] -> [a] -> [a]
    ++ String
    allowWhat String -> String -> String
    forall a. [a] -> [a] -> [a]
    ++ String
    " classes"))]

    classFunDepsErr :: Class -> SDoc
    classFunDepsErr :: Class -> SDoc
    classFunDepsErr Class
    cls
      = [SDoc] -> SDoc
    vcat [String -> SDoc
    text String
    "Fundeps in class" SDoc -> SDoc -> SDoc
    <+> SDoc -> SDoc
    quotes (Class -> SDoc
    forall a. Outputable a => a -> SDoc
    ppr Class
    cls),
              SDoc -> SDoc
    parens (String -> SDoc
    text String
    "Enable FunctionalDependencies to allow fundeps")]

    badMethPred :: Id -> TcPredType -> SDoc
    badMethPred :: TyVar -> Type -> SDoc
    badMethPred TyVar
    sel_id Type
    pred
      = [SDoc] -> SDoc
    vcat [ SDoc -> Arity -> SDoc -> SDoc
    hang (String -> SDoc
    text String
    "Constraint" SDoc -> SDoc -> SDoc
    <+> SDoc -> SDoc
    quotes (Type -> SDoc
    forall a. Outputable a => a -> SDoc
    ppr Type
    pred)
                     SDoc -> SDoc -> SDoc
    <+> String -> SDoc
    text String
    "in the type of" SDoc -> SDoc -> SDoc
    <+> SDoc -> SDoc
    quotes (TyVar -> SDoc
    forall a. Outputable a => a -> SDoc
    ppr TyVar
    sel_id))
                  Arity
    2 (String -> SDoc
    text String
    "constrains only the class type variables")
             , String -> SDoc
    text String
    "Enable ConstrainedClassMethods to allow it" ]

    noClassTyVarErr :: Class -> TyCon -> SDoc
    noClassTyVarErr :: Class -> TyCon -> SDoc
    noClassTyVarErr Class
    clas TyCon
    fam_tc
      = [SDoc] -> SDoc
    sep [ String -> SDoc
    text String
    "The associated type" SDoc -> SDoc -> SDoc
    <+> SDoc -> SDoc
    quotes (TyCon -> SDoc
    forall a. Outputable a => a -> SDoc
    ppr TyCon
    fam_tc SDoc -> SDoc -> SDoc
    <+> [SDoc] -> SDoc
    hsep ((TyVar -> SDoc) -> [TyVar] -> [SDoc]
    forall a b. (a -> b) -> [a] -> [b]
    map TyVar -> SDoc
    forall a. Outputable a => a -> SDoc
    ppr (TyCon -> [TyVar]
    tyConTyVars TyCon
    fam_tc)))
            , String -> SDoc
    text String
    "mentions none of the type or kind variables of the class" SDoc -> SDoc -> SDoc
    <+>
                    SDoc -> SDoc
    quotes (Class -> SDoc
    forall a. Outputable a => a -> SDoc
    ppr Class
    clas SDoc -> SDoc -> SDoc
    <+> [SDoc] -> SDoc
    hsep ((TyVar -> SDoc) -> [TyVar] -> [SDoc]
    forall a b. (a -> b) -> [a] -> [b]
    map TyVar -> SDoc
    forall a. Outputable a => a -> SDoc
    ppr (Class -> [TyVar]
    classTyVars Class
    clas)))]

    badDataConTyCon :: DataCon -> Type -> SDoc
    badDataConTyCon :: DataCon -> Type -> SDoc
    badDataConTyCon DataCon
    data_con Type
    res_ty_tmpl
      = SDoc -> Arity -> SDoc -> SDoc
    hang (String -> SDoc
    text String
    "Data constructor" SDoc -> SDoc -> SDoc
    <+> SDoc -> SDoc
    quotes (DataCon -> SDoc
    forall a. Outputable a => a -> SDoc
    ppr DataCon
    data_con) SDoc -> SDoc -> SDoc
    <+>
                    String -> SDoc
    text String
    "returns type" SDoc -> SDoc -> SDoc
    <+> SDoc -> SDoc
    quotes (Type -> SDoc
    forall a. Outputable a => a -> SDoc
    ppr Type
    actual_res_ty))
           Arity
    2 (String -> SDoc
    text String
    "instead of an instance of its parent type" SDoc -> SDoc -> SDoc
    <+> SDoc -> SDoc
    quotes (Type -> SDoc
    forall a. Outputable a => a -> SDoc
    ppr Type
    res_ty_tmpl))
      where
        actual_res_ty :: Type
    actual_res_ty = DataCon -> Type
    dataConOrigResTy DataCon
    data_con

    badGadtDecl :: Name -> SDoc
    badGadtDecl :: Name -> SDoc
    badGadtDecl Name
    tc_name
      = [SDoc] -> SDoc
    vcat [ String -> SDoc
    text String
    "Illegal generalised algebraic data declaration for" SDoc -> SDoc -> SDoc
    <+> SDoc -> SDoc
    quotes (Name -> SDoc
    forall a. Outputable a => a -> SDoc
    ppr Name
    tc_name)
             , Arity -> SDoc -> SDoc
    nest Arity
    2 (SDoc -> SDoc
    parens (SDoc -> SDoc) -> SDoc -> SDoc
    forall a b. (a -> b) -> a -> b
    $ String -> SDoc
    text String
    "Enable the GADTs extension to allow this") ]

    badExistential :: DataCon -> SDoc
    badExistential :: DataCon -> SDoc
    badExistential DataCon
    con
      = (SDocContext -> Bool) -> (Bool -> SDoc) -> SDoc
    forall a. (SDocContext -> a) -> (a -> SDoc) -> SDoc
    sdocOption SDocContext -> Bool
    sdocLinearTypes (\Bool
    show_linear_types ->
          SDoc -> Arity -> SDoc -> SDoc
    hang (String -> SDoc
    text String
    "Data constructor" SDoc -> SDoc -> SDoc
    <+> SDoc -> SDoc
    quotes (DataCon -> SDoc
    forall a. Outputable a => a -> SDoc
    ppr DataCon
    con) SDoc -> SDoc -> SDoc
    <+>
                      String -> SDoc
    text String
    "has existential type variables, a context, or a specialised result type")
             Arity
    2 ([SDoc] -> SDoc
    vcat [ DataCon -> SDoc
    forall a. Outputable a => a -> SDoc
    ppr DataCon
    con SDoc -> SDoc -> SDoc
    <+> SDoc
    dcolon SDoc -> SDoc -> SDoc
    <+> Type -> SDoc
    forall a. Outputable a => a -> SDoc
    ppr (Bool -> DataCon -> Type
    dataConDisplayType Bool
    show_linear_types DataCon
    con)
                     , SDoc -> SDoc
    parens (SDoc -> SDoc) -> SDoc -> SDoc
    forall a b. (a -> b) -> a -> b
    $ String -> SDoc
    text String
    "Enable ExistentialQuantification or GADTs to allow this" ]))

    badStupidTheta :: Name -> SDoc
    badStupidTheta :: Name -> SDoc
    badStupidTheta Name
    tc_name
      = String -> SDoc
    text String
    "A data type declared in GADT style cannot have a context:" SDoc -> SDoc -> SDoc
    <+> SDoc -> SDoc
    quotes (Name -> SDoc
    forall a. Outputable a => a -> SDoc
    ppr Name
    tc_name)

    newtypeConError :: Name -> Int -> SDoc
    newtypeConError :: Name -> Arity -> SDoc
    newtypeConError Name
    tycon Arity
    n
      = [SDoc] -> SDoc
    sep [String -> SDoc
    text String
    "A newtype must have exactly one constructor,",
             Arity -> SDoc -> SDoc
    nest Arity
    2 (SDoc -> SDoc) -> SDoc -> SDoc
    forall a b. (a -> b) -> a -> b
    $ String -> SDoc
    text String
    "but" SDoc -> SDoc -> SDoc
    <+> SDoc -> SDoc
    quotes (Name -> SDoc
    forall a. Outputable a => a -> SDoc
    ppr Name
    tycon) SDoc -> SDoc -> SDoc
    <+> String -> SDoc
    text String
    "has" SDoc -> SDoc -> SDoc
    <+> Arity -> SDoc
    speakN Arity
    n ]

    newtypeStrictError :: DataCon -> SDoc
    newtypeStrictError :: DataCon -> SDoc
    newtypeStrictError DataCon
    con
      = [SDoc] -> SDoc
    sep [String -> SDoc
    text String
    "A newtype constructor cannot have a strictness annotation,",
             Arity -> SDoc -> SDoc
    nest Arity
    2 (SDoc -> SDoc) -> SDoc -> SDoc
    forall a b. (a -> b) -> a -> b
    $ String -> SDoc
    text String
    "but" SDoc -> SDoc -> SDoc
    <+> SDoc -> SDoc
    quotes (DataCon -> SDoc
    forall a. Outputable a => a -> SDoc
    ppr DataCon
    con) SDoc -> SDoc -> SDoc
    <+> String -> SDoc
    text String
    "does"]

    newtypeFieldErr :: DataCon -> Int -> SDoc
    newtypeFieldErr :: DataCon -> Arity -> SDoc
    newtypeFieldErr DataCon
    con_name Arity
    n_flds
      = [SDoc] -> SDoc
    sep [String -> SDoc
    text String
    "The constructor of a newtype must have exactly one field",
             Arity -> SDoc -> SDoc
    nest Arity
    2 (SDoc -> SDoc) -> SDoc -> SDoc
    forall a b. (a -> b) -> a -> b
    $ String -> SDoc
    text String
    "but" SDoc -> SDoc -> SDoc
    <+> SDoc -> SDoc
    quotes (DataCon -> SDoc
    forall a. Outputable a => a -> SDoc
    ppr DataCon
    con_name) SDoc -> SDoc -> SDoc
    <+> String -> SDoc
    text String
    "has" SDoc -> SDoc -> SDoc
    <+> Arity -> SDoc
    speakN Arity
    n_flds]

    badSigTyDecl :: Name -> SDoc
    badSigTyDecl :: Name -> SDoc
    badSigTyDecl Name
    tc_name
      = [SDoc] -> SDoc
    vcat [ String -> SDoc
    text String
    "Illegal kind signature" SDoc -> SDoc -> SDoc
    <+>
               SDoc -> SDoc
    quotes (Name -> SDoc
    forall a. Outputable a => a -> SDoc
    ppr Name
    tc_name)
             , Arity -> SDoc -> SDoc
    nest Arity
    2 (SDoc -> SDoc
    parens (SDoc -> SDoc) -> SDoc -> SDoc
    forall a b. (a -> b) -> a -> b
    $ String -> SDoc
    text String
    "Use KindSignatures to allow kind signatures") ]

    emptyConDeclsErr :: Name -> SDoc
    emptyConDeclsErr :: Name -> SDoc
    emptyConDeclsErr Name
    tycon
      = [SDoc] -> SDoc
    sep [SDoc -> SDoc
    quotes (Name -> SDoc
    forall a. Outputable a => a -> SDoc
    ppr Name
    tycon) SDoc -> SDoc -> SDoc
    <+> String -> SDoc
    text String
    "has no constructors",
             Arity -> SDoc -> SDoc
    nest Arity
    2 (SDoc -> SDoc) -> SDoc -> SDoc
    forall a b. (a -> b) -> a -> b
    $ String -> SDoc
    text String
    "(EmptyDataDecls permits this)"]

    wrongKindOfFamily :: TyCon -> SDoc
    wrongKindOfFamily :: TyCon -> SDoc
    wrongKindOfFamily TyCon
    family
      = String -> SDoc
    text String
    "Wrong category of family instance; declaration was for a"
        SDoc -> SDoc -> SDoc
    <+> SDoc
    kindOfFamily
      where
        kindOfFamily :: SDoc
    kindOfFamily | TyCon -> Bool
    isTypeFamilyTyCon TyCon
    family = String -> SDoc
    text String
    "type family"
                     | TyCon -> Bool
    isDataFamilyTyCon TyCon
    family = String -> SDoc
    text String
    "data family"
                     | Bool
    otherwise = String -> SDoc -> SDoc
    forall a. HasCallStack => String -> SDoc -> a
    pprPanic String
    "wrongKindOfFamily" (TyCon -> SDoc
    forall a. Outputable a => a -> SDoc
    ppr TyCon
    family)

    -- | Produce an error for oversaturated type family equations with too many
    -- required arguments.
    -- See Note [Oversaturated type family equations] in "GHC.Tc.Validity".
    wrongNumberOfParmsErr :: Arity -> SDoc
    wrongNumberOfParmsErr :: Arity -> SDoc
    wrongNumberOfParmsErr Arity
    max_args
      = String -> SDoc
    text String
    "Number of parameters must match family declaration; expected"
        SDoc -> SDoc -> SDoc
    <+> Arity -> SDoc
    forall a. Outputable a => a -> SDoc
    ppr Arity
    max_args

    badRoleAnnot :: Name -> Role -> Role -> SDoc
    badRoleAnnot :: Name -> Role -> Role -> SDoc
    badRoleAnnot Name
    var Role
    annot Role
    inferred
      = SDoc -> Arity -> SDoc -> SDoc
    hang (String -> SDoc
    text String
    "Role mismatch on variable" SDoc -> SDoc -> SDoc
    <+> Name -> SDoc
    forall a. Outputable a => a -> SDoc
    ppr Name
    var SDoc -> SDoc -> SDoc
    <> SDoc
    colon)
           Arity
    2 ([SDoc] -> SDoc
    sep [ String -> SDoc
    text String
    "Annotation says", Role -> SDoc
    forall a. Outputable a => a -> SDoc
    ppr Role
    annot
                  , String -> SDoc
    text String
    "but role", Role -> SDoc
    forall a. Outputable a => a -> SDoc
    ppr Role
    inferred
                  , String -> SDoc
    text String
    "is required" ])

    wrongNumberOfRoles :: [a] -> LRoleAnnotDecl GhcRn -> SDoc
    wrongNumberOfRoles :: forall a. [a] -> LRoleAnnotDecl GhcRn -> SDoc
    wrongNumberOfRoles [a]
    tyvars d :: LRoleAnnotDecl GhcRn
    d@(L SrcSpanAnnA
    _ (RoleAnnotDecl XCRoleAnnotDecl GhcRn
    _ LIdP GhcRn
    _ [XRec GhcRn (Maybe Role)]
    annots))
      = SDoc -> Arity -> SDoc -> SDoc
    hang (String -> SDoc
    text String
    "Wrong number of roles listed in role annotation;" SDoc -> SDoc -> SDoc
    $$
              String -> SDoc
    text String
    "Expected" SDoc -> SDoc -> SDoc
    <+> (Arity -> SDoc
    forall a. Outputable a => a -> SDoc
    ppr (Arity -> SDoc) -> Arity -> SDoc
    forall a b. (a -> b) -> a -> b
    $ [a] -> Arity
    forall (t :: * -> *) a. Foldable t => t a -> Arity
    length [a]
    tyvars) SDoc -> SDoc -> SDoc
    <> SDoc
    comma SDoc -> SDoc -> SDoc
    <+>
              String -> SDoc
    text String
    "got" SDoc -> SDoc -> SDoc
    <+> (Arity -> SDoc
    forall a. Outputable a => a -> SDoc
    ppr (Arity -> SDoc) -> Arity -> SDoc
    forall a b. (a -> b) -> a -> b
    $ [GenLocated SrcSpan (Maybe Role)] -> Arity
    forall (t :: * -> *) a. Foldable t => t a -> Arity
    length [GenLocated SrcSpan (Maybe Role)]
    [XRec GhcRn (Maybe Role)]
    annots) SDoc -> SDoc -> SDoc
    <> SDoc
    colon)
           Arity
    2 (GenLocated SrcSpanAnnA (RoleAnnotDecl GhcRn) -> SDoc
    forall a. Outputable a => a -> SDoc
    ppr GenLocated SrcSpanAnnA (RoleAnnotDecl GhcRn)
    LRoleAnnotDecl GhcRn
    d)

    illegalRoleAnnotDecl :: LRoleAnnotDecl GhcRn -> TcM ()
    illegalRoleAnnotDecl :: LRoleAnnotDecl GhcRn -> TcRn ()
    illegalRoleAnnotDecl (L SrcSpanAnnA
    loc (RoleAnnotDecl XCRoleAnnotDecl GhcRn
    _ LIdP GhcRn
    tycon [XRec GhcRn (Maybe 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. SrcSpanAnn' ann -> TcRn a -> TcRn a
    setSrcSpanA SrcSpanAnnA
    loc (TcRn () -> TcRn ()) -> TcRn () -> TcRn ()
    forall a b. (a -> b) -> a -> b
    $
        SDoc -> TcRn ()
    addErrTc (String -> SDoc
    text String
    "Illegal role annotation for" SDoc -> SDoc -> SDoc
    <+> GenLocated SrcSpanAnnN Name -> SDoc
    forall a. Outputable a => a -> SDoc
    ppr GenLocated SrcSpanAnnN Name
    LIdP GhcRn
    tycon SDoc -> SDoc -> SDoc
    <> Char -> SDoc
    char Char
    ';' SDoc -> SDoc -> SDoc
    $$
                  String -> SDoc
    text String
    "they are allowed only for datatypes and classes.")

    needXRoleAnnotations :: TyCon -> SDoc
    needXRoleAnnotations :: TyCon -> SDoc
    needXRoleAnnotations TyCon
    tc
      = String -> SDoc
    text String
    "Illegal role annotation for" SDoc -> SDoc -> SDoc
    <+> TyCon -> SDoc
    forall a. Outputable a => a -> SDoc
    ppr TyCon
    tc SDoc -> SDoc -> SDoc
    <> Char -> SDoc
    char Char
    ';' SDoc -> SDoc -> SDoc
    $$
        String -> SDoc
    text String
    "did you intend to use RoleAnnotations?"

    incoherentRoles :: SDoc
    incoherentRoles :: SDoc
    incoherentRoles = (String -> SDoc
    text String
    "Roles other than" SDoc -> SDoc -> SDoc
    <+> SDoc -> SDoc
    quotes (String -> SDoc
    text String
    "nominal") SDoc -> SDoc -> SDoc
    <+>
                       String -> SDoc
    text String
    "for class parameters can lead to incoherence.") SDoc -> SDoc -> SDoc
    $$
                      (String -> SDoc
    text String
    "Use IncoherentInstances to allow this; bad role found")

    wrongTyFamName :: Name -> Name -> SDoc
    wrongTyFamName :: Name -> Name -> SDoc
    wrongTyFamName Name
    fam_tc_name Name
    eqn_tc_name
      = SDoc -> Arity -> SDoc -> SDoc
    hang (String -> SDoc
    text String
    "Mismatched type name in type family instance.")
           Arity
    2 ([SDoc] -> SDoc
    vcat [ String -> SDoc
    text String
    "Expected:" SDoc -> SDoc -> SDoc
    <+> Name -> SDoc
    forall a. Outputable a => a -> SDoc
    ppr Name
    fam_tc_name
                   , String -> SDoc
    text String
    "  Actual:" SDoc -> SDoc -> SDoc
    <+> Name -> SDoc
    forall a. Outputable a => a -> SDoc
    ppr Name
    eqn_tc_name ])

    addTyConCtxt :: TyCon -> TcM a -> TcM a
    addTyConCtxt :: forall a. TyCon -> TcM a -> TcM a
    addTyConCtxt TyCon
    tc = Name -> TyConFlavour -> TcM a -> TcM a
    forall a. Name -> TyConFlavour -> TcM a -> TcM a
    addTyConFlavCtxt Name
    name TyConFlavour
    flav
      where
        name :: Name
    name = TyCon -> Name
    forall a. NamedThing a => a -> Name
    getName TyCon
    tc
        flav :: TyConFlavour
    flav = TyCon -> TyConFlavour
    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
    text String
    "while checking a role annotation for" SDoc -> SDoc -> SDoc
    <+> SDoc -> SDoc
    quotes (Name -> SDoc
    forall a. Outputable a => a -> SDoc
    ppr Name
    name)