From e8aa8ccba0c40884765281b21ff8f4411802dd41 Mon Sep 17 00:00:00 2001 From: Richard Eisenberg Date: Fri, 2 Aug 2013 15:47:03 +0100 Subject: [PATCH] Implement "roles" into GHC. Roles are a solution to the GeneralizedNewtypeDeriving type-safety problem. Roles were first described in the "Generative type abstraction" paper, by Stephanie Weirich, Dimitrios Vytiniotis, Simon PJ, and Steve Zdancewic. The implementation is a little different than that paper. For a quick primer, check out Note [Roles] in Coercion. Also see http://ghc.haskell.org/trac/ghc/wiki/Roles and http://ghc.haskell.org/trac/ghc/wiki/RolesImplementation For a more formal treatment, check out docs/core-spec/core-spec.pdf. This fixes Trac #1496, #4846, #7148. --- compiler/basicTypes/DataCon.lhs | 10 +- compiler/basicTypes/MkId.lhs | 14 +- compiler/cmm/SMRep.lhs | 42 +- compiler/coreSyn/CoreLint.lhs | 123 ++- compiler/coreSyn/CoreSubst.lhs | 8 +- compiler/coreSyn/CoreUtils.lhs | 16 +- compiler/coreSyn/ExternalCore.lhs | 29 +- compiler/coreSyn/MkExternalCore.lhs | 24 +- compiler/coreSyn/PprExternalCore.lhs | 60 +- compiler/coreSyn/TrieMap.lhs | 82 +- compiler/deSugar/DsBinds.lhs | 59 +- compiler/deSugar/DsForeign.lhs | 2 +- compiler/deSugar/DsMeta.hs | 106 ++- compiler/ghci/ByteCodeAsm.lhs | 16 +- compiler/hsSyn/Convert.lhs | 19 +- compiler/hsSyn/HsTypes.lhs | 25 +- compiler/hsSyn/HsUtils.lhs | 2 +- compiler/iface/BinIface.hs | 1 + compiler/iface/BuildTyCl.lhs | 43 +- compiler/iface/IfaceSyn.lhs | 128 ++- compiler/iface/IfaceType.lhs | 343 +++++--- compiler/iface/MkIface.lhs | 19 +- compiler/iface/TcIface.lhs | 75 +- compiler/main/DynFlags.hs | 2 + compiler/parser/Lexer.x | 31 +- compiler/parser/Parser.y.pp | 26 +- compiler/parser/ParserCore.y | 7 +- compiler/parser/RdrHsSyn.lhs | 8 +- compiler/prelude/PrelNames.lhs | 4 +- compiler/prelude/PrelRules.lhs | 4 +- compiler/prelude/TysPrim.lhs | 62 +- compiler/prelude/TysWiredIn.lhs | 4 + compiler/rename/RnTypes.lhs | 43 +- compiler/simplCore/SimplUtils.lhs | 2 +- compiler/specialise/Rules.lhs | 7 +- compiler/specialise/SpecConstr.lhs | 2 +- compiler/stranal/WwLib.lhs | 4 +- compiler/typecheck/TcDeriv.lhs | 16 +- compiler/typecheck/TcEvidence.lhs | 8 +- compiler/typecheck/TcForeign.lhs | 48 +- compiler/typecheck/TcGenGenerics.lhs | 2 +- compiler/typecheck/TcHsType.lhs | 105 ++- compiler/typecheck/TcInstDcls.lhs | 13 +- compiler/typecheck/TcInteract.lhs | 3 +- compiler/typecheck/TcRnDriver.lhs | 12 +- compiler/typecheck/TcSplice.lhs | 42 +- compiler/typecheck/TcTyClsDecls.lhs | 302 +++++-- compiler/typecheck/TcTyDecls.lhs | 293 ++++++- compiler/typecheck/TcType.lhs | 7 +- compiler/types/Class.lhs | 6 +- compiler/types/CoAxiom.lhs | 82 +- compiler/types/Coercion.lhs | 802 +++++++++++++----- compiler/types/FamInstEnv.lhs | 78 +- compiler/types/OptCoercion.lhs | 199 +++-- compiler/types/TyCon.lhs | 110 ++- compiler/types/Type.lhs | 9 +- compiler/types/TypeRep.lhs | 2 +- compiler/utils/Maybes.lhs | 5 + compiler/utils/UniqFM.lhs | 2 +- compiler/utils/Util.lhs | 10 +- .../vectorise/Vectorise/Generic/PAMethods.hs | 8 +- compiler/vectorise/Vectorise/Generic/PData.hs | 1 + compiler/vectorise/Vectorise/Type/Env.hs | 2 +- .../vectorise/Vectorise/Type/TyConDecl.hs | 2 + compiler/vectorise/Vectorise/Utils/Base.hs | 4 +- compiler/vectorise/Vectorise/Utils/PADict.hs | 2 +- docs/core-spec/CoreLint.ott | 178 +++- docs/core-spec/CoreSyn.ott | 77 +- docs/core-spec/OpSem.ott | 2 +- docs/core-spec/README | 2 +- docs/core-spec/core-spec.mng | 54 +- docs/core-spec/core-spec.pdf | Bin 349150 -> 359837 bytes docs/users_guide/glasgow_exts.xml | 211 ++++- 73 files changed, 3091 insertions(+), 1060 deletions(-) diff --git a/compiler/basicTypes/DataCon.lhs b/compiler/basicTypes/DataCon.lhs index 42032d49a8..eba5c8b67d 100644 --- a/compiler/basicTypes/DataCon.lhs +++ b/compiler/basicTypes/DataCon.lhs @@ -650,11 +650,12 @@ mkDataCon name declared_infix | isJust (promotableTyCon_maybe rep_tycon) -- The TyCon is promotable only if all its datacons -- are, so the promoteType for prom_kind should succeed - = Just (mkPromotedDataCon con name (getUnique name) prom_kind arity) + = Just (mkPromotedDataCon con name (getUnique name) prom_kind roles) | otherwise = Nothing prom_kind = promoteType (dataConUserType con) - arity = dataConSourceArity con + roles = map (const Nominal) (univ_tvs ++ ex_tvs) ++ + map (const Representational) orig_arg_tys eqSpecPreds :: [(TyVar,Type)] -> ThetaType eqSpecPreds spec = [ mkEqPred (mkTyVarTy tv) ty | (tv,ty) <- spec ] @@ -996,6 +997,7 @@ dataConCannotMatch tys con \begin{code} buildAlgTyCon :: Name -> [TyVar] -- ^ Kind variables and type variables + -> [Role] -> Maybe CType -> ThetaType -- ^ Stupid theta -> AlgTyConRhs @@ -1005,14 +1007,14 @@ buildAlgTyCon :: Name -> TyConParent -> TyCon -buildAlgTyCon tc_name ktvs cType stupid_theta rhs +buildAlgTyCon tc_name ktvs roles cType stupid_theta rhs is_rec is_promotable gadt_syn parent = tc where kind = mkPiKinds ktvs liftedTypeKind -- tc and mb_promoted_tc are mutually recursive - tc = mkAlgTyCon tc_name kind ktvs cType stupid_theta + tc = mkAlgTyCon tc_name kind ktvs roles cType stupid_theta rhs parent is_rec gadt_syn mb_promoted_tc diff --git a/compiler/basicTypes/MkId.lhs b/compiler/basicTypes/MkId.lhs index 218033a4cf..14e29c1d99 100644 --- a/compiler/basicTypes/MkId.lhs +++ b/compiler/basicTypes/MkId.lhs @@ -547,7 +547,7 @@ mkDataConRep dflags fam_envs wrap_name data_con initial_wrap_app = Var (dataConWorkId data_con) `mkTyApps` res_ty_args `mkVarApps` ex_tvs - `mkCoApps` map (mkReflCo . snd) eq_spec + `mkCoApps` map (mkReflCo Nominal . snd) eq_spec -- Dont box the eq_spec coercions since they are -- marked as HsUnpack by mk_dict_strict_mark @@ -823,7 +823,7 @@ wrapNewTypeBody tycon args result_expr wrapFamInstBody tycon args $ mkCast result_expr (mkSymCo co) where - co = mkUnbranchedAxInstCo (newTyConCo tycon) args + co = mkUnbranchedAxInstCo Representational (newTyConCo tycon) args -- When unwrapping, we do *not* apply any family coercion, because this will -- be done via a CoPat by the type checker. We have to do it this way as @@ -833,7 +833,7 @@ wrapNewTypeBody tycon args result_expr unwrapNewTypeBody :: TyCon -> [Type] -> CoreExpr -> CoreExpr unwrapNewTypeBody tycon args result_expr = ASSERT( isNewTyCon tycon ) - mkCast result_expr (mkUnbranchedAxInstCo (newTyConCo tycon) args) + mkCast result_expr (mkUnbranchedAxInstCo Representational (newTyConCo tycon) args) -- If the type constructor is a representation type of a data instance, wrap -- the expression into a cast adjusting the expression type, which is an @@ -843,7 +843,7 @@ unwrapNewTypeBody tycon args result_expr wrapFamInstBody :: TyCon -> [Type] -> CoreExpr -> CoreExpr wrapFamInstBody tycon args body | Just co_con <- tyConFamilyCoercion_maybe tycon - = mkCast body (mkSymCo (mkUnbranchedAxInstCo co_con args)) + = mkCast body (mkSymCo (mkUnbranchedAxInstCo Representational co_con args)) | otherwise = body @@ -851,7 +851,7 @@ wrapFamInstBody tycon args body -- represented by a `CoAxiom`, and not a `TyCon` wrapTypeFamInstBody :: CoAxiom br -> Int -> [Type] -> CoreExpr -> CoreExpr wrapTypeFamInstBody axiom ind args body - = mkCast body (mkSymCo (mkAxInstCo axiom ind args)) + = mkCast body (mkSymCo (mkAxInstCo Representational axiom ind args)) wrapTypeUnbranchedFamInstBody :: CoAxiom Unbranched -> [Type] -> CoreExpr -> CoreExpr wrapTypeUnbranchedFamInstBody axiom @@ -860,13 +860,13 @@ wrapTypeUnbranchedFamInstBody axiom unwrapFamInstScrut :: TyCon -> [Type] -> CoreExpr -> CoreExpr unwrapFamInstScrut tycon args scrut | Just co_con <- tyConFamilyCoercion_maybe tycon - = mkCast scrut (mkUnbranchedAxInstCo co_con args) -- data instances only + = mkCast scrut (mkUnbranchedAxInstCo Representational co_con args) -- data instances only | otherwise = scrut unwrapTypeFamInstScrut :: CoAxiom br -> Int -> [Type] -> CoreExpr -> CoreExpr unwrapTypeFamInstScrut axiom ind args scrut - = mkCast scrut (mkAxInstCo axiom ind args) + = mkCast scrut (mkAxInstCo Representational axiom ind args) unwrapTypeUnbranchedFamInstScrut :: CoAxiom Unbranched -> [Type] -> CoreExpr -> CoreExpr unwrapTypeUnbranchedFamInstScrut axiom diff --git a/compiler/cmm/SMRep.lhs b/compiler/cmm/SMRep.lhs index 6f569ef6fa..c54f6d5f9d 100644 --- a/compiler/cmm/SMRep.lhs +++ b/compiler/cmm/SMRep.lhs @@ -16,6 +16,11 @@ module SMRep ( WordOff, ByteOff, roundUpToWords, +#if __GLASGOW_HASKELL__ > 706 + -- ** Immutable arrays of StgWords + UArrayStgWord, listArray, toByteArray, +#endif + -- * Closure repesentation SMRep(..), -- CmmInfo sees the rep; no one else does IsStatic, @@ -49,8 +54,13 @@ import DynFlags import Outputable import Platform import FastString +import qualified Data.Array.Base as Array + +#if __GLASGOW_HASKELL__ > 706 +import GHC.Base ( ByteArray# ) +import Data.Ix +#endif -import Data.Array.Base import Data.Char( ord ) import Data.Word import Data.Bits @@ -80,7 +90,11 @@ newtype StgWord = StgWord Word64 #if __GLASGOW_HASKELL__ < 706 Num, #endif - Bits, IArray UArray) + +#if __GLASGOW_HASKELL__ <= 706 + Array.IArray Array.UArray, +#endif + Bits) fromStgWord :: StgWord -> Integer fromStgWord (StgWord i) = toInteger i @@ -125,6 +139,30 @@ hALF_WORD_SIZE_IN_BITS :: DynFlags -> Int hALF_WORD_SIZE_IN_BITS dflags = platformWordSize (targetPlatform dflags) `shiftL` 2 \end{code} +%************************************************************************ +%* * + Immutable arrays of StgWords +%* * +%************************************************************************ + +\begin{code} + +#if __GLASGOW_HASKELL__ > 706 +-- TODO: Improve with newtype coercions! + +newtype UArrayStgWord i = UArrayStgWord (Array.UArray i Word64) + +listArray :: Ix i => (i, i) -> [StgWord] -> UArrayStgWord i +listArray (i,j) words + = UArrayStgWord $ Array.listArray (i,j) (map unStgWord words) + where unStgWord (StgWord w64) = w64 + +toByteArray :: UArrayStgWord i -> ByteArray# +toByteArray (UArrayStgWord (Array.UArray _ _ _ b)) = b + +#endif + +\end{code} %************************************************************************ %* * diff --git a/compiler/coreSyn/CoreLint.lhs b/compiler/coreSyn/CoreLint.lhs index f9256e18ad..5befacdd45 100644 --- a/compiler/coreSyn/CoreLint.lhs +++ b/compiler/coreSyn/CoreLint.lhs @@ -24,7 +24,6 @@ import Demand import CoreSyn import CoreFVs import CoreUtils -import Pair import Bag import Literal import DataCon @@ -306,7 +305,8 @@ lintCoreExpr (Lit lit) lintCoreExpr (Cast expr co) = do { expr_ty <- lintCoreExpr expr ; co' <- applySubstCo co - ; (_, from_ty, to_ty) <- lintCoercion co' + ; (_, from_ty, to_ty, r) <- lintCoercion co' + ; checkRole co' Representational r ; checkTys from_ty expr_ty (mkCastErr expr co' from_ty expr_ty) ; return to_ty } @@ -400,9 +400,9 @@ lintCoreExpr (Type ty) = pprPanic "lintCoreExpr" (ppr ty) lintCoreExpr (Coercion co) - = do { co' <- lintInCo co - ; let Pair ty1 ty2 = coercionKind co' - ; return (mkCoercionType ty1 ty2) } + = do { (_kind, ty1, ty2, role) <- lintInCo co + ; checkRole co Nominal role + ; return (mkCoercionType role ty1 ty2) } \end{code} @@ -804,49 +804,56 @@ lint_app doc kfn kas %************************************************************************ \begin{code} -lintInCo :: InCoercion -> LintM OutCoercion +lintInCo :: InCoercion -> LintM (LintedKind, LintedType, LintedType, Role) -- Check the coercion, and apply the substitution to it -- See Note [Linting type lets] lintInCo co = addLoc (InCo co) $ do { co' <- applySubstCo co - ; _ <- lintCoercion co' - ; return co' } + ; lintCoercion co' } -lintCoercion :: OutCoercion -> LintM (LintedKind, LintedType, LintedType) +lintCoercion :: OutCoercion -> LintM (LintedKind, LintedType, LintedType, Role) -- Check the kind of a coercion term, returning the kind -- Post-condition: the returned OutTypes are lint-free -- and have the same kind as each other -- If you edit this function, you may need to update the GHC formalism -- See Note [GHC Formalism] -lintCoercion (Refl ty) +lintCoercion (Refl r ty) = do { k <- lintType ty - ; return (k, ty, ty) } + ; return (k, ty, ty, r) } -lintCoercion co@(TyConAppCo tc cos) +lintCoercion co@(TyConAppCo r tc cos) | tc `hasKey` funTyConKey , [co1,co2] <- cos - = do { (k1,s1,t1) <- lintCoercion co1 - ; (k2,s2,t2) <- lintCoercion co2 + = do { (k1,s1,t1,r1) <- lintCoercion co1 + ; (k2,s2,t2,r2) <- lintCoercion co2 ; rk <- lintArrow (ptext (sLit "coercion") <+> quotes (ppr co)) k1 k2 - ; return (rk, mkFunTy s1 s2, mkFunTy t1 t2) } + ; checkRole co1 r r1 + ; checkRole co2 r r2 + ; return (rk, mkFunTy s1 s2, mkFunTy t1 t2, r) } | otherwise - = do { (ks,ss,ts) <- mapAndUnzip3M lintCoercion cos + = do { (ks,ss,ts,rs) <- mapAndUnzip4M lintCoercion cos ; rk <- lint_co_app co (tyConKind tc) (ss `zip` ks) - ; return (rk, mkTyConApp tc ss, mkTyConApp tc ts) } + ; _ <- zipWith3M checkRole cos (tyConRolesX r tc) rs + ; return (rk, mkTyConApp tc ss, mkTyConApp tc ts, r) } lintCoercion co@(AppCo co1 co2) - = do { (k1,s1,t1) <- lintCoercion co1 - ; (k2,s2,t2) <- lintCoercion co2 + = do { (k1,s1,t1,r1) <- lintCoercion co1 + ; (k2,s2,t2,r2) <- lintCoercion co2 ; rk <- lint_co_app co k1 [(s2,k2)] - ; return (rk, mkAppTy s1 s2, mkAppTy t1 t2) } + ; if r1 == Phantom + then checkL (r2 == Phantom || r2 == Nominal) + (ptext (sLit "Second argument in AppCo cannot be R:") $$ + ppr co) + else checkRole co Nominal r2 + ; return (rk, mkAppTy s1 s2, mkAppTy t1 t2, r1) } lintCoercion (ForAllCo tv co) = do { lintTyBndrKind tv - ; (k, s, t) <- addInScopeVar tv (lintCoercion co) - ; return (k, mkForAllTy tv s, mkForAllTy tv t) } + ; (k, s, t, r) <- addInScopeVar tv (lintCoercion co) + ; return (k, mkForAllTy tv s, mkForAllTy tv t, r) } lintCoercion (CoVarCo cv) | not (isCoVar cv) @@ -857,52 +864,58 @@ lintCoercion (CoVarCo cv) ; cv' <- lookupIdInScope cv ; let (s,t) = coVarKind cv' k = typeKind s + r = coVarRole cv' ; when (isSuperKind k) $ - checkL (s `eqKind` t) (hang (ptext (sLit "Non-refl kind equality")) - 2 (ppr cv)) - ; return (k, s, t) } + do { checkL (r == Nominal) (hang (ptext (sLit "Non-nominal kind equality")) + 2 (ppr cv)) + ; checkL (s `eqKind` t) (hang (ptext (sLit "Non-refl kind equality")) + 2 (ppr cv)) } + ; return (k, s, t, r) } -lintCoercion (UnsafeCo ty1 ty2) +lintCoercion (UnivCo r ty1 ty2) = do { k1 <- lintType ty1 ; _k2 <- lintType ty2 -- ; unless (k1 `eqKind` k2) $ -- failWithL (hang (ptext (sLit "Unsafe coercion changes kind")) -- 2 (ppr co)) - ; return (k1, ty1, ty2) } + ; return (k1, ty1, ty2, r) } lintCoercion (SymCo co) - = do { (k, ty1, ty2) <- lintCoercion co - ; return (k, ty2, ty1) } + = do { (k, ty1, ty2, r) <- lintCoercion co + ; return (k, ty2, ty1, r) } lintCoercion co@(TransCo co1 co2) - = do { (k1, ty1a, ty1b) <- lintCoercion co1 - ; (_, ty2a, ty2b) <- lintCoercion co2 + = do { (k1, ty1a, ty1b, r1) <- lintCoercion co1 + ; (_, ty2a, ty2b, r2) <- lintCoercion co2 ; checkL (ty1b `eqType` ty2a) (hang (ptext (sLit "Trans coercion mis-match:") <+> ppr co) 2 (vcat [ppr ty1a, ppr ty1b, ppr ty2a, ppr ty2b])) - ; return (k1, ty1a, ty2b) } + ; checkRole co r1 r2 + ; return (k1, ty1a, ty2b, r1) } lintCoercion the_co@(NthCo n co) - = do { (_,s,t) <- lintCoercion co + = do { (_,s,t,r) <- lintCoercion co ; case (splitTyConApp_maybe s, splitTyConApp_maybe t) of (Just (tc_s, tys_s), Just (tc_t, tys_t)) | tc_s == tc_t , tys_s `equalLength` tys_t , n < length tys_s - -> return (ks, ts, tt) + -> return (ks, ts, tt, tr) where ts = getNth tys_s n tt = getNth tys_t n + tr = nthRole r tc_s n ks = typeKind ts _ -> failWithL (hang (ptext (sLit "Bad getNth:")) 2 (ppr the_co $$ ppr s $$ ppr t)) } lintCoercion the_co@(LRCo lr co) - = do { (_,s,t) <- lintCoercion co + = do { (_,s,t,r) <- lintCoercion co + ; checkRole co Nominal r ; case (splitAppTy_maybe s, splitAppTy_maybe t) of (Just s_pr, Just t_pr) - -> return (k, s_pick, t_pick) + -> return (k, s_pick, t_pick, Nominal) where s_pick = pickLR lr s_pr t_pick = pickLR lr t_pr @@ -912,13 +925,13 @@ lintCoercion the_co@(LRCo lr co) 2 (ppr the_co $$ ppr s $$ ppr t)) } lintCoercion (InstCo co arg_ty) - = do { (k,s,t) <- lintCoercion co - ; arg_kind <- lintType arg_ty + = do { (k,s,t,r) <- lintCoercion co + ; arg_kind <- lintType arg_ty ; case (splitForAllTy_maybe s, splitForAllTy_maybe t) of (Just (tv1,ty1), Just (tv2,ty2)) | arg_kind `isSubKind` tyVarKind tv1 -> return (k, substTyWith [tv1] [arg_ty] ty1, - substTyWith [tv2] [arg_ty] ty2) + substTyWith [tv2] [arg_ty] ty2, r) | otherwise -> failWithL (ptext (sLit "Kind mis-match in inst coercion")) _ -> failWithL (ptext (sLit "Bad argument of inst")) } @@ -927,27 +940,29 @@ lintCoercion co@(AxiomInstCo con ind cos) = do { unless (0 <= ind && ind < brListLength (coAxiomBranches con)) (bad_ax (ptext (sLit "index out of range"))) -- See Note [Kind instantiation in coercions] - ; let CoAxBranch { cab_tvs = ktvs - , cab_lhs = lhs - , cab_rhs = rhs } = coAxiomNthBranch con ind + ; let CoAxBranch { cab_tvs = ktvs + , cab_roles = roles + , cab_lhs = lhs + , cab_rhs = rhs } = coAxiomNthBranch con ind ; unless (equalLength ktvs cos) (bad_ax (ptext (sLit "lengths"))) ; in_scope <- getInScope ; let empty_subst = mkTvSubst in_scope emptyTvSubstEnv ; (subst_l, subst_r) <- foldlM check_ki (empty_subst, empty_subst) - (ktvs `zip` cos) + (zip3 ktvs roles cos) ; let lhs' = Type.substTys subst_l lhs rhs' = Type.substTy subst_r rhs ; case checkAxInstCo co of Just bad_branch -> bad_ax $ ptext (sLit "inconsistent with") <+> (pprCoAxBranch (coAxiomTyCon con) bad_branch) Nothing -> return () - ; return (typeKind rhs', mkTyConApp (coAxiomTyCon con) lhs', rhs') } + ; return (typeKind rhs', mkTyConApp (coAxiomTyCon con) lhs', rhs', coAxiomRole con) } where bad_ax what = addErrL (hang (ptext (sLit "Bad axiom application") <+> parens what) 2 (ppr co)) - check_ki (subst_l, subst_r) (ktv, co) - = do { (k, t1, t2) <- lintCoercion co + check_ki (subst_l, subst_r) (ktv, role, co) + = do { (k, t1, t2, r) <- lintCoercion co + ; checkRole co role r ; let ktv_kind = Type.substTy subst_l (tyVarKind ktv) -- Using subst_l is ok, because subst_l and subst_r -- must agree on kind equalities @@ -955,6 +970,11 @@ lintCoercion co@(AxiomInstCo con ind cos) (bad_ax (ptext (sLit "check_ki2") <+> vcat [ ppr co, ppr k, ppr ktv, ppr ktv_kind ] )) ; return (Type.extendTvSubst subst_l ktv t1, Type.extendTvSubst subst_r ktv t2) } + +lintCoercion co@(SubCo co') + = do { (k,s,t,r) <- lintCoercion co' + ; checkRole co Nominal r + ; return (k,s,t,Representational) } \end{code} %************************************************************************ @@ -1131,6 +1151,17 @@ checkTys :: OutType -> OutType -> MsgDoc -> LintM () -- annotations need only be consistent, not equal) -- Assumes ty1,ty2 are have alrady had the substitution applied checkTys ty1 ty2 msg = checkL (ty1 `eqType` ty2) msg + +checkRole :: Coercion + -> Role -- expected + -> Role -- actual + -> LintM () +checkRole co r1 r2 + = checkL (r1 == r2) + (ptext (sLit "Role incompatibility: expected") <+> ppr r1 <> comma <+> + ptext (sLit "got") <+> ppr r2 $$ + ptext (sLit "in") <+> ppr co) + \end{code} %************************************************************************ diff --git a/compiler/coreSyn/CoreSubst.lhs b/compiler/coreSyn/CoreSubst.lhs index bc9c767d29..25a751b423 100644 --- a/compiler/coreSyn/CoreSubst.lhs +++ b/compiler/coreSyn/CoreSubst.lhs @@ -1163,7 +1163,7 @@ data ConCont = CC [CoreExpr] Coercion -- where t1..tk are the *universally-qantified* type args of 'dc' exprIsConApp_maybe :: InScopeEnv -> CoreExpr -> Maybe (DataCon, [Type], [CoreExpr]) exprIsConApp_maybe (in_scope, id_unf) expr - = go (Left in_scope) expr (CC [] (mkReflCo (exprType expr))) + = go (Left in_scope) expr (CC [] (mkReflCo Representational (exprType expr))) where go :: Either InScopeSet Subst -> CoreExpr -> ConCont @@ -1252,9 +1252,11 @@ dealWithCoercion co dc dc_args -- Make the "theta" from Fig 3 of the paper gammas = decomposeCo tc_arity co - theta_subst = liftCoSubstWith + theta_subst = liftCoSubstWith Representational (dc_univ_tyvars ++ dc_ex_tyvars) - (gammas ++ map mkReflCo (stripTypeArgs ex_args)) + -- existentials are at role N + (gammas ++ map (mkReflCo Nominal) + (stripTypeArgs ex_args)) -- Cast the value arguments (which include dictionaries) new_val_args = zipWith cast_arg arg_tys val_args diff --git a/compiler/coreSyn/CoreUtils.lhs b/compiler/coreSyn/CoreUtils.lhs index 00f704f7c8..c872ac311e 100644 --- a/compiler/coreSyn/CoreUtils.lhs +++ b/compiler/coreSyn/CoreUtils.lhs @@ -187,9 +187,12 @@ mkCast (Coercion e_co) co = Coercion (mkCoCast e_co co) mkCast (Cast expr co2) co - = ASSERT(let { Pair from_ty _to_ty = coercionKind co; - Pair _from_ty2 to_ty2 = coercionKind co2} in - from_ty `eqType` to_ty2 ) + = WARN(let { Pair from_ty _to_ty = coercionKind co; + Pair _from_ty2 to_ty2 = coercionKind co2} in + not (from_ty `eqType` to_ty2), + vcat ([ ptext (sLit "expr:") <+> ppr expr + , ptext (sLit "co2:") <+> ppr co2 + , ptext (sLit "co:") <+> ppr co ]) ) mkCast expr (mkTransCo co2 co) mkCast expr co @@ -1602,7 +1605,7 @@ need to address that here. \begin{code} tryEtaReduce :: [Var] -> CoreExpr -> Maybe CoreExpr tryEtaReduce bndrs body - = go (reverse bndrs) body (mkReflCo (exprType body)) + = go (reverse bndrs) body (mkReflCo Representational (exprType body)) where incoming_arity = count isId bndrs @@ -1659,9 +1662,10 @@ tryEtaReduce bndrs body | Just tv <- getTyVar_maybe ty , bndr == tv = Just (mkForAllCo tv co) ok_arg bndr (Var v) co - | bndr == v = Just (mkFunCo (mkReflCo (idType bndr)) co) + | bndr == v = Just (mkFunCo Representational + (mkReflCo Representational (idType bndr)) co) ok_arg bndr (Cast (Var v) co_arg) co - | bndr == v = Just (mkFunCo (mkSymCo co_arg) co) + | bndr == v = Just (mkFunCo Representational (mkSymCo co_arg) co) -- The simplifier combines multiple casts into one, -- so we can have a simple-minded pattern match here ok_arg _ _ _ = Nothing diff --git a/compiler/coreSyn/ExternalCore.lhs b/compiler/coreSyn/ExternalCore.lhs index f002c3a3e5..ecc24b1155 100644 --- a/compiler/coreSyn/ExternalCore.lhs +++ b/compiler/coreSyn/ExternalCore.lhs @@ -34,7 +34,7 @@ data Exp | Lam Bind Exp | Let Vdefg Exp | Case Exp Vbind Ty [Alt] {- non-empty list -} - | Cast Exp Ty + | Cast Exp Coercion | Tick String Exp {- XXX probably wrong -} | External String String Ty {- target name, convention, and type -} | DynExternal String Ty {- convention and type (incl. Addr# of target as first arg) -} @@ -52,23 +52,30 @@ data Alt type Vbind = (Var,Ty) type Tbind = (Tvar,Kind) --- Internally, we represent types and coercions separately; but for --- the purposes of external core (at least for now) it's still --- convenient to collapse them into a single type. data Ty = Tvar Tvar | Tcon (Qual Tcon) | Tapp Ty Ty | Tforall Tbind Ty + +data Coercion -- We distinguish primitive coercions because External Core treats -- them specially, so we have to print them out with special syntax. - | TransCoercion Ty Ty - | SymCoercion Ty - | UnsafeCoercion Ty Ty - | InstCoercion Ty Ty - | NthCoercion Int Ty - | AxiomCoercion (Qual Tcon) Int [Ty] - | LRCoercion LeftOrRight Ty + = ReflCoercion Role Ty + | SymCoercion Coercion + | TransCoercion Coercion Coercion + | TyConAppCoercion Role (Qual Tcon) [Coercion] + | AppCoercion Coercion Coercion + | ForAllCoercion Tbind Coercion + | CoVarCoercion Var + | UnivCoercion Role Ty Ty + | InstCoercion Coercion Ty + | NthCoercion Int Coercion + | AxiomCoercion (Qual Tcon) Int [Coercion] + | LRCoercion LeftOrRight Coercion + | SubCoercion Coercion + +data Role = Nominal | Representational | Phantom data LeftOrRight = CLeft | CRight diff --git a/compiler/coreSyn/MkExternalCore.lhs b/compiler/coreSyn/MkExternalCore.lhs index e84dff900d..a0776af218 100644 --- a/compiler/coreSyn/MkExternalCore.lhs +++ b/compiler/coreSyn/MkExternalCore.lhs @@ -309,29 +309,29 @@ make_var_qid dflags force_unqual = make_qid dflags force_unqual True make_con_qid :: DynFlags -> Name -> C.Qual C.Id make_con_qid dflags = make_qid dflags False False -make_co :: DynFlags -> Coercion -> C.Ty -make_co dflags (Refl ty) = make_ty dflags ty -make_co dflags (TyConAppCo tc cos) = make_conAppCo dflags (qtc dflags tc) cos -make_co dflags (AppCo c1 c2) = C.Tapp (make_co dflags c1) (make_co dflags c2) -make_co dflags (ForAllCo tv co) = C.Tforall (make_tbind tv) (make_co dflags co) -make_co _ (CoVarCo cv) = C.Tvar (make_var_id (coVarName cv)) +make_co :: DynFlags -> Coercion -> C.Coercion +make_co dflags (Refl r ty) = C.ReflCoercion (make_role r) $ make_ty dflags ty +make_co dflags (TyConAppCo r tc cos) = C.TyConAppCoercion (make_role r) (qtc dflags tc) (map (make_co dflags) cos) +make_co dflags (AppCo c1 c2) = C.AppCoercion (make_co dflags c1) (make_co dflags c2) +make_co dflags (ForAllCo tv co) = C.ForAllCoercion (make_tbind tv) (make_co dflags co) +make_co _ (CoVarCo cv) = C.CoVarCoercion (make_var_id (coVarName cv)) make_co dflags (AxiomInstCo cc ind cos) = C.AxiomCoercion (qcc dflags cc) ind (map (make_co dflags) cos) -make_co dflags (UnsafeCo t1 t2) = C.UnsafeCoercion (make_ty dflags t1) (make_ty dflags t2) +make_co dflags (UnivCo r t1 t2) = C.UnivCoercion (make_role r) (make_ty dflags t1) (make_ty dflags t2) make_co dflags (SymCo co) = C.SymCoercion (make_co dflags co) make_co dflags (TransCo c1 c2) = C.TransCoercion (make_co dflags c1) (make_co dflags c2) make_co dflags (NthCo d co) = C.NthCoercion d (make_co dflags co) make_co dflags (LRCo lr co) = C.LRCoercion (make_lr lr) (make_co dflags co) make_co dflags (InstCo co ty) = C.InstCoercion (make_co dflags co) (make_ty dflags ty) +make_co dflags (SubCo co) = C.SubCoercion (make_co dflags co) make_lr :: LeftOrRight -> C.LeftOrRight make_lr CLeft = C.CLeft make_lr CRight = C.CRight --- Used for both tycon app coercions and axiom instantiations. -make_conAppCo :: DynFlags -> C.Qual C.Tcon -> [Coercion] -> C.Ty -make_conAppCo dflags con cos = - foldl C.Tapp (C.Tcon con) - (map (make_co dflags) cos) +make_role :: Role -> C.Role +make_role Nominal = C.Nominal +make_role Representational = C.Representational +make_role Phantom = C.Phantom ------- isALocal :: Name -> CoreM Bool diff --git a/compiler/coreSyn/PprExternalCore.lhs b/compiler/coreSyn/PprExternalCore.lhs index 24ee560cb1..7fd3ac1d65 100644 --- a/compiler/coreSyn/PprExternalCore.lhs +++ b/compiler/coreSyn/PprExternalCore.lhs @@ -102,22 +102,6 @@ pbty t = paty t pty (Tapp(Tapp(Tcon tc) t1) t2) | tc == tcArrow = fsep [pbty t1, text "->",pty t2] pty (Tforall tb t) = text "%forall" <+> pforall [tb] t -pty (TransCoercion t1 t2) = - sep [text "%trans", paty t1, paty t2] -pty (SymCoercion t) = - sep [text "%sym", paty t] -pty (UnsafeCoercion t1 t2) = - sep [text "%unsafe", paty t1, paty t2] -pty (NthCoercion n t) = - sep [text "%nth", int n, paty t] -pty (LRCoercion CLeft t) = - sep [text "%left", paty t] -pty (LRCoercion CRight t) = - sep [text "%right", paty t] -pty (InstCoercion t1 t2) = - sep [text "%inst", paty t1, paty t2] -pty (AxiomCoercion tc i cos) = - pqname tc <+> int i <+> sep (map paty cos) pty ty@(Tapp {}) = pappty ty [] pty ty@(Tvar {}) = paty ty pty ty@(Tcon {}) = paty ty @@ -130,6 +114,48 @@ pforall :: [Tbind] -> Ty -> Doc pforall tbs (Tforall tb t) = pforall (tbs ++ [tb]) t pforall tbs t = hsep (map ptbind tbs) <+> char '.' <+> pty t +paco, pbco, pco :: Coercion -> Doc +paco (ReflCoercion r ty) = char '<' <> pty ty <> text ">_" <> prole r +paco (TyConAppCoercion r qtc []) = pqname qtc <> char '_' <> prole r +paco (AxiomCoercion qtc i []) = pqname qtc <> char '[' <> int i <> char ']' +paco (CoVarCoercion cv) = pname cv +paco c = parens (pco c) + +pbco (TyConAppCoercion _ arr [co1, co2]) + | arr == tcArrow + = parens (fsep [pbco co1, text "->", pco co2]) +pbco co = paco co + +pco c@(ReflCoercion {}) = paco c +pco (SymCoercion co) = sep [text "%sub", paco co] +pco (TransCoercion co1 co2) = sep [text "%trans", paco co1, paco co2] +pco (TyConAppCoercion _ arr [co1, co2]) + | arr == tcArrow = fsep [pbco co1, text "->", pco co2] +pco (TyConAppCoercion r qtc cos) = parens (pqname qtc <+> sep (map paco cos)) <> char '_' <> prole r +pco co@(AppCoercion {}) = pappco co [] +pco (ForAllCoercion tb co) = text "%forall" <+> pforallco [tb] co +pco co@(CoVarCoercion {}) = paco co +pco (UnivCoercion r ty1 ty2) = sep [text "%univ", prole r, paty ty1, paty ty2] +pco (InstCoercion co ty) = sep [text "%inst", paco co, paty ty] +pco (NthCoercion i co) = sep [text "%nth", int i, paco co] +pco (AxiomCoercion qtc i cos) = pqname qtc <> char '[' <> int i <> char ']' <+> sep (map paco cos) +pco (LRCoercion CLeft co) = sep [text "%left", paco co] +pco (LRCoercion CRight co) = sep [text "%right", paco co] +pco (SubCoercion co) = sep [text "%sub", paco co] + +pappco :: Coercion -> [Coercion ] -> Doc +pappco (AppCoercion co1 co2) cos = pappco co1 (co2:cos) +pappco co cos = sep (map paco (co:cos)) + +pforallco :: [Tbind] -> Coercion -> Doc +pforallco tbs (ForAllCoercion tb co) = pforallco (tbs ++ [tb]) co +pforallco tbs co = hsep (map ptbind tbs) <+> char '.' <+> pco co + +prole :: Role -> Doc +prole Nominal = char 'N' +prole Representational = char 'R' +prole Phantom = char 'P' + pvdefg :: Vdefg -> Doc pvdefg (Rec vdefs) = text "%rec" $$ braces (indent (vcat (punctuate (char ';') (map pvdef vdefs)))) pvdefg (Nonrec vdef) = pvdef vdef @@ -172,7 +198,7 @@ pexp (Let vd e) = (text "%let" <+> pvdefg vd) $$ (text "%in" <+> pexp e) pexp (Case e vb ty alts) = sep [text "%case" <+> paty ty <+> paexp e, text "%of" <+> pvbind vb] $$ (indent (braces (vcat (punctuate (char ';') (map palt alts))))) -pexp (Cast e co) = (text "%cast" <+> parens (pexp e)) $$ paty co +pexp (Cast e co) = (text "%cast" <+> parens (pexp e)) $$ paco co pexp (Tick s e) = (text "%source" <+> pstring s) $$ pexp e pexp (External n cc t) = (text "%external" <+> text cc <+> pstring n) $$ paty t pexp (DynExternal cc t) = (text "%dynexternal" <+> text cc) $$ paty t diff --git a/compiler/coreSyn/TrieMap.lhs b/compiler/coreSyn/TrieMap.lhs index c5cd9902bc..f8ad8da5f4 100644 --- a/compiler/coreSyn/TrieMap.lhs +++ b/compiler/coreSyn/TrieMap.lhs @@ -458,27 +458,28 @@ fdA k m = foldTM k (am_deflt m) \begin{code} data CoercionMap a = EmptyKM - | KM { km_refl :: TypeMap a - , km_tc_app :: NameEnv (ListMap CoercionMap a) + | KM { km_refl :: RoleMap (TypeMap a) + , km_tc_app :: RoleMap (NameEnv (ListMap CoercionMap a)) , km_app :: CoercionMap (CoercionMap a) , km_forall :: CoercionMap (TypeMap a) , km_var :: VarMap a , km_axiom :: NameEnv (IntMap.IntMap (ListMap CoercionMap a)) - , km_unsafe :: TypeMap (TypeMap a) + , km_univ :: RoleMap (TypeMap (TypeMap a)) , km_sym :: CoercionMap a , km_trans :: CoercionMap (CoercionMap a) , km_nth :: IntMap.IntMap (CoercionMap a) , km_left :: CoercionMap a , km_right :: CoercionMap a - , km_inst :: CoercionMap (TypeMap a) } + , km_inst :: CoercionMap (TypeMap a) + , km_sub :: CoercionMap a } wrapEmptyKM :: CoercionMap a -wrapEmptyKM = KM { km_refl = emptyTM, km_tc_app = emptyNameEnv +wrapEmptyKM = KM { km_refl = emptyTM, km_tc_app = emptyTM , km_app = emptyTM, km_forall = emptyTM , km_var = emptyTM, km_axiom = emptyNameEnv - , km_unsafe = emptyTM, km_sym = emptyTM, km_trans = emptyTM + , km_univ = emptyTM, km_sym = emptyTM, km_trans = emptyTM , km_nth = emptyTM, km_left = emptyTM, km_right = emptyTM - , km_inst = emptyTM } + , km_inst = emptyTM, km_sub = emptyTM } instance TrieMap CoercionMap where type Key CoercionMap = Coercion @@ -493,34 +494,35 @@ mapC _ EmptyKM = EmptyKM mapC f (KM { km_refl = krefl, km_tc_app = ktc , km_app = kapp, km_forall = kforall , km_var = kvar, km_axiom = kax - , km_unsafe = kunsafe, km_sym = ksym, km_trans = ktrans + , km_univ = kuniv , km_sym = ksym, km_trans = ktrans , km_nth = knth, km_left = kml, km_right = kmr - , km_inst = kinst }) - = KM { km_refl = mapTM f krefl - , km_tc_app = mapNameEnv (mapTM f) ktc + , km_inst = kinst, km_sub = ksub }) + = KM { km_refl = mapTM (mapTM f) krefl + , km_tc_app = mapTM (mapNameEnv (mapTM f)) ktc , km_app = mapTM (mapTM f) kapp , km_forall = mapTM (mapTM f) kforall , km_var = mapTM f kvar , km_axiom = mapNameEnv (IntMap.map (mapTM f)) kax - , km_unsafe = mapTM (mapTM f) kunsafe + , km_univ = mapTM (mapTM (mapTM f)) kuniv , km_sym = mapTM f ksym , km_trans = mapTM (mapTM f) ktrans , km_nth = IntMap.map (mapTM f) knth , km_left = mapTM f kml , km_right = mapTM f kmr - , km_inst = mapTM (mapTM f) kinst } + , km_inst = mapTM (mapTM f) kinst + , km_sub = mapTM f ksub } lkC :: CmEnv -> Coercion -> CoercionMap a -> Maybe a lkC env co m | EmptyKM <- m = Nothing | otherwise = go co m where - go (Refl ty) = km_refl >.> lkT env ty - go (TyConAppCo tc cs) = km_tc_app >.> lkNamed tc >=> lkList (lkC env) cs + go (Refl r ty) = km_refl >.> lookupTM r >=> lkT env ty + go (TyConAppCo r tc cs) = km_tc_app >.> lookupTM r >=> lkNamed tc >=> lkList (lkC env) cs go (AxiomInstCo ax ind cs) = km_axiom >.> lkNamed ax >=> lookupTM ind >=> lkList (lkC env) cs go (AppCo c1 c2) = km_app >.> lkC env c1 >=> lkC env c2 go (TransCo c1 c2) = km_trans >.> lkC env c1 >=> lkC env c2 - go (UnsafeCo t1 t2) = km_unsafe >.> lkT env t1 >=> lkT env t2 + go (UnivCo r t1 t2) = km_univ >.> lookupTM r >=> lkT env t1 >=> lkT env t2 go (InstCo c t) = km_inst >.> lkC env c >=> lkT env t go (ForAllCo v c) = km_forall >.> lkC (extendCME env v) c >=> lkBndr env v go (CoVarCo v) = km_var >.> lkVar env v @@ -528,15 +530,16 @@ lkC env co m go (NthCo n c) = km_nth >.> lookupTM n >=> lkC env c go (LRCo CLeft c) = km_left >.> lkC env c go (LRCo CRight c) = km_right >.> lkC env c + go (SubCo c) = km_sub >.> lkC env c xtC :: CmEnv -> Coercion -> XT a -> CoercionMap a -> CoercionMap a xtC env co f EmptyKM = xtC env co f wrapEmptyKM -xtC env (Refl ty) f m = m { km_refl = km_refl m |> xtT env ty f } -xtC env (TyConAppCo tc cs) f m = m { km_tc_app = km_tc_app m |> xtNamed tc |>> xtList (xtC env) cs f } +xtC env (Refl r ty) f m = m { km_refl = km_refl m |> xtR r |>> xtT env ty f } +xtC env (TyConAppCo r tc cs) f m = m { km_tc_app = km_tc_app m |> xtR r |>> xtNamed tc |>> xtList (xtC env) cs f } xtC env (AxiomInstCo ax ind cs) f m = m { km_axiom = km_axiom m |> xtNamed ax |>> xtInt ind |>> xtList (xtC env) cs f } xtC env (AppCo c1 c2) f m = m { km_app = km_app m |> xtC env c1 |>> xtC env c2 f } xtC env (TransCo c1 c2) f m = m { km_trans = km_trans m |> xtC env c1 |>> xtC env c2 f } -xtC env (UnsafeCo t1 t2) f m = m { km_unsafe = km_unsafe m |> xtT env t1 |>> xtT env t2 f } +xtC env (UnivCo r t1 t2) f m = m { km_univ = km_univ m |> xtR r |>> xtT env t1 |>> xtT env t2 f } xtC env (InstCo c t) f m = m { km_inst = km_inst m |> xtC env c |>> xtT env t f } xtC env (ForAllCo v c) f m = m { km_forall = km_forall m |> xtC (extendCME env v) c |>> xtBndr env v f } @@ -544,23 +547,56 @@ xtC env (CoVarCo v) f m = m { km_var = km_var m |> xtVar env v f xtC env (SymCo c) f m = m { km_sym = km_sym m |> xtC env c f } xtC env (NthCo n c) f m = m { km_nth = km_nth m |> xtInt n |>> xtC env c f } xtC env (LRCo CLeft c) f m = m { km_left = km_left m |> xtC env c f } -xtC env (LRCo CRight c) f m = m { km_right = km_right m |> xtC env c f } +xtC env (LRCo CRight c) f m = m { km_right = km_right m |> xtC env c f } +xtC env (SubCo c) f m = m { km_sub = km_sub m |> xtC env c f } fdC :: (a -> b -> b) -> CoercionMap a -> b -> b fdC _ EmptyKM = \z -> z -fdC k m = foldTM k (km_refl m) - . foldTM (foldTM k) (km_tc_app m) +fdC k m = foldTM (foldTM k) (km_refl m) + . foldTM (foldTM (foldTM k)) (km_tc_app m) . foldTM (foldTM k) (km_app m) . foldTM (foldTM k) (km_forall m) . foldTM k (km_var m) . foldTM (foldTM (foldTM k)) (km_axiom m) - . foldTM (foldTM k) (km_unsafe m) + . foldTM (foldTM (foldTM k)) (km_univ m) . foldTM k (km_sym m) . foldTM (foldTM k) (km_trans m) . foldTM (foldTM k) (km_nth m) . foldTM k (km_left m) . foldTM k (km_right m) . foldTM (foldTM k) (km_inst m) + . foldTM k (km_sub m) + +\end{code} + +\begin{code} + +newtype RoleMap a = RM { unRM :: (IntMap.IntMap a) } + +instance TrieMap RoleMap where + type Key RoleMap = Role + emptyTM = RM emptyTM + lookupTM = lkR + alterTM = xtR + foldTM = fdR + mapTM = mapR + +lkR :: Role -> RoleMap a -> Maybe a +lkR Nominal = lookupTM 1 . unRM +lkR Representational = lookupTM 2 . unRM +lkR Phantom = lookupTM 3 . unRM + +xtR :: Role -> XT a -> RoleMap a -> RoleMap a +xtR Nominal f = RM . alterTM 1 f . unRM +xtR Representational f = RM . alterTM 2 f . unRM +xtR Phantom f = RM . alterTM 3 f . unRM + +fdR :: (a -> b -> b) -> RoleMap a -> b -> b +fdR f (RM m) = foldTM f m + +mapR :: (a -> b) -> RoleMap a -> RoleMap b +mapR f = RM . mapTM f . unRM + \end{code} diff --git a/compiler/deSugar/DsBinds.lhs b/compiler/deSugar/DsBinds.lhs index 66022f970e..617516bd97 100644 --- a/compiler/deSugar/DsBinds.lhs +++ b/compiler/deSugar/DsBinds.lhs @@ -65,6 +65,7 @@ import Maybes import OrdList import Bag import BasicTypes hiding ( TopLevel ) +import Pair import DynFlags import FastString import ErrUtils( MsgDoc ) @@ -705,7 +706,7 @@ dsHsWrapper (WpTyApp ty) e = return $ App e (Type ty) dsHsWrapper (WpLet ev_binds) e = do bs <- dsTcEvBinds ev_binds return (mkCoreLets bs e) dsHsWrapper (WpCompose c1 c2) e = dsHsWrapper c1 =<< dsHsWrapper c2 e -dsHsWrapper (WpCast co) e = dsTcCoercion co (mkCast e) +dsHsWrapper (WpCast co) e = dsTcCoercion Representational co (mkCast e) dsHsWrapper (WpEvLam ev) e = return $ Lam ev e dsHsWrapper (WpTyLam tv) e = return $ Lam tv e dsHsWrapper (WpEvApp evtrm) e = liftM (App e) (dsEvTerm evtrm) @@ -739,7 +740,7 @@ dsEvTerm (EvId v) = return (Var v) dsEvTerm (EvCast tm co) = do { tm' <- dsEvTerm tm - ; dsTcCoercion co $ mkCast tm' } + ; dsTcCoercion Representational co $ mkCast tm' } -- 'v' is always a lifted evidence variable so it is -- unnecessary to call varToCoreExpr v here. @@ -747,7 +748,7 @@ dsEvTerm (EvDFunApp df tys tms) = do { tms' <- mapM dsEvTerm tms ; return (Var df `mkTyApps` tys `mkApps` tms') } dsEvTerm (EvCoercion (TcCoVarCo v)) = return (Var v) -- See Note [Simple coercions] -dsEvTerm (EvCoercion co) = dsTcCoercion co mkEqBox +dsEvTerm (EvCoercion co) = dsTcCoercion Nominal co mkEqBox dsEvTerm (EvTupleSel v n) = do { tm' <- dsEvTerm v @@ -785,21 +786,22 @@ dsEvTerm (EvLit l) = EvStr s -> mkStringExprFS s --------------------------------------- -dsTcCoercion :: TcCoercion -> (Coercion -> CoreExpr) -> DsM CoreExpr +dsTcCoercion :: Role -> TcCoercion -> (Coercion -> CoreExpr) -> DsM CoreExpr -- This is the crucial function that moves -- from TcCoercions to Coercions; see Note [TcCoercions] in Coercion -- e.g. dsTcCoercion (trans g1 g2) k -- = case g1 of EqBox g1# -> -- case g2 of EqBox g2# -> -- k (trans g1# g2#) -dsTcCoercion co thing_inside +-- thing_inside will get a coercion at the role requested +dsTcCoercion role co thing_inside = do { us <- newUniqueSupply ; let eqvs_covs :: [(EqVar,CoVar)] eqvs_covs = zipWith mk_co_var (varSetElems (coVarsOfTcCo co)) (uniqsFromSupply us) subst = mkCvSubst emptyInScopeSet [(eqv, mkCoVarCo cov) | (eqv, cov) <- eqvs_covs] - result_expr = thing_inside (ds_tc_coercion subst co) + result_expr = thing_inside (ds_tc_coercion subst role co) result_ty = exprType result_expr ; return (foldr (wrap_in_case result_ty) result_expr eqvs_covs) } @@ -810,36 +812,41 @@ dsTcCoercion co thing_inside eq_nm = idName eqv occ = nameOccName eq_nm loc = nameSrcSpan eq_nm - ty = mkCoercionType ty1 ty2 + ty = mkCoercionType Nominal ty1 ty2 (ty1, ty2) = getEqPredTys (evVarPred eqv) wrap_in_case result_ty (eqv, cov) body = Case (Var eqv) eqv result_ty [(DataAlt eqBoxDataCon, [cov], body)] -ds_tc_coercion :: CvSubst -> TcCoercion -> Coercion +ds_tc_coercion :: CvSubst -> Role -> TcCoercion -> Coercion -- If the incoming TcCoercion if of type (a ~ b), -- the result is of type (a ~# b) -- The VarEnv maps EqVars of type (a ~ b) to Coercions of type (a ~# b) -- No need for InScope set etc because the -ds_tc_coercion subst tc_co - = go tc_co +ds_tc_coercion subst role tc_co + = go role tc_co where - go (TcRefl ty) = Refl (Coercion.substTy subst ty) - go (TcTyConAppCo tc cos) = mkTyConAppCo tc (map go cos) - go (TcAppCo co1 co2) = mkAppCo (go co1) (go co2) - go (TcForAllCo tv co) = mkForAllCo tv' (ds_tc_coercion subst' co) + go Phantom co + = mkUnivCo Phantom ty1 ty2 + where Pair ty1 ty2 = tcCoercionKind co + + go r (TcRefl ty) = Refl r (Coercion.substTy subst ty) + go r (TcTyConAppCo tc cos) = mkTyConAppCo r tc (zipWith go (tyConRolesX r tc) cos) + go r (TcAppCo co1 co2) = mkAppCo (go r co1) (go Nominal co2) + go r (TcForAllCo tv co) = mkForAllCo tv' (ds_tc_coercion subst' r co) where (subst', tv') = Coercion.substTyVarBndr subst tv - go (TcAxiomInstCo ax ind tys) - = mkAxInstCo ax ind (map (Coercion.substTy subst) tys) - go (TcSymCo co) = mkSymCo (go co) - go (TcTransCo co1 co2) = mkTransCo (go co1) (go co2) - go (TcNthCo n co) = mkNthCo n (go co) - go (TcLRCo lr co) = mkLRCo lr (go co) - go (TcInstCo co ty) = mkInstCo (go co) ty - go (TcLetCo bs co) = ds_tc_coercion (ds_co_binds bs) co - go (TcCastCo co1 co2) = mkCoCast (go co1) (go co2) - go (TcCoVarCo v) = ds_ev_id subst v + go r (TcAxiomInstCo ax ind tys) + = mkAxInstCo r ax ind (map (Coercion.substTy subst) tys) + go r (TcSymCo co) = mkSymCo (go r co) + go r (TcTransCo co1 co2) = mkTransCo (go r co1) (go r co2) + go r (TcNthCo n co) = mkNthCoRole r n (go r co) -- the 2nd r is a harmless lie + go r (TcLRCo lr co) = maybeSubCo r $ mkLRCo lr (go Nominal co) + go r (TcInstCo co ty) = mkInstCo (go r co) ty + go r (TcLetCo bs co) = ds_tc_coercion (ds_co_binds bs) r co + go r (TcCastCo co1 co2) = maybeSubCo r $ mkCoCast (go Nominal co1) + (go Nominal co2) + go r (TcCoVarCo v) = maybeSubCo r $ ds_ev_id subst v ds_co_binds :: TcEvBinds -> CvSubst ds_co_binds (EvBinds bs) = foldl ds_scc subst (sccEvBinds bs) @@ -851,9 +858,9 @@ ds_tc_coercion subst tc_co ds_scc _ (CyclicSCC other) = pprPanic "ds_scc:cyclic" (ppr other $$ ppr tc_co) ds_co_term :: CvSubst -> EvTerm -> Coercion - ds_co_term subst (EvCoercion tc_co) = ds_tc_coercion subst tc_co + ds_co_term subst (EvCoercion tc_co) = ds_tc_coercion subst Nominal tc_co ds_co_term subst (EvId v) = ds_ev_id subst v - ds_co_term subst (EvCast tm co) = mkCoCast (ds_co_term subst tm) (ds_tc_coercion subst co) + ds_co_term subst (EvCast tm co) = mkCoCast (ds_co_term subst tm) (ds_tc_coercion subst Nominal co) ds_co_term _ other = pprPanic "ds_co_term" (ppr other $$ ppr tc_co) ds_ev_id :: CvSubst -> EqVar -> Coercion diff --git a/compiler/deSugar/DsForeign.lhs b/compiler/deSugar/DsForeign.lhs index 9be8e96615..1053b91aaa 100644 --- a/compiler/deSugar/DsForeign.lhs +++ b/compiler/deSugar/DsForeign.lhs @@ -418,7 +418,7 @@ dsFExportDynamic id co0 cconv = do export_ty = mkFunTy stable_ptr_ty arg_ty bindIOId <- dsLookupGlobalId bindIOName stbl_value <- newSysLocalDs stable_ptr_ty - (h_code, c_code, typestring, args_size) <- dsFExport id (Refl export_ty) fe_nm cconv True + (h_code, c_code, typestring, args_size) <- dsFExport id (mkReflCo Representational export_ty) fe_nm cconv True let {- The arguments to the external function which will diff --git a/compiler/deSugar/DsMeta.hs b/compiler/deSugar/DsMeta.hs index a60f18ded5..f92f6212a0 100644 --- a/compiler/deSugar/DsMeta.hs +++ b/compiler/deSugar/DsMeta.hs @@ -305,7 +305,7 @@ mk_extra_tvs tc tvs defn = do { uniq <- newUnique ; let { occ = mkTyVarOccFS (fsLit "t") ; nm = mkInternalName uniq occ loc - ; hs_tv = L loc (KindedTyVar nm kind) } + ; hs_tv = L loc (HsTyVarBndr nm (Just kind) Nothing) } ; hs_tvs <- go rest ; return (hs_tv : hs_tvs) } @@ -731,10 +731,16 @@ addTyClTyVarBinds tvs m -- repTyVarBndrWithKind :: LHsTyVarBndr Name -> Core TH.Name -> DsM (Core TH.TyVarBndr) -repTyVarBndrWithKind (L _ (UserTyVar {})) nm +repTyVarBndrWithKind (L _ (HsTyVarBndr _ Nothing Nothing)) nm = repPlainTV nm -repTyVarBndrWithKind (L _ (KindedTyVar _ ki)) nm +repTyVarBndrWithKind (L _ (HsTyVarBndr _ (Just ki) Nothing)) nm = repLKind ki >>= repKindedTV nm +repTyVarBndrWithKind (L _ (HsTyVarBndr _ Nothing (Just r))) nm + = repRole r >>= repRoledTV nm +repTyVarBndrWithKind (L _ (HsTyVarBndr _ (Just ki) (Just r))) nm + = do { ki' <- repLKind ki + ; r' <- repRole r + ; repKindedRoledTV nm ki' r' } -- represent a type context -- @@ -878,6 +884,11 @@ repNonArrowKind (HsTupleTy _ ks) = do { ks' <- mapM repLKind ks } repNonArrowKind k = notHandled "Exotic form of kind" (ppr k) +repRole :: Role -> DsM (Core TH.Role) +repRole Nominal = rep2 nominalName [] +repRole Representational = rep2 representationalName [] +repRole Phantom = rep2 phantomName [] + ----------------------------------------------------------------------------- -- Splices ----------------------------------------------------------------------------- @@ -1828,6 +1839,13 @@ repPlainTV (MkC nm) = rep2 plainTVName [nm] repKindedTV :: Core TH.Name -> Core TH.Kind -> DsM (Core TH.TyVarBndr) repKindedTV (MkC nm) (MkC ki) = rep2 kindedTVName [nm, ki] +repRoledTV :: Core TH.Name -> Core TH.Role -> DsM (Core TH.TyVarBndr) +repRoledTV (MkC nm) (MkC r) = rep2 roledTVName [nm, r] + +repKindedRoledTV :: Core TH.Name -> Core TH.Kind -> Core TH.Role + -> DsM (Core TH.TyVarBndr) +repKindedRoledTV (MkC nm) (MkC k) (MkC r) = rep2 kindedRoledTVName [nm, k, r] + repKVar :: Core TH.Name -> DsM (Core TH.Kind) repKVar (MkC s) = rep2 varKName [s] @@ -2041,7 +2059,9 @@ templateHaskellNames = [ -- TyLit numTyLitName, strTyLitName, -- TyVarBndr - plainTVName, kindedTVName, + plainTVName, kindedTVName, roledTVName, kindedRoledTVName, + -- Role + nominalName, representationalName, phantomName, -- Kind varKName, conKName, tupleKName, arrowKName, listKName, appKName, starKName, constraintKName, @@ -2319,9 +2339,17 @@ numTyLitName = libFun (fsLit "numTyLit") numTyLitIdKey strTyLitName = libFun (fsLit "strTyLit") strTyLitIdKey -- data TyVarBndr = ... -plainTVName, kindedTVName :: Name -plainTVName = libFun (fsLit "plainTV") plainTVIdKey -kindedTVName = libFun (fsLit "kindedTV") kindedTVIdKey +plainTVName, kindedTVName, roledTVName, kindedRoledTVName :: Name +plainTVName = libFun (fsLit "plainTV") plainTVIdKey +kindedTVName = libFun (fsLit "kindedTV") kindedTVIdKey +roledTVName = libFun (fsLit "roledTV") roledTVIdKey +kindedRoledTVName = libFun (fsLit "kindedRoledTV") kindedRoledTVIdKey + +-- data Role = ... +nominalName, representationalName, phantomName :: Name +nominalName = libFun (fsLit "nominal") nominalIdKey +representationalName = libFun (fsLit "representational") representationalIdKey +phantomName = libFun (fsLit "phantom") phantomIdKey -- data Kind = ... varKName, conKName, tupleKName, arrowKName, listKName, appKName, @@ -2589,8 +2617,8 @@ forImpDIdKey = mkPreludeMiscIdUnique 338 pragInlDIdKey = mkPreludeMiscIdUnique 339 pragSpecDIdKey = mkPreludeMiscIdUnique 340 pragSpecInlDIdKey = mkPreludeMiscIdUnique 341 -pragSpecInstDIdKey = mkPreludeMiscIdUnique 412 -pragRuleDIdKey = mkPreludeMiscIdUnique 413 +pragSpecInstDIdKey = mkPreludeMiscIdUnique 416 +pragRuleDIdKey = mkPreludeMiscIdUnique 417 familyNoKindDIdKey = mkPreludeMiscIdUnique 342 familyKindDIdKey = mkPreludeMiscIdUnique 343 dataInstDIdKey = mkPreludeMiscIdUnique 344 @@ -2658,32 +2686,40 @@ numTyLitIdKey = mkPreludeMiscIdUnique 394 strTyLitIdKey = mkPreludeMiscIdUnique 395 -- data TyVarBndr = ... -plainTVIdKey, kindedTVIdKey :: Unique -plainTVIdKey = mkPreludeMiscIdUnique 396 -kindedTVIdKey = mkPreludeMiscIdUnique 397 +plainTVIdKey, kindedTVIdKey, roledTVIdKey, kindedRoledTVIdKey :: Unique +plainTVIdKey = mkPreludeMiscIdUnique 396 +kindedTVIdKey = mkPreludeMiscIdUnique 397 +roledTVIdKey = mkPreludeMiscIdUnique 398 +kindedRoledTVIdKey = mkPreludeMiscIdUnique 399 + +-- data Role = ... +nominalIdKey, representationalIdKey, phantomIdKey :: Unique +nominalIdKey = mkPreludeMiscIdUnique 400 +representationalIdKey = mkPreludeMiscIdUnique 401 +phantomIdKey = mkPreludeMiscIdUnique 402 -- data Kind = ... varKIdKey, conKIdKey, tupleKIdKey, arrowKIdKey, listKIdKey, appKIdKey, starKIdKey, constraintKIdKey :: Unique -varKIdKey = mkPreludeMiscIdUnique 398 -conKIdKey = mkPreludeMiscIdUnique 399 -tupleKIdKey = mkPreludeMiscIdUnique 400 -arrowKIdKey = mkPreludeMiscIdUnique 401 -listKIdKey = mkPreludeMiscIdUnique 402 -appKIdKey = mkPreludeMiscIdUnique 403 -starKIdKey = mkPreludeMiscIdUnique 404 -constraintKIdKey = mkPreludeMiscIdUnique 405 +varKIdKey = mkPreludeMiscIdUnique 403 +conKIdKey = mkPreludeMiscIdUnique 404 +tupleKIdKey = mkPreludeMiscIdUnique 405 +arrowKIdKey = mkPreludeMiscIdUnique 406 +listKIdKey = mkPreludeMiscIdUnique 407 +appKIdKey = mkPreludeMiscIdUnique 408 +starKIdKey = mkPreludeMiscIdUnique 409 +constraintKIdKey = mkPreludeMiscIdUnique 410 -- data Callconv = ... cCallIdKey, stdCallIdKey :: Unique -cCallIdKey = mkPreludeMiscIdUnique 406 -stdCallIdKey = mkPreludeMiscIdUnique 407 +cCallIdKey = mkPreludeMiscIdUnique 411 +stdCallIdKey = mkPreludeMiscIdUnique 412 -- data Safety = ... unsafeIdKey, safeIdKey, interruptibleIdKey :: Unique -unsafeIdKey = mkPreludeMiscIdUnique 408 -safeIdKey = mkPreludeMiscIdUnique 409 -interruptibleIdKey = mkPreludeMiscIdUnique 411 +unsafeIdKey = mkPreludeMiscIdUnique 413 +safeIdKey = mkPreludeMiscIdUnique 414 +interruptibleIdKey = mkPreludeMiscIdUnique 415 -- data Inline = ... noInlineDataConKey, inlineDataConKey, inlinableDataConKey :: Unique @@ -2704,25 +2740,25 @@ beforePhaseDataConKey = mkPreludeDataConUnique 47 -- data FunDep = ... funDepIdKey :: Unique -funDepIdKey = mkPreludeMiscIdUnique 414 +funDepIdKey = mkPreludeMiscIdUnique 418 -- data FamFlavour = ... typeFamIdKey, dataFamIdKey :: Unique -typeFamIdKey = mkPreludeMiscIdUnique 415 -dataFamIdKey = mkPreludeMiscIdUnique 416 +typeFamIdKey = mkPreludeMiscIdUnique 419 +dataFamIdKey = mkPreludeMiscIdUnique 420 -- data TySynEqn = ... tySynEqnIdKey :: Unique -tySynEqnIdKey = mkPreludeMiscIdUnique 417 +tySynEqnIdKey = mkPreludeMiscIdUnique 421 -- quasiquoting quoteExpKey, quotePatKey, quoteDecKey, quoteTypeKey :: Unique -quoteExpKey = mkPreludeMiscIdUnique 418 -quotePatKey = mkPreludeMiscIdUnique 419 -quoteDecKey = mkPreludeMiscIdUnique 420 -quoteTypeKey = mkPreludeMiscIdUnique 421 +quoteExpKey = mkPreludeMiscIdUnique 422 +quotePatKey = mkPreludeMiscIdUnique 423 +quoteDecKey = mkPreludeMiscIdUnique 424 +quoteTypeKey = mkPreludeMiscIdUnique 425 -- data RuleBndr = ... ruleVarIdKey, typedRuleVarIdKey :: Unique -ruleVarIdKey = mkPreludeMiscIdUnique 422 -typedRuleVarIdKey = mkPreludeMiscIdUnique 423 +ruleVarIdKey = mkPreludeMiscIdUnique 426 +typedRuleVarIdKey = mkPreludeMiscIdUnique 427 diff --git a/compiler/ghci/ByteCodeAsm.lhs b/compiler/ghci/ByteCodeAsm.lhs index 9906467186..e3119a7842 100644 --- a/compiler/ghci/ByteCodeAsm.lhs +++ b/compiler/ghci/ByteCodeAsm.lhs @@ -41,8 +41,10 @@ import Control.Monad.Trans.Class import Control.Monad.Trans.State.Strict import Data.Array.MArray -import Data.Array.Unboxed ( listArray ) + +import qualified Data.Array.Unboxed as Array import Data.Array.Base ( UArray(..) ) + import Data.Array.Unsafe( castSTUArray ) import Foreign @@ -161,11 +163,11 @@ assembleBCO dflags (ProtoBCO nm instrs bitmap bsize arity _origin _malloced) = d let asm_insns = ssElts final_insns barr a = case a of UArray _lo _hi _n b -> b - insns_arr = listArray (0, n_insns - 1) asm_insns + insns_arr = Array.listArray (0, n_insns - 1) asm_insns !insns_barr = barr insns_arr bitmap_arr = mkBitmapArray dflags bsize bitmap - !bitmap_barr = barr bitmap_arr + !bitmap_barr = toByteArray bitmap_arr ul_bco = UnlinkedBCO nm arity insns_barr bitmap_barr final_lits final_ptrs @@ -176,9 +178,15 @@ assembleBCO dflags (ProtoBCO nm instrs bitmap bsize arity _origin _malloced) = d return ul_bco +#if __GLASGOW_HASKELL__ > 706 +mkBitmapArray :: DynFlags -> Word16 -> [StgWord] -> UArrayStgWord Int +mkBitmapArray dflags bsize bitmap + = SMRep.listArray (0, length bitmap) (toStgWord dflags (toInteger bsize) : bitmap) +#else mkBitmapArray :: DynFlags -> Word16 -> [StgWord] -> UArray Int StgWord mkBitmapArray dflags bsize bitmap - = listArray (0, length bitmap) (toStgWord dflags (toInteger bsize) : bitmap) + = Array.listArray (0, length bitmap) (toStgWord dflags (toInteger bsize) : bitmap) +#endif -- instrs nonptrs ptrs type AsmState = (SizedSeq Word16, diff --git a/compiler/hsSyn/Convert.lhs b/compiler/hsSyn/Convert.lhs index f7d5bdb084..383b641262 100644 --- a/compiler/hsSyn/Convert.lhs +++ b/compiler/hsSyn/Convert.lhs @@ -20,6 +20,7 @@ import qualified OccName import OccName import SrcLoc import Type +import qualified Coercion ( Role(..) ) import TysWiredIn import BasicTypes as Hs import ForeignCall @@ -847,11 +848,25 @@ cvtTvs tvs = do { tvs' <- mapM cvt_tv tvs; return (mkHsQTvs tvs') } cvt_tv :: TH.TyVarBndr -> CvtM (LHsTyVarBndr RdrName) cvt_tv (TH.PlainTV nm) = do { nm' <- tName nm - ; returnL $ UserTyVar nm' } + ; returnL $ HsTyVarBndr nm' Nothing Nothing } cvt_tv (TH.KindedTV nm ki) = do { nm' <- tName nm ; ki' <- cvtKind ki - ; returnL $ KindedTyVar nm' ki' } + ; returnL $ HsTyVarBndr nm' (Just ki') Nothing } +cvt_tv (TH.RoledTV nm r) + = do { nm' <- tName nm + ; r' <- cvtRole r + ; returnL $ HsTyVarBndr nm' Nothing (Just r') } +cvt_tv (TH.KindedRoledTV nm k r) + = do { nm' <- tName nm + ; k' <- cvtKind k + ; r' <- cvtRole r + ; returnL $ HsTyVarBndr nm' (Just k') (Just r') } + +cvtRole :: TH.Role -> CvtM Coercion.Role +cvtRole TH.Nominal = return Coercion.Nominal +cvtRole TH.Representational = return Coercion.Representational +cvtRole TH.Phantom = return Coercion.Phantom cvtContext :: TH.Cxt -> CvtM (LHsContext RdrName) cvtContext tys = do { preds' <- mapM cvtPred tys; returnL preds' } diff --git a/compiler/hsSyn/HsTypes.lhs b/compiler/hsSyn/HsTypes.lhs index eeed5cdbfb..82b0cf244b 100644 --- a/compiler/hsSyn/HsTypes.lhs +++ b/compiler/hsSyn/HsTypes.lhs @@ -47,6 +47,7 @@ import Name( Name ) import RdrName( RdrName ) import DataCon( HsBang(..) ) import Type +import TyCon ( Role(..) ) import HsDoc import BasicTypes import SrcLoc @@ -179,20 +180,15 @@ instance OutputableBndr HsIPName where pprInfixOcc n = ppr n pprPrefixOcc n = ppr n - data HsTyVarBndr name - = UserTyVar -- No explicit kinding - name -- See Note [Printing KindedTyVars] - - | KindedTyVar - name - (LHsKind name) -- The user-supplied kind signature + = HsTyVarBndr name + (Maybe (LHsKind name)) -- See Note [Printing KindedTyVars] + (Maybe Role) -- *** NOTA BENE *** A "monotype" in a pragma can have -- for-alls in it, (mostly to do with dictionaries). These -- must be explicitly Kinded. deriving (Data, Typeable) - data HsType name = HsForAllTy HsExplicitFlag -- Renamer leaves this flag unchanged, to record the way -- the user wrote it originally, so that the printer can @@ -232,6 +228,9 @@ data HsType name | HsKindSig (LHsType name) -- (ty :: kind) (LHsKind name) -- A type with a kind signature + | HsRoleAnnot (LHsType name) -- ty@role, seen only right after parsing + Role + | HsQuasiQuoteTy (HsQuasiQuote name) | HsSpliceTy (HsSplice name) @@ -421,8 +420,7 @@ hsExplicitTvs _ = [] --------------------- hsTyVarName :: HsTyVarBndr name -> name -hsTyVarName (UserTyVar n) = n -hsTyVarName (KindedTyVar n _) = n +hsTyVarName (HsTyVarBndr n _ _) = n hsLTyVarName :: LHsTyVarBndr name -> name hsLTyVarName = hsTyVarName . unLoc @@ -529,8 +527,10 @@ instance (OutputableBndr name) => Outputable (LHsTyVarBndrs name) where = sep [ ifPprDebug $ braces (interppSP kvs), interppSP tvs ] instance (OutputableBndr name) => Outputable (HsTyVarBndr name) where - ppr (UserTyVar name) = ppr name - ppr (KindedTyVar name kind) = parens $ hsep [ppr name, dcolon, ppr kind] + ppr (HsTyVarBndr n Nothing Nothing) = ppr n + ppr (HsTyVarBndr n (Just k) Nothing) = parens $ hsep [ppr n, dcolon, ppr k] + ppr (HsTyVarBndr n Nothing (Just r)) = ppr n <> char '@' <> ppr r + ppr (HsTyVarBndr n (Just k) (Just r)) = parens $ hsep [ppr n, dcolon, ppr k] <> char '@' <> ppr r instance (Outputable thing) => Outputable (HsWithBndrs thing) where ppr (HsWB { hswb_cts = ty }) = ppr ty @@ -622,6 +622,7 @@ ppr_mono_ty _ (HsTupleTy con tys) = tupleParens std_con (interpp'SP tys) HsUnboxedTuple -> UnboxedTuple _ -> BoxedTuple ppr_mono_ty _ (HsKindSig ty kind) = parens (ppr_mono_lty pREC_TOP ty <+> dcolon <+> ppr kind) +ppr_mono_ty _ (HsRoleAnnot ty r) = ppr ty <> char '@' <> ppr r ppr_mono_ty _ (HsListTy ty) = brackets (ppr_mono_lty pREC_TOP ty) ppr_mono_ty _ (HsPArrTy ty) = paBrackets (ppr_mono_lty pREC_TOP ty) ppr_mono_ty prec (HsIParamTy n ty) = maybeParen prec pREC_FUN (ppr n <+> dcolon <+> ppr_mono_lty pREC_TOP ty) diff --git a/compiler/hsSyn/HsUtils.lhs b/compiler/hsSyn/HsUtils.lhs index 1fa949653e..267b2cac0e 100644 --- a/compiler/hsSyn/HsUtils.lhs +++ b/compiler/hsSyn/HsUtils.lhs @@ -271,7 +271,7 @@ mkHsString s = HsString (mkFastString s) ------------- userHsTyVarBndrs :: SrcSpan -> [name] -> [Located (HsTyVarBndr name)] -- Caller sets location -userHsTyVarBndrs loc bndrs = [ L loc (UserTyVar v) | v <- bndrs ] +userHsTyVarBndrs loc bndrs = [ L loc (HsTyVarBndr v Nothing Nothing) | v <- bndrs ] \end{code} diff --git a/compiler/iface/BinIface.hs b/compiler/iface/BinIface.hs index 0876d906ab..b0bb88789d 100644 --- a/compiler/iface/BinIface.hs +++ b/compiler/iface/BinIface.hs @@ -415,3 +415,4 @@ getWayDescr dflags -- if this is an unregisterised build, make sure our interfaces -- can't be used by a registerised build. + diff --git a/compiler/iface/BuildTyCl.lhs b/compiler/iface/BuildTyCl.lhs index a541e32b7b..20aea22e47 100644 --- a/compiler/iface/BuildTyCl.lhs +++ b/compiler/iface/BuildTyCl.lhs @@ -46,13 +46,13 @@ import Outputable \begin{code} ------------------------------------------------------ -buildSynTyCon :: Name -> [TyVar] +buildSynTyCon :: Name -> [TyVar] -> [Role] -> SynTyConRhs -> Kind -- ^ Kind of the RHS -> TyConParent -> TcRnIf m n TyCon -buildSynTyCon tc_name tvs rhs rhs_kind parent - = return (mkSynTyCon tc_name kind tvs rhs parent) +buildSynTyCon tc_name tvs roles rhs rhs_kind parent + = return (mkSynTyCon tc_name kind tvs roles rhs parent) where kind = mkPiKinds tvs rhs_kind @@ -80,7 +80,7 @@ mkNewTyConRhs :: Name -> TyCon -> DataCon -> TcRnIf m n AlgTyConRhs -- because the latter is part of a knot, whereas the former is not. mkNewTyConRhs tycon_name tycon con = do { co_tycon_name <- newImplicitBinder tycon_name mkNewTyCoOcc - ; let co_tycon = mkNewTypeCo co_tycon_name tycon etad_tvs etad_rhs + ; let co_tycon = mkNewTypeCo co_tycon_name tycon etad_tvs etad_roles etad_rhs ; traceIf (text "mkNewTyConRhs" <+> ppr co_tycon) ; return (NewTyCon { data_con = con, nt_rhs = rhs_ty, @@ -90,6 +90,7 @@ mkNewTyConRhs tycon_name tycon con -- for nt_co, or uses explicit coercions otherwise where tvs = tyConTyVars tycon + roles = tyConRoles tycon inst_con_ty = applyTys (dataConUserType con) (mkTyVarTys tvs) rhs_ty = ASSERT( isFunTy inst_con_ty ) funArgTy inst_con_ty -- Instantiate the data con with the @@ -101,20 +102,22 @@ mkNewTyConRhs tycon_name tycon con -- has a single argument (Foo a) that is a *type class*, so -- dataConInstOrigArgTys returns []. - etad_tvs :: [TyVar] -- Matched lazily, so that mkNewTypeCo can - etad_rhs :: Type -- return a TyCon without pulling on rhs_ty - -- See Note [Tricky iface loop] in LoadIface - (etad_tvs, etad_rhs) = eta_reduce (reverse tvs) rhs_ty + etad_tvs :: [TyVar] -- Matched lazily, so that mkNewTypeCo can + etad_roles :: [Role] -- return a TyCon without pulling on rhs_ty + etad_rhs :: Type -- See Note [Tricky iface loop] in LoadIface + (etad_tvs, etad_roles, etad_rhs) = eta_reduce (reverse tvs) (reverse roles) rhs_ty - eta_reduce :: [TyVar] -- Reversed - -> Type -- Rhs type - -> ([TyVar], Type) -- Eta-reduced version (tyvars in normal order) - eta_reduce (a:as) ty | Just (fun, arg) <- splitAppTy_maybe ty, - Just tv <- getTyVar_maybe arg, - tv == a, - not (a `elemVarSet` tyVarsOfType fun) - = eta_reduce as fun - eta_reduce tvs ty = (reverse tvs, ty) + eta_reduce :: [TyVar] -- Reversed + -> [Role] -- also reversed + -> Type -- Rhs type + -> ([TyVar], [Role], Type) -- Eta-reduced version + -- (tyvars in normal order) + eta_reduce (a:as) (_:rs) ty | Just (fun, arg) <- splitAppTy_maybe ty, + Just tv <- getTyVar_maybe arg, + tv == a, + not (a `elemVarSet` tyVarsOfType fun) + = eta_reduce as rs fun + eta_reduce tvs rs ty = (reverse tvs, reverse rs, ty) ------------------------------------------------------ @@ -185,14 +188,14 @@ type TcMethInfo = (Name, DefMethSpec, Type) buildClass :: Bool -- True <=> do not include unfoldings -- on dict selectors -- Used when importing a class without -O - -> Name -> [TyVar] -> ThetaType + -> Name -> [TyVar] -> [Role] -> ThetaType -> [FunDep TyVar] -- Functional dependencies -> [ClassATItem] -- Associated types -> [TcMethInfo] -- Method info -> RecFlag -- Info for type constructor -> TcRnIf m n Class -buildClass no_unf tycon_name tvs sc_theta fds at_items sig_stuff tc_isrec +buildClass no_unf tycon_name tvs roles sc_theta fds at_items sig_stuff tc_isrec = fixM $ \ rec_clas -> -- Only name generation inside loop do { traceIf (text "buildClass") ; dflags <- getDynFlags @@ -255,7 +258,7 @@ buildClass no_unf tycon_name tvs sc_theta fds at_items sig_stuff tc_isrec ; let { clas_kind = mkPiKinds tvs constraintKind - ; tycon = mkClassTyCon tycon_name clas_kind tvs + ; tycon = mkClassTyCon tycon_name clas_kind tvs roles rhs rec_clas tc_isrec -- A class can be recursive, and in the case of newtypes -- this matters. For example diff --git a/compiler/iface/IfaceSyn.lhs b/compiler/iface/IfaceSyn.lhs index 7eb3d3a119..3bbcdd395e 100644 --- a/compiler/iface/IfaceSyn.lhs +++ b/compiler/iface/IfaceSyn.lhs @@ -42,7 +42,7 @@ import Demand import Annotations import Class import NameSet -import CoAxiom ( BranchIndex ) +import CoAxiom ( BranchIndex, Role ) import Name import CostCentre import Literal @@ -79,6 +79,7 @@ data IfaceDecl | IfaceData { ifName :: OccName, -- Type constructor ifCType :: Maybe CType, -- C type for CAPI FFI ifTyVars :: [IfaceTvBndr], -- Type variables + ifRoles :: [Role], -- Roles ifCtxt :: IfaceContext, -- The "stupid theta" ifCons :: IfaceConDecls, -- Includes new/data/data family info ifRec :: RecFlag, -- Recursive or not? @@ -91,12 +92,14 @@ data IfaceDecl | IfaceSyn { ifName :: OccName, -- Type constructor ifTyVars :: [IfaceTvBndr], -- Type variables + ifRoles :: [Role], -- Roles ifSynKind :: IfaceKind, -- Kind of the *rhs* (not of the tycon) ifSynRhs :: IfaceSynTyConRhs } | IfaceClass { ifCtxt :: IfaceContext, -- Context... ifName :: OccName, -- Name of the class TyCon ifTyVars :: [IfaceTvBndr], -- Type variables + ifRoles :: [Role], -- Roles ifFDs :: [FunDep FastString], -- Functional dependencies ifATs :: [IfaceAT], -- Associated type families ifSigs :: [IfaceClassOp], -- Method signatures @@ -106,6 +109,7 @@ data IfaceDecl | IfaceAxiom { ifName :: OccName, -- Axiom name ifTyCon :: IfaceTyCon, -- LHS TyCon + ifRole :: Role, -- Role of axiom ifAxBranches :: [IfaceAxBranch] -- Branches } @@ -130,7 +134,7 @@ instance Binary IfaceDecl where put_ _ (IfaceForeign _ _) = error "Binary.put_(IfaceDecl): IfaceForeign" - put_ bh (IfaceData a1 a2 a3 a4 a5 a6 a7 a8 a9) = do + put_ bh (IfaceData a1 a2 a3 a4 a5 a6 a7 a8 a9 a10) = do putByte bh 2 put_ bh (occNameFS a1) put_ bh a2 @@ -141,15 +145,17 @@ instance Binary IfaceDecl where put_ bh a7 put_ bh a8 put_ bh a9 + put_ bh a10 - put_ bh (IfaceSyn a1 a2 a3 a4) = do + put_ bh (IfaceSyn a1 a2 a3 a4 a5) = do putByte bh 3 put_ bh (occNameFS a1) put_ bh a2 put_ bh a3 put_ bh a4 + put_ bh a5 - put_ bh (IfaceClass a1 a2 a3 a4 a5 a6 a7) = do + put_ bh (IfaceClass a1 a2 a3 a4 a5 a6 a7 a8) = do putByte bh 4 put_ bh a1 put_ bh (occNameFS a2) @@ -158,12 +164,14 @@ instance Binary IfaceDecl where put_ bh a5 put_ bh a6 put_ bh a7 + put_ bh a8 - put_ bh (IfaceAxiom a1 a2 a3) = do + put_ bh (IfaceAxiom a1 a2 a3 a4) = do putByte bh 5 put_ bh (occNameFS a1) put_ bh a2 put_ bh a3 + put_ bh a4 get bh = do h <- getByte bh @@ -175,23 +183,25 @@ instance Binary IfaceDecl where occ <- return $! mkOccNameFS varName name return (IfaceId occ ty details idinfo) 1 -> error "Binary.get(TyClDecl): ForeignType" - 2 -> do a1 <- get bh - a2 <- get bh - a3 <- get bh - a4 <- get bh - a5 <- get bh - a6 <- get bh - a7 <- get bh - a8 <- get bh - a9 <- get bh + 2 -> do a1 <- get bh + a2 <- get bh + a3 <- get bh + a4 <- get bh + a5 <- get bh + a6 <- get bh + a7 <- get bh + a8 <- get bh + a9 <- get bh + a10 <- get bh occ <- return $! mkOccNameFS tcName a1 - return (IfaceData occ a2 a3 a4 a5 a6 a7 a8 a9) + return (IfaceData occ a2 a3 a4 a5 a6 a7 a8 a9 a10) 3 -> do a1 <- get bh a2 <- get bh a3 <- get bh a4 <- get bh + a5 <- get bh occ <- return $! mkOccNameFS tcName a1 - return (IfaceSyn occ a2 a3 a4) + return (IfaceSyn occ a2 a3 a4 a5) 4 -> do a1 <- get bh a2 <- get bh a3 <- get bh @@ -199,13 +209,15 @@ instance Binary IfaceDecl where a5 <- get bh a6 <- get bh a7 <- get bh + a8 <- get bh occ <- return $! mkOccNameFS clsName a2 - return (IfaceClass a1 occ a3 a4 a5 a6 a7) + return (IfaceClass a1 occ a3 a4 a5 a6 a7 a8) _ -> do a1 <- get bh a2 <- get bh a3 <- get bh + a4 <- get bh occ <- return $! mkOccNameFS tcName a1 - return (IfaceAxiom occ a2 a3) + return (IfaceAxiom occ a2 a3 a4) data IfaceSynTyConRhs = IfaceOpenSynFamilyTyCon @@ -282,22 +294,25 @@ pprAxBranch mtycon (IfaceAxBranch { ifaxbTyVars = tvs -- this is just like CoAxBranch data IfaceAxBranch = IfaceAxBranch { ifaxbTyVars :: [IfaceTvBndr] , ifaxbLHS :: [IfaceType] + , ifaxbRoles :: [Role] , ifaxbRHS :: IfaceType , ifaxbIncomps :: [BranchIndex] } -- See Note [Storing compatibility] in CoAxiom instance Binary IfaceAxBranch where - put_ bh (IfaceAxBranch a1 a2 a3 a4) = do + put_ bh (IfaceAxBranch a1 a2 a3 a4 a5) = do put_ bh a1 put_ bh a2 put_ bh a3 put_ bh a4 + put_ bh a5 get bh = do a1 <- get bh a2 <- get bh a3 <- get bh a4 <- get bh - return (IfaceAxBranch a1 a2 a3 a4) + a5 <- get bh + return (IfaceAxBranch a1 a2 a3 a4 a5) data IfaceConDecls = IfAbstractTyCon Bool -- c.f TyCon.AbstractTyCon @@ -625,7 +640,7 @@ data IfaceExpr = IfaceLcl IfLclName | IfaceExt IfExtName | IfaceType IfaceType - | IfaceCo IfaceType -- We re-use IfaceType for coercions + | IfaceCo IfaceCoercion | IfaceTuple TupleSort [IfaceExpr] -- Saturated; type arguments omitted | IfaceLam IfaceBndr IfaceExpr | IfaceApp IfaceExpr IfaceExpr @@ -1010,26 +1025,27 @@ pprIfaceDecl (IfaceForeign {ifName = tycon}) pprIfaceDecl (IfaceSyn {ifName = tycon, ifTyVars = tyvars, + ifRoles = roles, ifSynRhs = IfaceSynonymTyCon mono_ty}) - = hang (ptext (sLit "type") <+> pprIfaceDeclHead [] tycon tyvars) + = hang (ptext (sLit "type") <+> pprIfaceDeclHead [] tycon tyvars roles) 4 (vcat [equals <+> ppr mono_ty]) -pprIfaceDecl (IfaceSyn {ifName = tycon, ifTyVars = tyvars, +pprIfaceDecl (IfaceSyn {ifName = tycon, ifTyVars = tyvars, ifRoles = roles, ifSynRhs = IfaceOpenSynFamilyTyCon, ifSynKind = kind }) - = hang (ptext (sLit "type family") <+> pprIfaceDeclHead [] tycon tyvars) + = hang (ptext (sLit "type family") <+> pprIfaceDeclHead [] tycon tyvars roles) 4 (dcolon <+> ppr kind) -pprIfaceDecl (IfaceSyn {ifName = tycon, ifTyVars = tyvars, +pprIfaceDecl (IfaceSyn {ifName = tycon, ifTyVars = tyvars, ifRoles = roles, ifSynRhs = IfaceClosedSynFamilyTyCon {}, ifSynKind = kind }) - = hang (ptext (sLit "closed type family") <+> pprIfaceDeclHead [] tycon tyvars) + = hang (ptext (sLit "closed type family") <+> pprIfaceDeclHead [] tycon tyvars roles) 4 (dcolon <+> ppr kind) pprIfaceDecl (IfaceData {ifName = tycon, ifCType = cType, ifCtxt = context, - ifTyVars = tyvars, ifCons = condecls, + ifTyVars = tyvars, ifRoles = roles, ifCons = condecls, ifRec = isrec, ifPromotable = is_prom, ifAxiom = mbAxiom}) - = hang (pp_nd <+> pprIfaceDeclHead context tycon tyvars) + = hang (pp_nd <+> pprIfaceDeclHead context tycon tyvars roles) 4 (vcat [ pprCType cType , pprRec isrec <> comma <+> pp_prom , pp_condecls tycon condecls @@ -1044,9 +1060,9 @@ pprIfaceDecl (IfaceData {ifName = tycon, ifCType = cType, IfNewTyCon _ -> ptext (sLit "newtype") pprIfaceDecl (IfaceClass {ifCtxt = context, ifName = clas, ifTyVars = tyvars, - ifFDs = fds, ifATs = ats, ifSigs = sigs, + ifRoles = roles, ifFDs = fds, ifATs = ats, ifSigs = sigs, ifRec = isrec}) - = hang (ptext (sLit "class") <+> pprIfaceDeclHead context clas tyvars <+> pprFundeps fds) + = hang (ptext (sLit "class") <+> pprIfaceDeclHead context clas tyvars roles <+> pprFundeps fds) 4 (vcat [pprRec isrec, sep (map ppr ats), sep (map ppr sigs)]) @@ -1072,10 +1088,10 @@ instance Outputable IfaceClassOp where instance Outputable IfaceAT where ppr (IfaceAT d defs) = hang (ppr d) 2 (vcat (map ppr defs)) -pprIfaceDeclHead :: IfaceContext -> OccName -> [IfaceTvBndr] -> SDoc -pprIfaceDeclHead context thing tyvars +pprIfaceDeclHead :: IfaceContext -> OccName -> [IfaceTvBndr] -> [Role] -> SDoc +pprIfaceDeclHead context thing tyvars roles = hsep [pprIfaceContext context, parenSymOcc thing (ppr thing), - pprIfaceTvBndrs tyvars] + pprIfaceTvBndrsRoles tyvars roles] pp_condecls :: OccName -> IfaceConDecls -> SDoc pp_condecls _ (IfAbstractTyCon {}) = empty @@ -1105,7 +1121,7 @@ pprIfaceConDecl tc ppr_bang IfNoBang = char '_' -- Want to see these ppr_bang IfStrict = char '!' ppr_bang IfUnpack = ptext (sLit "!!") - ppr_bang (IfUnpackCo co) = ptext (sLit "!!") <> pprParendIfaceType co + ppr_bang (IfUnpackCo co) = ptext (sLit "!!") <> pprParendIfaceCoercion co main_payload = ppr name <+> dcolon <+> pprIfaceForAllPart (univ_tvs ++ ex_tvs) (eq_ctxt ++ ctxt) pp_tau @@ -1170,7 +1186,7 @@ pprIfaceExpr _ (IfaceExt v) = ppr v pprIfaceExpr _ (IfaceLit l) = ppr l pprIfaceExpr _ (IfaceFCall cc ty) = braces (ppr cc <+> ppr ty) pprIfaceExpr _ (IfaceType ty) = char '@' <+> pprParendIfaceType ty -pprIfaceExpr _ (IfaceCo co) = text "@~" <+> pprParendIfaceType co +pprIfaceExpr _ (IfaceCo co) = text "@~" <+> pprParendIfaceCoercion co pprIfaceExpr add_par app@(IfaceApp _ _) = add_par (pprIfaceApp app []) pprIfaceExpr _ (IfaceTuple c as) = tupleParens c (interpp'SP as) @@ -1203,7 +1219,7 @@ pprIfaceExpr add_par (IfaceCase scrut bndr alts) pprIfaceExpr _ (IfaceCast expr co) = sep [pprParendIfaceExpr expr, nest 2 (ptext (sLit "`cast`")), - pprParendIfaceType co] + pprParendIfaceCoercion co] pprIfaceExpr add_par (IfaceLet (IfaceNonRec b rhs) body) = add_par (sep [ptext (sLit "let {"), @@ -1376,8 +1392,35 @@ freeNamesIfType (IfaceLitTy _) = emptyNameSet freeNamesIfType (IfaceForAllTy tv t) = freeNamesIfTvBndr tv &&& freeNamesIfType t freeNamesIfType (IfaceFunTy s t) = freeNamesIfType s &&& freeNamesIfType t -freeNamesIfType (IfaceCoConApp tc ts) = - freeNamesIfCo tc &&& fnList freeNamesIfType ts + +freeNamesIfCoercion :: IfaceCoercion -> NameSet +freeNamesIfCoercion (IfaceReflCo _ t) = freeNamesIfType t +freeNamesIfCoercion (IfaceFunCo _ c1 c2) + = freeNamesIfCoercion c1 &&& freeNamesIfCoercion c2 +freeNamesIfCoercion (IfaceTyConAppCo _ tc cos) + = freeNamesIfTc tc &&& fnList freeNamesIfCoercion cos +freeNamesIfCoercion (IfaceAppCo c1 c2) + = freeNamesIfCoercion c1 &&& freeNamesIfCoercion c2 +freeNamesIfCoercion (IfaceForAllCo tv co) + = freeNamesIfTvBndr tv &&& freeNamesIfCoercion co +freeNamesIfCoercion (IfaceCoVarCo _) + = emptyNameSet +freeNamesIfCoercion (IfaceAxiomInstCo ax _ cos) + = unitNameSet ax &&& fnList freeNamesIfCoercion cos +freeNamesIfCoercion (IfaceUnivCo _ t1 t2) + = freeNamesIfType t1 &&& freeNamesIfType t2 +freeNamesIfCoercion (IfaceSymCo c) + = freeNamesIfCoercion c +freeNamesIfCoercion (IfaceTransCo c1 c2) + = freeNamesIfCoercion c1 &&& freeNamesIfCoercion c2 +freeNamesIfCoercion (IfaceNthCo _ co) + = freeNamesIfCoercion co +freeNamesIfCoercion (IfaceLRCo _ co) + = freeNamesIfCoercion co +freeNamesIfCoercion (IfaceInstCo co ty) + = freeNamesIfCoercion co &&& freeNamesIfType ty +freeNamesIfCoercion (IfaceSubCo co) + = freeNamesIfCoercion co freeNamesIfTvBndrs :: [IfaceTvBndr] -> NameSet freeNamesIfTvBndrs = fnList freeNamesIfTvBndr @@ -1420,11 +1463,11 @@ freeNamesIfExpr :: IfaceExpr -> NameSet freeNamesIfExpr (IfaceExt v) = unitNameSet v freeNamesIfExpr (IfaceFCall _ ty) = freeNamesIfType ty freeNamesIfExpr (IfaceType ty) = freeNamesIfType ty -freeNamesIfExpr (IfaceCo co) = freeNamesIfType co +freeNamesIfExpr (IfaceCo co) = freeNamesIfCoercion co freeNamesIfExpr (IfaceTuple _ as) = fnList freeNamesIfExpr as freeNamesIfExpr (IfaceLam b body) = freeNamesIfBndr b &&& freeNamesIfExpr body freeNamesIfExpr (IfaceApp f a) = freeNamesIfExpr f &&& freeNamesIfExpr a -freeNamesIfExpr (IfaceCast e co) = freeNamesIfExpr e &&& freeNamesIfType co +freeNamesIfExpr (IfaceCast e co) = freeNamesIfExpr e &&& freeNamesIfCoercion co freeNamesIfExpr (IfaceTick _ e) = freeNamesIfExpr e freeNamesIfExpr (IfaceECase e ty) = freeNamesIfExpr e &&& freeNamesIfType ty freeNamesIfExpr (IfaceCase s _ alts) @@ -1454,11 +1497,6 @@ freeNamesIfTc :: IfaceTyCon -> NameSet freeNamesIfTc (IfaceTc tc) = unitNameSet tc -- ToDo: shouldn't we include IfaceIntTc & co.? -freeNamesIfCo :: IfaceCoCon -> NameSet -freeNamesIfCo (IfaceCoAx tc _) = unitNameSet tc --- ToDo: include IfaceIPCoAx? Probably not necessary. -freeNamesIfCo _ = emptyNameSet - freeNamesIfRule :: IfaceRule -> NameSet freeNamesIfRule (IfaceRule { ifRuleBndrs = bs, ifRuleHead = f , ifRuleArgs = es, ifRuleRhs = rhs }) diff --git a/compiler/iface/IfaceType.lhs b/compiler/iface/IfaceType.lhs index c3b59b7be8..b9d6a445cf 100644 --- a/compiler/iface/IfaceType.lhs +++ b/compiler/iface/IfaceType.lhs @@ -9,22 +9,24 @@ This module defines interface types and binders module IfaceType ( IfExtName, IfLclName, - IfaceType(..), IfacePredType, IfaceKind, IfaceTyCon(..), IfaceCoCon(..), + IfaceType(..), IfacePredType, IfaceKind, IfaceTyCon(..), IfaceCoercion(..), IfaceTyLit(..), - IfaceContext, IfaceBndr(..), IfaceTvBndr, IfaceIdBndr, IfaceCoercion, + IfaceContext, IfaceBndr(..), IfaceTvBndr, IfaceIdBndr, -- Conversion from Type -> IfaceType toIfaceType, toIfaceKind, toIfaceContext, toIfaceBndr, toIfaceIdBndr, toIfaceTvBndrs, toIfaceTyCon, toIfaceTyCon_name, - -- Conversion from Coercion -> IfaceType - coToIfaceType, + -- Conversion from Coercion -> IfaceCoercion + toIfaceCoercion, -- Printing pprIfaceType, pprParendIfaceType, pprIfaceContext, - pprIfaceIdBndr, pprIfaceTvBndr, pprIfaceTvBndrs, pprIfaceBndrs, - tOP_PREC, tYCON_PREC, noParens, maybeParen, pprIfaceForAllPart + pprIfaceIdBndr, pprIfaceTvBndr, pprIfaceTvBndrs, pprIfaceTvBndrsRoles, + pprIfaceBndrs, + tOP_PREC, tYCON_PREC, noParens, maybeParen, pprIfaceForAllPart, + pprIfaceCoercion, pprParendIfaceCoercion ) where @@ -68,16 +70,14 @@ type IfaceTvBndr = (IfLclName, IfaceKind) ------------------------------- type IfaceKind = IfaceType -type IfaceCoercion = IfaceType -data IfaceType -- A kind of universal type, used for types, kinds, and coercions +data IfaceType -- A kind of universal type, used for types and kinds = IfaceTyVar IfLclName -- Type/coercion variable only, not tycon | IfaceAppTy IfaceType IfaceType | IfaceFunTy IfaceType IfaceType | IfaceForAllTy IfaceTvBndr IfaceType | IfaceTyConApp IfaceTyCon [IfaceType] -- Not necessarily saturated -- Includes newtypes, synonyms, tuples - | IfaceCoConApp IfaceCoCon [IfaceType] -- Always saturated | IfaceLitTy IfaceTyLit type IfacePredType = IfaceType @@ -91,12 +91,21 @@ data IfaceTyLit -- coercion constructors, the lot newtype IfaceTyCon = IfaceTc { ifaceTyConName :: IfExtName } - -- Coercion constructors -data IfaceCoCon - = IfaceCoAx IfExtName BranchIndex -- BranchIndex is 0-indexed branch number - | IfaceReflCo | IfaceUnsafeCo | IfaceSymCo - | IfaceTransCo | IfaceInstCo - | IfaceNthCo Int | IfaceLRCo LeftOrRight +data IfaceCoercion + = IfaceReflCo Role IfaceType + | IfaceFunCo Role IfaceCoercion IfaceCoercion + | IfaceTyConAppCo Role IfaceTyCon [IfaceCoercion] + | IfaceAppCo IfaceCoercion IfaceCoercion + | IfaceForAllCo IfaceTvBndr IfaceCoercion + | IfaceCoVarCo IfLclName + | IfaceAxiomInstCo IfExtName BranchIndex [IfaceCoercion] + | IfaceUnivCo Role IfaceType IfaceType + | IfaceSymCo IfaceCoercion + | IfaceTransCo IfaceCoercion IfaceCoercion + | IfaceNthCo Int IfaceCoercion + | IfaceLRCo LeftOrRight IfaceCoercion + | IfaceInstCo IfaceCoercion IfaceType + | IfaceSubCo IfaceCoercion \end{code} %************************************************************************ @@ -177,6 +186,11 @@ pprIfaceTvBndr (tv, kind) = parens (ppr tv <> dcolon <> ppr kind) pprIfaceTvBndrs :: [IfaceTvBndr] -> SDoc pprIfaceTvBndrs tyvars = sep (map pprIfaceTvBndr tyvars) +pprIfaceTvBndrsRoles :: [IfaceTvBndr] -> [Role] -> SDoc +pprIfaceTvBndrsRoles tyvars roles = sep (zipWith ppr_bndr_role tyvars roles) + where + ppr_bndr_role bndr role = pprIfaceTvBndr bndr <> char '@' <> ppr role + instance Binary IfaceBndr where put_ bh (IfaceIdBndr aa) = do putByte bh 0 @@ -211,14 +225,10 @@ isIfacePredTy _ = False ppr_ty :: Int -> IfaceType -> SDoc ppr_ty _ (IfaceTyVar tyvar) = ppr tyvar -ppr_ty ctxt_prec (IfaceTyConApp tc tys) = ppr_tc_app ctxt_prec tc tys +ppr_ty ctxt_prec (IfaceTyConApp tc tys) = ppr_tc_app ppr_ty ctxt_prec tc tys ppr_ty _ (IfaceLitTy n) = ppr_tylit n -ppr_ty ctxt_prec (IfaceCoConApp tc tys) - = maybeParen ctxt_prec tYCON_PREC - (sep [ppr tc, nest 4 (sep (map pprParendIfaceType tys))]) - -- Function types ppr_ty ctxt_prec (IfaceFunTy ty1 ty2) = -- We don't want to lose synonyms, so we mustn't use splitFunTys here. @@ -243,7 +253,9 @@ ppr_ty ctxt_prec ty@(IfaceForAllTy _ _) (tvs, theta, tau) = splitIfaceSigmaTy ty ------------------- -pprIfaceForAllPart :: [IfaceTvBndr] -> IfaceContext -> SDoc -> SDoc +-- needs to handle type contexts and coercion contexts, hence the +-- generality +pprIfaceForAllPart :: Outputable a => [IfaceTvBndr] -> [a] -> SDoc -> SDoc pprIfaceForAllPart tvs ctxt doc = sep [ppr_tvs, pprIfaceContext ctxt, doc] where @@ -251,20 +263,23 @@ pprIfaceForAllPart tvs ctxt doc | otherwise = ptext (sLit "forall") <+> pprIfaceTvBndrs tvs <> dot ------------------- -ppr_tc_app :: Int -> IfaceTyCon -> [IfaceType] -> SDoc -ppr_tc_app _ tc [] = ppr_tc tc +ppr_tc_app :: (Int -> a -> SDoc) -> Int -> IfaceTyCon -> [a] -> SDoc +ppr_tc_app _ _ tc [] = ppr_tc tc -ppr_tc_app _ (IfaceTc n) [ty] | n == listTyConName = brackets (pprIfaceType ty) -ppr_tc_app _ (IfaceTc n) [ty] | n == parrTyConName = paBrackets (pprIfaceType ty) -ppr_tc_app _ (IfaceTc n) tys +ppr_tc_app pp _ (IfaceTc n) [ty] + | n == listTyConName + = brackets (pp tOP_PREC ty) + | n == parrTyConName + = paBrackets (pp tOP_PREC ty) +ppr_tc_app pp _ (IfaceTc n) tys | Just (ATyCon tc) <- wiredInNameTyThing_maybe n , Just sort <- tyConTuple_maybe tc , tyConArity tc == length tys - = tupleParens sort (sep (punctuate comma (map pprIfaceType tys))) -ppr_tc_app ctxt_prec tc tys + = tupleParens sort (sep (punctuate comma (map (pp tOP_PREC) tys))) +ppr_tc_app pp ctxt_prec tc tys = maybeParen ctxt_prec tYCON_PREC - (sep [ppr_tc tc, nest 4 (sep (map pprParendIfaceType tys))]) + (sep [ppr_tc tc, nest 4 (sep (map (pp tYCON_PREC) tys))]) ppr_tc :: IfaceTyCon -> SDoc -- Wrap infix type constructors in parens @@ -278,47 +293,78 @@ ppr_tylit :: IfaceTyLit -> SDoc ppr_tylit (IfaceNumTyLit n) = integer n ppr_tylit (IfaceStrTyLit n) = text (show n) +pprIfaceCoercion, pprParendIfaceCoercion :: IfaceCoercion -> SDoc +pprIfaceCoercion = ppr_co tOP_PREC +pprParendIfaceCoercion = ppr_co tYCON_PREC + +ppr_co :: Int -> IfaceCoercion -> SDoc +ppr_co _ (IfaceReflCo r ty) = angleBrackets (ppr ty) <> ppr_role r +ppr_co ctxt_prec (IfaceFunCo r co1 co2) + = maybeParen ctxt_prec fUN_PREC $ + sep (ppr_co fUN_PREC co1 : ppr_fun_tail co2) + where + ppr_fun_tail (IfaceFunCo r co1 co2) + = (arrow <> ppr_role r <+> ppr_co fUN_PREC co1) : ppr_fun_tail co2 + ppr_fun_tail other_co + = [arrow <> ppr_role r <+> pprIfaceCoercion other_co] + +ppr_co _ (IfaceTyConAppCo r tc cos) + = parens (ppr_tc_app ppr_co tOP_PREC tc cos) <> ppr_role r +ppr_co ctxt_prec (IfaceAppCo co1 co2) + = maybeParen ctxt_prec tYCON_PREC $ + ppr_co fUN_PREC co1 <+> pprParendIfaceCoercion co2 +ppr_co ctxt_prec co@(IfaceForAllCo _ _) + = maybeParen ctxt_prec fUN_PREC (sep [ppr_tvs, pprIfaceCoercion inner_co]) + where + (tvs, inner_co) = split_co co + ppr_tvs = ptext (sLit "forall") <+> pprIfaceTvBndrs tvs <> dot + + split_co (IfaceForAllCo tv co') + = let (tvs, co'') = split_co co' in (tv:tvs,co'') + split_co co' = ([], co') + +ppr_co _ (IfaceCoVarCo covar) = ppr covar + +ppr_co ctxt_prec (IfaceUnivCo r ty1 ty2) + = maybeParen ctxt_prec tYCON_PREC $ + ptext (sLit "UnivCo") <+> ppr r <+> + pprParendIfaceType ty1 <+> pprParendIfaceType ty2 + +ppr_co ctxt_prec (IfaceInstCo co ty) + = maybeParen ctxt_prec tYCON_PREC $ + ptext (sLit "Inst") <+> pprParendIfaceCoercion co <+> pprParendIfaceType ty + +ppr_co ctxt_prec co + = ppr_special_co ctxt_prec doc cos + where (doc, cos) = case co of + { IfaceAxiomInstCo n i cos -> (ppr n <> brackets (ppr i), cos) + ; IfaceSymCo co -> (ptext (sLit "Sym"), [co]) + ; IfaceTransCo co1 co2 -> (ptext (sLit "Trans"), [co1,co2]) + ; IfaceNthCo d co -> (ptext (sLit "Nth:") <> int d, + [co]) + ; IfaceLRCo lr co -> (ppr lr, [co]) + ; IfaceSubCo co -> (ptext (sLit "Sub"), [co]) + ; _ -> panic "pprIfaceCo" } + +ppr_special_co :: Int -> SDoc -> [IfaceCoercion] -> SDoc +ppr_special_co ctxt_prec doc cos + = maybeParen ctxt_prec tYCON_PREC + (sep [doc, nest 4 (sep (map pprParendIfaceCoercion cos))]) + +ppr_role :: Role -> SDoc +ppr_role r = underscore <> ppr r + ------------------- instance Outputable IfaceTyCon where ppr = ppr . ifaceTyConName +instance Outputable IfaceCoercion where + ppr = pprIfaceCoercion + instance Binary IfaceTyCon where put_ bh (IfaceTc ext) = put_ bh ext get bh = liftM IfaceTc (get bh) -instance Outputable IfaceCoCon where - ppr (IfaceCoAx n i) = ppr n <> brackets (ppr i) - ppr IfaceReflCo = ptext (sLit "Refl") - ppr IfaceUnsafeCo = ptext (sLit "Unsafe") - ppr IfaceSymCo = ptext (sLit "Sym") - ppr IfaceTransCo = ptext (sLit "Trans") - ppr IfaceInstCo = ptext (sLit "Inst") - ppr (IfaceNthCo d) = ptext (sLit "Nth:") <> int d - ppr (IfaceLRCo lr) = ppr lr - -instance Binary IfaceCoCon where - put_ bh (IfaceCoAx n ind) = do { putByte bh 0; put_ bh n; put_ bh ind } - put_ bh IfaceReflCo = putByte bh 1 - put_ bh IfaceUnsafeCo = putByte bh 2 - put_ bh IfaceSymCo = putByte bh 3 - put_ bh IfaceTransCo = putByte bh 4 - put_ bh IfaceInstCo = putByte bh 5 - put_ bh (IfaceNthCo d) = do { putByte bh 6; put_ bh d } - put_ bh (IfaceLRCo lr) = do { putByte bh 7; put_ bh lr } - - get bh = do - h <- getByte bh - case h of - 0 -> do { n <- get bh; ind <- get bh; return (IfaceCoAx n ind) } - 1 -> return IfaceReflCo - 2 -> return IfaceUnsafeCo - 3 -> return IfaceSymCo - 4 -> return IfaceTransCo - 5 -> return IfaceInstCo - 6 -> do { d <- get bh; return (IfaceNthCo d) } - 7 -> do { lr <- get bh; return (IfaceLRCo lr) } - _ -> panic ("get IfaceCoCon " ++ show h) - instance Outputable IfaceTyLit where ppr = ppr_tylit @@ -336,12 +382,12 @@ instance Binary IfaceTyLit where _ -> panic ("get IfaceTyLit " ++ show tag) ------------------- -pprIfaceContext :: IfaceContext -> SDoc +pprIfaceContext :: Outputable a => [a] -> SDoc -- Prints "(C a, D b) =>", including the arrow pprIfaceContext [] = empty pprIfaceContext theta = ppr_preds theta <+> darrow -ppr_preds :: [IfacePredType] -> SDoc +ppr_preds :: Outputable a => [a] -> SDoc ppr_preds [pred] = ppr pred -- No parens ppr_preds preds = parens (sep (punctuate comma (map ppr preds))) @@ -361,8 +407,6 @@ instance Binary IfaceType where putByte bh 3 put_ bh ag put_ bh ah - put_ bh (IfaceCoConApp cc tys) - = do { putByte bh 4; put_ bh cc; put_ bh tys } put_ bh (IfaceTyConApp tc tys) = do { putByte bh 5; put_ bh tc; put_ bh tys } @@ -383,8 +427,6 @@ instance Binary IfaceType where 3 -> do ag <- get bh ah <- get bh return (IfaceFunTy ag ah) - 4 -> do { cc <- get bh; tys <- get bh - ; return (IfaceCoConApp cc tys) } 5 -> do { tc <- get bh; tys <- get bh ; return (IfaceTyConApp tc tys) } @@ -392,6 +434,114 @@ instance Binary IfaceType where return (IfaceLitTy n) _ -> panic ("get IfaceType " ++ show h) + +instance Binary IfaceCoercion where + put_ bh (IfaceReflCo a b) = do + putByte bh 1 + put_ bh a + put_ bh b + put_ bh (IfaceFunCo a b c) = do + putByte bh 2 + put_ bh a + put_ bh b + put_ bh c + put_ bh (IfaceTyConAppCo a b c) = do + putByte bh 3 + put_ bh a + put_ bh b + put_ bh c + put_ bh (IfaceAppCo a b) = do + putByte bh 4 + put_ bh a + put_ bh b + put_ bh (IfaceForAllCo a b) = do + putByte bh 5 + put_ bh a + put_ bh b + put_ bh (IfaceCoVarCo a) = do + putByte bh 6 + put_ bh a + put_ bh (IfaceAxiomInstCo a b c) = do + putByte bh 7 + put_ bh a + put_ bh b + put_ bh c + put_ bh (IfaceUnivCo a b c) = do + putByte bh 8 + put_ bh a + put_ bh b + put_ bh c + put_ bh (IfaceSymCo a) = do + putByte bh 9 + put_ bh a + put_ bh (IfaceTransCo a b) = do + putByte bh 10 + put_ bh a + put_ bh b + put_ bh (IfaceNthCo a b) = do + putByte bh 11 + put_ bh a + put_ bh b + put_ bh (IfaceLRCo a b) = do + putByte bh 12 + put_ bh a + put_ bh b + put_ bh (IfaceInstCo a b) = do + putByte bh 13 + put_ bh a + put_ bh b + put_ bh (IfaceSubCo a) = do + putByte bh 14 + put_ bh a + + get bh = do + tag <- getByte bh + case tag of + 1 -> do a <- get bh + b <- get bh + return $ IfaceReflCo a b + 2 -> do a <- get bh + b <- get bh + c <- get bh + return $ IfaceFunCo a b c + 3 -> do a <- get bh + b <- get bh + c <- get bh + return $ IfaceTyConAppCo a b c + 4 -> do a <- get bh + b <- get bh + return $ IfaceAppCo a b + 5 -> do a <- get bh + b <- get bh + return $ IfaceForAllCo a b + 6 -> do a <- get bh + return $ IfaceCoVarCo a + 7 -> do a <- get bh + b <- get bh + c <- get bh + return $ IfaceAxiomInstCo a b c + 8 -> do a <- get bh + b <- get bh + c <- get bh + return $ IfaceUnivCo a b c + 9 -> do a <- get bh + return $ IfaceSymCo a + 10-> do a <- get bh + b <- get bh + return $ IfaceTransCo a b + 11-> do a <- get bh + b <- get bh + return $ IfaceNthCo a b + 12-> do a <- get bh + b <- get bh + return $ IfaceLRCo a b + 13-> do a <- get bh + b <- get bh + return $ IfaceInstCo a b + 14-> do a <- get bh + return $ IfaceSubCo a + _ -> panic ("get IfaceCoercion " ++ show tag) + \end{code} %************************************************************************ @@ -453,38 +603,31 @@ toIfaceContext :: ThetaType -> IfaceContext toIfaceContext = toIfaceTypes ---------------- -coToIfaceType :: Coercion -> IfaceType -coToIfaceType (Refl ty) = IfaceCoConApp IfaceReflCo [toIfaceType ty] -coToIfaceType (TyConAppCo tc cos) +toIfaceCoercion :: Coercion -> IfaceCoercion +toIfaceCoercion (Refl r ty) = IfaceReflCo r (toIfaceType ty) +toIfaceCoercion (TyConAppCo r tc cos) | tc `hasKey` funTyConKey - , [arg,res] <- cos = IfaceFunTy (coToIfaceType arg) (coToIfaceType res) - | otherwise = IfaceTyConApp (toIfaceTyCon tc) - (map coToIfaceType cos) -coToIfaceType (AppCo co1 co2) = IfaceAppTy (coToIfaceType co1) - (coToIfaceType co2) -coToIfaceType (ForAllCo v co) = IfaceForAllTy (toIfaceTvBndr v) - (coToIfaceType co) -coToIfaceType (CoVarCo cv) = IfaceTyVar (toIfaceCoVar cv) -coToIfaceType (AxiomInstCo con ind cos) - = IfaceCoConApp (coAxiomToIfaceType con ind) - (map coToIfaceType cos) -coToIfaceType (UnsafeCo ty1 ty2) = IfaceCoConApp IfaceUnsafeCo - [ toIfaceType ty1 - , toIfaceType ty2 ] -coToIfaceType (SymCo co) = IfaceCoConApp IfaceSymCo - [ coToIfaceType co ] -coToIfaceType (TransCo co1 co2) = IfaceCoConApp IfaceTransCo - [ coToIfaceType co1 - , coToIfaceType co2 ] -coToIfaceType (NthCo d co) = IfaceCoConApp (IfaceNthCo d) - [ coToIfaceType co ] -coToIfaceType (LRCo lr co) = IfaceCoConApp (IfaceLRCo lr) - [ coToIfaceType co ] -coToIfaceType (InstCo co ty) = IfaceCoConApp IfaceInstCo - [ coToIfaceType co - , toIfaceType ty ] - -coAxiomToIfaceType :: CoAxiom br -> Int -> IfaceCoCon -coAxiomToIfaceType con ind = IfaceCoAx (coAxiomName con) ind + , [arg,res] <- cos = IfaceFunCo r (toIfaceCoercion arg) (toIfaceCoercion res) + | otherwise = IfaceTyConAppCo r (toIfaceTyCon tc) + (map toIfaceCoercion cos) +toIfaceCoercion (AppCo co1 co2) = IfaceAppCo (toIfaceCoercion co1) + (toIfaceCoercion co2) +toIfaceCoercion (ForAllCo v co) = IfaceForAllCo (toIfaceTvBndr v) + (toIfaceCoercion co) +toIfaceCoercion (CoVarCo cv) = IfaceCoVarCo (toIfaceCoVar cv) +toIfaceCoercion (AxiomInstCo con ind cos) + = IfaceAxiomInstCo (coAxiomName con) ind + (map toIfaceCoercion cos) +toIfaceCoercion (UnivCo r ty1 ty2) = IfaceUnivCo r (toIfaceType ty1) + (toIfaceType ty2) +toIfaceCoercion (SymCo co) = IfaceSymCo (toIfaceCoercion co) +toIfaceCoercion (TransCo co1 co2) = IfaceTransCo (toIfaceCoercion co1) + (toIfaceCoercion co2) +toIfaceCoercion (NthCo d co) = IfaceNthCo d (toIfaceCoercion co) +toIfaceCoercion (LRCo lr co) = IfaceLRCo lr (toIfaceCoercion co) +toIfaceCoercion (InstCo co ty) = IfaceInstCo (toIfaceCoercion co) + (toIfaceType ty) +toIfaceCoercion (SubCo co) = IfaceSubCo (toIfaceCoercion co) + \end{code} diff --git a/compiler/iface/MkIface.lhs b/compiler/iface/MkIface.lhs index d9bd6fc941..bf48f889a4 100644 --- a/compiler/iface/MkIface.lhs +++ b/compiler/iface/MkIface.lhs @@ -1441,9 +1441,11 @@ idToIfaceDecl id coAxiomToIfaceDecl :: CoAxiom br -> IfaceDecl -- We *do* tidy Axioms, because they are not (and cannot -- conveniently be) built in tidy form -coAxiomToIfaceDecl ax@(CoAxiom { co_ax_tc = tycon, co_ax_branches = branches }) +coAxiomToIfaceDecl ax@(CoAxiom { co_ax_tc = tycon, co_ax_branches = branches + , co_ax_role = role }) = IfaceAxiom { ifName = name , ifTyCon = toIfaceTyCon tycon + , ifRole = role , ifAxBranches = brListMap (coAxBranchToIfaceBranch emptyTidyEnv (brListMap coAxBranchLHS branches)) branches } @@ -1466,9 +1468,11 @@ coAxBranchToIfaceBranch env0 lhs_s -- use this one for standalone branches without incompatibles coAxBranchToIfaceBranch' :: TidyEnv -> CoAxBranch -> IfaceAxBranch coAxBranchToIfaceBranch' env0 - (CoAxBranch { cab_tvs = tvs, cab_lhs = lhs, cab_rhs = rhs }) + (CoAxBranch { cab_tvs = tvs, cab_lhs = lhs + , cab_roles = roles, cab_rhs = rhs }) = IfaceAxBranch { ifaxbTyVars = toIfaceTvBndrs tv_bndrs , ifaxbLHS = map (tidyToIfaceType env1) lhs + , ifaxbRoles = roles , ifaxbRHS = tidyToIfaceType env1 rhs , ifaxbIncomps = [] } where @@ -1485,6 +1489,7 @@ tyConToIfaceDecl env tycon | Just syn_rhs <- synTyConRhs_maybe tycon = IfaceSyn { ifName = getOccName tycon, ifTyVars = toIfaceTvBndrs tyvars, + ifRoles = tyConRoles tycon, ifSynRhs = to_ifsyn_rhs syn_rhs, ifSynKind = tidyToIfaceType env1 (synTyConResKind tycon) } @@ -1492,6 +1497,7 @@ tyConToIfaceDecl env tycon = IfaceData { ifName = getOccName tycon, ifCType = tyConCType tycon, ifTyVars = toIfaceTvBndrs tyvars, + ifRoles = tyConRoles tycon, ifCtxt = tidyToIfaceContext env1 (tyConStupidTheta tycon), ifCons = ifaceConDecls (algTyConRhs tycon), ifRec = boolToRecFlag (isRecursiveTyCon tycon), @@ -1545,7 +1551,7 @@ tyConToIfaceDecl env tycon toIfaceBang :: TidyEnv -> HsBang -> IfaceBang toIfaceBang _ HsNoBang = IfNoBang toIfaceBang _ (HsUnpack Nothing) = IfUnpack -toIfaceBang env (HsUnpack (Just co)) = IfUnpackCo (coToIfaceType (tidyCo env co)) +toIfaceBang env (HsUnpack (Just co)) = IfUnpackCo (toIfaceCoercion (tidyCo env co)) toIfaceBang _ HsStrict = IfStrict toIfaceBang _ (HsUserBang {}) = panic "toIfaceBang" @@ -1554,6 +1560,7 @@ classToIfaceDecl env clas = IfaceClass { ifCtxt = tidyToIfaceContext env1 sc_theta, ifName = getOccName (classTyCon clas), ifTyVars = toIfaceTvBndrs clas_tyvars', + ifRoles = tyConRoles (classTyCon clas), ifFDs = map toIfaceFD clas_fds, ifATs = map toIfaceAT clas_ats, ifSigs = map toIfaceClassOp op_stuff, @@ -1790,7 +1797,7 @@ coreRuleToIfaceRule mod rule@(Rule { ru_name = name, ru_fn = fn, -- construct the same ru_rough field as we have right now; -- see tcIfaceRule do_arg (Type ty) = IfaceType (toIfaceType (deNoteType ty)) - do_arg (Coercion co) = IfaceCo (coToIfaceType co) + do_arg (Coercion co) = IfaceCo (toIfaceCoercion co) do_arg arg = toIfaceExpr arg -- Compute orphanhood. See Note [Orphans] in IfaceSyn @@ -1813,14 +1820,14 @@ toIfaceExpr :: CoreExpr -> IfaceExpr toIfaceExpr (Var v) = toIfaceVar v toIfaceExpr (Lit l) = IfaceLit l toIfaceExpr (Type ty) = IfaceType (toIfaceType ty) -toIfaceExpr (Coercion co) = IfaceCo (coToIfaceType co) +toIfaceExpr (Coercion co) = IfaceCo (toIfaceCoercion co) toIfaceExpr (Lam x b) = IfaceLam (toIfaceBndr x) (toIfaceExpr b) toIfaceExpr (App f a) = toIfaceApp f [a] toIfaceExpr (Case s x ty as) | null as = IfaceECase (toIfaceExpr s) (toIfaceType ty) | otherwise = IfaceCase (toIfaceExpr s) (getFS x) (map toIfaceAlt as) toIfaceExpr (Let b e) = IfaceLet (toIfaceBind b) (toIfaceExpr e) -toIfaceExpr (Cast e co) = IfaceCast (toIfaceExpr e) (coToIfaceType co) +toIfaceExpr (Cast e co) = IfaceCast (toIfaceExpr e) (toIfaceCoercion co) toIfaceExpr (Tick t e) = IfaceTick (toIfaceTickish t) (toIfaceExpr e) --------------------- diff --git a/compiler/iface/TcIface.lhs b/compiler/iface/TcIface.lhs index f6b4e40fd7..c379199214 100644 --- a/compiler/iface/TcIface.lhs +++ b/compiler/iface/TcIface.lhs @@ -437,7 +437,8 @@ tc_iface_decl _ ignore_prags (IfaceId {ifName = occ_name, ifType = iface_type, tc_iface_decl parent _ (IfaceData {ifName = occ_name, ifCType = cType, - ifTyVars = tv_bndrs, + ifTyVars = tv_bndrs, + ifRoles = roles, ifCtxt = ctxt, ifGadtSyntax = gadt_syn, ifCons = rdr_cons, ifRec = is_rec, ifPromotable = is_prom, @@ -448,7 +449,7 @@ tc_iface_decl parent _ (IfaceData {ifName = occ_name, { stupid_theta <- tcIfaceCtxt ctxt ; parent' <- tc_parent tyvars mb_axiom_name ; cons <- tcIfaceDataCons tc_name tycon tyvars rdr_cons - ; return (buildAlgTyCon tc_name tyvars cType stupid_theta + ; return (buildAlgTyCon tc_name tyvars roles cType stupid_theta cons is_rec is_prom gadt_syn parent') } ; traceIf (text "tcIfaceDecl4" <+> ppr tycon) ; return (ATyCon tycon) } @@ -479,6 +480,7 @@ tc_iface_decl parent _ (IfaceData {ifName = occ_name, ; return (FamInstTyCon ax_unbr fam_tc lhs_tys) } tc_iface_decl parent _ (IfaceSyn {ifName = occ_name, ifTyVars = tv_bndrs, + ifRoles = roles, ifSynRhs = mb_rhs_ty, ifSynKind = kind }) = bindIfaceTyVars_AT tv_bndrs $ \ tyvars -> do @@ -486,7 +488,7 @@ tc_iface_decl parent _ (IfaceSyn {ifName = occ_name, ifTyVars = tv_bndrs, ; rhs_kind <- tcIfaceKind kind -- Note [Synonym kind loop] ; rhs <- forkM (mk_doc tc_name) $ tc_syn_rhs mb_rhs_ty - ; tycon <- buildSynTyCon tc_name tyvars rhs rhs_kind parent + ; tycon <- buildSynTyCon tc_name tyvars roles rhs rhs_kind parent ; return (ATyCon tycon) } where mk_doc n = ptext (sLit "Type syonym") <+> ppr n @@ -499,7 +501,7 @@ tc_iface_decl parent _ (IfaceSyn {ifName = occ_name, ifTyVars = tv_bndrs, tc_iface_decl _parent ignore_prags (IfaceClass {ifCtxt = rdr_ctxt, ifName = tc_occ, - ifTyVars = tv_bndrs, ifFDs = rdr_fds, + ifTyVars = tv_bndrs, ifRoles = roles, ifFDs = rdr_fds, ifATs = rdr_ats, ifSigs = rdr_sigs, ifRec = tc_isrec }) -- ToDo: in hs-boot files we should really treat abstract classes specially, @@ -515,7 +517,7 @@ tc_iface_decl _parent ignore_prags ; cls <- fixM $ \ cls -> do { ats <- mapM (tc_at cls) rdr_ats ; traceIf (text "tc-iface-class4" <+> ppr tc_occ) - ; buildClass ignore_prags tc_name tyvars ctxt fds ats sigs tc_isrec } + ; buildClass ignore_prags tc_name tyvars roles ctxt fds ats sigs tc_isrec } ; return (ATyCon (classTyCon cls)) } where tc_sc pred = forkM (mk_sc_doc pred) (tcIfaceType pred) @@ -555,9 +557,10 @@ tc_iface_decl _parent ignore_prags tc_iface_decl _ _ (IfaceForeign {ifName = rdr_name, ifExtName = ext_name}) = do { name <- lookupIfaceTop rdr_name ; return (ATyCon (mkForeignTyCon name ext_name - liftedTypeKind 0)) } + liftedTypeKind)) } -tc_iface_decl _ _ (IfaceAxiom {ifName = ax_occ, ifTyCon = tc, ifAxBranches = branches}) +tc_iface_decl _ _ (IfaceAxiom { ifName = ax_occ, ifTyCon = tc + , ifAxBranches = branches, ifRole = role }) = do { tc_name <- lookupIfaceTop ax_occ ; tc_tycon <- tcIfaceTyCon tc ; tc_branches <- foldlM tc_ax_branches [] branches @@ -565,6 +568,7 @@ tc_iface_decl _ _ (IfaceAxiom {ifName = ax_occ, ifTyCon = tc, ifAxBranches = bra CoAxiom { co_ax_unique = nameUnique tc_name , co_ax_name = tc_name , co_ax_tc = tc_tycon + , co_ax_role = role , co_ax_branches = toBranchList tc_branches , co_ax_implicit = False } ; return (ACoAxiom axiom) } @@ -572,14 +576,15 @@ tc_iface_decl _ _ (IfaceAxiom {ifName = ax_occ, ifTyCon = tc, ifAxBranches = bra tc_ax_branches :: [CoAxBranch] -> IfaceAxBranch -> IfL [CoAxBranch] tc_ax_branches prev_branches (IfaceAxBranch { ifaxbTyVars = tv_bndrs, ifaxbLHS = lhs, ifaxbRHS = rhs - , ifaxbIncomps = incomps }) + , ifaxbRoles = roles, ifaxbIncomps = incomps }) = bindIfaceTyVars tv_bndrs $ \ tvs -> do -- Variables will all be fresh { tc_lhs <- mapM tcIfaceType lhs ; tc_rhs <- tcIfaceType rhs - ; let br = CoAxBranch { cab_loc = noSrcSpan - , cab_tvs = tvs - , cab_lhs = tc_lhs - , cab_rhs = tc_rhs + ; let br = CoAxBranch { cab_loc = noSrcSpan + , cab_tvs = tvs + , cab_lhs = tc_lhs + , cab_roles = roles + , cab_rhs = tc_rhs , cab_incomps = map (prev_branches !!) incomps } ; return (prev_branches ++ [br]) } @@ -915,7 +920,6 @@ tcIfaceType (IfaceTyConApp tc tks) = do { tc' <- tcIfaceTyCon tc ; tks' <- tcIfaceTcArgs (tyConKind tc') tks ; return (mkTyConApp tc' tks') } tcIfaceType (IfaceForAllTy tv t) = bindIfaceTyVar tv $ \ tv' -> do { t' <- tcIfaceType t; return (ForAllTy tv' t') } -tcIfaceType t@(IfaceCoConApp {}) = pprPanic "tcIfaceType" (ppr t) tcIfaceTypes :: [IfaceType] -> IfL [Type] tcIfaceTypes tys = mapM tcIfaceType tys @@ -983,28 +987,29 @@ This context business is why we need tcIfaceTcArgs. %************************************************************************ \begin{code} -tcIfaceCo :: IfaceType -> IfL Coercion -tcIfaceCo (IfaceTyVar n) = mkCoVarCo <$> tcIfaceCoVar n -tcIfaceCo (IfaceAppTy t1 t2) = mkAppCo <$> tcIfaceCo t1 <*> tcIfaceCo t2 -tcIfaceCo (IfaceFunTy t1 t2) = mkFunCo <$> tcIfaceCo t1 <*> tcIfaceCo t2 -tcIfaceCo (IfaceTyConApp tc ts) = mkTyConAppCo <$> tcIfaceTyCon tc <*> mapM tcIfaceCo ts -tcIfaceCo t@(IfaceLitTy _) = mkReflCo <$> tcIfaceType t -tcIfaceCo (IfaceCoConApp tc ts) = tcIfaceCoApp tc ts -tcIfaceCo (IfaceForAllTy tv t) = bindIfaceTyVar tv $ \ tv' -> - mkForAllCo tv' <$> tcIfaceCo t - -tcIfaceCoApp :: IfaceCoCon -> [IfaceType] -> IfL Coercion -tcIfaceCoApp IfaceReflCo [t] = Refl <$> tcIfaceType t -tcIfaceCoApp (IfaceCoAx n i) ts = AxiomInstCo <$> tcIfaceCoAxiom n - <*> pure i - <*> mapM tcIfaceCo ts -tcIfaceCoApp IfaceUnsafeCo [t1,t2] = UnsafeCo <$> tcIfaceType t1 <*> tcIfaceType t2 -tcIfaceCoApp IfaceSymCo [t] = SymCo <$> tcIfaceCo t -tcIfaceCoApp IfaceTransCo [t1,t2] = TransCo <$> tcIfaceCo t1 <*> tcIfaceCo t2 -tcIfaceCoApp IfaceInstCo [t1,t2] = InstCo <$> tcIfaceCo t1 <*> tcIfaceType t2 -tcIfaceCoApp (IfaceNthCo d) [t] = NthCo d <$> tcIfaceCo t -tcIfaceCoApp (IfaceLRCo lr) [t] = LRCo lr <$> tcIfaceCo t -tcIfaceCoApp cc ts = pprPanic "toIfaceCoApp" (ppr cc <+> ppr ts) +tcIfaceCo :: IfaceCoercion -> IfL Coercion +tcIfaceCo (IfaceReflCo r t) = mkReflCo r <$> tcIfaceType t +tcIfaceCo (IfaceFunCo r c1 c2) = mkFunCo r <$> tcIfaceCo c1 <*> tcIfaceCo c2 +tcIfaceCo (IfaceTyConAppCo r tc cs) = mkTyConAppCo r <$> tcIfaceTyCon tc + <*> mapM tcIfaceCo cs +tcIfaceCo (IfaceAppCo c1 c2) = mkAppCo <$> tcIfaceCo c1 + <*> tcIfaceCo c2 +tcIfaceCo (IfaceForAllCo tv c) = bindIfaceTyVar tv $ \ tv' -> + mkForAllCo tv' <$> tcIfaceCo c +tcIfaceCo (IfaceCoVarCo n) = mkCoVarCo <$> tcIfaceCoVar n +tcIfaceCo (IfaceAxiomInstCo n i cs) = AxiomInstCo <$> tcIfaceCoAxiom n + <*> pure i + <*> mapM tcIfaceCo cs +tcIfaceCo (IfaceUnivCo r t1 t2) = UnivCo r <$> tcIfaceType t1 + <*> tcIfaceType t2 +tcIfaceCo (IfaceSymCo c) = SymCo <$> tcIfaceCo c +tcIfaceCo (IfaceTransCo c1 c2) = TransCo <$> tcIfaceCo c1 + <*> tcIfaceCo c2 +tcIfaceCo (IfaceInstCo c1 t2) = InstCo <$> tcIfaceCo c1 + <*> tcIfaceType t2 +tcIfaceCo (IfaceNthCo d c) = NthCo d <$> tcIfaceCo c +tcIfaceCo (IfaceLRCo lr c) = LRCo lr <$> tcIfaceCo c +tcIfaceCo (IfaceSubCo c) = SubCo <$> tcIfaceCo c tcIfaceCoVar :: FastString -> IfL CoVar tcIfaceCoVar = tcIfaceLclId diff --git a/compiler/main/DynFlags.hs b/compiler/main/DynFlags.hs index 0bbd819a79..64ec8be612 100644 --- a/compiler/main/DynFlags.hs +++ b/compiler/main/DynFlags.hs @@ -535,6 +535,7 @@ data ExtensionFlag | Opt_MagicHash | Opt_EmptyDataDecls | Opt_KindSignatures + | Opt_RoleAnnotations | Opt_ParallelListComp | Opt_TransformListComp | Opt_MonadComprehensions @@ -2637,6 +2638,7 @@ xFlags = [ ( "MagicHash", Opt_MagicHash, nop ), ( "ExistentialQuantification", Opt_ExistentialQuantification, nop ), ( "KindSignatures", Opt_KindSignatures, nop ), + ( "RoleAnnotations", Opt_RoleAnnotations, nop ), ( "EmptyDataDecls", Opt_EmptyDataDecls, nop ), ( "ParallelListComp", Opt_ParallelListComp, nop ), ( "TransformListComp", Opt_TransformListComp, nop ), diff --git a/compiler/parser/Lexer.x b/compiler/parser/Lexer.x index 11d849ab71..c97d38f506 100644 --- a/compiler/parser/Lexer.x +++ b/compiler/parser/Lexer.x @@ -362,14 +362,14 @@ $tab+ { warn Opt_WarnTabs (text "Tab character") } @qual @varid { idtoken qvarid } @qual @conid { idtoken qconid } @varid { varid } - @conid { idtoken conid } + @conid { conid } } <0> { @qual @varid "#"+ / { ifExtension magicHashEnabled } { idtoken qvarid } @qual @conid "#"+ / { ifExtension magicHashEnabled } { idtoken qconid } @varid "#"+ / { ifExtension magicHashEnabled } { varid } - @conid "#"+ / { ifExtension magicHashEnabled } { idtoken conid } + @conid "#"+ / { ifExtension magicHashEnabled } { conid } } -- ToDo: - move `var` and (sym) into lexical syntax? @@ -475,6 +475,9 @@ data Token | ITgroup | ITby | ITusing + | ITnominal + | ITrepresentational + | ITphantom -- Pragmas | ITinline_prag InlineSpec RuleMatchInfo @@ -669,6 +672,14 @@ reservedWordsFM = listToUFM $ ( "proc", ITproc, bit arrowsBit) ] +reservedUpcaseWordsFM :: UniqFM (Token, Int) +reservedUpcaseWordsFM = listToUFM $ + map (\(x, y, z) -> (mkFastString x, (y, z))) + [ ( "N", ITnominal, 0 ), -- no extension bit for better error msgs + ( "R", ITrepresentational, 0 ), + ( "P", ITphantom, 0 ) + ] + reservedSymsFM :: UniqFM (Token, Int -> Bool) reservedSymsFM = listToUFM $ map (\ (x,y,z) -> (mkFastString x,(y,z))) @@ -1014,8 +1025,20 @@ varid span buf len = where !fs = lexemeToFastString buf len -conid :: StringBuffer -> Int -> Token -conid buf len = ITconid $! lexemeToFastString buf len +conid :: Action +conid span buf len = + case lookupUFM reservedUpcaseWordsFM fs of + Just (keyword, 0) -> return $ L span keyword + + Just (keyword, exts) -> do + extsEnabled <- extension $ \i -> exts .&. i /= 0 + if extsEnabled + then return $ L span keyword + else return $ L span $ ITconid fs + + Nothing -> return $ L span $ ITconid fs + where + !fs = lexemeToFastString buf len qvarsym, qconsym, prefixqvarsym, prefixqconsym :: StringBuffer -> Int -> Token qvarsym buf len = ITqvarsym $! splitQualName buf len False diff --git a/compiler/parser/Parser.y.pp b/compiler/parser/Parser.y.pp index af297531e2..b35bbf38b4 100644 --- a/compiler/parser/Parser.y.pp +++ b/compiler/parser/Parser.y.pp @@ -59,6 +59,7 @@ import Type ( funTyCon ) import ForeignCall import OccName ( varName, dataName, tcClsName, tvName ) import DataCon ( DataCon, dataConName ) +import CoAxiom ( Role(..) ) import SrcLoc import Module import Kind ( Kind, liftedTypeKind, unliftedTypeKind, mkArrowKind ) @@ -273,6 +274,9 @@ incorrect. 'group' { L _ ITgroup } -- for list transform extension 'by' { L _ ITby } -- for list transform extension 'using' { L _ ITusing } -- for list transform extension + 'N' { L _ ITnominal } -- Nominal role + 'R' { L _ ITrepresentational } -- Representational role + 'P' { L _ ITphantom } -- Phantom role '{-# INLINE' { L _ (ITinline_prag _ _) } '{-# SPECIALISE' { L _ ITspec_prag } @@ -1129,6 +1133,7 @@ atype :: { LHsType RdrName } | '[:' ctype ':]' { LL $ HsPArrTy $2 } | '(' ctype ')' { LL $ HsParTy $2 } | '(' ctype '::' kind ')' { LL $ HsKindSig $2 $4 } + | atype '@' role { LL $ HsRoleAnnot $1 (unLoc $3) } | quasiquote { L1 (HsQuasiQuoteTy (unLoc $1)) } | '$(' exp ')' { LL $ mkHsSpliceTy $2 } | TH_ID_SPLICE { LL $ mkHsSpliceTy $ L1 $ HsVar $ @@ -1166,8 +1171,8 @@ tv_bndrs :: { [LHsTyVarBndr RdrName] } | {- empty -} { [] } tv_bndr :: { LHsTyVarBndr RdrName } - : tyvar { L1 (UserTyVar (unLoc $1)) } - | '(' tyvar '::' kind ')' { LL (KindedTyVar (unLoc $2) $4) } + : tyvar { L1 (HsTyVarBndr (unLoc $1) Nothing Nothing) } + | '(' tyvar '::' kind ')' { LL (HsTyVarBndr (unLoc $2) (Just $4) Nothing) } fds :: { Located [Located (FunDep RdrName)] } : {- empty -} { noLoc [] } @@ -1185,6 +1190,11 @@ varids0 :: { Located [RdrName] } : {- empty -} { noLoc [] } | varids0 tyvar { LL (unLoc $2 : unLoc $1) } +role :: { Located Role } + : 'N' { LL Nominal } + | 'R' { LL Representational } + | 'P' { LL Phantom } + ----------------------------------------------------------------------------- -- Kinds @@ -1926,7 +1936,7 @@ qtycon :: { Located RdrName } -- Qualified or unqualified | tycon { $1 } tycon :: { Located RdrName } -- Unqualified - : CONID { L1 $! mkUnqual tcClsName (getCONID $1) } + : upcase_id { L1 $! mkUnqual tcClsName (unLoc $1) } qtyconsym :: { Located RdrName } : QCONSYM { L1 $! mkQual tcClsName (getQCONSYM $1) } @@ -2071,7 +2081,7 @@ qconid :: { Located RdrName } -- Qualified or unqualified | PREFIXQCONSYM { L1 $! mkQual dataName (getPREFIXQCONSYM $1) } conid :: { Located RdrName } - : CONID { L1 $ mkUnqual dataName (getCONID $1) } + : upcase_id { L1 $ mkUnqual dataName (unLoc $1) } qconsym :: { Located RdrName } -- Qualified or unqualified : consym { $1 } @@ -2108,7 +2118,7 @@ close :: { () } -- Miscellaneous (mostly renamings) modid :: { Located ModuleName } - : CONID { L1 $ mkModuleNameFS (getCONID $1) } + : upcase_id { L1 $ mkModuleNameFS (unLoc $1) } | QCONID { L1 $ let (mod,c) = getQCONID $1 in mkModuleNameFS (mkFastString @@ -2119,6 +2129,12 @@ commas :: { Int } -- One or more commas : commas ',' { $1 + 1 } | ',' { 1 } +upcase_id :: { Located FastString } + : CONID { L1 $! getCONID $1 } + | 'N' { L1 (fsLit "N") } + | 'R' { L1 (fsLit "R") } + | 'P' { L1 (fsLit "P") } + ----------------------------------------------------------------------------- -- Documentation comments diff --git a/compiler/parser/ParserCore.y b/compiler/parser/ParserCore.y index 0e78794515..2a4c957039 100644 --- a/compiler/parser/ParserCore.y +++ b/compiler/parser/ParserCore.y @@ -270,7 +270,10 @@ exp :: { IfaceExpr } -- gaw 2004 | '%case' '(' ty ')' aexp '%of' id_bndr '{' alts1 '}' { IfaceCase $5 (fst $7) $9 } - | '%cast' aexp aty { IfaceCast $2 $3 } +-- The following line is broken and is hard to fix. Not fixing now +-- because this whole parser is bitrotten anyway. +-- Richard Eisenberg, July 2013 +-- | '%cast' aexp aty { IfaceCast $2 $3 } -- No InlineMe any more -- | '%note' STRING exp -- { case $2 of @@ -375,7 +378,7 @@ ifaceUnliftedTypeKind = ifaceTcType (IfaceTc unliftedTypeKindTyConName) ifaceArrow ifT1 ifT2 = IfaceFunTy ifT1 ifT2 toHsTvBndr :: IfaceTvBndr -> LHsTyVarBndr RdrName -toHsTvBndr (tv,k) = noLoc $ KindedTyVar (mkRdrUnqual (mkTyVarOccFS tv)) bsig +toHsTvBndr (tv,k) = noLoc $ HsTyVarBndr (mkRdrUnqual (mkTyVarOccFS tv)) (Just bsig) Nothing where bsig = toHsKind k diff --git a/compiler/parser/RdrHsSyn.lhs b/compiler/parser/RdrHsSyn.lhs index e8c23cad52..1e61cf9f4f 100644 --- a/compiler/parser/RdrHsSyn.lhs +++ b/compiler/parser/RdrHsSyn.lhs @@ -465,10 +465,14 @@ checkTyVars tycl_hdr tparms = do { tvs <- mapM chk tparms ; return (mkHsQTvs tvs) } where -- Check that the name space is correct! + chk (L l (HsRoleAnnot (L _ (HsKindSig (L _ (HsTyVar tv)) k)) r)) + | isRdrTyVar tv = return (L l (HsTyVarBndr tv (Just k) (Just r))) chk (L l (HsKindSig (L _ (HsTyVar tv)) k)) - | isRdrTyVar tv = return (L l (KindedTyVar tv k)) + | isRdrTyVar tv = return (L l (HsTyVarBndr tv (Just k) Nothing)) + chk (L l (HsRoleAnnot (L _ (HsTyVar tv)) r)) + | isRdrTyVar tv = return (L l (HsTyVarBndr tv Nothing (Just r))) chk (L l (HsTyVar tv)) - | isRdrTyVar tv = return (L l (UserTyVar tv)) + | isRdrTyVar tv = return (L l (HsTyVarBndr tv Nothing Nothing)) chk t@(L l _) = parseErrorSDoc l $ vcat [ sep [ ptext (sLit "Unexpected type") <+> quotes (ppr t) diff --git a/compiler/prelude/PrelNames.lhs b/compiler/prelude/PrelNames.lhs index 2d795ab9c9..8452092ceb 100644 --- a/compiler/prelude/PrelNames.lhs +++ b/compiler/prelude/PrelNames.lhs @@ -1333,11 +1333,13 @@ statePrimTyConKey, stableNamePrimTyConKey, stableNameTyConKey, word32PrimTyConKey, word32TyConKey, word64PrimTyConKey, word64TyConKey, liftedConKey, unliftedConKey, anyBoxConKey, kindConKey, boxityConKey, typeConKey, threadIdPrimTyConKey, bcoPrimTyConKey, ptrTyConKey, - funPtrTyConKey, tVarPrimTyConKey, eqPrimTyConKey :: Unique + funPtrTyConKey, tVarPrimTyConKey, eqPrimTyConKey, + eqReprPrimTyConKey :: Unique statePrimTyConKey = mkPreludeTyConUnique 50 stableNamePrimTyConKey = mkPreludeTyConUnique 51 stableNameTyConKey = mkPreludeTyConUnique 52 eqPrimTyConKey = mkPreludeTyConUnique 53 +eqReprPrimTyConKey = mkPreludeTyConUnique 54 mutVarPrimTyConKey = mkPreludeTyConUnique 55 ioTyConKey = mkPreludeTyConUnique 56 wordPrimTyConKey = mkPreludeTyConUnique 58 diff --git a/compiler/prelude/PrelRules.lhs b/compiler/prelude/PrelRules.lhs index b569840918..6faecaaef9 100644 --- a/compiler/prelude/PrelRules.lhs +++ b/compiler/prelude/PrelRules.lhs @@ -47,7 +47,7 @@ import BasicTypes import DynFlags import Platform import Util -import Coercion (mkUnbranchedAxInstCo,mkSymCo) +import Coercion (mkUnbranchedAxInstCo,mkSymCo,Role(..)) import Control.Monad import Data.Bits as Bits @@ -1020,7 +1020,7 @@ match_magicSingI (Type t : e : Lam b _ : _) , Just (sI_tc,xs) <- splitTyConApp_maybe sI_type , Just (_,_,co) <- unwrapNewTyCon_maybe sI_tc = Just $ let f = setVarType b fu - in Lam f $ Var f `App` Cast e (mkSymCo (mkUnbranchedAxInstCo co xs)) + in Lam f $ Var f `App` Cast e (mkSymCo (mkUnbranchedAxInstCo Representational co xs)) match_magicSingI _ = Nothing diff --git a/compiler/prelude/TysPrim.lhs b/compiler/prelude/TysPrim.lhs index a10300a99c..f166065b22 100644 --- a/compiler/prelude/TysPrim.lhs +++ b/compiler/prelude/TysPrim.lhs @@ -71,6 +71,7 @@ module TysPrim( word64PrimTyCon, word64PrimTy, eqPrimTyCon, -- ty1 ~# ty2 + eqReprPrimTyCon, -- ty1 ~R# ty2 (at role Representational) -- * Any anyTy, anyTyCon, anyTypeOfKind, @@ -134,6 +135,7 @@ primTyCons , word64PrimTyCon , anyTyCon , eqPrimTyCon + , eqReprPrimTyCon , liftedTypeKindTyCon , unliftedTypeKindTyCon @@ -155,7 +157,7 @@ mkPrimTc fs unique tycon (ATyCon tycon) -- Relevant TyCon UserSyntax -- None are built-in syntax -charPrimTyConName, intPrimTyConName, int32PrimTyConName, int64PrimTyConName, wordPrimTyConName, word32PrimTyConName, word64PrimTyConName, addrPrimTyConName, floatPrimTyConName, doublePrimTyConName, statePrimTyConName, realWorldTyConName, arrayPrimTyConName, arrayArrayPrimTyConName, byteArrayPrimTyConName, mutableArrayPrimTyConName, mutableByteArrayPrimTyConName, mutableArrayArrayPrimTyConName, mutVarPrimTyConName, mVarPrimTyConName, tVarPrimTyConName, stablePtrPrimTyConName, stableNamePrimTyConName, bcoPrimTyConName, weakPrimTyConName, threadIdPrimTyConName, eqPrimTyConName, floatX4PrimTyConName, doubleX2PrimTyConName, int32X4PrimTyConName, int64X2PrimTyConName :: Name +charPrimTyConName, intPrimTyConName, int32PrimTyConName, int64PrimTyConName, wordPrimTyConName, word32PrimTyConName, word64PrimTyConName, addrPrimTyConName, floatPrimTyConName, doublePrimTyConName, statePrimTyConName, realWorldTyConName, arrayPrimTyConName, arrayArrayPrimTyConName, byteArrayPrimTyConName, mutableArrayPrimTyConName, mutableByteArrayPrimTyConName, mutableArrayArrayPrimTyConName, mutVarPrimTyConName, mVarPrimTyConName, tVarPrimTyConName, stablePtrPrimTyConName, stableNamePrimTyConName, bcoPrimTyConName, weakPrimTyConName, threadIdPrimTyConName, eqPrimTyConName, eqReprPrimTyConName, floatX4PrimTyConName, doubleX2PrimTyConName, int32X4PrimTyConName, int64X2PrimTyConName :: Name charPrimTyConName = mkPrimTc (fsLit "Char#") charPrimTyConKey charPrimTyCon intPrimTyConName = mkPrimTc (fsLit "Int#") intPrimTyConKey intPrimTyCon int32PrimTyConName = mkPrimTc (fsLit "Int32#") int32PrimTyConKey int32PrimTyCon @@ -168,6 +170,7 @@ floatPrimTyConName = mkPrimTc (fsLit "Float#") floatPrimTyConKey floatP doublePrimTyConName = mkPrimTc (fsLit "Double#") doublePrimTyConKey doublePrimTyCon statePrimTyConName = mkPrimTc (fsLit "State#") statePrimTyConKey statePrimTyCon eqPrimTyConName = mkPrimTc (fsLit "~#") eqPrimTyConKey eqPrimTyCon +eqReprPrimTyConName = mkPrimTc (fsLit "~R#") eqReprPrimTyConKey eqReprPrimTyCon realWorldTyConName = mkPrimTc (fsLit "RealWorld") realWorldTyConKey realWorldTyCon arrayPrimTyConName = mkPrimTc (fsLit "Array#") arrayPrimTyConKey arrayPrimTyCon byteArrayPrimTyConName = mkPrimTc (fsLit "ByteArray#") byteArrayPrimTyConKey byteArrayPrimTyCon @@ -375,16 +378,16 @@ mkArrowKinds arg_kinds result_kind = foldr mkArrowKind result_kind arg_kinds \begin{code} -- only used herein -pcPrimTyCon :: Name -> Int -> PrimRep -> TyCon -pcPrimTyCon name arity rep - = mkPrimTyCon name kind arity rep +pcPrimTyCon :: Name -> [Role] -> PrimRep -> TyCon +pcPrimTyCon name roles rep + = mkPrimTyCon name kind roles rep where - kind = mkArrowKinds (replicate arity liftedTypeKind) result_kind + kind = mkArrowKinds (map (const liftedTypeKind) roles) result_kind result_kind = unliftedTypeKind pcPrimTyCon0 :: Name -> PrimRep -> TyCon pcPrimTyCon0 name rep - = mkPrimTyCon name result_kind 0 rep + = mkPrimTyCon name result_kind [] rep where result_kind = unliftedTypeKind @@ -469,19 +472,34 @@ or where s is a type variable. The only purpose of the type parameter is to keep different state threads separate. It is represented by nothing at all. +The type parameter to State# is intended to keep separate threads separate. +Even though this parameter is not used in the definition of State#, it is +given role Nominal to enforce its intended use. + \begin{code} mkStatePrimTy :: Type -> Type mkStatePrimTy ty = TyConApp statePrimTyCon [ty] statePrimTyCon :: TyCon -- See Note [The State# TyCon] -statePrimTyCon = pcPrimTyCon statePrimTyConName 1 VoidRep +statePrimTyCon = pcPrimTyCon statePrimTyConName [Nominal] VoidRep eqPrimTyCon :: TyCon -- The representation type for equality predicates -- See Note [The ~# TyCon] -eqPrimTyCon = mkPrimTyCon eqPrimTyConName kind 3 VoidRep +eqPrimTyCon = mkPrimTyCon eqPrimTyConName kind [Nominal, Nominal, Nominal] VoidRep where kind = ForAllTy kv $ mkArrowKinds [k, k] unliftedTypeKind kv = kKiVar k = mkTyVarTy kv + +-- like eqPrimTyCon, but the type for *Representational* coercions +-- this should only ever appear as the type of a covar. Its role is +-- interpreted in coercionRole +eqReprPrimTyCon :: TyCon +eqReprPrimTyCon = mkPrimTyCon eqReprPrimTyConName kind + -- the roles really should be irrelevant! + [Nominal, Representational, Representational] VoidRep + where kind = ForAllTy kv $ mkArrowKinds [k, k] unliftedTypeKind + kv = kKiVar + k = mkTyVarTy kv \end{code} RealWorld is deeply magical. It is *primitive*, but it is not @@ -490,7 +508,7 @@ RealWorld; it's only used in the type system, to parameterise State#. \begin{code} realWorldTyCon :: TyCon -realWorldTyCon = mkLiftedPrimTyCon realWorldTyConName liftedTypeKind 0 PtrRep +realWorldTyCon = mkLiftedPrimTyCon realWorldTyConName liftedTypeKind [] PtrRep realWorldTy :: Type realWorldTy = mkTyConTy realWorldTyCon realWorldStatePrimTy :: Type @@ -509,12 +527,12 @@ defined in \tr{TysWiredIn.lhs}, not here. \begin{code} arrayPrimTyCon, mutableArrayPrimTyCon, mutableByteArrayPrimTyCon, byteArrayPrimTyCon, arrayArrayPrimTyCon, mutableArrayArrayPrimTyCon :: TyCon -arrayPrimTyCon = pcPrimTyCon arrayPrimTyConName 1 PtrRep -mutableArrayPrimTyCon = pcPrimTyCon mutableArrayPrimTyConName 2 PtrRep -mutableByteArrayPrimTyCon = pcPrimTyCon mutableByteArrayPrimTyConName 1 PtrRep -byteArrayPrimTyCon = pcPrimTyCon0 byteArrayPrimTyConName PtrRep -arrayArrayPrimTyCon = pcPrimTyCon0 arrayArrayPrimTyConName PtrRep -mutableArrayArrayPrimTyCon = pcPrimTyCon mutableArrayArrayPrimTyConName 1 PtrRep +arrayPrimTyCon = pcPrimTyCon arrayPrimTyConName [Representational] PtrRep +mutableArrayPrimTyCon = pcPrimTyCon mutableArrayPrimTyConName [Nominal, Representational] PtrRep +mutableByteArrayPrimTyCon = pcPrimTyCon mutableByteArrayPrimTyConName [Nominal] PtrRep +byteArrayPrimTyCon = pcPrimTyCon0 byteArrayPrimTyConName PtrRep +arrayArrayPrimTyCon = pcPrimTyCon0 arrayArrayPrimTyConName PtrRep +mutableArrayArrayPrimTyCon = pcPrimTyCon mutableArrayArrayPrimTyConName [Nominal] PtrRep mkArrayPrimTy :: Type -> Type mkArrayPrimTy elt = TyConApp arrayPrimTyCon [elt] @@ -538,7 +556,7 @@ mkMutableArrayArrayPrimTy s = TyConApp mutableArrayArrayPrimTyCon [s] \begin{code} mutVarPrimTyCon :: TyCon -mutVarPrimTyCon = pcPrimTyCon mutVarPrimTyConName 2 PtrRep +mutVarPrimTyCon = pcPrimTyCon mutVarPrimTyConName [Nominal, Representational] PtrRep mkMutVarPrimTy :: Type -> Type -> Type mkMutVarPrimTy s elt = TyConApp mutVarPrimTyCon [s, elt] @@ -552,7 +570,7 @@ mkMutVarPrimTy s elt = TyConApp mutVarPrimTyCon [s, elt] \begin{code} mVarPrimTyCon :: TyCon -mVarPrimTyCon = pcPrimTyCon mVarPrimTyConName 2 PtrRep +mVarPrimTyCon = pcPrimTyCon mVarPrimTyConName [Nominal, Representational] PtrRep mkMVarPrimTy :: Type -> Type -> Type mkMVarPrimTy s elt = TyConApp mVarPrimTyCon [s, elt] @@ -566,7 +584,7 @@ mkMVarPrimTy s elt = TyConApp mVarPrimTyCon [s, elt] \begin{code} tVarPrimTyCon :: TyCon -tVarPrimTyCon = pcPrimTyCon tVarPrimTyConName 2 PtrRep +tVarPrimTyCon = pcPrimTyCon tVarPrimTyConName [Nominal, Representational] PtrRep mkTVarPrimTy :: Type -> Type -> Type mkTVarPrimTy s elt = TyConApp tVarPrimTyCon [s, elt] @@ -580,7 +598,7 @@ mkTVarPrimTy s elt = TyConApp tVarPrimTyCon [s, elt] \begin{code} stablePtrPrimTyCon :: TyCon -stablePtrPrimTyCon = pcPrimTyCon stablePtrPrimTyConName 1 AddrRep +stablePtrPrimTyCon = pcPrimTyCon stablePtrPrimTyConName [Representational] AddrRep mkStablePtrPrimTy :: Type -> Type mkStablePtrPrimTy ty = TyConApp stablePtrPrimTyCon [ty] @@ -594,7 +612,7 @@ mkStablePtrPrimTy ty = TyConApp stablePtrPrimTyCon [ty] \begin{code} stableNamePrimTyCon :: TyCon -stableNamePrimTyCon = pcPrimTyCon stableNamePrimTyConName 1 PtrRep +stableNamePrimTyCon = pcPrimTyCon stableNamePrimTyConName [Representational] PtrRep mkStableNamePrimTy :: Type -> Type mkStableNamePrimTy ty = TyConApp stableNamePrimTyCon [ty] @@ -621,7 +639,7 @@ bcoPrimTyCon = pcPrimTyCon0 bcoPrimTyConName PtrRep \begin{code} weakPrimTyCon :: TyCon -weakPrimTyCon = pcPrimTyCon weakPrimTyConName 1 PtrRep +weakPrimTyCon = pcPrimTyCon weakPrimTyConName [Representational] PtrRep mkWeakPrimTy :: Type -> Type mkWeakPrimTy v = TyConApp weakPrimTyCon [v] @@ -727,7 +745,7 @@ anyTy :: Type anyTy = mkTyConTy anyTyCon anyTyCon :: TyCon -anyTyCon = mkLiftedPrimTyCon anyTyConName kind 1 PtrRep +anyTyCon = mkLiftedPrimTyCon anyTyConName kind [Nominal] PtrRep where kind = ForAllTy kKiVar (mkTyVarTy kKiVar) {- Can't do this yet without messing up kind proxies diff --git a/compiler/prelude/TysWiredIn.lhs b/compiler/prelude/TysWiredIn.lhs index b8c0e34174..b563b25cc4 100644 --- a/compiler/prelude/TysWiredIn.lhs +++ b/compiler/prelude/TysWiredIn.lhs @@ -236,12 +236,15 @@ pcNonRecDataTyCon :: Name -> Maybe CType -> [TyVar] -> [DataCon] -> TyCon -- Not an enumeration, not promotable pcNonRecDataTyCon = pcTyCon False NonRecursive False +-- This function assumes that the types it creates have all parameters at +-- Representational role! pcTyCon :: Bool -> RecFlag -> Bool -> Name -> Maybe CType -> [TyVar] -> [DataCon] -> TyCon pcTyCon is_enum is_rec is_prom name cType tyvars cons = tycon where tycon = buildAlgTyCon name tyvars + (map (const Representational) tyvars) cType [] -- No stupid theta (DataTyCon cons is_enum) @@ -425,6 +428,7 @@ eqTyCon :: TyCon eqTyCon = mkAlgTyCon eqTyConName (ForAllTy kv $ mkArrowKinds [k, k] constraintKind) [kv, a, b] + [Nominal, Nominal, Nominal] Nothing [] -- No stupid theta (DataTyCon [eqBoxDataCon] False) diff --git a/compiler/rename/RnTypes.lhs b/compiler/rename/RnTypes.lhs index fb55ac932c..a1c4bac25c 100644 --- a/compiler/rename/RnTypes.lhs +++ b/compiler/rename/RnTypes.lhs @@ -213,6 +213,9 @@ rnHsTyKi isType doc (HsKindSig ty k) ; (k', fvs2) <- rnLHsKind doc k ; return (HsKindSig ty' k', fvs1 `plusFV` fvs2) } +rnHsTyKi _ doc (HsRoleAnnot ty _) + = illegalRoleAnnotDoc doc ty >> failM + rnHsTyKi isType doc (HsPArrTy ty) = ASSERT( isType ) do { (ty', fvs) <- rnLHsType doc ty @@ -360,7 +363,7 @@ bindHsTyVars :: HsDocContext bindHsTyVars doc mb_assoc kv_bndrs tv_bndrs thing_inside = do { rdr_env <- getLocalRdrEnv ; let tvs = hsQTvBndrs tv_bndrs - kvs_from_tv_bndrs = [ kv | L _ (KindedTyVar _ kind) <- tvs + kvs_from_tv_bndrs = [ kv | L _ (HsTyVarBndr _ (Just kind) _) <- tvs , let (_, kvs) = extractHsTyRdrTyVars kind , kv <- kvs ] all_kvs = filterOut (`elemLocalRdrEnv` rdr_env) $ @@ -382,15 +385,19 @@ bindHsTyVars doc mb_assoc kv_bndrs tv_bndrs thing_inside do { let tv_names_w_loc = hsLTyVarLocNames tv_bndrs rn_tv_bndr :: LHsTyVarBndr RdrName -> RnM (LHsTyVarBndr Name, FreeVars) - rn_tv_bndr (L loc (UserTyVar rdr)) - = do { nm <- newTyVarNameRn mb_assoc rdr_env loc rdr - ; return (L loc (UserTyVar nm), emptyFVs) } - rn_tv_bndr (L loc (KindedTyVar rdr kind)) - = do { sig_ok <- xoptM Opt_KindSignatures - ; unless sig_ok (badSigErr False doc kind) - ; nm <- newTyVarNameRn mb_assoc rdr_env loc rdr - ; (kind', fvs) <- rnLHsKind doc kind - ; return (L loc (KindedTyVar nm kind'), fvs) } + rn_tv_bndr (L loc (HsTyVarBndr name mkind mrole)) + = do { ksig_ok <- xoptM Opt_KindSignatures + ; unless ksig_ok $ + whenIsJust mkind $ \k -> badSigErr False doc k + ; rsig_ok <- xoptM Opt_RoleAnnotations + ; unless rsig_ok $ + whenIsJust mrole $ \_ -> badRoleAnnotOpt loc doc + ; nm <- newTyVarNameRn mb_assoc rdr_env loc name + ; (mkind', fvs) <- case mkind of + Just k -> do { (kind', fvs) <- rnLHsKind doc k + ; return (Just kind', fvs) } + Nothing -> return (Nothing, emptyFVs) + ; return (L loc (HsTyVarBndr nm mkind' mrole), fvs) } -- Check for duplicate or shadowed tyvar bindrs ; checkDupRdrNames tv_names_w_loc @@ -465,6 +472,19 @@ dataKindsErr is_type thing where what | is_type = ptext (sLit "type") | otherwise = ptext (sLit "kind") + +badRoleAnnotOpt :: SrcSpan -> HsDocContext -> TcM () +badRoleAnnotOpt loc doc + = setSrcSpan loc $ addErr $ + vcat [ ptext (sLit "Illegal role annotation") + , ptext (sLit "Perhaps you intended to use -XRoleAnnotations") + , docOfHsDocContext doc ] + +illegalRoleAnnotDoc :: HsDocContext -> LHsType RdrName -> TcM () +illegalRoleAnnotDoc doc (L loc ty) + = setSrcSpan loc $ addErr $ + vcat [ ptext (sLit "Illegal role annotation on") <+> (ppr ty) + , docOfHsDocContext doc ] \end{code} Note [Renaming associated types] @@ -1011,6 +1031,7 @@ extract_lty (L _ ty) acc HsTyLit _ -> acc HsWrapTy _ _ -> panic "extract_lty" HsKindSig ty ki -> extract_lty ty (extract_lkind ki acc) + HsRoleAnnot ty _ -> extract_lty ty acc HsForAllTy _ tvs cx ty -> extract_hs_tv_bndrs tvs acc $ extract_lctxt cx $ extract_lty ty ([],[]) @@ -1027,7 +1048,7 @@ extract_hs_tv_bndrs (HsQTvs { hsq_tvs = tvs }) acc_tvs ++ filterOut (`elem` local_tvs) body_tvs) where local_tvs = map hsLTyVarName tvs - (_, local_kvs) = foldr extract_lty ([], []) [k | L _ (KindedTyVar _ k) <- tvs] + (_, local_kvs) = foldr extract_lty ([], []) [k | L _ (HsTyVarBndr _ (Just k) _) <- tvs] -- These kind variables are bound here if not bound further out extract_tv :: RdrName -> FreeKiTyVars -> FreeKiTyVars diff --git a/compiler/simplCore/SimplUtils.lhs b/compiler/simplCore/SimplUtils.lhs index 92874de4a3..4e40e31d9a 100644 --- a/compiler/simplCore/SimplUtils.lhs +++ b/compiler/simplCore/SimplUtils.lhs @@ -1100,7 +1100,7 @@ mkLam _env bndrs body | not (any bad bndrs) -- Note [Casts and lambdas] = do { lam <- mkLam' dflags bndrs body - ; return (mkCast lam (mkPiCos bndrs co)) } + ; return (mkCast lam (mkPiCos Representational bndrs co)) } where co_vars = tyCoVarsOfCo co bad bndr = isCoVar bndr && bndr `elemVarSet` co_vars diff --git a/compiler/specialise/Rules.lhs b/compiler/specialise/Rules.lhs index c2148120e3..b88888c96c 100644 --- a/compiler/specialise/Rules.lhs +++ b/compiler/specialise/Rules.lhs @@ -724,10 +724,11 @@ match_co :: RuleMatchEnv -> Maybe RuleSubst match_co renv subst (CoVarCo cv) co = match_var renv subst cv (Coercion co) -match_co renv subst (Refl ty1) co +match_co renv subst (Refl r1 ty1) co = case co of - Refl ty2 -> match_ty renv subst ty1 ty2 - _ -> Nothing + Refl r2 ty2 + | r1 == r2 -> match_ty renv subst ty1 ty2 + _ -> Nothing match_co _ _ co1 _ = pprTrace "match_co: needs more cases" (ppr co1) Nothing -- Currently just deals with CoVarCo and Refl diff --git a/compiler/specialise/SpecConstr.lhs b/compiler/specialise/SpecConstr.lhs index c1486d30c7..a5df7d52bc 100644 --- a/compiler/specialise/SpecConstr.lhs +++ b/compiler/specialise/SpecConstr.lhs @@ -1780,7 +1780,7 @@ argToPat env in_scope val_env (Cast arg co) arg_occ { -- Make a wild-card pattern for the coercion uniq <- getUniqueUs ; let co_name = mkSysTvName uniq (fsLit "sg") - co_var = mkCoVar co_name (mkCoercionType ty1 ty2) + co_var = mkCoVar co_name (mkCoercionType Representational ty1 ty2) ; return (interesting, Cast arg' (mkCoVarCo co_var)) } } where Pair ty1 ty2 = coercionKind co diff --git a/compiler/stranal/WwLib.lhs b/compiler/stranal/WwLib.lhs index 810db2069b..ca64a7fbce 100644 --- a/compiler/stranal/WwLib.lhs +++ b/compiler/stranal/WwLib.lhs @@ -488,7 +488,7 @@ deepSplitProductType_maybe :: Type -> Maybe (DataCon, [Type], [Type], Coercion) -- If deepSplitProductType_maybe ty = Just (dc, tys, arg_tys, co) -- then dc @ tys (args::arg_tys) |> co :: ty deepSplitProductType_maybe ty - | let (ty1, co) = topNormaliseNewType ty `orElse` (ty, mkReflCo ty) + | let (ty1, co) = topNormaliseNewType ty `orElse` (ty, mkReflCo Representational ty) , Just (tc, tc_args) <- splitTyConApp_maybe ty1 , Just con <- isDataProductTyCon_maybe tc = Just (con, tc_args, dataConInstArgTys con tc_args, co) @@ -496,7 +496,7 @@ deepSplitProductType_maybe _ = Nothing deepSplitCprType_maybe :: ConTag -> Type -> Maybe (DataCon, [Type], [Type], Coercion) deepSplitCprType_maybe con_tag ty - | let (ty1, co) = topNormaliseNewType ty `orElse` (ty, mkReflCo ty) + | let (ty1, co) = topNormaliseNewType ty `orElse` (ty, mkReflCo Representational ty) , Just (tc, tc_args) <- splitTyConApp_maybe ty1 , isDataTyCon tc , let cons = tyConDataCons tc diff --git a/compiler/typecheck/TcDeriv.lhs b/compiler/typecheck/TcDeriv.lhs index 21e2bbb5b9..ebb5b850b3 100644 --- a/compiler/typecheck/TcDeriv.lhs +++ b/compiler/typecheck/TcDeriv.lhs @@ -1444,6 +1444,7 @@ mkNewTypeEqn orig dflags tvs && arity_ok && eta_ok && ats_ok + && roles_ok -- && not (isRecursiveTyCon tycon) -- Note [Recursive newtypes] arity_ok = length cls_tys + 1 == classArity cls @@ -1464,13 +1465,26 @@ mkNewTypeEqn orig dflags tvs -- currently generate type 'instance' decls; and cannot do -- so for 'data' instance decls + roles_ok = let cls_roles = tyConRoles (classTyCon cls) in + not (null cls_roles) && last cls_roles /= Nominal + -- We must make sure that the class definition (and all its + -- members) never pattern-match on the last parameter. + -- See Trac #1496 and Note [Roles] in Coercion + cant_derive_err = vcat [ ppUnless arity_ok arity_msg , ppUnless eta_ok eta_msg - , ppUnless ats_ok ats_msg ] + , ppUnless ats_ok ats_msg + , ppUnless roles_ok roles_msg ] arity_msg = quotes (ppr (mkClassPred cls cls_tys)) <+> ptext (sLit "does not have arity 1") eta_msg = ptext (sLit "cannot eta-reduce the representation type enough") ats_msg = ptext (sLit "the class has associated types") + roles_msg = ptext (sLit "it is not type-safe to use") <+> + ptext (sLit "GeneralizedNewtypeDeriving on this class;") $$ + ptext (sLit "the last parameter of") <+> + quotes (ppr (className cls)) <+> + ptext (sLit "is at role N") + \end{code} Note [Recursive newtypes] diff --git a/compiler/typecheck/TcEvidence.lhs b/compiler/typecheck/TcEvidence.lhs index eab839a380..a18dc21438 100644 --- a/compiler/typecheck/TcEvidence.lhs +++ b/compiler/typecheck/TcEvidence.lhs @@ -79,6 +79,12 @@ differences * The kind of a TcCoercion is t1 ~ t2 of a Coercion is t1 ~# t2 + * TcCoercions are essentially all at role Nominal -- the type-checker + reasons only about nominal equality, not representational. + --> Exception: there can be newtype axioms wrapped up in TcCoercions. + These, of course, are only used in casts, so the desugarer + will still produce the right 'Coercion's. + * TcAxiomInstCo takes Types, not Coecions as arguments; the generality is required only in the Simplifier @@ -96,7 +102,7 @@ data TcCoercion | TcAppCo TcCoercion TcCoercion | TcForAllCo TyVar TcCoercion | TcInstCo TcCoercion TcType - | TcCoVarCo EqVar + | TcCoVarCo EqVar -- variable always at role N | TcAxiomInstCo (CoAxiom Branched) Int [TcType] -- Int specifies branch number -- See [CoAxiom Index] in Coercion.lhs | TcSymCo TcCoercion diff --git a/compiler/typecheck/TcForeign.lhs b/compiler/typecheck/TcForeign.lhs index f65681ed1e..9914f94c5f 100644 --- a/compiler/typecheck/TcForeign.lhs +++ b/compiler/typecheck/TcForeign.lhs @@ -63,11 +63,30 @@ isForeignExport (L _ (ForeignExport _ _ _ _)) = True isForeignExport _ = False \end{code} +Note [Don't recur in normaliseFfiType'] +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +normaliseFfiType' is the workhorse for normalising a type used in a foreign +declaration. If we have + +newtype Age = MkAge Int + +we want to see that Age -> IO () is the same as Int -> IO (). But, we don't +need to recur on any type parameters, because no paramaterized types (with +interesting parameters) are marshalable! The full list of marshalable types +is in the body of boxedMarshalableTyCon in TcType. The only members of that +list not at kind * are Ptr, FunPtr, and StablePtr, all of which get marshaled +the same way regardless of type parameter. So, no need to recur into +parameters. + +Similarly, we don't need to look in AppTy's, because nothing headed by +an AppTy will be marshalable. + \begin{code} -- normaliseFfiType takes the type from an FFI declaration, and -- evaluates any type synonyms, type functions, and newtypes. However, -- we are only allowed to look through newtypes if the constructor is -- in scope. We return a bag of all the newtype constructors thus found. +-- Always returns a Representational coercion normaliseFfiType :: Type -> TcM (Coercion, Type, Bag GlobalRdrElt) normaliseFfiType ty = do fam_envs <- tcGetFamInstEnvs @@ -80,10 +99,11 @@ normaliseFfiType' env ty0 = go initRecTc ty0 go rec_nts ty | Just ty' <- coreView ty -- Expand synonyms = go rec_nts ty' - go rec_nts (TyConApp tc tys) + go rec_nts ty@(TyConApp tc tys) -- We don't want to look through the IO newtype, even if it is -- in scope, so we have a special case for it: | tc_key `elem` [ioTyConKey, funPtrTyConKey] + -- Those *must* have R roles on their parameters! = children_only | isNewTyCon tc -- Expand newtypes @@ -96,44 +116,42 @@ normaliseFfiType' env ty0 = go initRecTc ty0 -- be rejected later as not being a valid FFI type. = do { rdr_env <- getGlobalRdrEnv ; case checkNewtypeFFI rdr_env tc of - Nothing -> children_only + Nothing -> nothing Just gre -> do { (co', ty', gres) <- go rec_nts' nt_rhs ; return (mkTransCo nt_co co', ty', gre `consBag` gres) } } | isFamilyTyCon tc -- Expand open tycons - , (co, ty) <- normaliseTcApp env tc tys + , (co, ty) <- normaliseTcApp env Representational tc tys , not (isReflCo co) = do (co', ty', gres) <- go rec_nts ty return (mkTransCo co co', ty', gres) | otherwise - = children_only + = nothing -- see Note [Don't recur in normaliseFfiType'] where tc_key = getUnique tc children_only = do xs <- mapM (go rec_nts) tys let (cos, tys', gres) = unzip3 xs - return (mkTyConAppCo tc cos, mkTyConApp tc tys', unionManyBags gres) - nt_co = mkUnbranchedAxInstCo (newTyConCo tc) tys + return ( mkTyConAppCo Representational tc cos + , mkTyConApp tc tys', unionManyBags gres) + nt_co = mkUnbranchedAxInstCo Representational (newTyConCo tc) tys nt_rhs = newTyConInstRhs tc tys - - go rec_nts (AppTy ty1 ty2) - = do (coi1, nty1, gres1) <- go rec_nts ty1 - (coi2, nty2, gres2) <- go rec_nts ty2 - return (mkAppCo coi1 coi2, mkAppTy nty1 nty2, gres1 `unionBags` gres2) + nothing = return (Refl Representational ty, ty, emptyBag) go rec_nts (FunTy ty1 ty2) = do (coi1,nty1,gres1) <- go rec_nts ty1 (coi2,nty2,gres2) <- go rec_nts ty2 - return (mkFunCo coi1 coi2, mkFunTy nty1 nty2, gres1 `unionBags` gres2) + return (mkFunCo Representational coi1 coi2, mkFunTy nty1 nty2, gres1 `unionBags` gres2) go rec_nts (ForAllTy tyvar ty1) = do (coi,nty1,gres1) <- go rec_nts ty1 return (mkForAllCo tyvar coi, ForAllTy tyvar nty1, gres1) - go _ ty@(TyVarTy {}) = return (Refl ty, ty, emptyBag) - go _ ty@(LitTy {}) = return (Refl ty, ty, emptyBag) - + go _ ty@(TyVarTy {}) = return (Refl Representational ty, ty, emptyBag) + go _ ty@(LitTy {}) = return (Refl Representational ty, ty, emptyBag) + go _ ty@(AppTy {}) = return (Refl Representational ty, ty, emptyBag) + -- See Note [Don't recur in normaliseFfiType'] checkNewtypeFFI :: GlobalRdrEnv -> TyCon -> Maybe GlobalRdrElt checkNewtypeFFI rdr_env tc diff --git a/compiler/typecheck/TcGenGenerics.lhs b/compiler/typecheck/TcGenGenerics.lhs index f4765e9425..7e2b0147ea 100644 --- a/compiler/typecheck/TcGenGenerics.lhs +++ b/compiler/typecheck/TcGenGenerics.lhs @@ -89,7 +89,7 @@ genGenericMetaTyCons tc mod = s_occ m n = mkGenS tc_occ m n mkTyCon name = ASSERT( isExternalName name ) - buildAlgTyCon name [] Nothing [] distinctAbstractTyConRhs + buildAlgTyCon name [] [] Nothing [] distinctAbstractTyConRhs NonRecursive False -- Not promotable False -- Not GADT syntax diff --git a/compiler/typecheck/TcHsType.lhs b/compiler/typecheck/TcHsType.lhs index d26f371d9b..ba027b10dc 100644 --- a/compiler/typecheck/TcHsType.lhs +++ b/compiler/typecheck/TcHsType.lhs @@ -20,7 +20,7 @@ module TcHsType ( -- Type checking type and class decls kcLookupKind, kcTyClTyVars, tcTyClTyVars, tcHsConArgType, tcDataKindSig, - tcClassSigType, + tcClassSigType, illegalRoleAnnot, -- Kind-checking types -- No kind generalisation, no checkValidType @@ -75,6 +75,7 @@ import UniqSupply import Outputable import FastString import Util +import Maybes import Control.Monad ( unless, when, zipWithM ) import PrelNames( ipClassName, funTyConKey ) @@ -505,6 +506,9 @@ tc_hs_type (HsKindSig ty sig_k) exp_kind msg_fn pkind = ptext (sLit "The signature specified kind") <+> quotes (pprKind pkind) +tc_hs_type ty@(HsRoleAnnot {}) _ + = pprPanic "tc_hs_type HsRoleAnnot" (ppr ty) + tc_hs_type (HsCoreTy ty) exp_kind = do { checkExpectedKind ty (typeKind ty) exp_kind ; return ty } @@ -908,21 +912,6 @@ addTypeCtxt (L _ ty) thing %* * %************************************************************************ -Note [Kind-checking kind-polymorphic types] -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -Consider: - f :: forall (f::k -> *) a. f a -> Int - -Here, the [LHsTyVarBndr Name] of the forall type will be [f,a], where - a is a UserTyVar -> type variable without kind annotation - f is a KindedTyVar -> type variable with kind annotation - -If were were to allow binding sites for kind variables, thus - f :: forall @k (f :: k -> *) a. f a -> Int -then we'd also need - k is a UserKiVar -> kind variable (they don't need annotation, - since we only have BOX for a super kind) - Note [Kind-checking strategies] ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ @@ -1120,14 +1109,15 @@ kcScopedKindVars kv_ns thing_inside kcHsTyVarBndrs :: KindCheckingStrategy -> LHsTyVarBndrs Name -> TcM (Kind, r) -- the result kind, possibly with other info - -> TcM (Kind, r) + -> TcM (Kind, r, [Maybe Role]) +-- See Note [Role annotations] in TcTyClsDecls about the last return value -- Used in getInitialKind kcHsTyVarBndrs strat (HsQTvs { hsq_kvs = kv_ns, hsq_tvs = hs_tvs }) thing_inside = do { kvs <- if skolem_kvs then mapM mkKindSigVar kv_ns else mapM (\n -> newSigTyVar n superKind) kv_ns ; tcExtendTyVarEnv2 (kv_ns `zip` kvs) $ - do { nks <- mapM (kc_hs_tv . unLoc) hs_tvs + do { (nks, mroles) <- mapAndUnzipM (kc_hs_tv . unLoc) hs_tvs ; (res_kind, stuff) <- tcExtendKindEnv nks thing_inside ; let full_kind = mkArrowKinds (map snd nks) res_kind kvs = filter (not . isMetaTyVar) $ @@ -1135,7 +1125,7 @@ kcHsTyVarBndrs strat (HsQTvs { hsq_kvs = kv_ns, hsq_tvs = hs_tvs }) thing_inside gen_kind = if generalise then mkForAllTys kvs full_kind else full_kind - ; return (gen_kind, stuff) } } + ; return (gen_kind, stuff, mroles) } } where -- See Note [Kind-checking strategies] (skolem_kvs, default_to_star, generalise) = case strat of @@ -1143,25 +1133,22 @@ kcHsTyVarBndrs strat (HsQTvs { hsq_kvs = kv_ns, hsq_tvs = hs_tvs }) thing_inside NonParametricKinds -> (True, False, True) FullKindSignature -> (True, True, True) - kc_hs_tv :: HsTyVarBndr Name -> TcM (Name, TcKind) - kc_hs_tv (UserTyVar n) + kc_hs_tv :: HsTyVarBndr Name -> TcM ((Name, TcKind), Maybe Role) + kc_hs_tv (HsTyVarBndr n mk mr) = do { mb_thing <- tcLookupLcl_maybe n - ; kind <- case mb_thing of - Just (AThing k) -> return k - _ | default_to_star -> return liftedTypeKind - | otherwise -> newMetaKindVar - ; return (n, kind) } - kc_hs_tv (KindedTyVar n k) - = do { kind <- tcLHsKind k - -- In an associated type decl, the type variable may already - -- be in scope; in that case we want to make sure its kind - -- matches the one declared here - ; mb_thing <- tcLookupLcl_maybe n - ; case mb_thing of - Nothing -> return () - Just (AThing ks) -> checkKind kind ks - Just thing -> pprPanic "check_in_scope" (ppr thing) - ; return (n, kind) } + ; kind <- case (mb_thing, mk) of + (Just (AThing k1), Just k2) -> do { k2' <- tcLHsKind k2 + ; checkKind k1 k2' + ; return k1 } + (Just (AThing k), Nothing) -> return k + (Nothing, Just k) -> tcLHsKind k + (_, Nothing) + | default_to_star -> return liftedTypeKind + | otherwise -> newMetaKindVar + (Just thing, Just _) -> pprPanic "check_in_scope" (ppr thing) + ; is_boot <- tcIsHsBoot -- in boot files, roles default to R + ; let default_role = if is_boot then Just Representational else Nothing + ; return ((n, kind), firstJust mr default_role) } tcHsTyVarBndrs :: LHsTyVarBndrs Name -> ([TcTyVar] -> TcM r) @@ -1186,9 +1173,8 @@ tcHsTyVarBndrs (HsQTvs { hsq_kvs = kv_ns, hsq_tvs = hs_tvs }) thing_inside tcHsTyVarBndr :: LHsTyVarBndr Name -> TcM TcTyVar -- Return a type variable -- initialised with a kind variable. --- Typically the Kind inside the KindedTyVar will be a tyvar with a mutable kind --- in it. We aren't yet sure whether the binder is a *type* variable or a *kind* --- variable. See Note [Kind-checking kind-polymorphic types] +-- Typically the Kind inside the HsTyVarBndr will be a tyvar with a mutable kind +-- in it. -- -- If the variable is already in scope return it, instead of introducing a new -- one. This can occur in @@ -1196,17 +1182,20 @@ tcHsTyVarBndr :: LHsTyVarBndr Name -> TcM TcTyVar -- type F (a,b) c = ... -- Here a,b will be in scope when processing the associated type instance for F. -- See Note [Associated type tyvar names] in Class -tcHsTyVarBndr (L _ hs_tv) - = do { let name = hsTyVarName hs_tv - ; mb_tv <- tcLookupLcl_maybe name +tcHsTyVarBndr (L _ (HsTyVarBndr name mkind Nothing)) + = do { mb_tv <- tcLookupLcl_maybe name ; case mb_tv of { Just (ATyVar _ tv) -> return tv ; _ -> do - { kind <- case hs_tv of - UserTyVar {} -> newMetaKindVar - KindedTyVar _ kind -> tcLHsKind kind + { kind <- case mkind of + Nothing -> newMetaKindVar + Just kind -> tcLHsKind kind ; return (mkTcTyVar name kind (SkolemTv False)) } } } +-- tcHsTyVarBndr is never called from a context where roles annotations are allowed +tcHsTyVarBndr (L _ (HsTyVarBndr name _ _)) + = addErrTc (illegalRoleAnnot name) >> failM + ------------------ kindGeneralize :: TyVarSet -> TcM [KindVar] kindGeneralize tkvs @@ -1291,12 +1280,11 @@ kcTyClTyVars name (HsQTvs { hsq_kvs = kvs, hsq_tvs = hs_tvs }) thing_inside -- to match the kind variables they mention against the ones -- we've freshly brought into scope kc_tv :: LHsTyVarBndr Name -> Kind -> TcM (Name, Kind) - kc_tv (L _ (UserTyVar n)) exp_k - = return (n, exp_k) - kc_tv (L _ (KindedTyVar n hs_k)) exp_k - = do { k <- tcLHsKind hs_k - ; checkKind k exp_k - ; return (n, exp_k) } + kc_tv (L _ (HsTyVarBndr n mkind _)) exp_k + | Just hs_k <- mkind = do { k <- tcLHsKind hs_k + ; checkKind k exp_k + ; return (n, exp_k) } + | otherwise = return (n, exp_k) ----------------------- tcTyClTyVars :: Name -> LHsTyVarBndrs Name -- LHS of the type or class decl @@ -1328,10 +1316,10 @@ tcTyClTyVars tycon (HsQTvs { hsq_kvs = hs_kvs, hsq_tvs = hs_tvs }) thing_inside ; tvs <- zipWithM tc_hs_tv hs_tvs kinds ; tcExtendTyVarEnv tvs (thing_inside (kvs ++ tvs) res) } where - tc_hs_tv (L _ (UserTyVar n)) kind = return (mkTyVar n kind) - tc_hs_tv (L _ (KindedTyVar n hs_k)) kind = do { tc_kind <- tcLHsKind hs_k - ; checkKind kind tc_kind - ; return (mkTyVar n kind) } + tc_hs_tv (L _ (HsTyVarBndr n mkind _)) kind + = do { whenIsJust mkind $ \k -> do { tc_kind <- tcLHsKind k + ; checkKind kind tc_kind } + ; return $ mkTyVar n kind } ----------------------------------- tcDataKindSig :: Kind -> TcM [TyVar] @@ -1686,6 +1674,11 @@ checkExpectedKind ty act_kind (EK exp_kind ek_ctxt) ; traceTc "checkExpectedKind 1" (ppr ty $$ ppr tidy_act_kind $$ ppr tidy_exp_kind $$ ppr env1 $$ ppr env2) ; failWithTcM (env2, err) } } } + +illegalRoleAnnot :: Name -> SDoc +illegalRoleAnnot var + = ptext (sLit "Illegal role annotation on variable") <+> ppr var <> semi $$ + ptext (sLit "role annotations are not allowed here") \end{code} %************************************************************************ diff --git a/compiler/typecheck/TcInstDcls.lhs b/compiler/typecheck/TcInstDcls.lhs index 2156bba9db..79ce573d84 100644 --- a/compiler/typecheck/TcInstDcls.lhs +++ b/compiler/typecheck/TcInstDcls.lhs @@ -19,10 +19,7 @@ module TcInstDcls ( tcInstDecls1, tcInstDecls2 ) where import HsSyn import TcBinds -import TcTyClsDecls( tcAddImplicits, tcAddTyFamInstCtxt, tcAddDataFamInstCtxt, - tcSynFamInstDecl, - wrongKindOfFamily, tcFamTyPats, kcDataDefn, dataDeclChecks, - tcConDecls, checkValidTyCon ) +import TcTyClsDecls import TcClassDcl( tcClassDecl2, HsSigFun, lookupHsSig, mkHsSigFun, emptyHsSigs, findMethodBind, instantiateMethod, tcInstanceMethodBody ) @@ -65,6 +62,7 @@ import Id import MkId import Name import NameSet +import NameEnv import Outputable import SrcLoc import Util @@ -697,7 +695,8 @@ tcDataFamInstDecl mb_clsinfo axiom = mkSingleCoAxiom axiom_name eta_tvs fam_tc eta_pats (mkTyConApp rep_tc (mkTyVarTys eta_tvs)) parent = FamInstTyCon axiom fam_tc pats' - rep_tc = buildAlgTyCon rep_tc_name tvs' cType stupid_theta tc_rhs + roles = map (const Nominal) tvs' + rep_tc = buildAlgTyCon rep_tc_name tvs' roles cType stupid_theta tc_rhs Recursive False -- No promotable to the kind level h98_syntax parent @@ -710,7 +709,9 @@ tcDataFamInstDecl mb_clsinfo ; return (rep_tc, fam_inst) } -- Remember to check validity; no recursion to worry about here - ; checkValidTyCon rep_tc + ; let role_annots = unitNameEnv rep_tc_name (repeat Nothing) + ; checkValidTyConDataConsOnly rep_tc + ; checkValidTyCon rep_tc role_annots ; return fam_inst } } where -- See Note [Eta reduction for data family axioms] diff --git a/compiler/typecheck/TcInteract.lhs b/compiler/typecheck/TcInteract.lhs index c0a0760f9f..23d63ba178 100644 --- a/compiler/typecheck/TcInteract.lhs +++ b/compiler/typecheck/TcInteract.lhs @@ -1713,7 +1713,8 @@ matchClassInst _ clas [ k, ty ] _ } , fim_tys = tys } | Just (_,_,axSing) <- unwrapNewTyCon_maybe tcon -> - + -- co1 and co3 are at role R, while co2 is at role N. + -- BUT, when desugaring to Coercions, the roles get fixed. do let co1 = mkTcSymCo $ mkTcUnbranchedAxInstCo axSing tys co2 = mkTcSymCo $ mkTcUnbranchedAxInstCo axDataFam tys co3 = mkTcSymCo $ mkTcUnbranchedAxInstCo axDict [k,ty] diff --git a/compiler/typecheck/TcRnDriver.lhs b/compiler/typecheck/TcRnDriver.lhs index 56cdf60afc..d96dd22299 100644 --- a/compiler/typecheck/TcRnDriver.lhs +++ b/compiler/typecheck/TcRnDriver.lhs @@ -758,6 +758,7 @@ checkBootTyCon tc1 tc2 eqListBy (eqTypeX env) (mkTyVarTys as1) (mkTyVarTys as2) && eqListBy (eqTypeX env) (mkTyVarTys bs1) (mkTyVarTys bs2) in + roles1 == roles2 && -- Checks kind of class eqListBy eqFD clas_fds1 clas_fds2 && (null sc_theta1 && null op_stuff1 && null ats1 @@ -777,11 +778,13 @@ checkBootTyCon tc1 tc2 = eqTypeX env t1 t2 eqSynRhs _ _ = False in + roles1 == roles2 && eqSynRhs syn_rhs1 syn_rhs2 | isAlgTyCon tc1 && isAlgTyCon tc2 , Just env <- eqTyVarBndrs emptyRnEnv2 (tyConTyVars tc1) (tyConTyVars tc2) = ASSERT(tc1 == tc2) + roles1 == roles2 && eqListBy (eqPredX env) (tyConStupidTheta tc1) (tyConStupidTheta tc2) && eqAlgRhs (algTyConRhs tc1) (algTyConRhs tc2) @@ -791,6 +794,9 @@ checkBootTyCon tc1 tc2 | otherwise = False where + roles1 = tyConRoles tc1 + roles2 = tyConRoles tc2 + eqAlgRhs (AbstractTyCon dis1) rhs2 | dis1 = isDistinctAlgRhs rhs2 --Check compatibility | otherwise = True @@ -1499,7 +1505,7 @@ getGhciStepIO = do stepTy :: LHsType Name -- Renamed, so needs all binders in place stepTy = noLoc $ HsForAllTy Implicit - (HsQTvs { hsq_tvs = [noLoc (UserTyVar a_tv)] + (HsQTvs { hsq_tvs = [noLoc (HsTyVarBndr a_tv Nothing Nothing)] , hsq_kvs = [] }) (noLoc []) (nlHsFunTy ghciM ioM) @@ -1590,9 +1596,9 @@ tcRnType hsc_env ictxt normalise rdr_type ; ty' <- if normalise then do { fam_envs <- tcGetFamInstEnvs - ; return (snd (normaliseType fam_envs ty)) } + ; return (snd (normaliseType fam_envs Nominal ty)) } -- normaliseType returns a coercion - -- which we discard + -- which we discard, so the Role is irrelevant else return ty ; ; return (ty', typeKind ty) } diff --git a/compiler/typecheck/TcSplice.lhs b/compiler/typecheck/TcSplice.lhs index 59b06d4a8e..bb24708882 100644 --- a/compiler/typecheck/TcSplice.lhs +++ b/compiler/typecheck/TcSplice.lhs @@ -76,7 +76,7 @@ import BasicTypes import DynFlags import Panic import FastString -import Control.Monad ( when ) +import Control.Monad ( when, zipWithM ) import qualified Language.Haskell.TH as TH -- THSyntax gives access to internal functions and data types @@ -1215,7 +1215,7 @@ reifyTyCon tc ; kind' <- if isLiftedTypeKind kind then return Nothing else fmap Just (reifyKind kind) - ; tvs' <- reifyTyVars tvs + ; tvs' <- reifyTyVars tvs Nothing ; flav' <- reifyFamFlavour tc ; case flav' of { Left flav -> -- open type/data family @@ -1231,7 +1231,7 @@ reifyTyCon tc | Just (tvs, rhs) <- synTyConDefn_maybe tc -- Vanilla type synonym = do { rhs' <- reifyType rhs - ; tvs' <- reifyTyVars tvs + ; tvs' <- reifyTyVars tvs (Just $ tyConRoles tc) ; return (TH.TyConI (TH.TySynD (reifyName tc) tvs' rhs')) } @@ -1240,7 +1240,7 @@ reifyTyCon tc = do { cxt <- reifyCxt (tyConStupidTheta tc) ; let tvs = tyConTyVars tc ; cons <- mapM (reifyDataCon (mkTyVarTys tvs)) (tyConDataCons tc) - ; r_tvs <- reifyTyVars tvs + ; r_tvs <- reifyTyVars tvs (Just $ tyConRoles tc) ; let name = reifyName tc deriv = [] -- Don't know about deriving decl | isNewTyCon tc = TH.NewtypeD cxt name r_tvs (head cons) deriv @@ -1276,7 +1276,7 @@ reifyDataCon tys dc return main_con else do { cxt <- reifyCxt theta' - ; ex_tvs'' <- reifyTyVars ex_tvs' + ; ex_tvs'' <- reifyTyVars ex_tvs' Nothing ; return (TH.ForallC ex_tvs'' cxt main_con) } } ------------------------------ @@ -1286,7 +1286,7 @@ reifyClass cls ; inst_envs <- tcGetInstEnvs ; insts <- mapM reifyClassInstance (InstEnv.classInstances inst_envs cls) ; ops <- mapM reify_op op_stuff - ; tvs' <- reifyTyVars tvs + ; tvs' <- reifyTyVars tvs (Just $ tyConRoles (classTyCon cls)) ; let dec = TH.ClassD cxt (reifyName cls) tvs' fds' ops ; return (TH.ClassI dec insts ) } where @@ -1344,7 +1344,7 @@ reify_for_all :: TypeRep.Type -> TcM TH.Type reify_for_all ty = do { cxt' <- reifyCxt cxt; ; tau' <- reifyType tau - ; tvs' <- reifyTyVars tvs + ; tvs' <- reifyTyVars tvs Nothing ; return (TH.ForallT tvs' cxt' tau') } where (tvs, cxt, tau) = tcSplitSigmaTy ty @@ -1401,16 +1401,34 @@ reifyFamFlavour tc | otherwise = panic "TcSplice.reifyFamFlavour: not a type family" -reifyTyVars :: [TyVar] -> TcM [TH.TyVarBndr] -reifyTyVars = mapM reifyTyVar . filter isTypeVar +reifyTyVars :: [TyVar] -> Maybe [Role] -- use Nothing if role annot.s are not allowed + -> TcM [TH.TyVarBndr] +reifyTyVars tvs Nothing = mapM reify_tv $ filter isTypeVar tvs where - reifyTyVar tv | isLiftedTypeKind kind = return (TH.PlainTV name) - | otherwise = do kind' <- reifyKind kind - return (TH.KindedTV name kind') + reify_tv tv | isLiftedTypeKind kind = return (TH.PlainTV name) + | otherwise = do kind' <- reifyKind kind + return (TH.KindedTV name kind') where kind = tyVarKind tv name = reifyName tv +reifyTyVars tvs (Just roles) = zipWithM reify_tv tvs' roles' + where + (kvs, tvs') = span isKindVar tvs + roles' = dropList kvs roles + + reify_tv tv role + | isLiftedTypeKind kind = return (TH.RoledTV name role') + | otherwise = do kind' <- reifyKind kind + return (TH.KindedRoledTV name kind' role') + where + kind = tyVarKind tv + name = reifyName tv + role' = case role of + CoAxiom.Nominal -> TH.Nominal + CoAxiom.Representational -> TH.Representational + CoAxiom.Phantom -> TH.Phantom + reify_tc_app :: TyCon -> [TypeRep.Type] -> TcM TH.Type reify_tc_app tc tys = do { tys' <- reifyTypes (removeKinds (tyConKind tc) tys) diff --git a/compiler/typecheck/TcTyClsDecls.lhs b/compiler/typecheck/TcTyClsDecls.lhs index 4d7f70dc93..147927300b 100644 --- a/compiler/typecheck/TcTyClsDecls.lhs +++ b/compiler/typecheck/TcTyClsDecls.lhs @@ -14,6 +14,7 @@ module TcTyClsDecls ( -- Functions used by TcInstDcls to check -- data/type family instance declarations kcDataDefn, tcConDecls, dataDeclChecks, checkValidTyCon, + checkValidTyConDataConsOnly, tcSynFamInstDecl, tcFamTyPats, tcAddTyFamInstCtxt, tcAddDataFamInstCtxt, wrongKindOfFamily, @@ -38,8 +39,9 @@ import TcType import TysWiredIn( unitTy ) import FamInst import FamInstEnv( isDominatedBy, mkCoAxBranch, mkBranchedCoAxiom ) -import Coercion( pprCoAxBranch ) +import Coercion( pprCoAxBranch, ltRole ) import Type +import TypeRep -- for checkValidRoles import Kind import Class import CoAxiom @@ -122,13 +124,14 @@ tcTyClGroup boot_details tyclds = 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] - names_w_poly_kinds <- kcTyClGroup tyclds + -- See also Note [Role annotations] + (names_w_poly_kinds, role_annots) <- kcTyClGroup tyclds ; traceTc "tcTyAndCl generalized kinds" (ppr names_w_poly_kinds) -- Step 2: type-check all groups together, returning -- the final TyCons and Classes ; tyclss <- fixM $ \ rec_tyclss -> do - { let rec_flags = calcRecFlags boot_details rec_tyclss + { let rec_flags = calcRecFlags boot_details role_annots rec_tyclss -- Populate environment with knot-tied ATyCon for TyCons -- NB: if the decls mention any ill-staged data cons @@ -150,11 +153,19 @@ tcTyClGroup boot_details tyclds -- expects well-formed TyCons ; tcExtendGlobalEnv tyclss $ do { traceTc "Starting validity check" (ppr tyclss) - ; checkNoErrs $ - mapM_ (recoverM (return ()) . addLocM checkValidTyCl) tyclds + ; -- Step 3a: Check datacons only. Why? Because checking tycons in general + -- also checks for role consistency, which looks at types. But, a mal-formed + -- GADT return type means that a datacon has a panic in its types + -- (see rejigConRes). So, we check all datacons first, before doing other + -- checks. + checkNoErrs $ + mapM_ (recoverM (return ()) . addLocM checkValidTyClDataConsOnly) tyclds + -- The checkNoErrs above fixes Trac #7175 + + -- Step 3b: do the rest of validity checking + ; mapM_ (recoverM (return ()) . addLocM (checkValidTyCl role_annots)) tyclds -- We recover, which allows us to report multiple validity errors - -- but we then fail if any are wrong. Lacking the checkNoErrs - -- we get Trac #7175 + -- but we then fail if any are wrong. -- Step 4: Add the implicit things; -- we want them in the environment because @@ -248,11 +259,29 @@ 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'). +Note [Role annotations] +~~~~~~~~~~~~~~~~~~~~~~~ +Role processing is threaded through the kind- and type-checker. Here is the +route: + +1. kcTyClGroup returns a list of (Name, Kind, [Maybe Role]) triples. The +elements of the role list correspond to type variables associated with the Name. +Nothing indicates no role annotation. Just r indicates an annotation r. + +2. The role annotations are passed into calcRecFlags, which among other things, +performs role inference. The role annotations are used to initialize the role +inference algorithm. + +3. During validity-checking (in checkRoleAnnot), the inferred roles are +then checked against the annotations. If they don't match, an error is reported. +This is also where the presence of the RoleAnnotations flag is checked. + \begin{code} -kcTyClGroup :: TyClGroup Name -> TcM [(Name,Kind)] +kcTyClGroup :: TyClGroup Name -> TcM ([(Name,Kind)], RoleAnnots) -- Kind check this group, kind generalize, and return the resulting local env -- This bindds the TyCons and Classes of the group, but not the DataCons -- See Note [Kind checking for type and class decls] +-- Role annotation extraction is done here, too. See Note [Role annotations] kcTyClGroup decls = do { mod <- getModule ; traceTc "kcTyClGroup" (ptext (sLit "module") <+> ppr mod $$ vcat (map ppr decls)) @@ -266,12 +295,13 @@ kcTyClGroup decls -- Step 1: Bind kind variables for non-synonyms ; let (syn_decls, non_syn_decls) = partition (isSynDecl . unLoc) decls - ; initial_kinds <- getInitialKinds non_syn_decls + ; (initial_kinds, role_env) <- getInitialKinds non_syn_decls ; traceTc "kcTyClGroup: initial kinds" (ppr initial_kinds) -- Step 2: Set initial envt, kind-check the synonyms - ; lcl_env <- tcExtendTcTyThingEnv initial_kinds $ - kcSynDecls (calcSynCycles syn_decls) + -- See Note [Role annotations] + ; (lcl_env, role_env') <- tcExtendTcTyThingEnv initial_kinds $ + kcSynDecls (calcSynCycles syn_decls) -- Step 3: Set extended envt, kind-check the non-synonyms ; setLclEnv lcl_env $ @@ -283,7 +313,7 @@ kcTyClGroup decls ; res <- concatMapM (generaliseTCD (tcl_env lcl_env)) decls ; traceTc "kcTyClGroup result" (ppr res) - ; return res } + ; return (res, role_env `plusNameEnv` role_env') } where generalise :: TcTypeEnv -> Name -> TcM (Name, Kind) @@ -332,13 +362,14 @@ mk_thing_env (decl : decls) = (tcdName (unLoc decl), APromotionErr TyConPE) : (mk_thing_env decls) -getInitialKinds :: [LTyClDecl Name] -> TcM [(Name, TcTyThing)] +getInitialKinds :: [LTyClDecl Name] -> TcM ([(Name, TcTyThing)], RoleAnnots) getInitialKinds decls = tcExtendTcTyThingEnv (mk_thing_env decls) $ - concatMapM (addLocM getInitialKind) decls + do { (pairss, annots) <- mapAndUnzipM (addLocM getInitialKind) decls + ; return (concat pairss, mkNameEnv (zip (map (tcdName . unLoc) decls) annots)) } -- See Note [Kind-checking strategies] in TcHsType -getInitialKind :: TyClDecl Name -> TcM [(Name, TcTyThing)] +getInitialKind :: TyClDecl Name -> TcM ([(Name, TcTyThing)], [Maybe Role]) -- Allocate a fresh kind variable for each TyCon and Class -- For each tycon, return (tc, AThing k) -- where k is the kind of tc, derived from the LHS @@ -357,33 +388,37 @@ getInitialKind :: TyClDecl Name -> TcM [(Name, TcTyThing)] -- No family instances are passed to getInitialKinds getInitialKind decl@(ClassDecl { tcdLName = L _ name, tcdTyVars = ktvs, tcdATs = ats }) - = do { (cl_kind, inner_prs) <- + = do { (cl_kind, inner_prs, role_annots) <- kcHsTyVarBndrs (kcStrategy decl) ktvs $ do { inner_prs <- getFamDeclInitialKinds ats ; return (constraintKind, inner_prs) } ; let main_pr = (name, AThing cl_kind) - ; return (main_pr : inner_prs) } + ; return ((main_pr : inner_prs), role_annots) } getInitialKind decl@(DataDecl { tcdLName = L _ name , tcdTyVars = ktvs , tcdDataDefn = HsDataDefn { dd_kindSig = m_sig , dd_cons = cons } }) - = do { (decl_kind, _) <- + = do { (decl_kind, num_extra_tvs, role_annots) <- kcHsTyVarBndrs (kcStrategy decl) ktvs $ do { res_k <- case m_sig of Just ksig -> tcLHsKind ksig Nothing -> return liftedTypeKind - ; return (res_k, ()) } + -- return the number of extra type arguments from the res_k so + -- we can extend the role_annots list + ; return (res_k, length $ fst $ splitKindFunTys res_k) } ; let main_pr = (name, AThing decl_kind) inner_prs = [ (unLoc (con_name con), APromotionErr RecDataConPE) | L _ con <- cons ] - ; return (main_pr : inner_prs) } + role_annots' = role_annots ++ replicate num_extra_tvs Nothing + ; return ((main_pr : inner_prs), role_annots') } getInitialKind (FamDecl { tcdFam = decl }) - = getFamDeclInitialKind decl + = do { pairs <- getFamDeclInitialKind decl + ; return (pairs, []) } getInitialKind (ForeignType { tcdLName = L _ name }) - = return [(name, AThing liftedTypeKind)] + = return ([(name, AThing liftedTypeKind)], []) getInitialKind decl@(SynDecl {}) = pprPanic "getInitialKind" (ppr decl) @@ -401,7 +436,7 @@ getFamDeclInitialKind decl@(FamilyDecl { fdLName = L _ name , fdInfo = info , fdTyVars = ktvs , fdKindSig = ksig }) - = do { (fam_kind, _) <- + = do { (fam_kind, _, _) <- kcHsTyVarBndrs (kcStrategyFamDecl decl) ktvs $ do { res_k <- case ksig of Just k -> tcLHsKind k @@ -414,31 +449,34 @@ getFamDeclInitialKind decl@(FamilyDecl { fdLName = L _ name defaultResToStar = not $ isClosedTypeFamilyInfo info ---------------- -kcSynDecls :: [SCC (LTyClDecl Name)] -> TcM TcLclEnv -- Kind bindings -kcSynDecls [] = getLclEnv +kcSynDecls :: [SCC (LTyClDecl Name)] + -> TcM (TcLclEnv, RoleAnnots) -- Kind bindings and roles +kcSynDecls [] = do { env <- getLclEnv + ; return (env, emptyNameEnv) } kcSynDecls (group : groups) - = do { nk <- kcSynDecl1 group - ; tcExtendKindEnv [nk] (kcSynDecls groups) } + = do { (n,k,mr) <- kcSynDecl1 group + ; (lcl_env, role_env) <- tcExtendKindEnv [(n,k)] (kcSynDecls groups) + ; return (lcl_env, extendNameEnv role_env n mr) } kcSynDecl1 :: SCC (LTyClDecl Name) - -> TcM (Name,TcKind) -- Kind bindings + -> TcM (Name,TcKind,[Maybe Role]) -- Kind bindings with roles kcSynDecl1 (AcyclicSCC (L _ decl)) = kcSynDecl decl kcSynDecl1 (CyclicSCC decls) = do { recSynErr decls; failM } -- Fail here to avoid error cascade -- of out-of-scope tycons -kcSynDecl :: TyClDecl Name -> TcM (Name, TcKind) +kcSynDecl :: TyClDecl Name -> TcM (Name, TcKind, [Maybe Role]) kcSynDecl decl@(SynDecl { tcdTyVars = hs_tvs, tcdLName = L _ name , tcdRhs = rhs }) -- Returns a possibly-unzonked kind = tcAddDeclCtxt decl $ - do { (syn_kind, _) <- + do { (syn_kind, _, mroles) <- kcHsTyVarBndrs (kcStrategy decl) hs_tvs $ do { traceTc "kcd1" (ppr name <+> brackets (ppr hs_tvs)) ; (_, rhs_kind) <- tcLHsType rhs ; traceTc "kcd2" (ppr name) ; return (rhs_kind, ()) } - ; return (name, syn_kind) } + ; return (name, syn_kind, mroles) } kcSynDecl decl = pprPanic "kcSynDecl" (ppr decl) ------------------------------------------------------------------------ @@ -449,6 +487,7 @@ kcLTyClDecl (L loc decl) kcTyClDecl :: TyClDecl Name -> TcM () -- This function is used solely for its side effect on kind variables +-- and to extract role annotations -- NB kind signatures on the type variables and -- result kind signature have aready been dealt with -- by getInitialKind, so we can ignore them here. @@ -579,11 +618,11 @@ tcTyClDecl1 parent _rec_info (FamDecl { tcdFam = fd }) = tcFamDecl1 parent fd -- "type" synonym declaration -tcTyClDecl1 _parent _rec_info +tcTyClDecl1 _parent rec_info (SynDecl { tcdLName = L _ tc_name, tcdTyVars = tvs, tcdRhs = rhs }) = ASSERT( isNoParent _parent ) tcTyClTyVars tc_name tvs $ \ tvs' kind -> - tcTySynRhs tc_name tvs' kind rhs + tcTySynRhs rec_info tc_name tvs' kind rhs -- "data/newtype" declaration tcTyClDecl1 _parent rec_info @@ -601,11 +640,12 @@ tcTyClDecl1 _parent rec_info do { (clas, tvs', gen_dm_env) <- fixM $ \ ~(clas,_,_) -> tcTyClTyVars class_name tvs $ \ tvs' kind -> do { MASSERT( isConstraintKind kind ) - ; let -- This little knot is just so we can get - -- hold of the name of the class TyCon, which we - -- need to look up its recursiveness - tycon_name = tyConName (classTyCon clas) - tc_isrec = rti_is_rec rec_info tycon_name + -- This little knot is just so we can get + -- hold of the name of the class TyCon, which we + -- need to look up its recursiveness + ; let tycon_name = tyConName (classTyCon clas) + tc_isrec = rti_is_rec rec_info tycon_name + roles = rti_roles rec_info tycon_name ; ctxt' <- tcHsContext ctxt ; ctxt' <- zonkTcTypeToTypes emptyZonkEnv ctxt' @@ -614,7 +654,7 @@ tcTyClDecl1 _parent rec_info ; (sig_stuff, gen_dm_env) <- tcClassSigs class_name sigs meths ; at_stuff <- tcClassATs class_name (AssocFamilyTyCon clas) ats at_defs ; clas <- buildClass False {- Must include unfoldings for selectors -} - class_name tvs' ctxt' fds' at_stuff + class_name tvs' roles ctxt' fds' at_stuff sig_stuff tc_isrec ; traceTc "tcClassDecl" (ppr fundeps $$ ppr tvs' $$ ppr fds') ; return (clas, tvs', gen_dm_env) } @@ -647,7 +687,7 @@ tcTyClDecl1 _parent rec_info tcTyClDecl1 _ _ (ForeignType {tcdLName = L _ tc_name, tcdExtName = tc_ext_name}) - = return [ATyCon (mkForeignTyCon tc_name tc_ext_name liftedTypeKind 0)] + = return [ATyCon (mkForeignTyCon tc_name tc_ext_name liftedTypeKind)] \end{code} \begin{code} @@ -657,7 +697,9 @@ tcFamDecl1 parent = tcTyClTyVars tc_name tvs $ \ tvs' kind -> do { traceTc "open type family:" (ppr tc_name) ; checkFamFlag tc_name - ; tycon <- buildSynTyCon tc_name tvs' OpenSynFamilyTyCon kind parent + ; checkNoRoles tvs + ; let roles = map (const Nominal) tvs' + ; tycon <- buildSynTyCon tc_name tvs' roles OpenSynFamilyTyCon kind parent ; return [ATyCon tycon] } tcFamDecl1 parent @@ -671,6 +713,7 @@ tcFamDecl1 parent return (tvs', kind) ; checkFamFlag tc_name -- make sure we have -XTypeFamilies + ; checkNoRoles tvs -- check to make sure all the names used in the equations are -- consistent @@ -698,7 +741,8 @@ tcFamDecl1 parent -- now, finally, build the TyCon ; let syn_rhs = ClosedSynFamilyTyCon co_ax - ; tycon <- buildSynTyCon tc_name tvs' syn_rhs kind parent + roles = map (const Nominal) tvs' + ; tycon <- buildSynTyCon tc_name tvs' roles syn_rhs kind parent ; return [ATyCon tycon, ACoAxiom co_ax] } -- We check for instance validity later, when doing validity checking for @@ -709,24 +753,28 @@ tcFamDecl1 parent = tcTyClTyVars tc_name tvs $ \ tvs' kind -> do { traceTc "data family:" (ppr tc_name) ; checkFamFlag tc_name + ; checkNoRoles tvs ; extra_tvs <- tcDataKindSig kind ; let final_tvs = tvs' ++ extra_tvs -- we may not need these - tycon = buildAlgTyCon tc_name final_tvs Nothing [] + roles = map (const Nominal) final_tvs + tycon = buildAlgTyCon tc_name final_tvs roles Nothing [] DataFamilyTyCon Recursive False -- Not promotable to the kind level True -- GADT syntax parent ; return [ATyCon tycon] } -tcTySynRhs :: Name +tcTySynRhs :: RecTyInfo + -> Name -> [TyVar] -> Kind -> LHsType Name -> TcM [TyThing] -tcTySynRhs tc_name tvs kind hs_ty +tcTySynRhs rec_info tc_name tvs kind hs_ty = do { env <- getLclEnv ; traceTc "tc-syn" (ppr tc_name $$ ppr (tcl_env env)) ; rhs_ty <- tcCheckLHsType hs_ty kind ; rhs_ty <- zonkTcTypeToType emptyZonkEnv rhs_ty - ; tycon <- buildSynTyCon tc_name tvs (SynonymTyCon rhs_ty) + ; let roles = rti_roles rec_info tc_name + ; tycon <- buildSynTyCon tc_name tvs roles (SynonymTyCon rhs_ty) kind NoParentTyCon ; return [ATyCon tycon] } @@ -740,6 +788,7 @@ tcDataDefn rec_info tc_name tvs kind , dd_cons = cons }) = do { extra_tvs <- tcDataKindSig kind ; let final_tvs = tvs ++ extra_tvs + roles = rti_roles rec_info tc_name ; stupid_theta <- tcHsContext ctxt ; kind_signatures <- xoptM Opt_KindSignatures ; is_boot <- tcIsHsBoot -- Are we compiling an hs-boot file? @@ -764,7 +813,7 @@ tcDataDefn rec_info tc_name tvs kind DataType -> return (mkDataTyConRhs data_cons) NewType -> ASSERT( not (null data_cons) ) mkNewTyConRhs tc_name tycon (head data_cons) - ; return (buildAlgTyCon tc_name final_tvs cType stupid_theta tc_rhs + ; return (buildAlgTyCon tc_name final_tvs roles cType stupid_theta tc_rhs (rti_is_rec rec_info tc_name) (rti_promotable rec_info) (not h98_syntax) NoParentTyCon) } @@ -1269,8 +1318,8 @@ checkClassCycleErrs cls where cls_cycles = calcClassCycles cls checkValidDecl :: SDoc -- the context for error checking - -> Located Name -> TcM () -checkValidDecl ctxt lname + -> Located Name -> RoleAnnots -> TcM () +checkValidDecl ctxt lname mroles = addErrCtxt ctxt $ do { traceTc "Validity of 1" (ppr lname) ; env <- getGblEnv @@ -1281,16 +1330,38 @@ checkValidDecl ctxt lname ; case thing of ATyCon tc -> do traceTc " of kind" (ppr (tyConKind tc)) - checkValidTyCon tc + checkValidTyCon tc mroles AnId _ -> return () -- Generic default methods are checked -- with their parent class _ -> panic "checkValidTyCl" ; traceTc "Done validity of" (ppr thing) } -checkValidTyCl :: TyClDecl Name -> TcM () -checkValidTyCl decl - = do { checkValidDecl (tcMkDeclCtxt decl) (tyClDeclLName decl) +checkValidTyClDataConsOnly :: TyClDecl Name -> TcM () +checkValidTyClDataConsOnly decl + | DataDecl {} <- decl = check_datacons_decl + | otherwise = return () + where + lname = tyClDeclLName decl + check_datacons_decl + = addErrCtxt (tcMkDeclCtxt decl) $ + do { thing <- tcLookupLocatedGlobal lname + ; case thing of + ATyCon tc -> checkValidTyConDataConsOnly tc + _ -> pprPanic "checkValidTyClDataConsOnly" (ppr lname) } + +checkValidTyConDataConsOnly :: TyCon -> TcM () +checkValidTyConDataConsOnly tc + = do { -- Check arg types of data constructors + dflags <- getDynFlags + ; existential_ok <- xoptM Opt_ExistentialQuantification + ; gadt_ok <- xoptM Opt_GADTs + ; let ex_ok = existential_ok || gadt_ok -- Data cons can have existential context + ; mapM_ (checkValidDataCon dflags ex_ok tc) (tyConDataCons tc) } + +checkValidTyCl :: RoleAnnots -> TyClDecl Name -> TcM () +checkValidTyCl mroles decl + = do { checkValidDecl (tcMkDeclCtxt decl) (tyClDeclLName decl) mroles ; case decl of ClassDecl { tcdATs = ats } -> mapM_ (checkValidFamDecl . unLoc) ats @@ -1301,6 +1372,7 @@ checkValidFamDecl (FamilyDecl { fdLName = lname, fdInfo = flav }) = checkValidDecl (hsep [ptext (sLit "In the"), ppr flav, ptext (sLit "declaration for"), quotes (ppr lname)]) lname + (pprPanic "checkValidFamDecl" (ppr lname)) -- no roles on families ------------------------- -- For data types declared with record syntax, we require @@ -1317,31 +1389,29 @@ checkValidFamDecl (FamilyDecl { fdLName = lname, fdInfo = flav }) -- T2 { f1 :: c, f2 :: c, f3 ::Int } :: T -- Here we do not complain about f1,f2 because they are existential -checkValidTyCon :: TyCon -> TcM () -checkValidTyCon tc +checkValidTyCon :: TyCon -> RoleAnnots -> TcM () +checkValidTyCon tc mroles | Just cl <- tyConClass_maybe tc - = checkValidClass cl + = do { check_roles + ; checkValidClass cl } | Just syn_rhs <- synTyConRhs_maybe tc = case syn_rhs of ClosedSynFamilyTyCon ax -> checkValidClosedCoAxiom ax OpenSynFamilyTyCon -> return () - SynonymTyCon ty -> checkValidType syn_ctxt ty + SynonymTyCon ty -> + do { check_roles + ; checkValidType syn_ctxt ty } | otherwise - = do { -- Check the context on the data decl + = do { unless (isFamilyTyCon tc) $ check_roles -- don't check data families! + +-- Check the context on the data decl ; traceTc "cvtc1" (ppr tc) ; checkValidTheta (DataTyCtxt name) (tyConStupidTheta tc) - -- Check arg types of data constructors ; traceTc "cvtc2" (ppr tc) - ; dflags <- getDynFlags - ; existential_ok <- xoptM Opt_ExistentialQuantification - ; gadt_ok <- xoptM Opt_GADTs - ; let ex_ok = existential_ok || gadt_ok -- Data cons can have existential context - ; mapM_ (checkValidDataCon dflags ex_ok tc) data_cons - -- Check that fields with the same name share a type ; mapM_ check_fields groups } @@ -1350,6 +1420,23 @@ checkValidTyCon tc name = tyConName tc data_cons = tyConDataCons tc + -- Role annotations are given only on *type* variables, but a tycon stores + -- roles for all variables. So, we drop the kind roles (which are all + -- Nominal, anyway). + tyvars = tyConTyVars tc + (kind_vars, type_vars) = span isKindVar tyvars + roles = tyConRoles tc + type_roles = dropList kind_vars roles + + role_annots = case lookupNameEnv mroles name of + Just rs -> rs + Nothing -> pprPanic "checkValidTyCon role_annots" (ppr name) + + check_roles + = do { _ <- zipWith3M checkRoleAnnot type_vars role_annots type_roles + ; lint <- goptM Opt_DoCoreLinting + ; when lint $ checkValidRoles tc } + groups = equivClasses cmp_fld (concatMap get_fields data_cons) cmp_fld (f1,_) (f2,_) = f1 `compare` f2 get_fields con = dataConFieldLabels con `zip` repeat con @@ -1390,6 +1477,77 @@ checkValidTyCon tc fty2 = dataConFieldType con2 label check_fields [] = panic "checkValidTyCon/check_fields []" +checkRoleAnnot :: TyVar -> Maybe Role -> Role -> TcM () +checkRoleAnnot _ Nothing _ = return () +checkRoleAnnot tv (Just r1) r2 + = when (r1 /= r2) $ + addErrTc $ badRoleAnnot (tyVarName tv) r1 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 TcTyDecls +checkValidRoles :: TyCon -> TcM () +-- If you edit this function, you may need to update the GHC formalism +-- See Note [GHC Formalism] in CoreLint +checkValidRoles tc + | isAlgTyCon tc + -- tyConDataCons returns an empty list for data families + = mapM_ check_dc_roles (tyConDataCons tc) + | Just (SynonymTyCon rhs) <- synTyConRhs_maybe tc + = check_ty_roles (zipVarEnv (tyConTyVars tc) (tyConRoles tc)) Representational rhs + | otherwise + = return () + where + check_dc_roles datacon + = let univ_tvs = dataConUnivTyVars datacon + ex_tvs = dataConExTyVars datacon + args = dataConRepArgTys datacon + univ_roles = zipVarEnv univ_tvs (tyConRoles tc) + -- zipVarEnv uses zipEqual, but we don't want that for ex_tvs + ex_roles = mkVarEnv (zip ex_tvs (repeat Nominal)) + role_env = univ_roles `plusVarEnv` ex_roles in + mapM_ (check_ty_roles role_env Representational) args + + check_ty_roles env role (TyVarTy tv) + = case lookupVarEnv env tv of + Just role' -> unless (role' `ltRole` role || role' == role) $ + report_error $ ptext (sLit "type variable") <+> quotes (ppr tv) <+> + ptext (sLit "cannot have role") <+> ppr role <+> + ptext (sLit "because it was assigned role") <+> ppr role' + Nothing -> report_error $ ptext (sLit "type variable") <+> quotes (ppr tv) <+> + ptext (sLit "missing in environment") + + check_ty_roles env Representational (TyConApp tc tys) + = let roles' = tyConRoles tc in + zipWithM_ (maybe_check_ty_roles env) roles' tys + + check_ty_roles env Nominal (TyConApp _ tys) + = mapM_ (check_ty_roles env Nominal) tys + + check_ty_roles _ Phantom ty@(TyConApp {}) + = pprPanic "check_ty_roles" (ppr ty) + + check_ty_roles env role (AppTy ty1 ty2) + = check_ty_roles env role ty1 + >> check_ty_roles env Nominal ty2 + + check_ty_roles env role (FunTy ty1 ty2) + = check_ty_roles env role ty1 + >> check_ty_roles env role ty2 + + check_ty_roles env role (ForAllTy tv ty) + = check_ty_roles (extendVarEnv env tv Nominal) role ty + + check_ty_roles _ _ (LitTy {}) = return () + + maybe_check_ty_roles env role ty + = when (role == Nominal || role == Representational) $ + check_ty_roles env role ty + + report_error doc + = addErrTc $ vcat [ptext (sLit "Internal error in role inference:"), + doc, + ptext (sLit "Please report this as a GHC bug: http://www.haskell.org/ghc/reportabug")] + checkValidClosedCoAxiom :: CoAxiom Branched -> TcM () checkValidClosedCoAxiom (CoAxiom { co_ax_branches = branches, co_ax_tc = tc }) = tcAddClosedTypeFamilyDeclCtxt tc $ @@ -1579,6 +1737,13 @@ checkFamFlag tc_name where err_msg = hang (ptext (sLit "Illegal family declaraion for") <+> quotes (ppr tc_name)) 2 (ptext (sLit "Use -XTypeFamilies to allow indexed type families")) + +checkNoRoles :: LHsTyVarBndrs Name -> TcM () +checkNoRoles (HsQTvs { hsq_tvs = tvs }) + = mapM_ check tvs + where + check (L _ (HsTyVarBndr _ _ Nothing)) = return () + check (L _ (HsTyVarBndr name _ (Just _))) = addErrTc $ illegalRoleAnnot name \end{code} @@ -1960,4 +2125,11 @@ inaccessibleCoAxBranch tc fi = ptext (sLit "Inaccessible family instance equation:") $$ (pprCoAxBranch tc fi) +badRoleAnnot :: Name -> Role -> Role -> SDoc +badRoleAnnot var annot inferred + = hang (ptext (sLit "Role mismatch on variable") <+> ppr var <> colon) + 2 (sep [ ptext (sLit "Annotation says"), ppr annot + , ptext (sLit "but role"), ppr inferred + , ptext (sLit "is required") ]) + \end{code} diff --git a/compiler/typecheck/TcTyDecls.lhs b/compiler/typecheck/TcTyDecls.lhs index fb54899715..bea2cd19be 100644 --- a/compiler/typecheck/TcTyDecls.lhs +++ b/compiler/typecheck/TcTyDecls.lhs @@ -18,7 +18,8 @@ files for imported data types. module TcTyDecls( calcRecFlags, RecTyInfo(..), - calcSynCycles, calcClassCycles + calcSynCycles, calcClassCycles, + RoleAnnots ) where #include "HsVersions.h" @@ -34,15 +35,20 @@ import DataCon import Var import Name import NameEnv +import VarEnv +import VarSet import NameSet +import Coercion ( ltRole ) import Avail import Digraph import BasicTypes import SrcLoc +import Outputable import UniqSet -import Maybes( mapCatMaybes, isJust ) -import Util ( lengthIs, isSingleton ) +import Util +import Maybes import Data.List +import Control.Monad \end{code} @@ -351,13 +357,15 @@ compiled, plus the outer structure of directly-mentioned types. \begin{code} data RecTyInfo = RTI { rti_promotable :: Bool + , rti_roles :: Name -> [Role] , rti_is_rec :: Name -> RecFlag } -calcRecFlags :: ModDetails -> [TyThing] -> RecTyInfo +calcRecFlags :: ModDetails -> RoleAnnots -> [TyThing] -> RecTyInfo -- The 'boot_names' are the things declared in M.hi-boot, if M is the current module. -- Any type constructors in boot_names are automatically considered loop breakers -calcRecFlags boot_details tyclss +calcRecFlags boot_details mrole_env tyclss = RTI { rti_promotable = is_promotable + , rti_roles = roles , rti_is_rec = is_rec } where rec_tycon_names = mkNameSet (map tyConName all_tycons) @@ -367,6 +375,8 @@ calcRecFlags boot_details tyclss is_promotable = all (isPromotableTyCon rec_tycon_names) all_tycons + roles = inferRoles mrole_env all_tycons + ----------------- Recursion calculation ---------------- is_rec n | n `elemNameSet` rec_names = Recursive | otherwise = NonRecursive @@ -518,6 +528,279 @@ isPromotableType rec_tcs con_arg_ty go _ = False \end{code} +%************************************************************************ +%* * + Role inference +%* * +%************************************************************************ + +Note [Role inference] +~~~~~~~~~~~~~~~~~~~~~ +The role inference algorithm uses class, datatype, and synonym definitions +to infer the roles on the parameters. Although these roles are stored in the +tycons, we can perform this algorithm on the built tycons, as long as we +don't peek at an as-yet-unknown roles field! Ah, the magic of laziness. + +First, we choose appropriate initial roles. For families, roles (including +initial roles) are N. For all other types, we start with the role in the +role annotation (if any), or otherwise use Phantom. This is done in +initialRoleEnv1. + +The function irGroup then propagates role information until it reaches a +fixpoint, preferring N over R, P and R over P. To aid in this, we have a monad +RoleM, which is a combination reader and state monad. In its state are the +current RoleEnv, which gets updated by role propagation, and an update bit, +which we use to know whether or not we've reached the fixpoint. The +environment of RoleM contains the tycon whose parameters we are inferring, and +a VarEnv from parameters to their positions, so we can update the RoleEnv. +Between tycons, this reader information is missing; it is added by +addRoleInferenceInfo. + +There are two kinds of tycons to consider: algebraic ones (including classes) +and type synonyms. (Remember, families don't participate -- all their parameters +are N.) An algebraic tycon processes each of its datacons, in turn. Note that +a datacon's universally quantified parameters might be different from the parent +tycon's parameters, so we use the datacon's univ parameters in the mapping from +vars to positions. Note also that we don't want to infer roles for existentials +(they're all at N, too), so we put them in the set of local variables. As an +optimisation, we skip any tycons whose roles are already all Nominal, as there +nowhere else for them to go. For synonyms, we just analyse their right-hand sides. + +irType walks through a type, looking for uses of a variable of interest and +propagating role information. Because anything used under a phantom position +is at phantom and anything used under a nominal position is at nominal, the +irType function can assume that anything it sees is at representational. (The +other possibilities are pruned when they're encountered.) + +The rest of the code is just plumbing. + +How do we know that this algorithm is correct? It should meet the following +specification: + +Let Z be a role context -- a mapping from variables to roles. The following +rules define the property (Z |- t : r), where t is a type and r is a role: + +Z(a) = r' r' <= r +------------------------- RCVar +Z |- a : r + +---------- RCConst +Z |- T : r -- T is a type constructor + +Z |- t1 : r +Z |- t2 : N +-------------- RCApp +Z |- t1 t2 : r + +forall i<=n. (r_i is R or N) implies Z |- t_i : r_i +roles(T) = r_1 .. r_n +---------------------------------------------------- RCDApp +Z |- T t_1 .. t_n : R + +Z, a:N |- t : r +---------------------- RCAll +Z |- forall a:k.t : r + + +We also have the following rules: + +For all datacon_i in type T, where a_1 .. a_n are universally quantified +and b_1 .. b_m are existentially quantified, and the arguments are t_1 .. t_p, +then if forall j<=p, a_1 : r_1 .. a_n : r_n, b_1 : N .. b_m : N |- t_j : R, +then roles(T) = r_1 .. r_n + +roles(->) = R, R +roles(~#) = N, N + +With -dcore-lint on, the output of this algorithm is checked in checkValidRoles, +called from checkValidTycon. + +\begin{code} +type RoleEnv = NameEnv [Role] -- from tycon names to roles +type RoleAnnots = NameEnv [Maybe Role] -- from tycon names to role annotations, + -- which may be left out + +-- This, and any of the functions it calls, must *not* look at the roles +-- field of a tycon we are inferring roles about! +-- See Note [Role inference] +inferRoles :: RoleAnnots -> [TyCon] -> Name -> [Role] +inferRoles annots tycons + = let role_env = initialRoleEnv annots tycons + role_env' = irGroup role_env tycons in + \name -> case lookupNameEnv role_env' name of + Just roles -> roles + Nothing -> pprPanic "inferRoles" (ppr name) + +initialRoleEnv :: RoleAnnots -> [TyCon] -> RoleEnv +initialRoleEnv annots = extendNameEnvList emptyNameEnv . + map (initialRoleEnv1 annots) + +initialRoleEnv1 :: RoleAnnots -> TyCon -> (Name, [Role]) +initialRoleEnv1 annots_env tc + | isFamilyTyCon tc = (name, map (const Nominal) tyvars) + | isAlgTyCon tc + || isSynTyCon tc = (name, default_roles) + | otherwise = pprPanic "initialRoleEnv1" (ppr tc) + where name = tyConName tc + tyvars = tyConTyVars tc + + -- whether are not there are annotations, we're guaranteed that + -- the length of role_annots is appropriate + role_annots = case lookupNameEnv annots_env name of + Just annots -> annots + Nothing -> pprPanic "initialRoleEnv1 annots" (ppr name) + default_roles = let kvs = takeWhile isKindVar tyvars in + map (const Nominal) kvs ++ + zipWith orElse role_annots (repeat Phantom) + +irGroup :: RoleEnv -> [TyCon] -> RoleEnv +irGroup env tcs + = let (env', update) = runRoleM env $ mapM_ irTyCon tcs in + if update + then irGroup env' tcs + else env' + +irTyCon :: TyCon -> RoleM () +irTyCon tc + | isAlgTyCon tc + = do { old_roles <- lookupRoles tc + ; unless (all (== Nominal) old_roles) $ -- also catches data families, + -- which don't want or need role inference + do { whenIsJust (tyConClass_maybe tc) (irClass tc_name) + ; mapM_ (irDataCon tc_name) (visibleDataCons $ algTyConRhs tc) }} + + | Just (SynonymTyCon ty) <- synTyConRhs_maybe tc + = addRoleInferenceInfo tc_name (tyConTyVars tc) $ + irType emptyVarSet ty + + | otherwise + = return () + + where + tc_name = tyConName tc + +-- any type variable used in an associated type must be Nominal +irClass :: Name -> Class -> RoleM () +irClass tc_name cls + = addRoleInferenceInfo tc_name cls_tvs $ + mapM_ ir_at (classATs cls) + where + cls_tvs = classTyVars cls + cls_tv_set = mkVarSet cls_tvs + + ir_at at_tc + = mapM_ (updateRole Nominal) (varSetElems nvars) + where nvars = (mkVarSet $ tyConTyVars at_tc) `intersectVarSet` cls_tv_set + +-- See Note [Role inference] +irDataCon :: Name -> DataCon -> RoleM () +irDataCon tc_name datacon + = addRoleInferenceInfo tc_name (dataConUnivTyVars datacon) $ + let ex_var_set = mkVarSet $ dataConExTyVars datacon in + mapM_ (irType ex_var_set) (dataConRepArgTys datacon) + +irType :: VarSet -> Type -> RoleM () +irType = go + where + go lcls (TyVarTy tv) = unless (tv `elemVarSet` lcls) $ + updateRole Representational tv + go lcls (AppTy t1 t2) = go lcls t1 >> mark_nominal lcls t2 + go lcls (TyConApp tc tys) + = do { roles <- lookupRolesX tc + ; zipWithM_ (go_app lcls) roles tys } + go lcls (FunTy t1 t2) = go lcls t1 >> go lcls t2 + go lcls (ForAllTy tv ty) = go (extendVarSet lcls tv) ty + go _ (LitTy {}) = return () + + go_app _ Phantom _ = return () -- nothing to do here + go_app lcls Nominal ty = mark_nominal lcls ty -- all vars below here are N + go_app lcls Representational ty = go lcls ty + + mark_nominal lcls ty = let nvars = tyVarsOfType ty `minusVarSet` lcls in + mapM_ (updateRole Nominal) (varSetElems nvars) + +-- like lookupRoles, but with Nominal tags at the end for oversaturated TyConApps +lookupRolesX :: TyCon -> RoleM [Role] +lookupRolesX tc + = do { roles <- lookupRoles tc + ; return $ roles ++ repeat Nominal } + +-- gets the roles either from the environment or the tycon +lookupRoles :: TyCon -> RoleM [Role] +lookupRoles tc + = do { env <- getRoleEnv + ; case lookupNameEnv env (tyConName tc) of + Just roles -> return roles + Nothing -> return $ tyConRoles tc } + +-- tries to update a role; won't even update a role "downwards" +updateRole :: Role -> TyVar -> RoleM () +updateRole role tv + = do { var_ns <- getVarNs + ; case lookupVarEnv var_ns tv of + { Nothing -> pprPanic "updateRole" (ppr tv) + ; Just n -> do + { name <- getTyConName + ; updateRoleEnv name n role }}} + +-- the state in the RoleM monad +data RoleInferenceState = RIS { role_env :: RoleEnv + , update :: Bool } + +-- the environment in the RoleM monad +type VarPositions = VarEnv Int +data RoleInferenceInfo = RII { var_ns :: VarPositions + , name :: Name } + +-- See [Role inference] +newtype RoleM a = RM { unRM :: Maybe RoleInferenceInfo + -> RoleInferenceState + -> (a, RoleInferenceState) } +instance Monad RoleM where + return x = RM $ \_ state -> (x, state) + a >>= f = RM $ \m_info state -> let (a', state') = unRM a m_info state in + unRM (f a') m_info state' + +runRoleM :: RoleEnv -> RoleM () -> (RoleEnv, Bool) +runRoleM env thing = (env', update) + where RIS { role_env = env', update = update } = snd $ unRM thing Nothing state + state = RIS { role_env = env, update = False } + +addRoleInferenceInfo :: Name -> [TyVar] -> RoleM a -> RoleM a +addRoleInferenceInfo name tvs thing + = RM $ \_nothing state -> ASSERT( isNothing _nothing ) + unRM thing (Just info) state + where info = RII { var_ns = mkVarEnv (zip tvs [0..]), name = name } + +getRoleEnv :: RoleM RoleEnv +getRoleEnv = RM $ \_ state@(RIS { role_env = env }) -> (env, state) + +getVarNs :: RoleM VarPositions +getVarNs = RM $ \m_info state -> + case m_info of + Nothing -> panic "getVarNs" + Just (RII { var_ns = var_ns }) -> (var_ns, state) + +getTyConName :: RoleM Name +getTyConName = RM $ \m_info state -> + case m_info of + Nothing -> panic "getTyConName" + Just (RII { name = name }) -> (name, state) + + +updateRoleEnv :: Name -> Int -> Role -> RoleM () +updateRoleEnv name n role + = RM $ \_ state@(RIS { role_env = role_env }) -> ((), + case lookupNameEnv role_env name of + Nothing -> pprPanic "updateRoleEnv" (ppr name) + Just roles -> let (before, old_role : after) = splitAt n roles in + if role `ltRole` old_role + then let roles' = before ++ role : after + role_env' = extendNameEnv role_env name roles' in + RIS { role_env = role_env', update = True } + else state ) + +\end{code} %************************************************************************ %* * diff --git a/compiler/typecheck/TcType.lhs b/compiler/typecheck/TcType.lhs index a3d3156d3f..8a8de41159 100644 --- a/compiler/typecheck/TcType.lhs +++ b/compiler/typecheck/TcType.lhs @@ -1330,18 +1330,19 @@ orphNamesOfDFunHead dfun_ty (_, _, head_ty) -> orphNamesOfType head_ty orphNamesOfCo :: Coercion -> NameSet -orphNamesOfCo (Refl ty) = orphNamesOfType ty -orphNamesOfCo (TyConAppCo tc cos) = unitNameSet (getName tc) `unionNameSets` orphNamesOfCos cos +orphNamesOfCo (Refl _ ty) = orphNamesOfType ty +orphNamesOfCo (TyConAppCo _ tc cos) = unitNameSet (getName tc) `unionNameSets` orphNamesOfCos cos orphNamesOfCo (AppCo co1 co2) = orphNamesOfCo co1 `unionNameSets` orphNamesOfCo co2 orphNamesOfCo (ForAllCo _ co) = orphNamesOfCo co orphNamesOfCo (CoVarCo _) = emptyNameSet orphNamesOfCo (AxiomInstCo con _ cos) = orphNamesOfCoCon con `unionNameSets` orphNamesOfCos cos -orphNamesOfCo (UnsafeCo ty1 ty2) = orphNamesOfType ty1 `unionNameSets` orphNamesOfType ty2 +orphNamesOfCo (UnivCo _ ty1 ty2) = orphNamesOfType ty1 `unionNameSets` orphNamesOfType ty2 orphNamesOfCo (SymCo co) = orphNamesOfCo co orphNamesOfCo (TransCo co1 co2) = orphNamesOfCo co1 `unionNameSets` orphNamesOfCo co2 orphNamesOfCo (NthCo _ co) = orphNamesOfCo co orphNamesOfCo (LRCo _ co) = orphNamesOfCo co orphNamesOfCo (InstCo co ty) = orphNamesOfCo co `unionNameSets` orphNamesOfType ty +orphNamesOfCo (SubCo co) = orphNamesOfCo co orphNamesOfCos :: [Coercion] -> NameSet orphNamesOfCos = orphNamesOfThings orphNamesOfCo diff --git a/compiler/types/Class.lhs b/compiler/types/Class.lhs index 312ce84525..7a1251f8ea 100644 --- a/compiler/types/Class.lhs +++ b/compiler/types/Class.lhs @@ -143,15 +143,15 @@ parent class. Thus type F b x a :: * We make F use the same Name for 'a' as C does, and similary 'b'. -The only reason for this is when checking instances it's easier to match +The reason for this is when checking instances it's easier to match them up, to ensure they match. Eg instance C Int [d] where type F [d] x Int = .... we should make sure that the first and third args match the instance header. -This is the reason we use the Name and TyVar from the parent declaration, -in both class and instance decls: just to make this check easier. +Having the same variables for class and tycon is also used in checkValidRoles +(in TcTyClsDecls) when checking a class's roles. %************************************************************************ diff --git a/compiler/types/CoAxiom.lhs b/compiler/types/CoAxiom.lhs index 7781d56356..e507607cd3 100644 --- a/compiler/types/CoAxiom.lhs +++ b/compiler/types/CoAxiom.lhs @@ -21,10 +21,12 @@ module CoAxiom ( toBranchedAxiom, toUnbranchedAxiom, coAxiomName, coAxiomArity, coAxiomBranches, coAxiomTyCon, isImplicitCoAxiom, coAxiomNumPats, - coAxiomNthBranch, coAxiomSingleBranch_maybe, - coAxiomSingleBranch, coAxBranchTyVars, coAxBranchLHS, - coAxBranchRHS, coAxBranchSpan, coAxBranchIncomps, - placeHolderIncomps + coAxiomNthBranch, coAxiomSingleBranch_maybe, coAxiomRole, + coAxiomSingleBranch, coAxBranchTyVars, coAxBranchRoles, + coAxBranchLHS, coAxBranchRHS, coAxBranchSpan, coAxBranchIncomps, + placeHolderIncomps, + + Role(..) ) where import {-# SOURCE #-} TypeRep ( Type ) @@ -34,6 +36,7 @@ import Name import Unique import Var import Util +import Binary import BasicTypes import Data.Typeable ( Typeable ) import SrcLoc @@ -233,6 +236,7 @@ data CoAxiom br = CoAxiom -- Type equality axiom. { co_ax_unique :: Unique -- unique identifier , co_ax_name :: Name -- name for pretty-printing + , co_ax_role :: Role -- role of the axiom's equality , co_ax_tc :: TyCon -- the head of the LHS patterns , co_ax_branches :: BranchList CoAxBranch br -- the branches that form this axiom @@ -248,6 +252,7 @@ data CoAxBranch -- See Note [CoAxiom locations] , cab_tvs :: [TyVar] -- Bound type variables; not necessarily fresh -- See Note [CoAxBranch type variables] + , cab_roles :: [Role] -- See Note [CoAxBranch roles] , cab_lhs :: [Type] -- Type patterns to match against , cab_rhs :: Type -- Right-hand side of the equality , cab_incomps :: [CoAxBranch] -- The previous incompatible branches @@ -256,12 +261,12 @@ data CoAxBranch deriving Typeable toBranchedAxiom :: CoAxiom br -> CoAxiom Branched -toBranchedAxiom (CoAxiom unique name tc branches implicit) - = CoAxiom unique name tc (toBranchedList branches) implicit +toBranchedAxiom (CoAxiom unique name role tc branches implicit) + = CoAxiom unique name role tc (toBranchedList branches) implicit toUnbranchedAxiom :: CoAxiom br -> CoAxiom Unbranched -toUnbranchedAxiom (CoAxiom unique name tc branches implicit) - = CoAxiom unique name tc (toUnbranchedList branches) implicit +toUnbranchedAxiom (CoAxiom unique name role tc branches implicit) + = CoAxiom unique name role tc (toUnbranchedList branches) implicit coAxiomNumPats :: CoAxiom br -> Int coAxiomNumPats = length . coAxBranchLHS . (flip coAxiomNthBranch 0) @@ -277,6 +282,9 @@ coAxiomArity ax index coAxiomName :: CoAxiom br -> Name coAxiomName = co_ax_name +coAxiomRole :: CoAxiom br -> Role +coAxiomRole = co_ax_role + coAxiomBranches :: CoAxiom br -> BranchList CoAxBranch br coAxiomBranches = co_ax_branches @@ -302,6 +310,9 @@ coAxBranchLHS = cab_lhs coAxBranchRHS :: CoAxBranch -> Type coAxBranchRHS = cab_rhs +coAxBranchRoles :: CoAxBranch -> [Role] +coAxBranchRoles = cab_roles + coAxBranchSpan :: CoAxBranch -> SrcSpan coAxBranchSpan = cab_loc @@ -338,6 +349,29 @@ class decl, we use the same 'b' to make the same check easy. So, unlike FamInsts, there is no expectation that the cab_tvs are fresh wrt each other, or any other CoAxBranch. +Note [CoAxBranch roles] +~~~~~~~~~~~~~~~~~~~~~~~ +Consider this code: + + newtype Age = MkAge Int + newtype Wrap a = MkWrap a + + convert :: Wrap Age -> Int + convert (MkWrap (MkAge i)) = i + +We want this to compile to: + + NTCo:Wrap :: forall a. Wrap a ~R a + NTCo:Age :: Age ~R Int + convert = \x -> x |> (NTCo:Wrap[0] NTCo:Age[0]) + +But, note that NTCo:Age is at role R. Thus, we need to be able to pass +coercions at role R into axioms. However, we don't *always* want to be able to +do this, as it would be disastrous with type families. The solution is to +annotate the arguments to the axiom with roles, much like we annotate tycon +tyvars. Where do these roles get set? Newtype axioms inherit their roles from +the newtype tycon; family axioms are all at role N. + Note [CoAxiom locations] ~~~~~~~~~~~~~~~~~~~~~~~~ The source location of a CoAxiom is stored in two places in the @@ -391,3 +425,35 @@ instance Typeable br => Data.Data (CoAxiom br) where dataTypeOf _ = mkNoRepType "CoAxiom" \end{code} +%************************************************************************ +%* * + Roles +%* * +%************************************************************************ + +This is defined here to avoid circular dependencies. + +\begin{code} + +-- See Note [Roles] in Coercion +-- defined here to avoid cyclic dependency with Coercion +data Role = Nominal | Representational | Phantom + deriving (Eq, Data.Data, Data.Typeable) + +instance Outputable Role where + ppr Nominal = char 'N' + ppr Representational = char 'R' + ppr Phantom = char 'P' + +instance Binary Role where + put_ bh Nominal = putByte bh 1 + put_ bh Representational = putByte bh 2 + put_ bh Phantom = putByte bh 3 + + get bh = do tag <- getByte bh + case tag of 1 -> return Nominal + 2 -> return Representational + 3 -> return Phantom + _ -> panic ("get Role " ++ show tag) + +\end{code} \ No newline at end of file diff --git a/compiler/types/Coercion.lhs b/compiler/types/Coercion.lhs index 0c85667e2f..6cda16b9ec 100644 --- a/compiler/types/Coercion.lhs +++ b/compiler/types/Coercion.lhs @@ -18,11 +18,12 @@ module Coercion ( -- * Main data type Coercion(..), Var, CoVar, LeftOrRight(..), pickLR, + Role(..), ltRole, -- ** Functions over coercions - coVarKind, + coVarKind, coVarRole, coercionType, coercionKind, coercionKinds, isReflCo, - isReflCo_maybe, + isReflCo_maybe, coercionRole, mkCoercionType, -- ** Constructing coercions @@ -30,19 +31,19 @@ module Coercion ( mkAxInstCo, mkUnbranchedAxInstCo, mkAxInstLHS, mkAxInstRHS, mkUnbranchedAxInstRHS, mkPiCo, mkPiCos, mkCoCast, - mkSymCo, mkTransCo, mkNthCo, mkLRCo, + mkSymCo, mkTransCo, mkNthCo, mkNthCoRole, mkLRCo, mkInstCo, mkAppCo, mkTyConAppCo, mkFunCo, - mkForAllCo, mkUnsafeCo, - mkNewTypeCo, + mkForAllCo, mkUnsafeCo, mkUnivCo, mkSubCo, mkPhantomCo, + mkNewTypeCo, maybeSubCo, maybeSubCo2, -- ** Decomposition splitNewTypeRepCo_maybe, instNewTyCon_maybe, topNormaliseNewType, topNormaliseNewTypeX, decomposeCo, getCoVar_maybe, - splitTyConAppCo_maybe, splitAppCo_maybe, splitForAllCo_maybe, + nthRole, tyConRolesX, -- ** Coercion variables mkCoVar, isCoVar, isCoVarType, coVarName, setCoVarName, setCoVarUnique, @@ -57,7 +58,8 @@ module Coercion ( substCo, substCos, substCoVar, substCoVars, substCoWithTy, substCoWithTys, cvTvSubst, tvCvSubst, mkCvSubst, zipOpenCvSubst, - substTy, extendTvSubst, extendCvSubstAndInScope, + substTy, extendTvSubst, + extendCvSubstAndInScope, extendTvSubstAndInScope, substTyVarBndr, substCoVarBndr, -- ** Lifting @@ -101,10 +103,9 @@ import Outputable import Unique import Pair import SrcLoc -import PrelNames ( funTyConKey, eqPrimTyConKey ) +import PrelNames ( funTyConKey, eqPrimTyConKey, eqReprPrimTyConKey ) import Control.Applicative import Data.Traversable (traverse, sequenceA) -import Control.Arrow (second) import FastString import qualified Data.Data as Data hiding ( TyCon ) @@ -123,8 +124,16 @@ import qualified Data.Data as Data hiding ( TyCon ) -- If you edit this type, you may need to update the GHC formalism -- See Note [GHC Formalism] in coreSyn/CoreLint.lhs data Coercion + -- Each constructor has a "role signature", indicating the way roles are + -- propagated through coercions. P, N, and R stand for coercions of the + -- given role. e stands for a coercion of a specific unknown role (think + -- "role polymorphism"). "e" stands for an explicit role parameter + -- indicating role e. _ stands for a parameter that is not a Role or + -- Coercion. + -- These ones mirror the shape of types - = Refl Type -- See Note [Refl invariant] + = -- Refl :: "e" -> _ -> e + Refl Role Type -- See Note [Refl invariant] -- Invariant: applications of (Refl T) to a bunch of identity coercions -- always show up as Refl. -- For example (Refl T) (Refl a) (Refl b) shows up as (Refl (T a b)). @@ -135,20 +144,30 @@ data Coercion -- ConAppCo coercions (like all coercions other than Refl) -- are NEVER the identity. + -- Use (Refl Representational _), not (SubCo (Refl Nominal _)) + -- These ones simply lift the correspondingly-named -- Type constructors into Coercions - | TyConAppCo TyCon [Coercion] -- lift TyConApp + + -- TyConAppCo :: "e" -> _ -> ?? -> e + -- See Note [TyConAppCo roles] + | TyConAppCo Role TyCon [Coercion] -- lift TyConApp -- The TyCon is never a synonym; -- we expand synonyms eagerly -- But it can be a type function | AppCo Coercion Coercion -- lift AppTy + -- AppCo :: e -> N -> e -- See Note [Forall coercions] | ForAllCo TyVar Coercion -- forall a. g + -- :: _ -> e -> e -- These are special - | CoVarCo CoVar + | CoVarCo CoVar -- :: _ -> (N or R) + -- result role depends on the tycon of the variable's type + + -- AxiomInstCo :: e -> _ -> [N] -> e | AxiomInstCo (CoAxiom Branched) BranchIndex [Coercion] -- See also [CoAxiom index] -- The coercion arguments always *precisely* saturate @@ -156,14 +175,22 @@ data Coercion -- any left over, we use AppCo. See -- See [Coercion axioms applied to coercions] - | UnsafeCo Type Type - | SymCo Coercion - | TransCo Coercion Coercion + -- see Note [UnivCo] + | UnivCo Role Type Type -- :: "e" -> _ -> _ -> e + | SymCo Coercion -- :: e -> e + | TransCo Coercion Coercion -- :: e -> e -> e -- These are destructors + | NthCo Int Coercion -- Zero-indexed; decomposes (T t0 ... tn) + -- :: _ -> e -> ?? (inverse of TyConAppCo, see Note [TyConAppCo roles]) | LRCo LeftOrRight Coercion -- Decomposes (t_left t_right) + -- :: _ -> N -> N | InstCo Coercion Type + -- :: e -> _ -> e + + | SubCo Coercion -- Turns a ~N into a ~R + -- :: N -> R deriving (Data.Data, Data.Typeable) -- If you edit this type, you may need to update the GHC formalism @@ -185,7 +212,6 @@ pickLR CLeft (l,_) = l pickLR CRight (_,r) = r \end{code} - Note [Refl invariant] ~~~~~~~~~~~~~~~~~~~~~ Coercions have the following invariant @@ -323,6 +349,142 @@ may turn into C (Nth 0 g) .... Now (Nth 0 g) will optimise to Refl, but perhaps not instantly. +Note [Roles] +~~~~~~~~~~~~ +Roles are a solution to the GeneralizedNewtypeDeriving problem, articulated +in Trac #1496. The full story is in docs/core-spec/core-spec.pdf. Also, see +http://ghc.haskell.org/trac/ghc/wiki/RolesImplementation + +Here is one way to phrase the problem: + +Given: +newtype Age = MkAge Int +type family F x +type instance F Age = Bool +type instance F Int = Char + +This compiles down to: +axAge :: Age ~ Int +axF1 :: F Age ~ Bool +axF2 :: F Int ~ Char + +Then, we can make: +(sym (axF1) ; F axAge ; axF2) :: Bool ~ Char + +Yikes! + +The solution is _roles_, as articulated in "Generative Type Abstraction and +Type-level Computation" (POPL 2010), available at +http://www.seas.upenn.edu/~sweirich/papers/popl163af-weirich.pdf + +The specification for roles has evolved somewhat since that paper. For the +current full details, see the documentation in docs/core-spec. Here are some +highlights. + +We label every equality with a notion of type equivalence, of which there are +three options: Nominal, Representational, and Phantom. A ground type is +nominally equivalent only with itself. A newtype (which is considered a ground +type in Haskell) is representationally equivalent to its representation. +Anything is "phantomly" equivalent to anything else. We use "N", "R", and "P" +to denote the equivalences. + +The axioms above would be: +axAge :: Age ~R Int +axF1 :: F Age ~N Bool +axF2 :: F Age ~N Char + +Then, because transitivity applies only to coercions proving the same notion +of equivalence, the above construction is impossible. + +However, there is still an escape hatch: we know that any two types that are +nominally equivalent are representationally equivalent as well. This is what +the form SubCo proves -- it "demotes" a nominal equivalence into a +representational equivalence. So, it would seem the following is possible: + +sub (sym axF1) ; F axAge ; sub axF2 :: Bool ~R Char -- WRONG + +What saves us here is that the arguments to a type function F, lifted into a +coercion, *must* prove nominal equivalence. So, (F axAge) is ill-formed, and +we are safe. + +Roles are attached to parameters to TyCons. When lifting a TyCon into a +coercion (through TyConAppCo), we need to ensure that the arguments to the +TyCon respect their roles. For example: + +data T a b = MkT a (F b) + +If we know that a1 ~R a2, then we know (T a1 b) ~R (T a2 b). But, if we know +that b1 ~R b2, we know nothing about (T a b1) and (T a b2)! This is because +the type function F branches on b's *name*, not representation. So, we say +that 'a' has role Representational and 'b' has role Nominal. The third role, +Phantom, is for parameters not used in the type's definition. Given the +following definition + +data Q a = MkQ Int + +the Phantom role allows us to say that (Q Bool) ~R (Q Char), because we +can construct the coercion Bool ~P Char (using UnivCo). + +See the paper cited above for more examples and information. + +Note [UnivCo] +~~~~~~~~~~~~~ +The UnivCo ("universal coercion") serves two rather separate functions: + - the implementation for unsafeCoerce# + - placeholder for phantom parameters in a TyConAppCo + +At Representational, it asserts that two (possibly unrelated) +types have the same representation and can be casted to one another. +This form is necessary for unsafeCoerce#. + +For optimisation purposes, it is convenient to allow UnivCo to appear +at Nominal role. If we have + +data Foo a = MkFoo (F a) -- F is a type family + +and we want an unsafe coercion from Foo Int to Foo Bool, then it would +be nice to have (TyConAppCo Foo (UnivCo Nominal Int Bool)). So, we allow +Nominal UnivCo's. + +At Phantom role, it is used as an argument to TyConAppCo in the place +of a phantom parameter (a type parameter unused in the type definition). + +For example: + +data Q a = MkQ Int + +We want a coercion for (Q Bool) ~R (Q Char). + +(TyConAppCo Representational Q [UnivCo Phantom Bool Char]) does the trick. + +Note [TyConAppCo roles] +~~~~~~~~~~~~~~~~~~~~~~~ +The TyConAppCo constructor has a role parameter, indicating the role at +which the coercion proves equality. The choice of this parameter affects +the required roles of the arguments of the TyConAppCo. To help explain +it, assume the following definition: + +newtype Age = MkAge Int + +Nominal: All arguments must have role Nominal. Why? So that Foo Age ~N Foo Int +does *not* hold. + +Representational: All arguments must have the roles corresponding to the +result of tyConRoles on the TyCon. This is the whole point of having +roles on the TyCon to begin with. So, we can have Foo Age ~R Foo Int, +if Foo's parameter has role R. + +If a Representational TyConAppCo is over-saturated (which is otherwise fine), +the spill-over arguments must all be at Nominal. This corresponds to the +behavior for AppCo. + +Phantom: All arguments must have role Phantom. This one isn't strictly +necessary for soundness, but this choice removes ambiguity. + + + +The rules here also dictate what the parameters to mkTyConAppCo. + %************************************************************************ %* * \subsection{Coercion variables} @@ -345,7 +507,8 @@ isCoVar v = isCoVarType (varType v) isCoVarType :: Type -> Bool isCoVarType ty -- Tests for t1 ~# t2, the unboxed equality = case splitTyConApp_maybe ty of - Just (tc,tys) -> tc `hasKey` eqPrimTyConKey && tys `lengthAtLeast` 2 + Just (tc,tys) -> (tc `hasKey` eqPrimTyConKey || tc `hasKey` eqReprPrimTyConKey) + && tys `lengthAtLeast` 2 Nothing -> False \end{code} @@ -353,53 +516,56 @@ isCoVarType ty -- Tests for t1 ~# t2, the unboxed equality \begin{code} tyCoVarsOfCo :: Coercion -> VarSet -- Extracts type and coercion variables from a coercion -tyCoVarsOfCo (Refl ty) = tyVarsOfType ty -tyCoVarsOfCo (TyConAppCo _ cos) = tyCoVarsOfCos cos -tyCoVarsOfCo (AppCo co1 co2) = tyCoVarsOfCo co1 `unionVarSet` tyCoVarsOfCo co2 -tyCoVarsOfCo (ForAllCo tv co) = tyCoVarsOfCo co `delVarSet` tv -tyCoVarsOfCo (CoVarCo v) = unitVarSet v +tyCoVarsOfCo (Refl _ ty) = tyVarsOfType ty +tyCoVarsOfCo (TyConAppCo _ _ cos) = tyCoVarsOfCos cos +tyCoVarsOfCo (AppCo co1 co2) = tyCoVarsOfCo co1 `unionVarSet` tyCoVarsOfCo co2 +tyCoVarsOfCo (ForAllCo tv co) = tyCoVarsOfCo co `delVarSet` tv +tyCoVarsOfCo (CoVarCo v) = unitVarSet v tyCoVarsOfCo (AxiomInstCo _ _ cos) = tyCoVarsOfCos cos -tyCoVarsOfCo (UnsafeCo ty1 ty2) = tyVarsOfType ty1 `unionVarSet` tyVarsOfType ty2 -tyCoVarsOfCo (SymCo co) = tyCoVarsOfCo co -tyCoVarsOfCo (TransCo co1 co2) = tyCoVarsOfCo co1 `unionVarSet` tyCoVarsOfCo co2 -tyCoVarsOfCo (NthCo _ co) = tyCoVarsOfCo co -tyCoVarsOfCo (LRCo _ co) = tyCoVarsOfCo co -tyCoVarsOfCo (InstCo co ty) = tyCoVarsOfCo co `unionVarSet` tyVarsOfType ty +tyCoVarsOfCo (UnivCo _ ty1 ty2) = tyVarsOfType ty1 `unionVarSet` tyVarsOfType ty2 +tyCoVarsOfCo (SymCo co) = tyCoVarsOfCo co +tyCoVarsOfCo (TransCo co1 co2) = tyCoVarsOfCo co1 `unionVarSet` tyCoVarsOfCo co2 +tyCoVarsOfCo (NthCo _ co) = tyCoVarsOfCo co +tyCoVarsOfCo (LRCo _ co) = tyCoVarsOfCo co +tyCoVarsOfCo (InstCo co ty) = tyCoVarsOfCo co `unionVarSet` tyVarsOfType ty +tyCoVarsOfCo (SubCo co) = tyCoVarsOfCo co tyCoVarsOfCos :: [Coercion] -> VarSet tyCoVarsOfCos cos = foldr (unionVarSet . tyCoVarsOfCo) emptyVarSet cos coVarsOfCo :: Coercion -> VarSet -- Extract *coerction* variables only. Tiresome to repeat the code, but easy. -coVarsOfCo (Refl _) = emptyVarSet -coVarsOfCo (TyConAppCo _ cos) = coVarsOfCos cos -coVarsOfCo (AppCo co1 co2) = coVarsOfCo co1 `unionVarSet` coVarsOfCo co2 -coVarsOfCo (ForAllCo _ co) = coVarsOfCo co -coVarsOfCo (CoVarCo v) = unitVarSet v +coVarsOfCo (Refl _ _) = emptyVarSet +coVarsOfCo (TyConAppCo _ _ cos) = coVarsOfCos cos +coVarsOfCo (AppCo co1 co2) = coVarsOfCo co1 `unionVarSet` coVarsOfCo co2 +coVarsOfCo (ForAllCo _ co) = coVarsOfCo co +coVarsOfCo (CoVarCo v) = unitVarSet v coVarsOfCo (AxiomInstCo _ _ cos) = coVarsOfCos cos -coVarsOfCo (UnsafeCo _ _) = emptyVarSet -coVarsOfCo (SymCo co) = coVarsOfCo co -coVarsOfCo (TransCo co1 co2) = coVarsOfCo co1 `unionVarSet` coVarsOfCo co2 -coVarsOfCo (NthCo _ co) = coVarsOfCo co -coVarsOfCo (LRCo _ co) = coVarsOfCo co -coVarsOfCo (InstCo co _) = coVarsOfCo co +coVarsOfCo (UnivCo _ _ _) = emptyVarSet +coVarsOfCo (SymCo co) = coVarsOfCo co +coVarsOfCo (TransCo co1 co2) = coVarsOfCo co1 `unionVarSet` coVarsOfCo co2 +coVarsOfCo (NthCo _ co) = coVarsOfCo co +coVarsOfCo (LRCo _ co) = coVarsOfCo co +coVarsOfCo (InstCo co _) = coVarsOfCo co +coVarsOfCo (SubCo co) = coVarsOfCo co coVarsOfCos :: [Coercion] -> VarSet coVarsOfCos cos = foldr (unionVarSet . coVarsOfCo) emptyVarSet cos coercionSize :: Coercion -> Int -coercionSize (Refl ty) = typeSize ty -coercionSize (TyConAppCo _ cos) = 1 + sum (map coercionSize cos) -coercionSize (AppCo co1 co2) = coercionSize co1 + coercionSize co2 -coercionSize (ForAllCo _ co) = 1 + coercionSize co -coercionSize (CoVarCo _) = 1 +coercionSize (Refl _ ty) = typeSize ty +coercionSize (TyConAppCo _ _ cos) = 1 + sum (map coercionSize cos) +coercionSize (AppCo co1 co2) = coercionSize co1 + coercionSize co2 +coercionSize (ForAllCo _ co) = 1 + coercionSize co +coercionSize (CoVarCo _) = 1 coercionSize (AxiomInstCo _ _ cos) = 1 + sum (map coercionSize cos) -coercionSize (UnsafeCo ty1 ty2) = typeSize ty1 + typeSize ty2 -coercionSize (SymCo co) = 1 + coercionSize co -coercionSize (TransCo co1 co2) = 1 + coercionSize co1 + coercionSize co2 -coercionSize (NthCo _ co) = 1 + coercionSize co -coercionSize (LRCo _ co) = 1 + coercionSize co -coercionSize (InstCo co ty) = 1 + coercionSize co + typeSize ty +coercionSize (UnivCo _ ty1 ty2) = typeSize ty1 + typeSize ty2 +coercionSize (SymCo co) = 1 + coercionSize co +coercionSize (TransCo co1 co2) = 1 + coercionSize co1 + coercionSize co2 +coercionSize (NthCo _ co) = 1 + coercionSize co +coercionSize (LRCo _ co) = 1 + coercionSize co +coercionSize (InstCo co ty) = 1 + coercionSize co + typeSize ty +coercionSize (SubCo co) = 1 + coercionSize co \end{code} %************************************************************************ @@ -413,24 +579,25 @@ tidyCo :: TidyEnv -> Coercion -> Coercion tidyCo env@(_, subst) co = go co where - go (Refl ty) = Refl (tidyType env ty) - go (TyConAppCo tc cos) = let args = map go cos - in args `seqList` TyConAppCo tc args - go (AppCo co1 co2) = (AppCo $! go co1) $! go co2 - go (ForAllCo tv co) = ForAllCo tvp $! (tidyCo envp co) - where - (envp, tvp) = tidyTyVarBndr env tv - go (CoVarCo cv) = case lookupVarEnv subst cv of - Nothing -> CoVarCo cv - Just cv' -> CoVarCo cv' + go (Refl r ty) = Refl r (tidyType env ty) + go (TyConAppCo r tc cos) = let args = map go cos + in args `seqList` TyConAppCo r tc args + go (AppCo co1 co2) = (AppCo $! go co1) $! go co2 + go (ForAllCo tv co) = ForAllCo tvp $! (tidyCo envp co) + where + (envp, tvp) = tidyTyVarBndr env tv + go (CoVarCo cv) = case lookupVarEnv subst cv of + Nothing -> CoVarCo cv + Just cv' -> CoVarCo cv' go (AxiomInstCo con ind cos) = let args = tidyCos env cos - in args `seqList` AxiomInstCo con ind args - go (UnsafeCo ty1 ty2) = (UnsafeCo $! tidyType env ty1) $! tidyType env ty2 - go (SymCo co) = SymCo $! go co - go (TransCo co1 co2) = (TransCo $! go co1) $! go co2 - go (NthCo d co) = NthCo d $! go co - go (LRCo lr co) = LRCo lr $! go co - go (InstCo co ty) = (InstCo $! go co) $! tidyType env ty + in args `seqList` AxiomInstCo con ind args + go (UnivCo r ty1 ty2) = (UnivCo r $! tidyType env ty1) $! tidyType env ty2 + go (SymCo co) = SymCo $! go co + go (TransCo co1 co2) = (TransCo $! go co1) $! go co2 + go (NthCo d co) = NthCo d $! go co + go (LRCo lr co) = LRCo lr $! go co + go (InstCo co ty) = (InstCo $! go co) $! tidyType env ty + go (SubCo co) = SubCo $! go co tidyCos :: TidyEnv -> [Coercion] -> [Coercion] tidyCos env = map (tidyCo env) @@ -457,16 +624,16 @@ pprCo co = ppr_co TopPrec co pprParendCo co = ppr_co TyConPrec co ppr_co :: Prec -> Coercion -> SDoc -ppr_co _ (Refl ty) = angleBrackets (ppr ty) +ppr_co _ (Refl r ty) = angleBrackets (ppr ty) <> ppr_role r -ppr_co p co@(TyConAppCo tc [_,_]) +ppr_co p co@(TyConAppCo _ tc [_,_]) | tc `hasKey` funTyConKey = ppr_fun_co p co -ppr_co p (TyConAppCo tc cos) = pprTcApp p ppr_co tc cos -ppr_co p (AppCo co1 co2) = maybeParen p TyConPrec $ - pprCo co1 <+> ppr_co TyConPrec co2 -ppr_co p co@(ForAllCo {}) = ppr_forall_co p co -ppr_co _ (CoVarCo cv) = parenSymOcc (getOccName cv) (ppr cv) +ppr_co _ (TyConAppCo r tc cos) = pprTcApp TyConPrec ppr_co tc cos <> ppr_role r +ppr_co p (AppCo co1 co2) = maybeParen p TyConPrec $ + pprCo co1 <+> ppr_co TyConPrec co2 +ppr_co p co@(ForAllCo {}) = ppr_forall_co p co +ppr_co _ (CoVarCo cv) = parenSymOcc (getOccName cv) (ppr cv) ppr_co p (AxiomInstCo con index cos) = pprPrefixApp p (ppr (getName con) <> brackets (ppr index)) (map (ppr_co TyConPrec) cos) @@ -479,11 +646,15 @@ ppr_co p co@(TransCo {}) = maybeParen p FunPrec $ ppr_co p (InstCo co ty) = maybeParen p TyConPrec $ pprParendCo co <> ptext (sLit "@") <> pprType ty -ppr_co p (UnsafeCo ty1 ty2) = pprPrefixApp p (ptext (sLit "UnsafeCo")) +ppr_co p (UnivCo r ty1 ty2) = pprPrefixApp p (ptext (sLit "UnivCo") <+> ppr r) [pprParendType ty1, pprParendType ty2] ppr_co p (SymCo co) = pprPrefixApp p (ptext (sLit "Sym")) [pprParendCo co] ppr_co p (NthCo n co) = pprPrefixApp p (ptext (sLit "Nth:") <> int n) [pprParendCo co] ppr_co p (LRCo sel co) = pprPrefixApp p (ppr sel) [pprParendCo co] +ppr_co p (SubCo co) = pprPrefixApp p (ptext (sLit "Sub")) [pprParendCo co] + +ppr_role :: Role -> SDoc +ppr_role r = underscore <> ppr r trans_co_list :: Coercion -> [Coercion] -> [Coercion] trans_co_list (TransCo co1 co2) cos = trans_co_list co1 (trans_co_list co2 cos) @@ -497,7 +668,7 @@ ppr_fun_co :: Prec -> Coercion -> SDoc ppr_fun_co p co = pprArrowChain p (split co) where split :: Coercion -> [SDoc] - split (TyConAppCo f [arg,res]) + split (TyConAppCo _ f [arg,res]) | f `hasKey` funTyConKey = ppr_co FunPrec arg : split res split co = [ppr_co TopPrec co] @@ -561,25 +732,20 @@ getCoVar_maybe :: Coercion -> Maybe CoVar getCoVar_maybe (CoVarCo cv) = Just cv getCoVar_maybe _ = Nothing --- | Attempts to tease a coercion apart into a type constructor and the application --- of a number of coercion arguments to that constructor -splitTyConAppCo_maybe :: Coercion -> Maybe (TyCon, [Coercion]) -splitTyConAppCo_maybe (Refl ty) = (fmap . second . map) Refl (splitTyConApp_maybe ty) -splitTyConAppCo_maybe (TyConAppCo tc cos) = Just (tc, cos) -splitTyConAppCo_maybe _ = Nothing - +-- first result has role equal to input; second result is Nominal splitAppCo_maybe :: Coercion -> Maybe (Coercion, Coercion) -- ^ Attempt to take a coercion application apart. splitAppCo_maybe (AppCo co1 co2) = Just (co1, co2) -splitAppCo_maybe (TyConAppCo tc cos) +splitAppCo_maybe (TyConAppCo r tc cos) | isDecomposableTyCon tc || cos `lengthExceeds` tyConArity tc , Just (cos', co') <- snocView cos - = Just (mkTyConAppCo tc cos', co') -- Never create unsaturated type family apps! + , Just co'' <- unSubCo_maybe co' + = Just (mkTyConAppCo r tc cos', co'') -- Never create unsaturated type family apps! -- Use mkTyConAppCo to preserve the invariant -- that identity coercions are always represented by Refl -splitAppCo_maybe (Refl ty) +splitAppCo_maybe (Refl r ty) | Just (ty1, ty2) <- splitAppTy_maybe ty - = Just (Refl ty1, Refl ty2) + = Just (Refl r ty1, Refl Nominal ty2) splitAppCo_maybe _ = Nothing splitForAllCo_maybe :: Coercion -> Maybe (TyVar, Coercion) @@ -592,22 +758,38 @@ splitForAllCo_maybe _ = Nothing coVarKind :: CoVar -> (Type,Type) coVarKind cv | Just (tc, [_kind,ty1,ty2]) <- splitTyConApp_maybe (varType cv) - = ASSERT(tc `hasKey` eqPrimTyConKey) + = ASSERT(tc `hasKey` eqPrimTyConKey || tc `hasKey` eqReprPrimTyConKey) (ty1,ty2) | otherwise = panic "coVarKind, non coercion variable" +coVarRole :: CoVar -> Role +coVarRole cv + | tc `hasKey` eqPrimTyConKey + = Nominal + | tc `hasKey` eqReprPrimTyConKey + = Representational + | otherwise + = pprPanic "coVarRole: unknown tycon" (ppr cv) + + where + tc = case tyConAppTyCon_maybe (varType cv) of + Just tc0 -> tc0 + Nothing -> pprPanic "coVarRole: not tyconapp" (ppr cv) + -- | Makes a coercion type from two types: the types whose equality -- is proven by the relevant 'Coercion' -mkCoercionType :: Type -> Type -> Type -mkCoercionType = mkPrimEqPred +mkCoercionType :: Role -> Type -> Type -> Type +mkCoercionType Nominal = mkPrimEqPred +mkCoercionType Representational = mkReprPrimEqPred +mkCoercionType Phantom = panic "mkCoercionType" isReflCo :: Coercion -> Bool -isReflCo (Refl {}) = True -isReflCo _ = False +isReflCo (Refl {}) = True +isReflCo _ = False isReflCo_maybe :: Coercion -> Maybe Type -isReflCo_maybe (Refl ty) = Just ty -isReflCo_maybe _ = Nothing +isReflCo_maybe (Refl _ ty) = Just ty +isReflCo_maybe _ = Nothing \end{code} %************************************************************************ @@ -620,32 +802,36 @@ isReflCo_maybe _ = Nothing mkCoVarCo :: CoVar -> Coercion -- cv :: s ~# t mkCoVarCo cv - | ty1 `eqType` ty2 = Refl ty1 + | ty1 `eqType` ty2 = Refl Nominal ty1 | otherwise = CoVarCo cv where (ty1, ty2) = ASSERT( isCoVar cv ) coVarKind cv -mkReflCo :: Type -> Coercion +mkReflCo :: Role -> Type -> Coercion mkReflCo = Refl -mkAxInstCo :: CoAxiom br -> BranchIndex -> [Type] -> Coercion +mkAxInstCo :: Role -> CoAxiom br -> BranchIndex -> [Type] -> Coercion -- mkAxInstCo can legitimately be called over-staturated; -- i.e. with more type arguments than the coercion requires -mkAxInstCo ax index tys - | arity == n_tys = AxiomInstCo ax_br index rtys +mkAxInstCo role ax index tys + | arity == n_tys = maybeSubCo2 role ax_role $ AxiomInstCo ax_br index rtys | otherwise = ASSERT( arity < n_tys ) + maybeSubCo2 role ax_role $ foldl AppCo (AxiomInstCo ax_br index (take arity rtys)) (drop arity rtys) where - n_tys = length tys - arity = coAxiomArity ax index - rtys = map Refl tys - ax_br = toBranchedAxiom ax + n_tys = length tys + ax_br = toBranchedAxiom ax + branch = coAxiomNthBranch ax_br index + arity = length $ coAxBranchTyVars branch + arg_roles = coAxBranchRoles branch + rtys = zipWith mkReflCo (arg_roles ++ repeat Nominal) tys + ax_role = coAxiomRole ax -- to be used only with unbranched axioms -mkUnbranchedAxInstCo :: CoAxiom Unbranched -> [Type] -> Coercion -mkUnbranchedAxInstCo ax tys - = mkAxInstCo ax 0 tys +mkUnbranchedAxInstCo :: Role -> CoAxiom Unbranched -> [Type] -> Coercion +mkUnbranchedAxInstCo role ax tys + = mkAxInstCo role ax 0 tys mkAxInstLHS, mkAxInstRHS :: CoAxiom br -> BranchIndex -> [Type] -> Type -- Instantiate the axiom with specified types, @@ -668,41 +854,57 @@ mkUnbranchedAxInstRHS :: CoAxiom Unbranched -> [Type] -> Type mkUnbranchedAxInstRHS ax = mkAxInstRHS ax 0 -- | Apply a 'Coercion' to another 'Coercion'. +-- The second coercion must be Nominal, unless the first is Phantom. +-- If the first is Phantom, then the second can be either Phantom or Nominal. mkAppCo :: Coercion -> Coercion -> Coercion -mkAppCo (Refl ty1) (Refl ty2) = Refl (mkAppTy ty1 ty2) -mkAppCo (Refl (TyConApp tc tys)) co = TyConAppCo tc (map Refl tys ++ [co]) -mkAppCo (TyConAppCo tc cos) co = TyConAppCo tc (cos ++ [co]) -mkAppCo co1 co2 = AppCo co1 co2 +mkAppCo (Refl r ty1) (Refl _ ty2) + = Refl r (mkAppTy ty1 ty2) +mkAppCo (Refl r (TyConApp tc tys)) co2 + = TyConAppCo r tc (zip_roles (tyConRolesX r tc) tys) + where + zip_roles (r1:_) [] = [applyRole r1 co2] + zip_roles (r1:rs) (ty1:tys) = mkReflCo r1 ty1 : zip_roles rs tys + zip_roles _ _ = panic "zip_roles" -- but the roles are infinite... +mkAppCo (TyConAppCo r tc cos) co + = case r of + Nominal -> TyConAppCo Nominal tc (cos ++ [co]) + Representational -> TyConAppCo Representational tc (cos ++ [co']) + where new_role = (tyConRolesX Representational tc) !! (length cos) + co' = applyRole new_role co + Phantom -> TyConAppCo Phantom tc (cos ++ [mkPhantomCo co]) + +mkAppCo co1 co2 = AppCo co1 co2 -- Note, mkAppCo is careful to maintain invariants regarding -- where Refl constructors appear; see the comments in the definition -- of Coercion and the Note [Refl invariant] in types/TypeRep.lhs. -- | Applies multiple 'Coercion's to another 'Coercion', from left to right. --- See also 'mkAppCo' +-- See also 'mkAppCo'. mkAppCos :: Coercion -> [Coercion] -> Coercion -mkAppCos co1 tys = foldl mkAppCo co1 tys +mkAppCos co1 cos = foldl mkAppCo co1 cos --- | Apply a type constructor to a list of coercions. -mkTyConAppCo :: TyCon -> [Coercion] -> Coercion -mkTyConAppCo tc cos +-- | Apply a type constructor to a list of coercions. It is the +-- caller's responsibility to get the roles correct on argument coercions. +mkTyConAppCo :: Role -> TyCon -> [Coercion] -> Coercion +mkTyConAppCo r tc cos -- Expand type synonyms | Just (tv_co_prs, rhs_ty, leftover_cos) <- tcExpandTyCon_maybe tc cos - = mkAppCos (liftCoSubst tv_co_prs rhs_ty) leftover_cos + = mkAppCos (liftCoSubst r tv_co_prs rhs_ty) leftover_cos | Just tys <- traverse isReflCo_maybe cos - = Refl (mkTyConApp tc tys) -- See Note [Refl invariant] + = Refl r (mkTyConApp tc tys) -- See Note [Refl invariant] - | otherwise = TyConAppCo tc cos + | otherwise = TyConAppCo r tc cos -- | Make a function 'Coercion' between two other 'Coercion's -mkFunCo :: Coercion -> Coercion -> Coercion -mkFunCo co1 co2 = mkTyConAppCo funTyCon [co1, co2] +mkFunCo :: Role -> Coercion -> Coercion -> Coercion +mkFunCo r co1 co2 = mkTyConAppCo r funTyCon [co1, co2] -- | Make a 'Coercion' which binds a variable within an inner 'Coercion' mkForAllCo :: Var -> Coercion -> Coercion -- note that a TyVar should be used here, not a CoVar (nor a TcTyVar) -mkForAllCo tv (Refl ty) = ASSERT( isTyVar tv ) Refl (mkForAllTy tv ty) -mkForAllCo tv co = ASSERT( isTyVar tv ) ForAllCo tv co +mkForAllCo tv (Refl r ty) = ASSERT( isTyVar tv ) Refl r (mkForAllTy tv ty) +mkForAllCo tv co = ASSERT( isTyVar tv ) ForAllCo tv co ------------------------------- @@ -713,28 +915,40 @@ mkSymCo :: Coercion -> Coercion -- Do a few simple optimizations, but don't bother pushing occurrences -- of symmetry to the leaves; the optimizer will take care of that. -mkSymCo co@(Refl {}) = co -mkSymCo (UnsafeCo ty1 ty2) = UnsafeCo ty2 ty1 +mkSymCo co@(Refl {}) = co +mkSymCo (UnivCo r ty1 ty2) = UnivCo r ty2 ty1 mkSymCo (SymCo co) = co mkSymCo co = SymCo co -- | Create a new 'Coercion' by composing the two given 'Coercion's transitively. mkTransCo :: Coercion -> Coercion -> Coercion -mkTransCo (Refl _) co = co -mkTransCo co (Refl _) = co -mkTransCo co1 co2 = TransCo co1 co2 +mkTransCo (Refl {}) co = co +mkTransCo co (Refl {}) = co +mkTransCo co1 co2 = TransCo co1 co2 + +-- the Role is the desired one. It is the caller's responsibility to make +-- sure this request is reasonable +mkNthCoRole :: Role -> Int -> Coercion -> Coercion +mkNthCoRole role n co + = maybeSubCo2 role nth_role $ nth_co + where + nth_co = mkNthCo n co + nth_role = coercionRole nth_co mkNthCo :: Int -> Coercion -> Coercion -mkNthCo n (Refl ty) = ASSERT( ok_tc_app ty n ) - Refl (tyConAppArgN n ty) +mkNthCo n (Refl r ty) = ASSERT( ok_tc_app ty n ) + Refl r' (tyConAppArgN n ty) + where tc = tyConAppTyCon ty + r' = nthRole r tc n mkNthCo n co = ASSERT( ok_tc_app _ty1 n && ok_tc_app _ty2 n ) NthCo n co where Pair _ty1 _ty2 = coercionKind co + mkLRCo :: LeftOrRight -> Coercion -> Coercion -mkLRCo lr (Refl ty) = Refl (pickLR lr (splitAppTy ty)) -mkLRCo lr co = LRCo lr co +mkLRCo lr (Refl eq ty) = Refl eq (pickLR lr (splitAppTy ty)) +mkLRCo lr co = LRCo lr co ok_tc_app :: Type -> Int -> Bool ok_tc_app ty n = case splitTyConApp_maybe ty of @@ -751,15 +965,99 @@ mkInstCo co ty = InstCo co ty -- to implement the @unsafeCoerce#@ primitive. Optimise by pushing -- down through type constructors. mkUnsafeCo :: Type -> Type -> Coercion -mkUnsafeCo ty1 ty2 | ty1 `eqType` ty2 = Refl ty1 -mkUnsafeCo (TyConApp tc1 tys1) (TyConApp tc2 tys2) - | tc1 == tc2 - = mkTyConAppCo tc1 (zipWith mkUnsafeCo tys1 tys2) - -mkUnsafeCo (FunTy a1 r1) (FunTy a2 r2) - = mkFunCo (mkUnsafeCo a1 a2) (mkUnsafeCo r1 r2) - -mkUnsafeCo ty1 ty2 = UnsafeCo ty1 ty2 +mkUnsafeCo = mkUnivCo Representational + +mkUnivCo :: Role -> Type -> Type -> Coercion +mkUnivCo role ty1 ty2 + | ty1 `eqType` ty2 = Refl role ty1 + | otherwise = UnivCo role ty1 ty2 + +-- input coercion is Nominal +mkSubCo :: Coercion -> Coercion +mkSubCo (Refl Nominal ty) = Refl Representational ty +mkSubCo (TyConAppCo Nominal tc cos) + = TyConAppCo Representational tc (applyRoles tc cos) +mkSubCo (UnivCo Nominal ty1 ty2) = UnivCo Representational ty1 ty2 +mkSubCo co = ASSERT2( coercionRole co == Nominal, ppr co ) + SubCo co + +-- takes a Nominal coercion and possibly casts it into a Representational one +maybeSubCo :: Role -> Coercion -> Coercion +maybeSubCo Nominal = id +maybeSubCo Representational = mkSubCo +maybeSubCo Phantom = pprPanic "maybeSubCo Phantom" . ppr + +maybeSubCo2_maybe :: Role -- desired role + -> Role -- current role + -> Coercion -> Maybe Coercion +maybeSubCo2_maybe Representational Nominal = Just . mkSubCo +maybeSubCo2_maybe Nominal Representational = const Nothing +maybeSubCo2_maybe Phantom Phantom = Just +maybeSubCo2_maybe Phantom _ = Just . mkPhantomCo +maybeSubCo2_maybe _ Phantom = const Nothing +maybeSubCo2_maybe _ _ = Just + +maybeSubCo2 :: Role -- desired role + -> Role -- current role + -> Coercion -> Coercion +maybeSubCo2 r1 r2 co + = case maybeSubCo2_maybe r1 r2 co of + Just co' -> co' + Nothing -> pprPanic "maybeSubCo2" (ppr co) + +-- if co is Nominal, returns it; otherwise, unwraps a SubCo; otherwise, fails +unSubCo_maybe :: Coercion -> Maybe Coercion +unSubCo_maybe (SubCo co) = Just co +unSubCo_maybe (Refl _ ty) = Just $ Refl Nominal ty +unSubCo_maybe (TyConAppCo Representational tc cos) + = do { cos' <- mapM unSubCo_maybe cos + ; return $ TyConAppCo Nominal tc cos' } +unSubCo_maybe (UnivCo Representational ty1 ty2) = Just $ UnivCo Nominal ty1 ty2 + -- We do *not* promote UnivCo Phantom, as that's unsafe. + -- UnivCo Nominal is no more unsafe than UnivCo Representational +unSubCo_maybe co + | Nominal <- coercionRole co = Just co +unSubCo_maybe _ = Nothing + +-- takes any coercion and turns it into a Phantom coercion +mkPhantomCo :: Coercion -> Coercion +mkPhantomCo co + | Just ty <- isReflCo_maybe co = Refl Phantom ty + | Pair ty1 ty2 <- coercionKind co = UnivCo Phantom ty1 ty2 + -- don't optimise here... wait for OptCoercion + +-- All input coercions are assumed to be Nominal, +-- or, if Role is Phantom, the Coercion can be Phantom, too. +applyRole :: Role -> Coercion -> Coercion +applyRole Nominal = id +applyRole Representational = mkSubCo +applyRole Phantom = mkPhantomCo + +-- Convert args to a TyConAppCo Nominal to the same TyConAppCo Representational +applyRoles :: TyCon -> [Coercion] -> [Coercion] +applyRoles tc cos + = zipWith applyRole (tyConRolesX Representational tc) cos + +-- the Role parameter is the Role of the TyConAppCo +-- defined here because this is intimiately concerned with the implementation +-- of TyConAppCo +tyConRolesX :: Role -> TyCon -> [Role] +tyConRolesX Representational tc = tyConRoles tc ++ repeat Nominal +tyConRolesX role _ = repeat role + +nthRole :: Role -> TyCon -> Int -> Role +nthRole Nominal _ _ = Nominal +nthRole Phantom _ _ = Phantom +nthRole Representational tc n + = (tyConRolesX Representational tc) !! n + +-- is one role "less" than another? +ltRole :: Role -> Role -> Bool +ltRole Phantom _ = False +ltRole Representational Phantom = True +ltRole Representational _ = False +ltRole Nominal Nominal = False +ltRole Nominal _ = True -- See note [Newtype coercions] in TyCon @@ -768,26 +1066,29 @@ mkUnsafeCo ty1 ty2 = UnsafeCo ty1 ty2 -- 'CoAxiom', the 'TyVar's the arguments expected by the @newtype@ and -- the type the appropriate right hand side of the @newtype@, with -- the free variables a subset of those 'TyVar's. -mkNewTypeCo :: Name -> TyCon -> [TyVar] -> Type -> CoAxiom Unbranched -mkNewTypeCo name tycon tvs rhs_ty +mkNewTypeCo :: Name -> TyCon -> [TyVar] -> [Role] -> Type -> CoAxiom Unbranched +mkNewTypeCo name tycon tvs roles rhs_ty = CoAxiom { co_ax_unique = nameUnique name , co_ax_name = name , co_ax_implicit = True -- See Note [Implicit axioms] in TyCon + , co_ax_role = Representational , co_ax_tc = tycon , co_ax_branches = FirstBranch branch } - where branch = CoAxBranch { cab_loc = getSrcSpan name - , cab_tvs = tvs - , cab_lhs = mkTyVarTys tvs - , cab_rhs = rhs_ty + where branch = CoAxBranch { cab_loc = getSrcSpan name + , cab_tvs = tvs + , cab_lhs = mkTyVarTys tvs + , cab_roles = roles + , cab_rhs = rhs_ty , cab_incomps = [] } -mkPiCos :: [Var] -> Coercion -> Coercion -mkPiCos vs co = foldr mkPiCo co vs +mkPiCos :: Role -> [Var] -> Coercion -> Coercion +mkPiCos r vs co = foldr (mkPiCo r) co vs -mkPiCo :: Var -> Coercion -> Coercion -mkPiCo v co | isTyVar v = mkForAllCo v co - | otherwise = mkFunCo (mkReflCo (varType v)) co +mkPiCo :: Role -> Var -> Coercion -> Coercion +mkPiCo r v co | isTyVar v = mkForAllCo v co + | otherwise = mkFunCo r (mkReflCo r (varType v)) co +-- The first coercion *must* be Nominal. mkCoCast :: Coercion -> Coercion -> Coercion -- (mkCoCast (c :: s1 ~# t1) (g :: (s1 ~# t1) ~# (s2 ~# t2) mkCoCast c g @@ -816,7 +1117,7 @@ instNewTyCon_maybe :: TyCon -> [Type] -> Maybe (Type, Coercion) instNewTyCon_maybe tc tys | Just (tvs, ty, co_tc) <- unwrapNewTyCon_maybe tc -- Check for newtype , tys `lengthIs` tyConArity tc -- Check saturated - = Just (substTyWith tvs tys ty, mkUnbranchedAxInstCo co_tc tys) + = Just (substTyWith tvs tys ty, mkUnbranchedAxInstCo Representational co_tc tys) | otherwise = Nothing @@ -872,9 +1173,9 @@ coreEqCoercion co1 co2 = coreEqCoercion2 rn_env co1 co2 where rn_env = mkRnEnv2 (mkInScopeSet (tyCoVarsOfCo co1 `unionVarSet` tyCoVarsOfCo co2)) coreEqCoercion2 :: RnEnv2 -> Coercion -> Coercion -> Bool -coreEqCoercion2 env (Refl ty1) (Refl ty2) = eqTypeX env ty1 ty2 -coreEqCoercion2 env (TyConAppCo tc1 cos1) (TyConAppCo tc2 cos2) - = tc1 == tc2 && all2 (coreEqCoercion2 env) cos1 cos2 +coreEqCoercion2 env (Refl eq1 ty1) (Refl eq2 ty2) = eq1 == eq2 && eqTypeX env ty1 ty2 +coreEqCoercion2 env (TyConAppCo eq1 tc1 cos1) (TyConAppCo eq2 tc2 cos2) + = eq1 == eq2 && tc1 == tc2 && all2 (coreEqCoercion2 env) cos1 cos2 coreEqCoercion2 env (AppCo co11 co12) (AppCo co21 co22) = coreEqCoercion2 env co11 co21 && coreEqCoercion2 env co12 co22 @@ -890,8 +1191,8 @@ coreEqCoercion2 env (AxiomInstCo con1 ind1 cos1) (AxiomInstCo con2 ind2 cos2) && ind1 == ind2 && all2 (coreEqCoercion2 env) cos1 cos2 -coreEqCoercion2 env (UnsafeCo ty11 ty12) (UnsafeCo ty21 ty22) - = eqTypeX env ty11 ty21 && eqTypeX env ty12 ty22 +coreEqCoercion2 env (UnivCo r1 ty11 ty12) (UnivCo r2 ty21 ty22) + = r1 == r2 && eqTypeX env ty11 ty21 && eqTypeX env ty12 ty22 coreEqCoercion2 env (SymCo co1) (SymCo co2) = coreEqCoercion2 env co1 co2 @@ -907,6 +1208,9 @@ coreEqCoercion2 env (LRCo d1 co1) (LRCo d2 co2) coreEqCoercion2 env (InstCo co1 ty1) (InstCo co2 ty2) = coreEqCoercion2 env co1 co2 && eqTypeX env ty1 ty2 +coreEqCoercion2 env (SubCo co1) (SubCo co2) + = coreEqCoercion2 env co1 co2 + coreEqCoercion2 _ _ _ = False \end{code} @@ -958,6 +1262,12 @@ extendTvSubst :: CvSubst -> TyVar -> Type -> CvSubst extendTvSubst (CvSubst in_scope tenv cenv) tv ty = CvSubst in_scope (extendVarEnv tenv tv ty) cenv +extendTvSubstAndInScope :: CvSubst -> TyVar -> Type -> CvSubst +extendTvSubstAndInScope (CvSubst in_scope tenv cenv) tv ty + = CvSubst (in_scope `extendInScopeSetSet` tyVarsOfType ty) + (extendVarEnv tenv tv ty) + cenv + extendCvSubstAndInScope :: CvSubst -> CoVar -> Coercion -> CvSubst -- Also extends the in-scope set extendCvSubstAndInScope (CvSubst in_scope tenv cenv) cv co @@ -1031,25 +1341,27 @@ subst_co subst co go_ty = Coercion.substTy subst go :: Coercion -> Coercion - go (Refl ty) = Refl $! go_ty ty - go (TyConAppCo tc cos) = let args = map go cos - in args `seqList` TyConAppCo tc args + go (Refl eq ty) = Refl eq $! go_ty ty + go (TyConAppCo eq tc cos) = let args = map go cos + in args `seqList` TyConAppCo eq tc args go (AppCo co1 co2) = mkAppCo (go co1) $! go co2 go (ForAllCo tv co) = case substTyVarBndr subst tv of (subst', tv') -> ForAllCo tv' $! subst_co subst' co go (CoVarCo cv) = substCoVar subst cv go (AxiomInstCo con ind cos) = AxiomInstCo con ind $! map go cos - go (UnsafeCo ty1 ty2) = (UnsafeCo $! go_ty ty1) $! go_ty ty2 + go (UnivCo r ty1 ty2) = (UnivCo r $! go_ty ty1) $! go_ty ty2 go (SymCo co) = mkSymCo (go co) go (TransCo co1 co2) = mkTransCo (go co1) (go co2) go (NthCo d co) = mkNthCo d (go co) go (LRCo lr co) = mkLRCo lr (go co) go (InstCo co ty) = mkInstCo (go co) $! go_ty ty + go (SubCo co) = mkSubCo (go co) substCoVar :: CvSubst -> CoVar -> Coercion substCoVar (CvSubst in_scope _ cenv) cv - | Just co <- lookupVarEnv cenv cv = co + | Just co <- lookupVarEnv cenv cv = ASSERT2( coercionRole co == Nominal, ppr co ) + co | Just cv1 <- lookupInScope in_scope cv = ASSERT( isCoVar cv1 ) CoVarCo cv1 | otherwise = WARN( True, ptext (sLit "substCoVar not in scope") <+> ppr cv $$ ppr in_scope) ASSERT( isCoVar cv ) CoVarCo cv @@ -1124,47 +1436,81 @@ type LiftCoEnv = VarEnv Coercion -- Maps *type variables* to *coercions* -- That's the whole point of this function! -liftCoSubstWith :: [TyVar] -> [Coercion] -> Type -> Coercion -liftCoSubstWith tvs cos ty - = liftCoSubst (zipEqual "liftCoSubstWith" tvs cos) ty +liftCoSubstWith :: Role -> [TyVar] -> [Coercion] -> Type -> Coercion +liftCoSubstWith r tvs cos ty + = liftCoSubst r (zipEqual "liftCoSubstWith" tvs cos) ty -liftCoSubst :: [(TyVar,Coercion)] -> Type -> Coercion -liftCoSubst prs ty - | null prs = Refl ty +liftCoSubst :: Role -> [(TyVar,Coercion)] -> Type -> Coercion +liftCoSubst r prs ty + | null prs = Refl r ty | otherwise = ty_co_subst (LCS (mkInScopeSet (tyCoVarsOfCos (map snd prs))) - (mkVarEnv prs)) ty + (mkVarEnv prs)) r ty -- | The \"lifting\" operation which substitutes coercions for type -- variables in a type to produce a coercion. -- -- For the inverse operation, see 'liftCoMatch' -ty_co_subst :: LiftCoSubst -> Type -> Coercion -ty_co_subst subst ty - = go ty + +-- The Role parameter is the _desired_ role +ty_co_subst :: LiftCoSubst -> Role -> Type -> Coercion +ty_co_subst subst role ty + = go role ty where - go (TyVarTy tv) = liftCoSubstTyVar subst tv `orElse` Refl (TyVarTy tv) + go Phantom ty = lift_phantom ty + go role (TyVarTy tv) = liftCoSubstTyVar subst role tv + `orElse` Refl role (TyVarTy tv) -- A type variable from a non-cloned forall -- won't be in the substitution - go (AppTy ty1 ty2) = mkAppCo (go ty1) (go ty2) - go (TyConApp tc tys) = mkTyConAppCo tc (map go tys) + go role (AppTy ty1 ty2) = mkAppCo (go role ty1) (go Nominal ty2) + go role (TyConApp tc tys) = mkTyConAppCo role tc + (zipWith go (tyConRolesX role tc) tys) -- IA0_NOTE: Do we need to do anything -- about kind instantiations? I don't think -- so. see Note [Kind coercions] - go (FunTy ty1 ty2) = mkFunCo (go ty1) (go ty2) - go (ForAllTy v ty) = mkForAllCo v' $! (ty_co_subst subst' ty) + go role (FunTy ty1 ty2) = mkFunCo role (go role ty1) (go role ty2) + go role (ForAllTy v ty) = mkForAllCo v' $! (ty_co_subst subst' role ty) where (subst', v') = liftCoSubstTyVarBndr subst v - go ty@(LitTy {}) = mkReflCo ty + go role ty@(LitTy {}) = ASSERT( role == Nominal ) + mkReflCo role ty + + lift_phantom ty = mkUnivCo Phantom (liftCoSubstLeft subst ty) + (liftCoSubstRight subst ty) + +\end{code} + +Note [liftCoSubstTyVar] +~~~~~~~~~~~~~~~~~~~~~~~ +This function can fail (i.e., return Nothing) for two separate reasons: + 1) The variable is not in the substutition + 2) The coercion found is of too low a role + +liftCoSubstTyVar is called from two places: in liftCoSubst (naturally), and +also in matchAxiom in OptCoercion. From liftCoSubst, the so-called lifting +lemma guarantees that the roles work out. If we fail for reason 2) in this +case, we really should panic -- something is deeply wrong. But, in matchAxiom, +failing for reason 2) is fine. matchAxiom is trying to find a set of coercions +that match, but it may fail, and this is healthy behavior. Bottom line: if +you find that liftCoSubst is doing weird things (like leaving out-of-scope +variables lying around), disable coercion optimization (bypassing matchAxiom) +and use maybeSubCo2 instead of maybeSubCo2_maybe. The panic will then happen, +and you may learn something useful. + +\begin{code} -liftCoSubstTyVar :: LiftCoSubst -> TyVar -> Maybe Coercion -liftCoSubstTyVar (LCS _ cenv) tv = lookupVarEnv cenv tv +liftCoSubstTyVar :: LiftCoSubst -> Role -> TyVar -> Maybe Coercion +liftCoSubstTyVar (LCS _ cenv) r tv + = do { co <- lookupVarEnv cenv tv + ; let co_role = coercionRole co -- could theoretically take this as + -- a parameter, but painful + ; maybeSubCo2_maybe r co_role co } -- see Note [liftCoSubstTyVar] liftCoSubstTyVarBndr :: LiftCoSubst -> TyVar -> (LiftCoSubst, TyVar) liftCoSubstTyVarBndr subst@(LCS in_scope cenv) old_var = (LCS (in_scope `extendInScopeSet` new_var) new_cenv, new_var) where new_cenv | no_change = delVarEnv cenv old_var - | otherwise = extendVarEnv cenv old_var (Refl (TyVarTy new_var)) + | otherwise = extendVarEnv cenv old_var (Refl Nominal (TyVarTy new_var)) no_change = no_kind_change && (new_var == old_var) @@ -1175,6 +1521,16 @@ liftCoSubstTyVarBndr subst@(LCS in_scope cenv) old_var new_var | no_kind_change = new_var1 | otherwise = setTyVarKind new_var1 (subst_kind subst old_ki) +-- map every variable to the type on the *left* of its mapped coercion +liftCoSubstLeft :: LiftCoSubst -> Type -> Type +liftCoSubstLeft (LCS in_scope cenv) ty + = Type.substTy (mkTvSubst in_scope (mapVarEnv (pFst . coercionKind) cenv)) ty + +-- same, but to the type on the right +liftCoSubstRight :: LiftCoSubst -> Type -> Type +liftCoSubstRight (LCS in_scope cenv) ty + = Type.substTy (mkTvSubst in_scope (mapVarEnv (pSnd . coercionKind) cenv)) ty + subst_kind :: LiftCoSubst -> Kind -> Kind -- See Note [Substituting kinds in liftCoSubst] subst_kind subst@(LCS _ cenv) kind @@ -1250,10 +1606,10 @@ ty_co_match menv subst (AppTy ty1 ty2) co = do { subst' <- ty_co_match menv subst ty1 co1 ; ty_co_match menv subst' ty2 co2 } -ty_co_match menv subst (TyConApp tc1 tys) (TyConAppCo tc2 cos) +ty_co_match menv subst (TyConApp tc1 tys) (TyConAppCo _ tc2 cos) | tc1 == tc2 = ty_co_matches menv subst tys cos -ty_co_match menv subst (FunTy ty1 ty2) (TyConAppCo tc cos) +ty_co_match menv subst (FunTy ty1 ty2) (TyConAppCo _ tc cos) | tc == funTyCon = ty_co_matches menv subst [ty1,ty2] cos ty_co_match menv subst (ForAllTy tv1 ty) (ForAllCo tv2 co) @@ -1269,11 +1625,14 @@ ty_co_matches :: MatchEnv -> LiftCoEnv -> [Type] -> [Coercion] -> Maybe LiftCoEn ty_co_matches menv = matchList (ty_co_match menv) pushRefl :: Coercion -> Maybe Coercion -pushRefl (Refl (AppTy ty1 ty2)) = Just (AppCo (Refl ty1) (Refl ty2)) -pushRefl (Refl (FunTy ty1 ty2)) = Just (TyConAppCo funTyCon [Refl ty1, Refl ty2]) -pushRefl (Refl (TyConApp tc tys)) = Just (TyConAppCo tc (map Refl tys)) -pushRefl (Refl (ForAllTy tv ty)) = Just (ForAllCo tv (Refl ty)) -pushRefl _ = Nothing +pushRefl (Refl Nominal (AppTy ty1 ty2)) + = Just (AppCo (Refl Nominal ty1) (Refl Nominal ty2)) +pushRefl (Refl r (FunTy ty1 ty2)) + = Just (TyConAppCo r funTyCon [Refl r ty1, Refl r ty2]) +pushRefl (Refl r (TyConApp tc tys)) + = Just (TyConAppCo r tc (zipWith mkReflCo (tyConRolesX r tc) tys)) +pushRefl (Refl r (ForAllTy tv ty)) = Just (ForAllCo tv (Refl r ty)) +pushRefl _ = Nothing \end{code} %************************************************************************ @@ -1284,18 +1643,19 @@ pushRefl _ = Nothing \begin{code} seqCo :: Coercion -> () -seqCo (Refl ty) = seqType ty -seqCo (TyConAppCo tc cos) = tc `seq` seqCos cos -seqCo (AppCo co1 co2) = seqCo co1 `seq` seqCo co2 -seqCo (ForAllCo tv co) = tv `seq` seqCo co -seqCo (CoVarCo cv) = cv `seq` () +seqCo (Refl eq ty) = eq `seq` seqType ty +seqCo (TyConAppCo eq tc cos) = eq `seq` tc `seq` seqCos cos +seqCo (AppCo co1 co2) = seqCo co1 `seq` seqCo co2 +seqCo (ForAllCo tv co) = tv `seq` seqCo co +seqCo (CoVarCo cv) = cv `seq` () seqCo (AxiomInstCo con ind cos) = con `seq` ind `seq` seqCos cos -seqCo (UnsafeCo ty1 ty2) = seqType ty1 `seq` seqType ty2 -seqCo (SymCo co) = seqCo co -seqCo (TransCo co1 co2) = seqCo co1 `seq` seqCo co2 -seqCo (NthCo _ co) = seqCo co -seqCo (LRCo _ co) = seqCo co -seqCo (InstCo co ty) = seqCo co `seq` seqType ty +seqCo (UnivCo r ty1 ty2) = r `seq` seqType ty1 `seq` seqType ty2 +seqCo (SymCo co) = seqCo co +seqCo (TransCo co1 co2) = seqCo co1 `seq` seqCo co2 +seqCo (NthCo _ co) = seqCo co +seqCo (LRCo _ co) = seqCo co +seqCo (InstCo co ty) = seqCo co `seq` seqType ty +seqCo (SubCo co) = seqCo co seqCos :: [Coercion] -> () seqCos [] = () @@ -1312,7 +1672,7 @@ seqCos (co:cos) = seqCo co `seq` seqCos cos \begin{code} coercionType :: Coercion -> Type coercionType co = case coercionKind co of - Pair ty1 ty2 -> mkCoercionType ty1 ty2 + Pair ty1 ty2 -> mkCoercionType (coercionRole co) ty1 ty2 ------------------ -- | If it is the case that @@ -1324,11 +1684,11 @@ coercionType co = case coercionKind co of coercionKind :: Coercion -> Pair Type coercionKind co = go co where - go (Refl ty) = Pair ty ty - go (TyConAppCo tc cos) = mkTyConApp tc <$> (sequenceA $ map go cos) - go (AppCo co1 co2) = mkAppTy <$> go co1 <*> go co2 - go (ForAllCo tv co) = mkForAllTy tv <$> go co - go (CoVarCo cv) = toPair $ coVarKind cv + go (Refl _ ty) = Pair ty ty + go (TyConAppCo _ tc cos) = mkTyConApp tc <$> (sequenceA $ map go cos) + go (AppCo co1 co2) = mkAppTy <$> go co1 <*> go co2 + go (ForAllCo tv co) = mkForAllTy tv <$> go co + go (CoVarCo cv) = toPair $ coVarKind cv go (AxiomInstCo ax ind cos) | CoAxBranch { cab_tvs = tvs, cab_lhs = lhs, cab_rhs = rhs } <- coAxiomNthBranch ax ind , Pair tys1 tys2 <- sequenceA (map go cos) @@ -1336,12 +1696,13 @@ coercionKind co = go co -- exactly saturate the axiom branch Pair (substTyWith tvs tys1 (mkTyConApp (coAxiomTyCon ax) lhs)) (substTyWith tvs tys2 rhs) - go (UnsafeCo ty1 ty2) = Pair ty1 ty2 - go (SymCo co) = swap $ go co - go (TransCo co1 co2) = Pair (pFst $ go co1) (pSnd $ go co2) - go (NthCo d co) = tyConAppArgN d <$> go co - go (LRCo lr co) = (pickLR lr . splitAppTy) <$> go co - go (InstCo aco ty) = go_app aco [ty] + go (UnivCo _ ty1 ty2) = Pair ty1 ty2 + go (SymCo co) = swap $ go co + go (TransCo co1 co2) = Pair (pFst $ go co1) (pSnd $ go co2) + go (NthCo d co) = tyConAppArgN d <$> go co + go (LRCo lr co) = (pickLR lr . splitAppTy) <$> go co + go (InstCo aco ty) = go_app aco [ty] + go (SubCo co) = go co go_app :: Coercion -> [Type] -> Pair Type -- Collect up all the arguments and apply all at once @@ -1352,6 +1713,25 @@ coercionKind co = go co -- | Apply 'coercionKind' to multiple 'Coercion's coercionKinds :: [Coercion] -> Pair [Type] coercionKinds tys = sequenceA $ map coercionKind tys + +coercionRole :: Coercion -> Role +coercionRole = go + where + go (Refl r _) = r + go (TyConAppCo r _ _) = r + go (AppCo co _) = go co + go (ForAllCo _ co) = go co + go (CoVarCo cv) = coVarRole cv + go (AxiomInstCo ax _ _) = coAxiomRole ax + go (UnivCo r _ _) = r + go (SymCo co) = go co + go (TransCo co1 _) = go co1 -- same as go co2 + go (NthCo n co) = let Pair ty1 _ = coercionKind co + (tc, _) = splitTyConApp ty1 + in nthRole (coercionRole co) tc n + go (LRCo _ _) = Nominal + go (InstCo co _) = go co + go (SubCo _) = Representational \end{code} Note [Nested InstCos] diff --git a/compiler/types/FamInstEnv.lhs b/compiler/types/FamInstEnv.lhs index 63a4c50e2c..b6fdb35dc7 100644 --- a/compiler/types/FamInstEnv.lhs +++ b/compiler/types/FamInstEnv.lhs @@ -499,16 +499,18 @@ We print out axioms and don't want to print stuff like Instead we must tidy those kind variables. See Trac #7524. \begin{code} +-- all axiom roles are Nominal, as this is only used with type families mkCoAxBranch :: [TyVar] -- original, possibly stale, tyvars -> [Type] -- LHS patterns -> Type -- RHS -> SrcSpan -> CoAxBranch mkCoAxBranch tvs lhs rhs loc - = CoAxBranch { cab_tvs = tvs1 - , cab_lhs = tidyTypes env lhs - , cab_rhs = tidyType env rhs - , cab_loc = loc + = CoAxBranch { cab_tvs = tvs1 + , cab_lhs = tidyTypes env lhs + , cab_roles = map (const Nominal) tvs1 + , cab_rhs = tidyType env rhs + , cab_loc = loc , cab_incomps = placeHolderIncomps } where (env, tvs1) = tidyTyVarBndrs emptyTidyEnv tvs @@ -522,6 +524,7 @@ mkBranchedCoAxiom ax_name fam_tc branches CoAxiom { co_ax_unique = nameUnique ax_name , co_ax_name = ax_name , co_ax_tc = fam_tc + , co_ax_role = Nominal , co_ax_implicit = False , co_ax_branches = toBranchList branches } @@ -530,6 +533,7 @@ mkUnbranchedCoAxiom ax_name fam_tc branch = CoAxiom { co_ax_unique = nameUnique ax_name , co_ax_name = ax_name , co_ax_tc = fam_tc + , co_ax_role = Nominal , co_ax_implicit = False , co_ax_branches = FirstBranch (branch { cab_incomps = [] }) } @@ -538,6 +542,7 @@ mkSingleCoAxiom ax_name tvs fam_tc lhs_tys rhs_ty = CoAxiom { co_ax_unique = nameUnique ax_name , co_ax_name = ax_name , co_ax_tc = fam_tc + , co_ax_role = Nominal , co_ax_implicit = False , co_ax_branches = FirstBranch (branch { cab_incomps = [] }) } where @@ -764,19 +769,20 @@ but we also need to handle closed ones when normalising a type: \begin{code} -- The TyCon can be oversaturated. This works on both open and closed families -chooseAxiom :: FamInstEnvs -> TyCon -> [Type] -> Maybe (Coercion, Type) -chooseAxiom envs tc tys +chooseAxiom :: FamInstEnvs -> Role -> TyCon -> [Type] -> Maybe (Coercion, Type) +chooseAxiom envs role tc tys | isOpenFamilyTyCon tc , [FamInstMatch { fim_instance = fam_inst , fim_tys = inst_tys }] <- lookupFamInstEnv envs tc tys - = let co = mkUnbranchedAxInstCo (famInstAxiom fam_inst) inst_tys - ty = pSnd (coercionKind co) + = let ax = famInstAxiom fam_inst + co = mkUnbranchedAxInstCo role ax inst_tys + ty = pSnd (coercionKind co) in Just (co, ty) | Just ax <- isClosedSynFamilyTyCon_maybe tc , Just (ind, inst_tys) <- chooseBranch ax tys - = let co = mkAxInstCo ax ind inst_tys - ty = pSnd (coercionKind co) + = let co = mkAxInstCo role ax ind inst_tys + ty = pSnd (coercionKind co) in Just (co, ty) | otherwise @@ -843,6 +849,7 @@ topNormaliseType :: FamInstEnvs -- (F ty) is a redex. -- Its a bit like Type.repType, but handles type families too +-- The coercion returned is always an R coercion topNormaliseType env ty = go initRecTc ty @@ -857,7 +864,7 @@ topNormaliseType env ty go rec_nts (TyConApp tc tys) | isFamilyTyCon tc -- Expand family tycons - , (co, ty) <- normaliseTcApp env tc tys + , (co, ty) <- normaliseTcApp env Representational tc tys -- Note that normaliseType fully normalises 'tys', -- wrt type functions but *not* newtypes -- It has do to so to be sure that nested calls like @@ -875,13 +882,13 @@ topNormaliseType env ty --------------- -normaliseTcApp :: FamInstEnvs -> TyCon -> [Type] -> (Coercion, Type) -normaliseTcApp env tc tys +normaliseTcApp :: FamInstEnvs -> Role -> TyCon -> [Type] -> (Coercion, Type) +normaliseTcApp env role tc tys | isFamilyTyCon tc - , Just (co, rhs) <- chooseAxiom env tc ntys + , Just (co, rhs) <- chooseAxiom env role tc ntys = let -- A reduction is possible first_coi = mkTransCo tycon_coi co - (rest_coi,nty) = normaliseType env rhs + (rest_coi,nty) = normaliseType env role rhs fix_coi = mkTransCo first_coi rest_coi in (fix_coi, nty) @@ -893,35 +900,36 @@ normaliseTcApp env tc tys where -- Normalise the arg types so that they'll match -- when we lookup in in the instance envt - (cois, ntys) = mapAndUnzip (normaliseType env) tys - tycon_coi = mkTyConAppCo tc cois + (cois, ntys) = zipWithAndUnzip (normaliseType env) (tyConRolesX role tc) tys + tycon_coi = mkTyConAppCo role tc cois --------------- normaliseType :: FamInstEnvs -- environment with family instances - -> Type -- old type + -> Role -- desired role of output coercion + -> Type -- old type -> (Coercion, Type) -- (coercion,new type), where -- co :: old-type ~ new_type -- Normalise the input type, by eliminating *all* type-function redexes -- Returns with Refl if nothing happens -normaliseType env ty - | Just ty' <- coreView ty = normaliseType env ty' -normaliseType env (TyConApp tc tys) - = normaliseTcApp env tc tys -normaliseType _env ty@(LitTy {}) = (Refl ty, ty) -normaliseType env (AppTy ty1 ty2) - = let (coi1,nty1) = normaliseType env ty1 - (coi2,nty2) = normaliseType env ty2 +normaliseType env role ty + | Just ty' <- coreView ty = normaliseType env role ty' +normaliseType env role (TyConApp tc tys) + = normaliseTcApp env role tc tys +normaliseType _env role ty@(LitTy {}) = (Refl role ty, ty) +normaliseType env role (AppTy ty1 ty2) + = let (coi1,nty1) = normaliseType env role ty1 + (coi2,nty2) = normaliseType env Nominal ty2 in (mkAppCo coi1 coi2, mkAppTy nty1 nty2) -normaliseType env (FunTy ty1 ty2) - = let (coi1,nty1) = normaliseType env ty1 - (coi2,nty2) = normaliseType env ty2 - in (mkFunCo coi1 coi2, mkFunTy nty1 nty2) -normaliseType env (ForAllTy tyvar ty1) - = let (coi,nty1) = normaliseType env ty1 +normaliseType env role (FunTy ty1 ty2) + = let (coi1,nty1) = normaliseType env role ty1 + (coi2,nty2) = normaliseType env role ty2 + in (mkFunCo role coi1 coi2, mkFunTy nty1 nty2) +normaliseType env role (ForAllTy tyvar ty1) + = let (coi,nty1) = normaliseType env role ty1 in (mkForAllCo tyvar coi, ForAllTy tyvar nty1) -normaliseType _ ty@(TyVarTy _) - = (Refl ty,ty) +normaliseType _ role ty@(TyVarTy _) + = (Refl role ty,ty) \end{code} %************************************************************************ @@ -1024,4 +1032,4 @@ allTyVarsInTy = go (go ty) -- don't remove tv go (LitTy {}) = emptyVarSet -\end{code} \ No newline at end of file +\end{code} diff --git a/compiler/types/OptCoercion.lhs b/compiler/types/OptCoercion.lhs index 03175f33f9..9f965ece26 100644 --- a/compiler/types/OptCoercion.lhs +++ b/compiler/types/OptCoercion.lhs @@ -26,10 +26,11 @@ import VarEnv import StaticFlags ( opt_NoOptCoercion ) import Outputable import Pair -import Maybes( allMaybes ) +import Maybes import FastString import Util import Unify +import ListSetOps import InstEnv \end{code} @@ -62,7 +63,7 @@ optCoercion :: CvSubst -> Coercion -> NormalCo -- *and* optimises it to reduce its size optCoercion env co | opt_NoOptCoercion = substCo env co - | otherwise = opt_co env False co + | otherwise = opt_co env False Nothing co type NormalCo = Coercion -- Invariants: @@ -75,9 +76,11 @@ type NormalNonIdCo = NormalCo -- Extra invariant: not the identity opt_co, opt_co' :: CvSubst -> Bool -- True <=> return (sym co) + -> Maybe Role -- Nothing <=> don't change; otherwise, change + -- INVARIANT: the change is always a *downgrade* -> Coercion -> NormalCo -opt_co = opt_co' +opt_co = opt_co' {- opt_co env sym co = pprTrace "opt_co {" (ppr sym <+> ppr co $$ ppr env) $ @@ -103,73 +106,111 @@ opt_co env sym co | otherwise = substCo env co -} -opt_co' env _ (Refl ty) = Refl (substTy env ty) -opt_co' env sym (SymCo co) = opt_co env (not sym) co -opt_co' env sym (TyConAppCo tc cos) = mkTyConAppCo tc (map (opt_co env sym) cos) -opt_co' env sym (AppCo co1 co2) = mkAppCo (opt_co env sym co1) (opt_co env sym co2) -opt_co' env sym (ForAllCo tv co) = case substTyVarBndr env tv of - (env', tv') -> mkForAllCo tv' (opt_co env' sym co) +opt_co' env _ mrole (Refl r ty) = Refl (mrole `orElse` r) (substTy env ty) +opt_co' env sym mrole co + | mrole == Just Phantom + || coercionRole co == Phantom + , Pair ty1 ty2 <- coercionKind co + = if sym + then opt_univ env Phantom ty2 ty1 + else opt_univ env Phantom ty1 ty2 + +opt_co' env sym mrole (SymCo co) = opt_co env (not sym) mrole co +opt_co' env sym mrole (TyConAppCo r tc cos) + = case mrole of + Nothing -> mkTyConAppCo r tc (map (opt_co env sym Nothing) cos) + Just r' -> mkTyConAppCo r' tc (zipWith (opt_co env sym) + (map Just (tyConRolesX r' tc)) cos) +opt_co' env sym mrole (AppCo co1 co2) = mkAppCo (opt_co env sym mrole co1) + (opt_co env sym Nothing co2) +opt_co' env sym mrole (ForAllCo tv co) + = case substTyVarBndr env tv of + (env', tv') -> mkForAllCo tv' (opt_co env' sym mrole co) -- Use the "mk" functions to check for nested Refls -opt_co' env sym (CoVarCo cv) +opt_co' env sym mrole (CoVarCo cv) | Just co <- lookupCoVar env cv - = opt_co (zapCvSubstEnv env) sym co + = opt_co (zapCvSubstEnv env) sym mrole co | Just cv1 <- lookupInScope (getCvInScope env) cv - = ASSERT( isCoVar cv1 ) wrapSym sym (CoVarCo cv1) + = ASSERT( isCoVar cv1 ) wrapRole mrole cv_role $ wrapSym sym (CoVarCo cv1) -- cv1 might have a substituted kind! | otherwise = WARN( True, ptext (sLit "opt_co: not in scope:") <+> ppr cv $$ ppr env) ASSERT( isCoVar cv ) - wrapSym sym (CoVarCo cv) + wrapRole mrole cv_role $ wrapSym sym (CoVarCo cv) + where cv_role = coVarRole cv -opt_co' env sym (AxiomInstCo con ind cos) +opt_co' env sym mrole (AxiomInstCo con ind cos) -- Do *not* push sym inside top-level axioms -- e.g. if g is a top-level axiom -- g a : f a ~ a -- then (sym (g ty)) /= g (sym ty) !! - = wrapSym sym $ AxiomInstCo con ind (map (opt_co env False) cos) + = wrapRole mrole (coAxiomRole con) $ + wrapSym sym $ + AxiomInstCo con ind (map (opt_co env False Nothing) cos) -- Note that the_co does *not* have sym pushed into it -opt_co' env sym (UnsafeCo ty1 ty2) - | ty1' `eqType` ty2' = Refl ty1' - | sym = mkUnsafeCo ty2' ty1' - | otherwise = mkUnsafeCo ty1' ty2' +opt_co' env sym mrole (UnivCo r oty1 oty2) + = opt_univ env role a b where - ty1' = substTy env ty1 - ty2' = substTy env ty2 + (a,b) = if sym then (oty2,oty1) else (oty1,oty2) + role = mrole `orElse` r -opt_co' env sym (TransCo co1 co2) +opt_co' env sym mrole (TransCo co1 co2) | sym = opt_trans in_scope opt_co2 opt_co1 -- sym (g `o` h) = sym h `o` sym g | otherwise = opt_trans in_scope opt_co1 opt_co2 where - opt_co1 = opt_co env sym co1 - opt_co2 = opt_co env sym co2 + opt_co1 = opt_co env sym mrole co1 + opt_co2 = opt_co env sym mrole co2 in_scope = getCvInScope env -opt_co' env sym (NthCo n co) - | TyConAppCo tc cos <- co' +-- NthCo roles are fiddly! +opt_co' env sym mrole (NthCo n (TyConAppCo _ _ cos)) + = opt_co env sym mrole (getNth cos n) +opt_co' env sym mrole (NthCo n co) + | TyConAppCo _ _tc cos <- co' , isDecomposableTyCon tc -- Not synonym families = ASSERT( n < length cos ) - cos !! n + ASSERT( _tc == tc ) + let resultCo = cos !! n + resultRole = coercionRole resultCo in + case (mrole, resultRole) of + -- if we just need an R coercion, try to propagate the SubCo again: + (Just Representational, Nominal) -> opt_co (zapCvSubstEnv env) False mrole resultCo + _ -> resultCo + | otherwise - = NthCo n co' - where - co' = opt_co env sym co + = wrap_role $ NthCo n co' -opt_co' env sym (LRCo lr co) + where + wrap_role wrapped = wrapRole mrole (coercionRole wrapped) wrapped + + tc = tyConAppTyCon $ pFst $ coercionKind co + co' = opt_co env sym mrole' co + mrole' = case mrole of + Just Representational + | Representational <- nthRole Representational tc n + -> Just Representational + _ -> Nothing + +opt_co' env sym mrole (LRCo lr co) + | Just pr_co <- splitAppCo_maybe co + = opt_co env sym mrole (pickLR lr pr_co) | Just pr_co <- splitAppCo_maybe co' - = pickLR lr pr_co + = if mrole == Just Representational + then opt_co (zapCvSubstEnv env) False mrole (pickLR lr pr_co) + else pickLR lr pr_co | otherwise - = LRCo lr co' + = wrapRole mrole Nominal $ LRCo lr co' where - co' = opt_co env sym co + co' = opt_co env sym Nothing co -opt_co' env sym (InstCo co ty) +opt_co' env sym mrole (InstCo co ty) -- See if the first arg is already a forall -- ...then we can just extend the current substitution | Just (tv, co_body) <- splitForAllCo_maybe co - = opt_co (extendTvSubst env tv ty') sym co_body + = opt_co (extendTvSubst env tv ty') sym mrole co_body -- See if it is a forall after optimization -- If so, do an inefficient one-variable substitution @@ -178,9 +219,37 @@ opt_co' env sym (InstCo co ty) | otherwise = InstCo co' ty' where - co' = opt_co env sym co + co' = opt_co env sym mrole co ty' = substTy env ty +opt_co' env sym _ (SubCo co) = opt_co env sym (Just Representational) co + +------------- +opt_univ :: CvSubst -> Role -> Type -> Type -> Coercion +opt_univ env role oty1 oty2 + | Just (tc1, tys1) <- splitTyConApp_maybe oty1 + , Just (tc2, tys2) <- splitTyConApp_maybe oty2 + , tc1 == tc2 + = mkTyConAppCo role tc1 (zipWith3 (opt_univ env) (tyConRolesX role tc1) tys1 tys2) + + | Just (l1, r1) <- splitAppTy_maybe oty1 + , Just (l2, r2) <- splitAppTy_maybe oty2 + , typeKind l1 `eqType` typeKind l2 -- kind(r1) == kind(r2) by consequence + = let role' = if role == Phantom then Phantom else Nominal in + -- role' is to comform to mkAppCo's precondition + mkAppCo (opt_univ env role l1 l2) (opt_univ env role' r1 r2) + + | Just (tv1, ty1) <- splitForAllTy_maybe oty1 + , Just (tv2, ty2) <- splitForAllTy_maybe oty2 + , tyVarKind tv1 `eqType` tyVarKind tv2 -- rule out a weird unsafeCo + = case substTyVarBndr2 env tv1 tv2 of { (env1, env2, tv') -> + let ty1' = substTy env1 ty1 + ty2' = substTy env2 ty2 in + mkForAllCo tv' (opt_univ (zapCvSubstEnv2 env1 env2) role ty1' ty2') } + + | otherwise + = mkUnivCo role (substTy env oty1) (substTy env oty2) + ------------- opt_transList :: InScopeSet -> [NormalCo] -> [NormalCo] -> [NormalCo] opt_transList is = zipWith (opt_trans is) @@ -240,27 +309,28 @@ opt_trans_rule is in_co1@(InstCo co1 ty1) in_co2@(InstCo co2 ty2) mkInstCo (opt_trans is co1 co2) ty1 -- Push transitivity down through matching top-level constructors. -opt_trans_rule is in_co1@(TyConAppCo tc1 cos1) in_co2@(TyConAppCo tc2 cos2) +opt_trans_rule is in_co1@(TyConAppCo r1 tc1 cos1) in_co2@(TyConAppCo r2 tc2 cos2) | tc1 == tc2 - = fireTransRule "PushTyConApp" in_co1 in_co2 $ - TyConAppCo tc1 (opt_transList is cos1 cos2) + = ASSERT( r1 == r2 ) + fireTransRule "PushTyConApp" in_co1 in_co2 $ + TyConAppCo r1 tc1 (opt_transList is cos1 cos2) opt_trans_rule is in_co1@(AppCo co1a co1b) in_co2@(AppCo co2a co2b) = fireTransRule "TrPushApp" in_co1 in_co2 $ mkAppCo (opt_trans is co1a co2a) (opt_trans is co1b co2b) -- Eta rules -opt_trans_rule is co1@(TyConAppCo tc cos1) co2 +opt_trans_rule is co1@(TyConAppCo r tc cos1) co2 | Just cos2 <- etaTyConAppCo_maybe tc co2 = ASSERT( length cos1 == length cos2 ) fireTransRule "EtaCompL" co1 co2 $ - TyConAppCo tc (opt_transList is cos1 cos2) + TyConAppCo r tc (opt_transList is cos1 cos2) -opt_trans_rule is co1 co2@(TyConAppCo tc cos2) +opt_trans_rule is co1 co2@(TyConAppCo r tc cos2) | Just cos1 <- etaTyConAppCo_maybe tc co1 = ASSERT( length cos1 == length cos2 ) fireTransRule "EtaCompR" co1 co2 $ - TyConAppCo tc (opt_transList is cos1 cos2) + TyConAppCo r tc (opt_transList is cos1 cos2) opt_trans_rule is co1@(AppCo co1a co1b) co2 | Just (co2a,co2b) <- etaAppCo_maybe co2 @@ -337,18 +407,19 @@ opt_trans_rule is co1 co2 , all (`elemVarSet` pivot_tvs) qtvs = fireTransRule "TrPushAxSym" co1 co2 $ if sym2 - then liftCoSubstWith qtvs (opt_transList is cos1 (map mkSymCo cos2)) lhs -- TrPushAxSym - else liftCoSubstWith qtvs (opt_transList is (map mkSymCo cos1) cos2) rhs -- TrPushSymAx + then liftCoSubstWith role qtvs (opt_transList is cos1 (map mkSymCo cos2)) lhs -- TrPushAxSym + else liftCoSubstWith role qtvs (opt_transList is (map mkSymCo cos1) cos2) rhs -- TrPushSymAx where co1_is_axiom_maybe = isAxiom_maybe co1 co2_is_axiom_maybe = isAxiom_maybe co2 + role = coercionRole co1 -- should be the same as coercionRole co2! opt_trans_rule _ co1 co2 -- Identity rule | Pair ty1 _ <- coercionKind co1 , Pair _ ty2 <- coercionKind co2 , ty1 `eqType` ty2 = fireTransRule "RedTypeDirRefl" co1 co2 $ - Refl ty2 + Refl (coercionRole co1) ty2 opt_trans_rule _ _ _ = Nothing @@ -415,6 +486,24 @@ wrapSym :: Bool -> Coercion -> Coercion wrapSym sym co | sym = SymCo co | otherwise = co +wrapRole :: Maybe Role -- desired + -> Role -- current + -> Coercion -> Coercion +wrapRole Nothing _ = id +wrapRole (Just desired) current = maybeSubCo2 desired current + +----------- +-- takes two tyvars and builds env'ts to map them to the same tyvar +substTyVarBndr2 :: CvSubst -> TyVar -> TyVar + -> (CvSubst, CvSubst, TyVar) +substTyVarBndr2 env tv1 tv2 + = case substTyVarBndr env tv1 of + (env1, tv1') -> (env1, extendTvSubstAndInScope env tv2 (mkTyVarTy tv1'), tv1') + +zapCvSubstEnv2 :: CvSubst -> CvSubst -> CvSubst +zapCvSubstEnv2 env1 env2 = mkCvSubst (is1 `unionInScope` is2) [] + where is1 = getCvInScope env1 + is2 = getCvInScope env2 ----------- isAxiom_maybe :: Coercion -> Maybe (Bool, CoAxiom Branched, Int, [Coercion]) isAxiom_maybe (SymCo co) @@ -429,12 +518,13 @@ matchAxiom :: Bool -- True = match LHS, False = match RHS -- If we succeed in matching, then *all the quantified type variables are bound* -- E.g. if tvs = [a,b], lhs/rhs = [b], we'll fail matchAxiom sym ax@(CoAxiom { co_ax_tc = tc }) ind co - = let (CoAxBranch { cab_tvs = qtvs - , cab_lhs = lhs - , cab_rhs = rhs }) = coAxiomNthBranch ax ind in + = let (CoAxBranch { cab_tvs = qtvs + , cab_roles = roles + , cab_lhs = lhs + , cab_rhs = rhs }) = coAxiomNthBranch ax ind in case liftCoMatch (mkVarSet qtvs) (if sym then (mkTyConApp tc lhs) else rhs) co of Nothing -> Nothing - Just subst -> allMaybes (map (liftCoSubstTyVar subst) qtvs) + Just subst -> allMaybes (zipWith (liftCoSubstTyVar subst) roles qtvs) ------------- compatible_co :: Coercion -> Coercion -> Bool @@ -468,7 +558,8 @@ etaAppCo_maybe :: Coercion -> Maybe (Coercion,Coercion) etaAppCo_maybe co | Just (co1,co2) <- splitAppCo_maybe co = Just (co1,co2) - | Pair ty1 ty2 <- coercionKind co + | Nominal <- coercionRole co + , Pair ty1 ty2 <- coercionKind co , Just (_,t1) <- splitAppTy_maybe ty1 , Just (_,t2) <- splitAppTy_maybe ty2 , typeKind t1 `eqType` typeKind t2 -- Note [Eta for AppCo] @@ -480,7 +571,7 @@ etaTyConAppCo_maybe :: TyCon -> Coercion -> Maybe [Coercion] -- If possible, split a coercion -- g :: T s1 .. sn ~ T t1 .. tn -- into [ Nth 0 g :: s1~t1, ..., Nth (n-1) g :: sn~tn ] -etaTyConAppCo_maybe tc (TyConAppCo tc2 cos2) +etaTyConAppCo_maybe tc (TyConAppCo _ tc2 cos2) = ASSERT( tc == tc2 ) Just cos2 etaTyConAppCo_maybe tc co @@ -492,7 +583,7 @@ etaTyConAppCo_maybe tc co , let n = length tys1 = ASSERT( tc == tc1 ) ASSERT( n == length tys2 ) - Just (decomposeCo n co) + Just (decomposeCo n co) -- NB: n might be <> tyConArity tc -- e.g. data family T a :: * -> * -- g :: T a b ~ T c d diff --git a/compiler/types/TyCon.lhs b/compiler/types/TyCon.lhs index fb078ec979..8a699614c6 100644 --- a/compiler/types/TyCon.lhs +++ b/compiler/types/TyCon.lhs @@ -13,7 +13,7 @@ module TyCon( AlgTyConRhs(..), visibleDataCons, TyConParent(..), isNoParent, - SynTyConRhs(..), + SynTyConRhs(..), Role(..), -- ** Constructing TyCons mkAlgTyCon, @@ -65,6 +65,7 @@ module TyCon( tyConFamilySize, tyConStupidTheta, tyConArity, + tyConRoles, tyConParent, tyConTuple_maybe, tyConClass_maybe, tyConFamInst_maybe, tyConFamInstSig_maybe, tyConFamilyCoercion_maybe, @@ -271,6 +272,28 @@ This is important. In an instance declaration we expect data T p [x] = T1 x | T2 p type F [x] q (Tree y) = (x,y,q) +Note [TyCon Role signatures] +~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +Every tycon has a role signature, assigning a role to each of the tyConTyVars +(or of equal length to the tyConArity, if there are no tyConTyVars). An +example demonstrates these best: say we have a tycon T, with parameters a@N, +b@R, and c@P. Then, to prove representational equality between T a1 b1 c1 and +T a2 b2 c2, we need to have nominal equality between a1 and a2, representational +equality between b1 and b2, and nothing in particular (i.e., phantom equality) +between c1 and c2. This might happen, say, with the following declaration: + + data T a b c where + MkT :: b -> T Int b c + +Data and class tycons have their roles inferred (see inferRoles in TcTyDecls), +as do vanilla synonym tycons. Family tycons have all parameters at role N, +though it is conceivable that we could relax this restriction. (->)'s and +tuples' parameters are at role R. Each primitive tycon declares its roles; +it's worth noting that (~#)'s parameters are at role N. Promoted data +constructors' type arguments are at role R. All kind arguments are at role +N. + %************************************************************************ %* * \subsection{The data type} @@ -321,6 +344,10 @@ data TyCon -- 3. The family instance types if present -- -- Note that it does /not/ scope over the data constructors. + tc_roles :: [Role], -- ^ The role for each type variable + -- This list has the same length as tyConTyVars + -- See also Note [TyCon Role signatures] + tyConCType :: Maybe CType, -- The C type that should be used -- for this type when using the FFI -- and CAPI @@ -372,6 +399,7 @@ data TyCon tyConArity :: Arity, tyConTyVars :: [TyVar], -- Bound tyvars + tc_roles :: [Role], synTcRhs :: SynTyConRhs, -- ^ Contains information about the -- expansion of the synonym @@ -388,8 +416,8 @@ data TyCon tyConUnique :: Unique, tyConName :: Name, tc_kind :: Kind, - tyConArity :: Arity, -- SLPJ Oct06: I'm not sure what the significance - -- of the arity of a primtycon is! + tyConArity :: Arity, + tc_roles :: [Role], primTyConRep :: PrimRep, -- ^ Many primitive tycons are unboxed, but some are -- boxed (represented by pointers). This 'PrimRep' @@ -409,6 +437,7 @@ data TyCon tyConUnique :: Unique, -- ^ Same Unique as the data constructor tyConName :: Name, -- ^ Same Name as the data constructor tyConArity :: Arity, + tc_roles :: [Role], -- ^ Roles: N for kind vars, R for type vars tc_kind :: Kind, -- ^ Translated type of the data constructor dataCon :: DataCon -- ^ Corresponding data constructor } @@ -496,6 +525,7 @@ data AlgTyConRhs -- Watch out! If any newtypes become transparent -- again check Trac #1072. } + \end{code} Note [AbstractTyCon and type equality] @@ -683,10 +713,12 @@ which encodes as (TyConApp instCoercionTyCon [TyConApp CoT [], s]) Note [Newtype eta] ~~~~~~~~~~~~~~~~~~ Consider - newtype Parser m a = MkParser (Foogle m a) + newtype Parser a = MkParser (IO a) derriving( Monad ) Are these two types equal (to Core)? - Monad (Parser m) - Monad (Foogle m) + Monad Parser + Monad IO +which we need to make the derived instance for Monad Parser. + Well, yes. But to see that easily we eta-reduce the RHS type of Parser, in this case to ([], Froogle), so that even unsaturated applications of Parser will work right. This eta reduction is done when the type @@ -875,6 +907,7 @@ mkAlgTyCon :: Name -> Kind -- ^ Kind of the resulting 'TyCon' -> [TyVar] -- ^ 'TyVar's scoped over: see 'tyConTyVars'. -- Arity is inferred from the length of this list + -> [Role] -- ^ The roles for each TyVar -> Maybe CType -- ^ The C type this type corresponds to -- when using the CAPI FFI -> [PredType] -- ^ Stupid theta: see 'algTcStupidTheta' @@ -884,13 +917,14 @@ mkAlgTyCon :: Name -> Bool -- ^ Was the 'TyCon' declared with GADT syntax? -> Maybe TyCon -- ^ Promoted version -> TyCon -mkAlgTyCon name kind tyvars cType stupid rhs parent is_rec gadt_syn prom_tc +mkAlgTyCon name kind tyvars roles cType stupid rhs parent is_rec gadt_syn prom_tc = AlgTyCon { tyConName = name, tyConUnique = nameUnique name, tc_kind = kind, tyConArity = length tyvars, tyConTyVars = tyvars, + tc_roles = roles, tyConCType = cType, algTcStupidTheta = stupid, algTcRhs = rhs, @@ -901,9 +935,9 @@ mkAlgTyCon name kind tyvars cType stupid rhs parent is_rec gadt_syn prom_tc } -- | Simpler specialization of 'mkAlgTyCon' for classes -mkClassTyCon :: Name -> Kind -> [TyVar] -> AlgTyConRhs -> Class -> RecFlag -> TyCon -mkClassTyCon name kind tyvars rhs clas is_rec - = mkAlgTyCon name kind tyvars Nothing [] rhs (ClassTyCon clas) +mkClassTyCon :: Name -> Kind -> [TyVar] -> [Role] -> AlgTyConRhs -> Class -> RecFlag -> TyCon +mkClassTyCon name kind tyvars roles rhs clas is_rec + = mkAlgTyCon name kind tyvars roles Nothing [] rhs (ClassTyCon clas) is_rec False Nothing -- Class TyCons are not pormoted @@ -934,14 +968,14 @@ mkTupleTyCon name kind arity tyvars con sort prom_tc mkForeignTyCon :: Name -> Maybe FastString -- ^ Name of the foreign imported thing, maybe -> Kind - -> Arity -> TyCon -mkForeignTyCon name ext_name kind arity +mkForeignTyCon name ext_name kind = PrimTyCon { tyConName = name, tyConUnique = nameUnique name, tc_kind = kind, - tyConArity = arity, + tyConArity = 0, + tc_roles = [], primTyConRep = PtrRep, -- they all do isUnLifted = False, tyConExtName = ext_name @@ -949,41 +983,43 @@ mkForeignTyCon name ext_name kind arity -- | Create an unlifted primitive 'TyCon', such as @Int#@ -mkPrimTyCon :: Name -> Kind -> Arity -> PrimRep -> TyCon -mkPrimTyCon name kind arity rep - = mkPrimTyCon' name kind arity rep True +mkPrimTyCon :: Name -> Kind -> [Role] -> PrimRep -> TyCon +mkPrimTyCon name kind roles rep + = mkPrimTyCon' name kind roles rep True -- | Kind constructors mkKindTyCon :: Name -> Kind -> TyCon mkKindTyCon name kind - = mkPrimTyCon' name kind 0 VoidRep True + = mkPrimTyCon' name kind [] VoidRep True -- | Create a lifted primitive 'TyCon' such as @RealWorld@ -mkLiftedPrimTyCon :: Name -> Kind -> Arity -> PrimRep -> TyCon -mkLiftedPrimTyCon name kind arity rep - = mkPrimTyCon' name kind arity rep False +mkLiftedPrimTyCon :: Name -> Kind -> [Role] -> PrimRep -> TyCon +mkLiftedPrimTyCon name kind roles rep + = mkPrimTyCon' name kind roles rep False -mkPrimTyCon' :: Name -> Kind -> Arity -> PrimRep -> Bool -> TyCon -mkPrimTyCon' name kind arity rep is_unlifted +mkPrimTyCon' :: Name -> Kind -> [Role] -> PrimRep -> Bool -> TyCon +mkPrimTyCon' name kind roles rep is_unlifted = PrimTyCon { tyConName = name, tyConUnique = nameUnique name, tc_kind = kind, - tyConArity = arity, + tyConArity = length roles, + tc_roles = roles, primTyConRep = rep, isUnLifted = is_unlifted, tyConExtName = Nothing } -- | Create a type synonym 'TyCon' -mkSynTyCon :: Name -> Kind -> [TyVar] -> SynTyConRhs -> TyConParent -> TyCon -mkSynTyCon name kind tyvars rhs parent +mkSynTyCon :: Name -> Kind -> [TyVar] -> [Role] -> SynTyConRhs -> TyConParent -> TyCon +mkSynTyCon name kind tyvars roles rhs parent = SynTyCon { tyConName = name, tyConUnique = nameUnique name, tc_kind = kind, tyConArity = length tyvars, tyConTyVars = tyvars, + tc_roles = roles, synTcRhs = rhs, synTcParent = parent } @@ -992,15 +1028,18 @@ mkSynTyCon name kind tyvars rhs parent -- Somewhat dodgily, we give it the same Name -- as the data constructor itself; when we pretty-print -- the TyCon we add a quote; see the Outputable TyCon instance -mkPromotedDataCon :: DataCon -> Name -> Unique -> Kind -> Arity -> TyCon -mkPromotedDataCon con name unique kind arity +mkPromotedDataCon :: DataCon -> Name -> Unique -> Kind -> [Role] -> TyCon +mkPromotedDataCon con name unique kind roles = PromotedDataCon { tyConName = name, tyConUnique = unique, tyConArity = arity, + tc_roles = roles, tc_kind = kind, dataCon = con } + where + arity = length roles -- | Create a promoted type constructor 'TyCon' -- Somewhat dodgily, we give it the same Name @@ -1396,6 +1435,23 @@ algTyConRhs (AlgTyCon {algTcRhs = rhs}) = rhs algTyConRhs (TupleTyCon {dataCon = con, tyConArity = arity}) = DataTyCon { data_cons = [con], is_enum = arity == 0 } algTyConRhs other = pprPanic "algTyConRhs" (ppr other) + +-- | Get the list of roles for the type parameters of a TyCon +tyConRoles :: TyCon -> [Role] +-- See also Note [TyCon Role signatures] +tyConRoles tc + = case tc of + { FunTyCon {} -> const_role Representational + ; AlgTyCon { tc_roles = roles } -> roles + ; TupleTyCon {} -> const_role Representational + ; SynTyCon { tc_roles = roles } -> roles + ; PrimTyCon { tc_roles = roles } -> roles + ; PromotedDataCon { tc_roles = roles } -> roles + ; PromotedTyCon {} -> const_role Nominal + } + where + const_role r = replicate (tyConArity tc) r + \end{code} \begin{code} diff --git a/compiler/types/Type.lhs b/compiler/types/Type.lhs index 993507062d..8596dde439 100644 --- a/compiler/types/Type.lhs +++ b/compiler/types/Type.lhs @@ -48,7 +48,7 @@ module Type ( -- Pred types mkFamilyTyConApp, isDictLikeTy, - mkEqPred, mkPrimEqPred, + mkEqPred, mkPrimEqPred, mkReprPrimEqPred, mkClassPred, noParenPred, isClassPred, isEqPred, isIPPred, isIPPred_maybe, isIPTyCon, isIPClass, @@ -880,6 +880,13 @@ mkPrimEqPred ty1 ty2 TyConApp eqPrimTyCon [k, ty1, ty2] where k = typeKind ty1 + +mkReprPrimEqPred :: Type -> Type -> Type +mkReprPrimEqPred ty1 ty2 + = WARN( not (k `eqKind` typeKind ty2), ppr ty1 $$ ppr ty2 ) + TyConApp eqReprPrimTyCon [k, ty1, ty2] + where + k = typeKind ty1 \end{code} --------------------- Dictionary types --------------------------------- diff --git a/compiler/types/TypeRep.lhs b/compiler/types/TypeRep.lhs index ef79974605..e557a6cbb5 100644 --- a/compiler/types/TypeRep.lhs +++ b/compiler/types/TypeRep.lhs @@ -678,7 +678,7 @@ pprTcApp p pp tc tys sep (punctuate comma (map (pp TopPrec) ty_args))) | not opt_PprStyle_Debug - , getUnique tc `elem` [eqTyConKey, eqPrimTyConKey] + , getUnique tc `elem` [eqTyConKey, eqPrimTyConKey, eqReprPrimTyConKey] -- We need to special case the type equality TyCons because , [_, ty1,ty2] <- tys -- with kind polymorphism it has 3 args, so won't get printed infix -- With -dppr-debug switch this off so we can see the kind diff --git a/compiler/utils/Maybes.lhs b/compiler/utils/Maybes.lhs index 8a612fbb60..859908e266 100644 --- a/compiler/utils/Maybes.lhs +++ b/compiler/utils/Maybes.lhs @@ -14,6 +14,7 @@ module Maybes ( mapCatMaybes, allMaybes, firstJust, firstJusts, + whenIsJust, expectJust, maybeToBool, @@ -68,6 +69,10 @@ mapCatMaybes _ [] = [] mapCatMaybes f (x:xs) = case f x of Just y -> y : mapCatMaybes f xs Nothing -> mapCatMaybes f xs + +whenIsJust :: Monad m => Maybe a -> (a -> m ()) -> m () +whenIsJust (Just x) f = f x +whenIsJust Nothing _ = return () \end{code} \begin{code} diff --git a/compiler/utils/UniqFM.lhs b/compiler/utils/UniqFM.lhs index 680300abd4..862af99443 100644 --- a/compiler/utils/UniqFM.lhs +++ b/compiler/utils/UniqFM.lhs @@ -20,7 +20,7 @@ and ``addToUFM\_C'' and ``Data.IntMap.insertWith'' differ in the order of arguments of combining function. \begin{code} -{-# LANGUAGE GeneralizedNewtypeDeriving #-} +{-# LANGUAGE DeriveTraversable, GeneralizedNewtypeDeriving #-} {-# OPTIONS -Wall #-} module UniqFM ( diff --git a/compiler/utils/Util.lhs b/compiler/utils/Util.lhs index 6d42ce7dfe..dd947ffd93 100644 --- a/compiler/utils/Util.lhs +++ b/compiler/utils/Util.lhs @@ -14,7 +14,7 @@ module Util ( -- * General list processing zipEqual, zipWithEqual, zipWith3Equal, zipWith4Equal, - zipLazy, stretchZipWith, + zipLazy, stretchZipWith, zipWithAndUnzip, unzipWith, @@ -351,6 +351,14 @@ mapAndUnzip3 f (x:xs) in (r1:rs1, r2:rs2, r3:rs3) +zipWithAndUnzip :: (a -> b -> (c,d)) -> [a] -> [b] -> ([c],[d]) +zipWithAndUnzip f (a:as) (b:bs) + = let (r1, r2) = f a b + (rs1, rs2) = zipWithAndUnzip f as bs + in + (r1:rs1, r2:rs2) +zipWithAndUnzip _ _ _ = ([],[]) + mapAccumL2 :: (s1 -> s2 -> a -> (s1, s2, b)) -> s1 -> s2 -> [a] -> (s1, s2, [b]) mapAccumL2 f s1 s2 xs = (s1', s2', ys) where ((s1', s2'), ys) = mapAccumL (\(s1, s2) x -> case f s1 s2 x of diff --git a/compiler/vectorise/Vectorise/Generic/PAMethods.hs b/compiler/vectorise/Vectorise/Generic/PAMethods.hs index 9390696fc7..269119c6dd 100644 --- a/compiler/vectorise/Vectorise/Generic/PAMethods.hs +++ b/compiler/vectorise/Vectorise/Generic/PAMethods.hs @@ -218,7 +218,7 @@ buildToArrPRepr vect_tc repr_co pdata_tc _ r pdata_co <- mkBuiltinCo pdataTyCon let co = mkAppCo pdata_co . mkSymCo - $ mkUnbranchedAxInstCo repr_co ty_args + $ mkUnbranchedAxInstCo Nominal repr_co ty_args scrut = unwrapFamInstScrut pdata_tc ty_args (Var arg) @@ -282,7 +282,7 @@ buildFromArrPRepr vect_tc repr_co pdata_tc _ r pdata_co <- mkBuiltinCo pdataTyCon let co = mkAppCo pdata_co - $ mkUnbranchedAxInstCo repr_co var_tys + $ mkUnbranchedAxInstCo Nominal repr_co var_tys let scrut = mkCast (Var arg) co @@ -368,7 +368,7 @@ buildToArrPReprs vect_tc repr_co _ pdatas_tc r pdatas_co <- mkBuiltinCo pdatasTyCon let co = mkAppCo pdatas_co . mkSymCo - $ mkUnbranchedAxInstCo repr_co ty_args + $ mkUnbranchedAxInstCo Nominal repr_co ty_args let scrut = unwrapFamInstScrut pdatas_tc ty_args (Var varg) (vars, result) <- to_sum r @@ -458,7 +458,7 @@ buildFromArrPReprs vect_tc repr_co _ pdatas_tc r -- Build the coercion between PRepr and the instance type pdatas_co <- mkBuiltinCo pdatasTyCon let co = mkAppCo pdatas_co - $ mkUnbranchedAxInstCo repr_co var_tys + $ mkUnbranchedAxInstCo Nominal repr_co var_tys let scrut = mkCast (Var varg) co diff --git a/compiler/vectorise/Vectorise/Generic/PData.hs b/compiler/vectorise/Vectorise/Generic/PData.hs index 6b06996ec8..37358c9bdf 100644 --- a/compiler/vectorise/Vectorise/Generic/PData.hs +++ b/compiler/vectorise/Vectorise/Generic/PData.hs @@ -52,6 +52,7 @@ buildDataFamInst name' fam_tc vect_tc rhs pat_tys = [mkTyConApp vect_tc tys'] rep_tc = buildAlgTyCon name' tyvars' + (map (const Nominal) tyvars') Nothing [] -- no stupid theta rhs diff --git a/compiler/vectorise/Vectorise/Type/Env.hs b/compiler/vectorise/Vectorise/Type/Env.hs index 66db6185da..34008efbbd 100644 --- a/compiler/vectorise/Vectorise/Type/Env.hs +++ b/compiler/vectorise/Vectorise/Type/Env.hs @@ -354,7 +354,7 @@ vectTypeEnv tycons vectTypeDecls vectClassDecls origName = tyConName origTyCon vectName = tyConName vectTyCon - mkSyn canonName ty = mkSynTyCon canonName (typeKind ty) [] (SynonymTyCon ty) NoParentTyCon + mkSyn canonName ty = mkSynTyCon canonName (typeKind ty) [] [] (SynonymTyCon ty) NoParentTyCon defDataCons | isAbstract = return () diff --git a/compiler/vectorise/Vectorise/Type/TyConDecl.hs b/compiler/vectorise/Vectorise/Type/TyConDecl.hs index 588cd39ec0..935ea32c69 100644 --- a/compiler/vectorise/Vectorise/Type/TyConDecl.hs +++ b/compiler/vectorise/Vectorise/Type/TyConDecl.hs @@ -62,6 +62,7 @@ vectTyConDecl tycon name' False -- include unfoldings on dictionary selectors name' -- new name: "V:Class" (tyConTyVars tycon) -- keep original type vars + (map (const Nominal) (tyConRoles tycon)) -- all role are N for safety theta' -- superclasses (snd . classTvsFds $ cls) -- keep the original functional dependencies [] -- no associated types (for the moment) @@ -100,6 +101,7 @@ vectTyConDecl tycon name' ; return $ buildAlgTyCon name' -- new name (tyConTyVars tycon) -- keep original type vars + (map (const Nominal) (tyConRoles tycon)) -- all roles are N for safety Nothing [] -- no stupid theta rhs' -- new constructor defs diff --git a/compiler/vectorise/Vectorise/Utils/Base.hs b/compiler/vectorise/Vectorise/Utils/Base.hs index 0bd54f4408..cb7b34e36a 100644 --- a/compiler/vectorise/Vectorise/Utils/Base.hs +++ b/compiler/vectorise/Vectorise/Utils/Base.hs @@ -128,12 +128,12 @@ splitPrimTyCon ty -- Coercion Construction ----------------------------------------------------- --- |Make a coersion to some builtin type. +-- |Make a representational coersion to some builtin type. -- mkBuiltinCo :: (Builtins -> TyCon) -> VM Coercion mkBuiltinCo get_tc = do { tc <- builtin get_tc - ; return $ mkTyConAppCo tc [] + ; return $ mkTyConAppCo Representational tc [] } diff --git a/compiler/vectorise/Vectorise/Utils/PADict.hs b/compiler/vectorise/Vectorise/Utils/PADict.hs index 84a6ff37d9..01fbede4bd 100644 --- a/compiler/vectorise/Vectorise/Utils/PADict.hs +++ b/compiler/vectorise/Vectorise/Utils/PADict.hs @@ -145,7 +145,7 @@ prDictOfPReprInstTyCon _ty prepr_ax prepr_args pr_co <- mkBuiltinCo prTyCon let co = mkAppCo pr_co $ mkSymCo - $ mkUnbranchedAxInstCo prepr_ax prepr_args + $ mkUnbranchedAxInstCo Nominal prepr_ax prepr_args return $ mkCast dict co -- |Get the PR dictionary for a type. The argument must be a representation diff --git a/docs/core-spec/CoreLint.ott b/docs/core-spec/CoreLint.ott index c452877ad5..c2dba49612 100644 --- a/docs/core-spec/CoreLint.ott +++ b/docs/core-spec/CoreLint.ott @@ -1,3 +1,9 @@ +%% +%% CoreLint.ott +%% +%% defines formal version of core typing rules +%% +%% See accompanying README file %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% Static semantics %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% @@ -54,7 +60,7 @@ t = literalType lit G |-tm lit : t G |-tm e : s -G |-co g : s ~#k t +G |-co g : s ~Rep k t ------------------- :: Cast G |-tm e |> g : t @@ -115,7 +121,7 @@ G |-ty t : k2 ---------------------------------------------------- :: Case G |-tm case e as z_s return t of : t -G |-co g : t1 ~#k t2 +G |-co g : t1 ~Nom k t2 -------------------- :: Coercion G |-tm g : t1 ~#k t2 @@ -144,88 +150,101 @@ G |-ki k ok ---------------------------------------- :: TyVar G |-bnd alpha_k ok -defn G |- co g : t1 ~# k t2 :: :: lintCoercion :: 'Co_' +defn G |- co g : t1 ~ R k t2 :: :: lintCoercion :: 'Co_' {{ com Coercion typing, \coderef{coreSyn/CoreLint.lhs}{lintCoercion} }} - {{ tex [[G]] \labeledjudge{co} [[g]] : [[t1]] \mathop{\sim_{\#}^{[[k]]} } [[t2]] }} + {{ tex [[G]] \labeledjudge{co} [[g]] : [[t1]] \mathop{\sim_{[[R]]}^{[[k]]} } [[t2]] }} by G |-ty t : k ---------------------- :: Refl -G |-co : t ~#k t +G |-co _R : t ~R k t -G |-co g1 : s1 ~#k1 t1 -G |-co g2 : s2 ~#k2 t2 +G |-co g1 : s1 ~R k1 t1 +G |-co g2 : s2 ~R k2 t2 G |-arrow k1 -> k2 : k ------------------------- :: TyConAppCoFunTy -G |-co (->) g1 g2 : (s1 -> s2) ~#k (t1 -> t2) +G |-co (->)_R g1 g2 : (s1 -> s2) ~R k (t1 -> t2) T /= (->) - + = tyConRolesX R T + G |-app : tyConKind T ~> k --------------------------------- :: TyConAppCo -G |-co T : T ~#k T +G |-co T_R : T ~R k T -G |-co g1 : s1 ~#k1 t1 -G |-co g2 : s2 ~#k2 t2 +G |-co g1 : s1 ~R k1 t1 +G |-co g2 : s2 ~Nom k2 t2 G |-app (s2 : k2) : k1 ~> k --------------------- :: AppCo -G |-co g1 g2 : (s1 s2) ~#k (t1 t2) +G |-co g1 g2 : (s1 s2) ~R k (t1 t2) + +G |-co g1 : s1 ~Ph k1 t1 +G |-co g2 : s2 ~Ph k2 t2 +G |-app (s2 : k2) : k1 ~> k +--------------------- :: AppCoPhantom +G |-co g1 g2 : (s1 s2) ~Ph k (t1 t2) G |-ki k1 ok -G, z_k1 |-co g : s ~#k2 t +G, z_k1 |-co g : s ~R k2 t --------------------------- :: ForAllCo -G |-co forall z_k1. g : (forall z_k1.s) ~#k2 (forall z_k1.t) +G |-co forall z_k1. g : (forall z_k1.s) ~R k2 (forall z_k1.t) z_(t ~#BOX t) elt G ----------------------- :: CoVarCoBox -G |-co z_(t ~#BOX t) : t ~#BOX t +G |-co z_(t ~#BOX t) : t ~Nom BOX t z_(s ~#k t) elt G k /= BOX ------------------------ :: CoVarCo -G |-co z_(s ~#k t) : s ~#k t +----------------------- :: CoVarCoNom +G |-co z_(s ~#k t) : s ~Nom k t + +z_(s ~R#k t) elt G +k /= BOX +----------------------- :: CoVarCoRepr +G |-co z_(s ~R#k t) : s ~Rep k t G |-ty t1 : k ------------------------------ :: UnsafeCo -G |-co t1 ==>! t2 : t1 ~#k t2 +----------------------------- :: UnivCo +G |-co t1 ==>!_R t2 : t1 ~R k t2 -G |-co g : t1 ~#k t2 +G |-co g : t1 ~R k t2 ------------------------- :: SymCo -G |-co sym g : t2 ~#k t1 +G |-co sym g : t2 ~R k t1 -G |-co g1 : t1 ~#k t2 -G |-co g2 : t2 ~#k t3 +G |-co g1 : t1 ~R k t2 +G |-co g2 : t2 ~R k t3 ----------------------- :: TransCo -G |-co g1 ; g2 : t1 ~#k t3 +G |-co g1 ; g2 : t1 ~R k t3 -G |-co g : (T ) ~#k (T ) +G |-co g : (T ) ~R k (T ) length = length i < length G |-ty si : k +R' = (tyConRolesX R T)[i] ---------------------- :: NthCo -G |-co nth i g : si ~#k ti +G |-co nth i g : si ~R' k ti -G |-co g : (s1 s2) ~#k (t1 t2) +G |-co g : (s1 s2) ~Nom k' (t1 t2) G |-ty s1 : k ----------------------- :: LRCoLeft -G |-co Left g : s1 ~#k t1 +G |-co Left g : s1 ~Nom k t1 -G |-co g : (s1 s2) ~#k (t1 t2) +G |-co g : (s1 s2) ~Nom k' (t1 t2) G |-ty s2 : k ----------------------- :: LRCoRight -G |-co Right g : s2 ~#k t2 +G |-co Right g : s2 ~Nom k t2 -G |-co g : forall m.s ~#k forall n.t +G |-co g : forall m.s ~R k forall n.t G |-ty t0 : k0 m = z_k1 k0 <: k1 --------------------- :: InstCo -G |-co g t0 : s[m |-> t0] ~#k t[n |-> t0] +G |-co g t0 : s[m |-> t0] ~R k t[n |-> t0] -C = T +C = T_R0 0 <= ind < length -forall . ( ~> t1) = ()[ind] - +forall . ( ~> t1) = ()[ind] + = inits( s'i ] // i />) @@ -234,7 +253,76 @@ no_conflict(C, , ind, ind-1) t2 = t1 t'i] // i /> G |-ty t2 : k ------------------------------------------------------ :: AxiomInstCo -G |-co C ind : T ~#k t2 +G |-co C ind : T ~R0 k t2 + +defn validRoles T :: :: checkValidRoles :: 'Cvr_' + {{ com Type constructor role validity, \coderef{typecheck/TcTyClsDecls.lhs}{checkValidRoles} }} +by + + = tyConDataCons T + = tyConRoles T + Ki // i /> +------------------------------------ :: DataCons +validRoles T + +defn validDcRoles K :: :: check_dc_roles :: 'Cdr_' + {{ com Data constructor role validity, \coderef{typecheck/TcTyClsDecls.lhs}{check\_dc\_roles} }} +by + +forall . forall . @ -> T = dataConRepType K +, |- tcc : Rep // cc /> +--------------------------------- :: Args +validDcRoles K + +defn O |- t : R :: :: check_ty_roles :: 'Ctr_' + {{ com Type role validity, \coderef{typecheck/TcTyClsDecls.lhs}{check\_ty\_roles} }} + {{ tex [[O]] \labeledjudge{ctr} [[t]] : [[R]] }} +by + +O(n) = R' +R' <= R +---------- :: TyVarTy +O |- n : R + + = tyConRoles T + O |- ti : Ri // i /> +-------------------------- :: TyConAppRep +O |- T : Rep + + +--------------------------- :: TyConAppNom +O |- T : Nom + +O |- t1 : R +O |- t2 : Nom +-------------------------- :: AppTy +O |- t1 t2 : R + +O |- t1 : R +O |- t2 : R +------------------- :: FunTy +O |- t1 -> t2 : R + +O, n : Nom |- t : R +--------------------- :: ForAllTy +O |- forall n. t : R + +------------------ :: LitTy +O |- lit : R + +defn R1 <= R2 :: :: ltRole :: 'Rlt_' + {{ com Sub-role relation, \coderef{types/Coercion.lhs}{ltRole} }} + {{ tex [[R1]] \leq [[R2]] }} +by + +-------- :: Nominal +Nom <= R + +-------- :: Phantom +R <= Ph + +------- :: Refl +R <= R defn G |- ki k ok :: :: lintKind :: 'K_' {{ com Kind validity, \coderef{coreSyn/CoreLint.lhs}{lintKind} }} @@ -410,24 +498,24 @@ by ------------------------------------------------ :: NoBranch no_conflict(C, , ind, -1) -C = T -forall . ( ~> t') = ()[ind2] +C = T_R +forall . ( ~> t') = ()[ind2] apart(, ) no_conflict(C, , ind1, ind2-1) ------------------------------------------------ :: Incompat no_conflict(C, , ind1, ind2) -C = T -forall . ( ~> s) = ()[ind1] -forall . ( ~> s') = ()[ind2] +C = T_R +forall . ( ~> s) = ()[ind1] +forall . ( ~> s') = ()[ind2] apart(, ) no_conflict(C, , ind1, ind2-1) ------------------------------------------- :: CompatApart no_conflict(C, , ind1, ind2) -C = T -forall . ( ~> s) = ()[ind1] -forall . ( ~> s') = ()[ind2] +C = T_R +forall . ( ~> s) = ()[ind1] +forall . ( ~> s') = ()[ind2] unify(, ) = subst subst(s) = subst(s') ----------------------------------------- :: CompatCoincident diff --git a/docs/core-spec/CoreSyn.ott b/docs/core-spec/CoreSyn.ott index e6fae08956..ca060f2f72 100644 --- a/docs/core-spec/CoreSyn.ott +++ b/docs/core-spec/CoreSyn.ott @@ -1,3 +1,9 @@ +%% +%% CoreSyn.ott +%% +%% defines formal version of core syntax +%% +%% See accompanying README file embed {{ tex-preamble \newcommand{\coderef}[2]{\ghcfile{#1}:\texttt{#2}% @@ -93,6 +99,8 @@ t {{ tex \tau }}, k {{ tex \kappa }}, s {{ tex \sigma }} | tyConKind T :: M :: tyConKind {{ com \coderef{types/TyCon.lhs}{tyConKind} }} | t1 ~# k t2 :: M :: unliftedEq {{ com Metanotation for coercion types }} {{ tex [[t1]] \mathop{\sim_{\#}^{[[k]]} } [[t2]] }} + | t1 ~R# k t2 :: M :: unliftedREq {{ com Metanotation for coercion types }} + {{ tex [[t1]] \mathop{\sim_{\mathsf{R}\#}^{[[k]]} } [[t2]] }} | literalType t :: M :: literalType {{ com \coderef{basicTypes/Literal.lhs}{literalType} }} | ( t ) :: M :: parens {{ com Parentheses }} | t [ n |-> s ] :: M :: TySubst {{ com Type substitution }} @@ -106,14 +114,14 @@ t {{ tex \tau }}, k {{ tex \kappa }}, s {{ tex \sigma }} %% COERCIONS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% g {{ tex \gamma }} :: 'Coercion_' ::= {{ com Coercions, \coderef{types/Coercion.lhs}{Coercion} }} - | < t > :: :: Refl {{ com Reflexivity }} - {{ tex \langle [[t]] \rangle }} - | T :: :: TyConAppCo {{ com Type constructor application }} + | < t > _ R :: :: Refl {{ com Reflexivity }} + {{ tex {\langle [[t]] \rangle}_{[[R]]} }} + | T RA :: :: TyConAppCo {{ com Type constructor application }} | g1 g2 :: :: AppCo {{ com Application }} | forall n . g :: :: ForAllCo {{ com Polymorphism }} | n :: :: CoVarCo {{ com Variable }} | C ind :: :: AxiomInstCo {{ com Axiom application }} - | t1 ==>! t2 :: :: UnsafeCo {{ com Unsafe coercion }} + | t1 ==>! RA t2 :: :: UnivCo {{ com Universal coercion }} | sym g :: :: SymCo {{ com Symmetry }} | g1 ; g2 :: :: TransCo {{ com Transitivity }} | nth I g :: :: NthCo {{ com Projection (0-indexed) }} @@ -128,12 +136,21 @@ LorR :: 'LeftOrRight_' ::= {{ com left or right deconstructor, \coderef{types/Co | Right :: :: CRight {{ com Right projection }} C :: 'CoAxiom_' ::= {{ com Axioms, \coderef{types/TyCon.lhs}{CoAxiom} }} - | T :: :: CoAxiom {{ com Axiom }} + | T RA :: :: CoAxiom {{ com Axiom }} | ( C ) :: M :: Parens {{ com Parentheses }} +R {{ tex \rho }} :: 'Role_' ::= {{ com Roles, \coderef{types/CoAxiom.lhs}{Role} }} + | Nom :: :: Nominal {{ com Nominal }} + {{ tex \mathsf{N} }} + | Rep :: :: Representational {{ com Representational }} + {{ tex \mathsf{R} }} + | Ph :: :: Phantom {{ com Phantom }} + {{ tex \mathsf{P} }} + | role_list [ i ] :: M :: RoleListIndex {{ com Look up in list }} + axBranch, b :: 'CoAxBranch_' ::= {{ com Axiom branches, \coderef{types/TyCon.lhs}{CoAxBranch} }} - | forall . ( ~> s ) :: :: CoAxBranch {{ com Axiom branch }} - | ( ) [ ind ] :: M :: lookup {{ com List lookup }} + | forall . ( ~> s ) :: :: CoAxBranch {{ com Axiom branch }} + | ( ) [ ind ] :: M :: lookup {{ com List lookup }} %% TYCONS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% @@ -149,13 +166,14 @@ T :: 'TyCon_' ::= {{ com Type constructors, \coderef{types/TyCon.lhs}{TyCon} }} | dataConTyCon K :: M :: dataConTyCon {{ com TyCon extracted from DataCon }} H :: 'PrimTyCon_' ::= {{ com Primitive type constructors, \coderef{prelude/TysPrim.lhs}{} }} - | Int# :: :: intPrimTyCon {{ com Unboxed Int }} - | ( ~# ) :: :: eqPrimTyCon {{ com Unboxed equality }} - | BOX :: :: superKindTyCon {{ com Sort of kinds }} - | * :: :: liftedTypeKindTyCon {{ com Kind of lifted types }} - | # :: :: unliftedTypeKindTyCon {{ com Kind of unlifted types }} - | OpenKind :: :: openTypeKindTyCon {{ com Either $*$ or $\#$ }} - | Constraint :: :: constraintTyCon {{ com Constraint }} + | Int# :: :: intPrimTyCon {{ com Unboxed Int (\texttt{intPrimTyCon}) }} + | ( ~# ) :: :: eqPrimTyCon {{ com Unboxed equality (\texttt{eqPrimTyCon}) }} + | ( ~R# ) :: :: eqReprPrimTyCon {{ com Unboxed representational equality (\texttt{eqReprPrimTyCon}) }} + | BOX :: :: superKindTyCon {{ com Sort of kinds (\texttt{superKindTyCon}) }} + | * :: :: liftedTypeKindTyCon {{ com Kind of lifted types (\texttt{liftedTypeKindTyCon}) }} + | # :: :: unliftedTypeKindTyCon {{ com Kind of unlifted types (\texttt{unliftedTypeKindTyCon}) }} + | OpenKind :: :: openTypeKindTyCon {{ com Either $*$ or $\#$ (\texttt{openTypeKindTyCon}) }} + | Constraint :: :: constraintTyCon {{ com Constraint (\texttt{constraintTyCon}) }} %% CONTEXTS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% @@ -164,6 +182,10 @@ G {{ tex \Gamma }} :: 'LintM_Bindings_' ::= {{ com List of bindings, \coderef{co | :: :: Concat {{ com Context concatenation }} | vars_of binding :: M :: VarsOf {{ com \coderef{coreSyn/CoreSyn.lhs}{bindersOf} }} +O {{ tex \Omega }} :: 'VarEnv_Role_' ::= {{ com Mapping from type variables to roles }} + | :: :: List {{ com List of bindings }} + | O1 , O2 :: M :: Concat {{ com Concatenate two lists }} + S {{ tex \Sigma }} :: 'St_' ::= {{ com Runtime store }} | [ n |-> e ] :: :: Binding {{ com Single binding }} | :: :: Concat {{ com Store concatentation }} @@ -201,6 +223,17 @@ ind, I {{ tex i }} :: 'Ind_' ::= {{ com Indices, numbers }} type_list :: 'TypeList_' ::= {{ com List of types }} | :: :: List +RA {{ tex {\!\!\!{}_{\rho} } }} :: 'RoleAnnot_' ::= {{ com Role annotation }} + | _ R :: M :: annotation + {{ tex {}_{[[R]]} }} + +role_list :: 'RoleList_' ::= {{ com List of roles }} + | :: :: List + | tyConRolesX R T :: M :: tyConRolesX + | tyConRoles T :: M :: tyConRoles + | ( role_list ) :: M :: Parens + | { role_list } :: M :: Braces + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% Terminals %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% @@ -226,6 +259,7 @@ terminals :: 'terminals_' ::= | BOX :: :: BOX {{ tex \Box }} | Int# :: :: int_hash {{ tex {\textsf{Int} }_{\#} }} | ~# :: :: eq_hash {{ tex \mathop{ {\sim}_{\#} } }} + | ~R# :: :: eq_repr_hash {{ tex \mathop{ {\sim}_{\mathsf{R}\#} } }} | OpenKind :: :: OpenKind {{ tex \textsf{OpenKind} }} | ok :: :: ok {{ tex \textsf{ ok} }} | no_duplicates :: :: no_duplicates {{ tex \textsf{no\_duplicates } }} @@ -257,6 +291,11 @@ terminals :: 'terminals_' ::= | no_conflict :: :: no_conflict {{ tex \textsf{no\_conflict} }} | apart :: :: apart {{ tex \textsf{apart} }} | unify :: :: unify {{ tex \textsf{unify} }} + | tyConRolesX :: :: tyConRolesX {{ tex \textsf{tyConRolesX} }} + | tyConRoles :: :: tyConRoles {{ tex \textsf{tyConRoles} }} + | tyConDataCons :: :: tyConDataCons {{ tex \textsf{tyConDataCons} }} + | validRoles :: :: validRoles {{ tex \textsf{validRoles} }} + | validDcRoles :: :: validDcRoles {{ tex \textsf{validDcRoles} }} | --> :: :: steps {{ tex \longrightarrow }} | coercionKind :: :: coercionKind {{ tex \textsf{coercionKind} }} @@ -303,6 +342,14 @@ formula :: 'formula_' ::= | C1 = C2 :: :: axiom_rewrite | apart ( , ) :: :: apart | unify ( , ) = subst :: :: unify + | role_list1 = role_list2 :: :: eq_role_list + | R1 /= R2 :: :: role_neq + | R1 = R2 :: :: eq_role + | = tyConDataCons T :: :: tyConDataCons + | O ( n ) = R :: :: role_lookup + | R elt role_list :: :: role_elt + | formula1 => formula2 :: :: implication + {{ tex [[formula1]] \implies [[formula2]] }} | alt1 = alt2 :: :: alt_rewrite | e1 = e2 :: :: e_rewrite | no other case matches :: :: no_other_case @@ -336,4 +383,6 @@ Subst_TmMapping <= Type_TySubstListPost Expr_Type <= formula_e_rewrite +Coercion_TyConAppCo <= Coercion_AppCo + Expr_Coercion <= Subst_TmMapping diff --git a/docs/core-spec/OpSem.ott b/docs/core-spec/OpSem.ott index 53e1f288a9..1c21ada0ec 100644 --- a/docs/core-spec/OpSem.ott +++ b/docs/core-spec/OpSem.ott @@ -83,7 +83,7 @@ S |- case e as n return t of --> u[n |-> e] T ~#k T = coercionKind g forall . forall . @-> T = dataConRepType K - (t1cc @ nth aa g] // aa /> ] // bb />) // cc /> + (t1cc @ nth aa g] // aa /> _Nom] // bb />) // cc /> --------------------------- :: CasePush S |- case (K ) |> g as n return t2 of --> case K as n return t2 of diff --git a/docs/core-spec/README b/docs/core-spec/README index e193955490..1fb304d261 100644 --- a/docs/core-spec/README +++ b/docs/core-spec/README @@ -64,7 +64,7 @@ your notation to LaTeX. Three different homs are used: help disambiguate otherwise-ambiguous parses. Getting these right is hard, so if you have trouble, you're not alone. -- In one place, it was necessary to use an @ symbol to disambiguate parses. The +- In a few places, it is necessary to use an @ symbol to disambiguate parses. The @ symbol is not typeset and is used solely for disambiguation. Feel free to use it if necessary to disambiguate other parses. diff --git a/docs/core-spec/core-spec.mng b/docs/core-spec/core-spec.mng index 246be067fc..2e8134c7a1 100644 --- a/docs/core-spec/core-spec.mng +++ b/docs/core-spec/core-spec.mng @@ -7,6 +7,7 @@ \usepackage{xcolor} \usepackage{fullpage} \usepackage{multirow} +\usepackage{url} \newcommand{\ghcfile}[1]{\textsl{#1}} \newcommand{\arraylabel}[1]{\multicolumn{2}{l}{\!\!\!\!\!\!\!\!\!\text{\underline{#1}:}}} @@ -19,7 +20,7 @@ \setlength{\parindent}{0in} \setlength{\parskip}{1ex} -\newcommand{\gram}[1]{\ottgrammartabular{#1\ottinterrule}} +\newcommand{\gram}[1]{\ottgrammartabular{#1\ottafterlastrule}} \begin{document} @@ -148,13 +149,21 @@ a term-level literal, but we are ignoring this distinction here. Invariants on coercions: \begin{itemize} -\item $[[]]$ is used; never $[[ ]]$. -\item If $[[]]$ is applied to some coercions, at least one of which is not -reflexive, use $[[T ]]$, never $[[ g1 g2]] \ldots$. -\item The $[[T]]$ in $[[T ]]$ is never a type synonym, though it could +\item $[[_R]]$ is used; never $[[_R _Nom]]$. +\item If $[[_R]]$ is applied to some coercions, at least one of which is not +reflexive, use $[[T_R ]]$, never $[[_R g1 g2]] \ldots$. +\item The $[[T]]$ in $[[T_R ]]$ is never a type synonym, though it could be a type function. \end{itemize} +Roles label what equality relation a coercion is a witness of. Nominal equality +means that two types are identical (have the same name); representational equality +means that two types have the same representation (introduced by newtypes); and +phantom equality includes all types. See \url{http://ghc.haskell.org/trac/ghc/wiki/Roles} +for more background. + +\gram{\ottR} + Is it a left projection or a right projection? \gram{\ottLorR} @@ -285,12 +294,22 @@ a dead id and for one-tuples. These checks are omitted here. \subsection{Coercion typing} +In the coercion typing judgment, the $\#$ marks are left off the equality +operators to reduce clutter. This is not actually inconsistent, because +the GHC function that implements this check, \texttt{lintCoercion}, actually +returns four separate values (the kind, the two types, and the role), not +a type with head $[[(~#)]]$ or $[[(~R#)]]$. Note that the difference between +these two forms of equality is interpreted in the rules \ottdrulename{Co\_CoVarCoNom} +and \ottdrulename{Co\_CoVarCoRepr}. + \ottdefnlintCoercion{} In \ottdrulename{Co\_AxiomInstCo}, the use of $[[inits]]$ creates substitutions from the first $i$ mappings in $[[ si] // i /> ]]$. This has the effect of folding the substitution over the kinds for kind-checking. +See Section~\ref{sec:tyconroles} for more information about $[[tyConRolesX]]$. + \subsection{Name consistency} There are two very similar checks for names, one declared as a local function: @@ -327,6 +346,31 @@ There are two very similar checks for names, one declared as a local function: \ottdefnisSubKind{} +\subsection{Roles} +\label{sec:tyconroles} + +During type-checking, role inference is carried out, assigning roles to the +arguments of every type constructor. The function $[[tyConRoles]]$ extracts these +roles. Also used in other judgments is $[[tyConRolesX]]$, which is the same as +$[[tyConRoles]]$, but with an arbitrary number of $[[Nom]]$ at the end, to account +for potential oversaturation. + +The checks encoded in the following +judgments are run from \coderef{typecheck/TcTyClsDecls.lhs}{checkValidTyCon} +when \texttt{-dcore-lint} is set. + +\ottdefncheckValidRoles{} + +\ottdefncheckXXdcXXroles{} + +In the following judgment, the role $[[R]]$ is an \emph{input}, not an output. + +\ottdefncheckXXtyXXroles{} + +These judgments depend on a sub-role relation: + +\ottdefnltRole{} + \subsection{Branched axiom conflict checking} \label{sec:no_conflict} diff --git a/docs/core-spec/core-spec.pdf b/docs/core-spec/core-spec.pdf index 180d9bed78ad811e4f55535f8ea3898f4bf16c35..cb21286abb3bd055dd568414a6929ce19261bd5c 100644 GIT binary patch delta 212019 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�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%0Dco2-Zauk7}s^E}J(e6jg+x@vr1kmI`l(Gx7Tt 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 delta 201494 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 diff --git a/docs/users_guide/glasgow_exts.xml b/docs/users_guide/glasgow_exts.xml index f972a4bd56..8111a81e63 100644 --- a/docs/users_guide/glasgow_exts.xml +++ b/docs/users_guide/glasgow_exts.xml @@ -3525,7 +3525,7 @@ dictionary, only slower! - Generalising the deriving clause + Generalising the deriving clause GHC now permits such instances to be derived instead, using the flag , @@ -3646,6 +3646,8 @@ where derive these classes for a newtype, but it happens in the usual way, not via this new mechanism. + + The role of the last parameter of each of the ci is not N. (See .) Then, for each ci, the derived instance declaration is: @@ -10707,7 +10709,214 @@ Jose Pedro Magalhaes, Atze Dijkstra, Johan Jeuring, and Andres Loeh. + +Roles +<indexterm><primary>roles</primary></indexterm> + + + +Using (), a programmer can take existing +instances of classes and "lift" these into instances of that class for a +newtype. However, this is not always safe. For example, consider the following: + + + + newtype Age = MkAge { unAge :: Int } + + type family Inspect x + type instance Inspect Age = Int + type instance Inspect Int = Bool + + class BadIdea a where + bad :: a -> Inspect a + + instance BadIdea Int where + bad = (> 0) + + deriving instance BadIdea Age -- not allowed! + + + +If the derived instance were allowed, what would the type of its method +bad be? It would seem to be Age -> Inspect +Age, which is equivalent to Age -> Int, according +to the type family Inspect. Yet, if we simply adapt the +implementation from the instance for Int, the implementation +for bad produces a Bool, and we have trouble. + + + +The way to identify such situations is to have roles assigned +to type variables of datatypes, classes, and type synonyms. + + +Roles as implemented in GHC are a from a simplified version of the work +described in Generative +type abstraction and type-level computation, published at POPL 2011. + + +Nominal, Representational, and Phantom + +The goal of the roles system is to track when two types have the same +underlying representation. In the example above, Age and +Int have the same representation. But, the corresponding +instances of BadIdea would not have +the same representation, because the types of the implementations of +bad would be different. + +Suppose we have two uses of a type constructor, each applied to the same +parameters except for one difference. (For example, T Age Bool +c and T Int Bool c for some type +T.) The role of a type parameter says what we need to +know about the two differing type arguments in order to know that the two +outer types have the same representation (in the example, what must be true +about Age and Int in order to show that +T Age Bool c has the same representation as +T Int Bool c). + +GHC supports three different roles for type parameters: nominal, +representational, and phantom. If a type parameter has a nominal (N) role, +then the two types that differ must not actually differ at all: they must be +identical (after type family reduction). If a type parameter has a +representational (R) role, then the two types must have the same +representation. (If T's first parameter's role is R, then +T Age Bool c and T Int Bool c would have +the same representation, because Age and Int +have the same representation.) If a type parameter has a phantom (P) role, +then we need no further information. + +Here are some examples: + + + data Simple a = MkSimple a -- a has role R + + type family F + type instance F Int = Bool + type instance F Age = Char + + data Complex a = MkComplex (F a) -- a has role N + + data Phant a = MkPhant Bool -- a has role P + + +The type Simple has its parameter at role R, which is +generally the most common case. Simple Age would have the same +representation as Simple Int. The type Complex, +on the other hand, has its parameter at role N, because Simple Age +and Simple Int are not the same. Lastly, +Phant Age and Phant Bool have the same +representation, even though Age and Bool +are unrelated. + + + + +Role inference + + +What role should a given type parameter should have? GHC performs role +inference to determine the correct role for every parameter. It starts with a +few base facts: (->) has two R parameters; +(~) has two N parameters; all type families' parameters are +N; and all GADT-like parameters are N. Then, these facts are propagated to all +places where these types are used. By defaulting parameters to role P, any +parameters unused in the right-hand side (or used only in other types in P +positions) will be P. Whenever a parameter is used in an R position (that is, +used as a type argument to a constructor whose corresponding variable is at +role R), we raise its role from P to R. Similarly, when a parameter is used in +an N position, its role is upgraded to N. We never downgrade a role from N to +P or R, or from R to P. In this way, we infer the most-general role for each +parameter. + + +There is one particularly tricky case that should be explained: + + + data Tricky a b = MkTricky (a b) + + +What should Tricky's roles be? At first blush, it would +seem that both a and b should be at role R, +since both are used in the right-hand side and neither is involved in a type family. +However, this would be wrong, as the following example shows: + + data Nom a = MkNom (F a) -- type family F from example above + + +Is Tricky Nom Age representationally equal to +Tricky Nom Int? No! The former stores a Char +and the latter stores a Bool. The solution to this is +to require all parameters to type variables to have role N. Thus, GHC would +infer role R for a but role N for b. + + + + +Role annotations +<indexterm><primary>-XRoleAnnotations</primary></indexterm> + + + +Sometimes the programmer wants to constrain the inference process. For +example, the base library contains the following definition: + + + + data Ptr a = Ptr Addr# + + + +The idea is that a should really be an R parameter, but +role inference assigns it to P. This makes some level of sense: a pointer to +an Int really is representationally the same as a pointer +to a Bool. But, that's not at all how we want to use +Ptrs! So, we want to be able to say + + + data Ptr a@R = Ptr Addr# + + + +The @R (enabled with ) annotation forces the +parameter a to be at role R, not role P. GHC then checks +the user-supplied roles to make sure they don't break any promises. It would +be bad, for example, if the user could make BadIdea's role be R. + + +The other place where role annotations may be necessary are in +hs-boot files (), where +the right-hand sides of definitions can be omitted. As usual, the +types/classes declared in an hs-boot file must match up +with the definitions in the hs file, including down to the +roles. The default role is R in hs-boot files, +corresponding to the common use case. + + +Role annotations are allowed on type variables in data, newtype, class, +and type declarations. They are not allowed on type/data family +declarations or in explicit foralls in function type signatures. +The syntax for a role annotation is an @ sign followed +by one of N, R, or P, +directly following a type variable. If the type variable has an explicit +kind annotation, the role annotation goes after the kind annotation, outside +the parentheses. Here are some examples: + + + data T1 a b@P = MkT1 a -- b is not used; annotation is fine but unnecessary + data T2 a b@P = MkT2 b -- ERROR: b is used and cannot be P + data T3 a b@N = MkT3 a -- OK: N is higher than necessary, but safe + data T4 (a :: * -> *)@N = MkT4 (a Int) -- OK, but N is higher than necessary + class C a@R b where ... -- OK + type X a@N = ... -- OK + type family F a@R -- ERROR: annotations not allowed on family declarations + + + + +