[commit: ghc] wip/T15809: More wibbles (7b20763)
git at git.haskell.org
git at git.haskell.org
Mon Nov 26 17:49:50 UTC 2018
Repository : ssh://git@git.haskell.org/ghc
On branch : wip/T15809
Link : http://ghc.haskell.org/trac/ghc/changeset/7b2076396138b7db289d8887ac5e526f3c55c03c/ghc
>---------------------------------------------------------------
commit 7b2076396138b7db289d8887ac5e526f3c55c03c
Author: Simon Peyton Jones <simonpj at microsoft.com>
Date: Mon Nov 19 20:45:09 2018 +0000
More wibbles
>---------------------------------------------------------------
7b2076396138b7db289d8887ac5e526f3c55c03c
compiler/typecheck/TcTyClsDecls.hs | 62 +++++++++++++++-----------------------
1 file changed, 24 insertions(+), 38 deletions(-)
diff --git a/compiler/typecheck/TcTyClsDecls.hs b/compiler/typecheck/TcTyClsDecls.hs
index d74ecb5..8c6133e 100644
--- a/compiler/typecheck/TcTyClsDecls.hs
+++ b/compiler/typecheck/TcTyClsDecls.hs
@@ -68,7 +68,6 @@ import SrcLoc
import ListSetOps
import DynFlags
import Unique
-import UniqFM( nonDetEltsUFM )
import ConLike( ConLike(..) )
import BasicTypes
import qualified GHC.LanguageExtensions as LangExt
@@ -3240,8 +3239,7 @@ checkConsistentFamInst :: Maybe ClsInstInfo
checkConsistentFamInst Nothing _ _ = return ()
checkConsistentFamInst (Just (clas, inst_tvs, mini_env)) fam_tc at_arg_tys
= do { traceTc "checkConsistentFamInst" (vcat [ ppr inst_tvs
- , ppr kind_prs
- , ppr type_prs
+ , ppr arg_triples
, ppr mini_env ])
-- Check that the associated type indeed comes from this class
-- See [Mismatched class methods and associated type families]
@@ -3249,28 +3247,16 @@ checkConsistentFamInst (Just (clas, inst_tvs, mini_env)) fam_tc at_arg_tys
; checkTc (Just (classTyCon clas) == tyConAssoc_maybe fam_tc)
(badATErr (className clas) (tyConName fam_tc))
- -- Check kind args first, suggesting -fprint-explicit-kiinds
- -- if there is a mis-match here.
- ; checkTc (isJust mb_kinds_match) (pp_wrong_at_arg $$ ppSuggestExplicitKinds)
-
- -- Then type args. If we do these first, then we'll fail to
- -- suggest -fprint-explicit-kinds for (T @k vs T @Type)
- ; checkTc (isJust mb_types_match) pp_wrong_at_arg
+ ; check_match arg_triples
}
where
- kind_prs, type_prs :: [(Type,Type)]
- (kind_prs, type_prs) = partitionInvisibles $
- [ ((cls_arg_ty, at_arg_ty), vis)
- | (fam_tc_tv, vis, at_arg_ty)
- <- zip3 (tyConTyVars fam_tc)
- (tyConArgFlags fam_tc at_arg_tys)
- at_arg_tys
- , Just cls_arg_ty <- [lookupVarEnv mini_env fam_tc_tv] ]
-
-
- mb_types_match = alphaMatchTysX emptyTCvSubst type_prs
- Just subst1 = mb_types_match
- mb_kinds_match = alphaMatchTysX subst1 kind_prs
+ arg_triples :: [(Type,Type, ArgFlag)]
+ arg_triples = [ (cls_arg_ty, at_arg_ty, vis)
+ | (fam_tc_tv, vis, at_arg_ty)
+ <- zip3 (tyConTyVars fam_tc)
+ (tyConArgFlags fam_tc at_arg_tys)
+ at_arg_tys
+ , Just cls_arg_ty <- [lookupVarEnv mini_env fam_tc_tv] ]
pp_wrong_at_arg = vcat [ text "Type indexes must match class instance head"
, text "Expected:" <+> ppr (mkTyConApp fam_tc expected_args)
@@ -3281,22 +3267,22 @@ checkConsistentFamInst (Just (clas, inst_tvs, mini_env)) fam_tc at_arg_tys
underscore at_tv = mkTyVarTy (mkTyVar tv_name (tyVarKind at_tv))
tv_name = mkInternalName (mkAlphaTyVarUnique 1) (mkTyVarOcc "_") noSrcSpan
-alphaMatchTysX :: TCvSubst -> [(Type,Type)] -> Maybe TCvSubst
-alphaMatchTysX subst pairs
- | null pairs = Just subst
- | otherwise = go subst pairs
- where
- go :: TCvSubst -> [(Type,Type)] -> Maybe TCvSubst
- go subst []
- | allDistinctTyVars emptyVarSet $
- nonDetEltsUFM (getTvSubstEnv subst)
- = Just subst
+ check_match :: [(Type,Type, ArgFlag)] -> TcM ()
+ check_match triples = go emptyTCvSubst emptyTCvSubst triples
+
+ go _ _ [] = return ()
+ go lr_subst rl_subst ((ty1,ty2,vis):triples)
+ | Just lr_subst1 <- tcMatchTyX lr_subst ty1 ty2
+ , Just rl_subst1 <- tcMatchTyX rl_subst ty2 ty1
+ = go lr_subst1 rl_subst1 triples
| otherwise
- = Nothing
- go subst ((ty1,ty2):prs)
- = case tcMatchTyX subst ty1 ty2 of
- Just subst' -> go subst' prs
- Nothing -> Nothing
+ = addErrTc (pp_wrong_at_arg $$
+ ppWhen (isInvisibleArgFlag vis) ppSuggestExplicitKinds)
+ -- NB: checks left-to-right, kinds first.
+ -- If we types first, we'll fail to
+ -- suggest -fprint-explicit-kinds for a mis-match with
+ -- T @k vs T @Type
+ -- somewhere deep inside the type
badATErr :: Name -> Name -> SDoc
badATErr clas op
More information about the ghc-commits
mailing list