[commit: ghc] wip/rae: Change treatment of CUSKs for synonyms and families (#9200). (077d880)
git at git.haskell.org
git at git.haskell.org
Fri Aug 8 18:58:11 UTC 2014
Repository : ssh://git@git.haskell.org/ghc
On branch : wip/rae
Link : http://ghc.haskell.org/trac/ghc/changeset/077d880ba2a7c3a9684ac911828d943d1e920bc7/ghc
>---------------------------------------------------------------
commit 077d880ba2a7c3a9684ac911828d943d1e920bc7
Author: Richard Eisenberg <eir at cis.upenn.edu>
Date: Thu Aug 7 08:28:32 2014 -0400
Change treatment of CUSKs for synonyms and families (#9200).
>---------------------------------------------------------------
077d880ba2a7c3a9684ac911828d943d1e920bc7
compiler/typecheck/TcHsType.lhs | 27 +++++++++++++++++++++++----
testsuite/tests/polykinds/T9200.hs | 12 +++++++++++-
2 files changed, 34 insertions(+), 5 deletions(-)
diff --git a/compiler/typecheck/TcHsType.lhs b/compiler/typecheck/TcHsType.lhs
index 14a3c17..d075cbc 100644
--- a/compiler/typecheck/TcHsType.lhs
+++ b/compiler/typecheck/TcHsType.lhs
@@ -1067,22 +1067,41 @@ kcStrategy :: TyClDecl Name -> KindCheckingStrategy
kcStrategy d@(ForeignType {}) = pprPanic "kcStrategy" (ppr d)
kcStrategy (FamDecl fam_decl)
= kcStrategyFamDecl fam_decl
-kcStrategy (SynDecl {}) = ParametricKinds
+kcStrategy (SynDecl { tcdTyVars = tyvars, tcdRhs = rhs })
+ | all_tyvars_annotated tyvars
+ , rhs_annotated rhs
+ = FullKindSignature
+ | otherwise
+ = ParametricKinds
+ where
+ rhs_annotated (L _ ty) = case ty of
+ HsParTy lty -> rhs_annotated lty
+ HsKindSig {} -> True
+ _ -> False
kcStrategy decl@(DataDecl {}) = kcStrategyAlgDecl decl
kcStrategy decl@(ClassDecl {}) = kcStrategyAlgDecl decl
kcStrategyAlgDecl :: TyClDecl Name -> KindCheckingStrategy
kcStrategyAlgDecl decl
- | all (isHsKindedTyVar . unLoc) (hsQTvBndrs $ tcdTyVars decl)
+ | all_tyvars_annotated $ tcdTyVars decl
= FullKindSignature
| otherwise
= ParametricKinds
--- if the ClosedTypeFamily has no equations, do the defaulting to *, etc.
kcStrategyFamDecl :: FamilyDecl Name -> KindCheckingStrategy
-kcStrategyFamDecl (FamilyDecl { fdInfo = ClosedTypeFamily (_:_) }) = NonParametricKinds
+kcStrategyFamDecl (FamilyDecl { fdInfo = ClosedTypeFamily _
+ , fdTyVars = tyvars
+ , fdKindSig = Just _ })
+ | all (isHsKindedTyVar . unLoc) (hsQTvBndrs tyvars)
+ = FullKindSignature
+-- if the ClosedTypeFamily has no equations, do the defaulting to *, etc.
+kcStrategyFamDecl (FamilyDecl { fdInfo = ClosedTypeFamily (_:_) }) = ParametricKinds
kcStrategyFamDecl _ = FullKindSignature
+-- | Are all the type variables given with a kind annotation?
+all_tyvars_annotated :: LHsTyVarBndrs name -> Bool
+all_tyvars_annotated = all (isHsKindedTyVar . unLoc) . hsQTvBndrs
+
mkKindSigVar :: Name -> TcM KindVar
-- Use the specified name; don't clone it
mkKindSigVar n
diff --git a/testsuite/tests/polykinds/T9200.hs b/testsuite/tests/polykinds/T9200.hs
index b74177a..ca05066 100644
--- a/testsuite/tests/polykinds/T9200.hs
+++ b/testsuite/tests/polykinds/T9200.hs
@@ -1,4 +1,5 @@
-{-# LANGUAGE PolyKinds, MultiParamTypeClasses, FlexibleContexts, DataKinds #-}
+{-# LANGUAGE PolyKinds, MultiParamTypeClasses, FlexibleContexts, DataKinds,
+ TypeFamilies #-}
module T9200 where
@@ -17,3 +18,12 @@ data T1 a b c = MkT1 (S True b c)
data T2 p q r = MkT2 (S p 5 r)
data T3 x y q = MkT3 (S x y '())
type S (f :: k1) (g :: k2) (h :: k3) = ((T1 f g h, T2 f g h, T3 f g h) :: *)
+
+
+----------
+-- test CUSK on closed type families
+type family F (a :: k) :: k where
+ F True = False
+ F False = True
+ F x = x
+
More information about the ghc-commits
mailing list