summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--compiler/main/DynFlags.hs2
-rw-r--r--compiler/typecheck/TcTyClsDecls.lhs17
-rw-r--r--compiler/typecheck/TcValidity.lhs2481
-rw-r--r--docs/users_guide/flags.xml6
-rw-r--r--docs/users_guide/glasgow_exts.xml29
5 files changed, 1292 insertions, 1243 deletions
diff --git a/compiler/main/DynFlags.hs b/compiler/main/DynFlags.hs
index 060619dbf3..162568ca4e 100644
--- a/compiler/main/DynFlags.hs
+++ b/compiler/main/DynFlags.hs
@@ -513,6 +513,7 @@ data ExtensionFlag
| Opt_FlexibleInstances
| Opt_ConstrainedClassMethods
| Opt_MultiParamTypeClasses
+ | Opt_NullaryTypeClasses
| Opt_FunctionalDependencies
| Opt_UnicodeSyntax
| Opt_ExistentialQuantification
@@ -2650,6 +2651,7 @@ xFlags = [
( "FlexibleInstances", Opt_FlexibleInstances, nop ),
( "ConstrainedClassMethods", Opt_ConstrainedClassMethods, nop ),
( "MultiParamTypeClasses", Opt_MultiParamTypeClasses, nop ),
+ ( "NullaryTypeClasses", Opt_NullaryTypeClasses, nop ),
( "FunctionalDependencies", Opt_FunctionalDependencies, nop ),
( "GeneralizedNewtypeDeriving", Opt_GeneralizedNewtypeDeriving, setGenDeriving ),
( "OverlappingInstances", Opt_OverlappingInstances, nop ),
diff --git a/compiler/typecheck/TcTyClsDecls.lhs b/compiler/typecheck/TcTyClsDecls.lhs
index d5fce0b12a..c6467249e8 100644
--- a/compiler/typecheck/TcTyClsDecls.lhs
+++ b/compiler/typecheck/TcTyClsDecls.lhs
@@ -1391,11 +1391,13 @@ checkValidClass :: Class -> TcM ()
checkValidClass cls
= do { constrained_class_methods <- xoptM Opt_ConstrainedClassMethods
; multi_param_type_classes <- xoptM Opt_MultiParamTypeClasses
+ ; nullary_type_classes <- xoptM Opt_NullaryTypeClasses
; fundep_classes <- xoptM Opt_FunctionalDependencies
- -- Check that the class is unary, unless GlaExs
- ; checkTc (notNull tyvars) (nullaryClassErr cls)
- ; checkTc (multi_param_type_classes || unary) (classArityErr cls)
+ -- Check that the class is unary, unless multiparameter or
+ -- nullary type classes are enabled
+ ; checkTc (nullary_type_classes || notNull tyvars) (nullaryClassErr cls)
+ ; checkTc (multi_param_type_classes || arity <= 1) (classArityErr cls)
; checkTc (fundep_classes || null fundeps) (classFunDepsErr cls)
-- Check the super-classes
@@ -1411,7 +1413,7 @@ checkValidClass cls
; mapM_ check_at_defs at_stuff }
where
(tyvars, fundeps, theta, _, at_stuff, op_stuff) = classExtraBigSig cls
- unary = count isTypeVar tyvars == 1 -- Ignore kind variables
+ arity = count isTypeVar tyvars -- Ignore kind variables
check_op constrained_class_methods (sel_id, dm)
= addErrCtxt (classOpCtxt sel_id tau) $ do
@@ -1428,8 +1430,10 @@ checkValidClass cls
-- class Error e => Game b mv e | b -> mv e where
-- newBoard :: MonadState b m => m ()
-- Here, MonadState has a fundep m->b, so newBoard is fine
+ -- The check is disabled for nullary type classes,
+ -- since there is no possible ambiguity
; let grown_tyvars = growThetaTyVars theta (mkVarSet tyvars)
- ; checkTc (tyVarsOfType tau `intersectsVarSet` grown_tyvars)
+ ; checkTc (arity == 0 || tyVarsOfType tau `intersectsVarSet` grown_tyvars)
(noClassTyVarErr cls sel_id)
; case dm of
@@ -1733,7 +1737,8 @@ classOpCtxt sel_id tau = sep [ptext (sLit "When checking the class method:"),
nullaryClassErr :: Class -> SDoc
nullaryClassErr cls
- = ptext (sLit "No parameters for class") <+> quotes (ppr cls)
+ = vcat [ptext (sLit "No parameters for class") <+> quotes (ppr cls),
+ parens (ptext (sLit "Use -XNullaryTypeClasses to allow no-parameter classes"))]
classArityErr :: Class -> SDoc
classArityErr cls
diff --git a/compiler/typecheck/TcValidity.lhs b/compiler/typecheck/TcValidity.lhs
index e63a858950..d036c04dbf 100644
--- a/compiler/typecheck/TcValidity.lhs
+++ b/compiler/typecheck/TcValidity.lhs
@@ -1,1237 +1,1244 @@
-%
-% (c) The University of Glasgow 2006
-% (c) The GRASP/AQUA Project, Glasgow University, 1992-1998
-%
-
-\begin{code}
-module TcValidity (
- Rank, UserTypeCtxt(..), checkValidType, checkValidMonoType,
- expectedKindInCtxt,
- checkValidTheta, checkValidFamPats,
- checkValidInstHead, checkValidInstance, validDerivPred,
- checkInstTermination, checkValidTyFamInst, checkTyFamFreeness,
- checkConsistentFamInst,
- arityErr, badATErr
- ) where
-
-#include "HsVersions.h"
-
--- friends:
-import TcUnify ( tcSubType )
-import TcSimplify ( simplifyTop )
-import TypeRep
-import TcType
-import TcMType
-import Type
-import Unify( tcMatchTyX )
-import Kind
-import CoAxiom
-import Class
-import TyCon
-
--- others:
-import HsSyn -- HsType
-import TcRnMonad -- TcType, amongst others
-import FunDeps
-import Name
-import VarEnv
-import VarSet
-import ErrUtils
-import PrelNames
-import DynFlags
-import Util
-import Maybes
-import ListSetOps
-import SrcLoc
-import Outputable
-import FastString
-
-import Control.Monad
-import Data.List ( (\\) )
-\end{code}
-
-
-%************************************************************************
-%* *
- Checking for ambiguity
-%* *
-%************************************************************************
-
-
-\begin{code}
-checkAmbiguity :: UserTypeCtxt -> Type -> TcM ()
-checkAmbiguity ctxt ty
- = do { allow_ambiguous <- xoptM Opt_AllowAmbiguousTypes
- ; unless allow_ambiguous $
- do {(subst, _tvs) <- tcInstSkolTyVars (varSetElems (tyVarsOfType ty))
- ; let ty' = substTy subst ty
- -- The type might have free TyVars,
- -- so we skolemise them as TcTyVars
- -- Tiresome; but the type inference engine expects TcTyVars
- ; (_wrap, wanted) <- addErrCtxtM (mk_msg ty') $
- captureConstraints $
- tcSubType (AmbigOrigin ctxt) ctxt ty' ty'
-
- -- Solve the constraints eagerly because an ambiguous type
- -- can cause a cascade of further errors. The free tyvars
- -- are skolemised, so we can safely use tcSimplifyTop
- ; _ev_binds <- simplifyTop wanted
-
- ; return () } }
- where
- mk_msg ty tidy_env
- = return (tidy_env', msg)
- where
- (tidy_env', tidy_ty) = tidyOpenType tidy_env ty
- msg = hang (ptext (sLit "In the ambiguity check for:"))
- 2 (ppr tidy_ty)
-\end{code}
-
-
-%************************************************************************
-%* *
- Checking validity of a user-defined type
-%* *
-%************************************************************************
-
-When dealing with a user-written type, we first translate it from an HsType
-to a Type, performing kind checking, and then check various things that should
-be true about it. We don't want to perform these checks at the same time
-as the initial translation because (a) they are unnecessary for interface-file
-types and (b) when checking a mutually recursive group of type and class decls,
-we can't "look" at the tycons/classes yet. Also, the checks are are rather
-diverse, and used to really mess up the other code.
-
-One thing we check for is 'rank'.
-
- Rank 0: monotypes (no foralls)
- Rank 1: foralls at the front only, Rank 0 inside
- Rank 2: foralls at the front, Rank 1 on left of fn arrow,
-
- basic ::= tyvar | T basic ... basic
-
- r2 ::= forall tvs. cxt => r2a
- r2a ::= r1 -> r2a | basic
- r1 ::= forall tvs. cxt => r0
- r0 ::= r0 -> r0 | basic
-
-Another thing is to check that type synonyms are saturated.
-This might not necessarily show up in kind checking.
- type A i = i
- data T k = MkT (k Int)
- f :: T A -- BAD!
-
-
-\begin{code}
-checkValidType :: UserTypeCtxt -> Type -> TcM ()
--- Checks that the type is valid for the given context
--- Not used for instance decls; checkValidInstance instead
-checkValidType ctxt ty
- = do { traceTc "checkValidType" (ppr ty <+> text "::" <+> ppr (typeKind ty))
- ; rankn_flag <- xoptM Opt_RankNTypes
- ; let gen_rank :: Rank -> Rank
- gen_rank r | rankn_flag = ArbitraryRank
- | otherwise = r
-
- rank1 = gen_rank r1
- rank0 = gen_rank r0
-
- r0 = rankZeroMonoType
- r1 = LimitedRank True r0
-
- rank
- = case ctxt of
- DefaultDeclCtxt-> MustBeMonoType
- ResSigCtxt -> MustBeMonoType
- LamPatSigCtxt -> rank0
- BindPatSigCtxt -> rank0
- RuleSigCtxt _ -> rank1
- TySynCtxt _ -> rank0
-
- ExprSigCtxt -> rank1
- FunSigCtxt _ -> rank1
- InfSigCtxt _ -> ArbitraryRank -- Inferred type
- ConArgCtxt _ -> rank1 -- We are given the type of the entire
- -- constructor, hence rank 1
-
- ForSigCtxt _ -> rank1
- SpecInstCtxt -> rank1
- ThBrackCtxt -> rank1
- GhciCtxt -> ArbitraryRank
- _ -> panic "checkValidType"
- -- Can't happen; not used for *user* sigs
-
- -- Check the internal validity of the type itself
- ; check_type ctxt rank ty
-
- -- Check that the thing has kind Type, and is lifted if necessary
- -- Do this second, because we can't usefully take the kind of an
- -- ill-formed type such as (a~Int)
- ; check_kind ctxt ty }
-
-checkValidMonoType :: Type -> TcM ()
-checkValidMonoType ty = check_mono_type SigmaCtxt MustBeMonoType ty
-
-
-check_kind :: UserTypeCtxt -> TcType -> TcM ()
--- Check that the type's kind is acceptable for the context
-check_kind ctxt ty
- | TySynCtxt {} <- ctxt
- = do { ck <- xoptM Opt_ConstraintKinds
- ; unless ck $
- checkTc (not (returnsConstraintKind actual_kind))
- (constraintSynErr actual_kind) }
-
- | Just k <- expectedKindInCtxt ctxt
- = checkTc (tcIsSubKind actual_kind k) (kindErr actual_kind)
-
- | otherwise
- = return () -- Any kind will do
- where
- actual_kind = typeKind ty
-
--- Depending on the context, we might accept any kind (for instance, in a TH
--- splice), or only certain kinds (like in type signatures).
-expectedKindInCtxt :: UserTypeCtxt -> Maybe Kind
-expectedKindInCtxt (TySynCtxt _) = Nothing -- Any kind will do
-expectedKindInCtxt ThBrackCtxt = Nothing
-expectedKindInCtxt GhciCtxt = Nothing
-expectedKindInCtxt (ForSigCtxt _) = Just liftedTypeKind
-expectedKindInCtxt InstDeclCtxt = Just constraintKind
-expectedKindInCtxt SpecInstCtxt = Just constraintKind
-expectedKindInCtxt _ = Just openTypeKind
-\end{code}
-
-Note [Higher rank types]
-~~~~~~~~~~~~~~~~~~~~~~~~
-Technically
- Int -> forall a. a->a
-is still a rank-1 type, but it's not Haskell 98 (Trac #5957). So the
-validity checker allow a forall after an arrow only if we allow it
-before -- that is, with Rank2Types or RankNTypes
-
-\begin{code}
-data Rank = ArbitraryRank -- Any rank ok
-
- | LimitedRank -- Note [Higher rank types]
- Bool -- Forall ok at top
- Rank -- Use for function arguments
-
- | MonoType SDoc -- Monotype, with a suggestion of how it could be a polytype
-
- | MustBeMonoType -- Monotype regardless of flags
-
-rankZeroMonoType, tyConArgMonoType, synArgMonoType :: Rank
-rankZeroMonoType = MonoType (ptext (sLit "Perhaps you intended to use -XRankNTypes or -XRank2Types"))
-tyConArgMonoType = MonoType (ptext (sLit "Perhaps you intended to use -XImpredicativeTypes"))
-synArgMonoType = MonoType (ptext (sLit "Perhaps you intended to use -XLiberalTypeSynonyms"))
-
-funArgResRank :: Rank -> (Rank, Rank) -- Function argument and result
-funArgResRank (LimitedRank _ arg_rank) = (arg_rank, LimitedRank (forAllAllowed arg_rank) arg_rank)
-funArgResRank other_rank = (other_rank, other_rank)
-
-forAllAllowed :: Rank -> Bool
-forAllAllowed ArbitraryRank = True
-forAllAllowed (LimitedRank forall_ok _) = forall_ok
-forAllAllowed _ = False
-
-----------------------------------------
-check_mono_type :: UserTypeCtxt -> Rank
- -> KindOrType -> TcM () -- No foralls anywhere
- -- No unlifted types of any kind
-check_mono_type ctxt rank ty
- | isKind ty = return () -- IA0_NOTE: Do we need to check kinds?
- | otherwise
- = do { check_type ctxt rank ty
- ; checkTc (not (isUnLiftedType ty)) (unliftedArgErr ty) }
-
-check_type :: UserTypeCtxt -> Rank -> Type -> TcM ()
--- The args say what the *type context* requires, independent
--- of *flag* settings. You test the flag settings at usage sites.
---
--- Rank is allowed rank for function args
--- Rank 0 means no for-alls anywhere
-
-check_type ctxt rank ty
- | not (null tvs && null theta)
- = do { checkTc (forAllAllowed rank) (forAllTyErr rank ty)
- -- Reject e.g. (Maybe (?x::Int => Int)),
- -- with a decent error message
- ; check_valid_theta ctxt theta
- ; check_type ctxt rank tau -- Allow foralls to right of arrow
- ; checkAmbiguity ctxt ty }
- where
- (tvs, theta, tau) = tcSplitSigmaTy ty
-
-check_type _ _ (TyVarTy _) = return ()
-
-check_type ctxt rank (FunTy arg_ty res_ty)
- = do { check_type ctxt arg_rank arg_ty
- ; check_type ctxt res_rank res_ty }
- where
- (arg_rank, res_rank) = funArgResRank rank
-
-check_type ctxt rank (AppTy ty1 ty2)
- = do { check_arg_type ctxt rank ty1
- ; check_arg_type ctxt rank ty2 }
-
-check_type ctxt rank ty@(TyConApp tc tys)
- | isSynTyCon tc
- = do { -- Check that the synonym has enough args
- -- This applies equally to open and closed synonyms
- -- It's OK to have an *over-applied* type synonym
- -- data Tree a b = ...
- -- type Foo a = Tree [a]
- -- f :: Foo a b -> ...
- checkTc (tyConArity tc <= length tys) arity_msg
-
- -- See Note [Liberal type synonyms]
- ; liberal <- xoptM Opt_LiberalTypeSynonyms
- ; if not liberal || isSynFamilyTyCon tc then
- -- For H98 and synonym families, do check the type args
- mapM_ (check_mono_type ctxt synArgMonoType) tys
-
- else -- In the liberal case (only for closed syns), expand then check
- case tcView ty of
- Just ty' -> check_type ctxt rank ty'
- Nothing -> pprPanic "check_tau_type" (ppr ty)
- }
-
- | isUnboxedTupleTyCon tc
- = do { ub_tuples_allowed <- xoptM Opt_UnboxedTuples
- ; checkTc ub_tuples_allowed ubx_tup_msg
-
- ; impred <- xoptM Opt_ImpredicativeTypes
- ; let rank' = if impred then ArbitraryRank else tyConArgMonoType
- -- c.f. check_arg_type
- -- However, args are allowed to be unlifted, or
- -- more unboxed tuples, so can't use check_arg_ty
- ; mapM_ (check_type ctxt rank') tys }
-
- | otherwise
- = mapM_ (check_arg_type ctxt rank) tys
-
- where
- n_args = length tys
- tc_arity = tyConArity tc
-
- arity_msg = arityErr "Type synonym" (tyConName tc) tc_arity n_args
- ubx_tup_msg = ubxArgTyErr ty
-
-check_type _ _ (LitTy {}) = return ()
-
-check_type _ _ ty = pprPanic "check_type" (ppr ty)
-
-----------------------------------------
-check_arg_type :: UserTypeCtxt -> Rank -> KindOrType -> TcM ()
--- The sort of type that can instantiate a type variable,
--- or be the argument of a type constructor.
--- Not an unboxed tuple, but now *can* be a forall (since impredicativity)
--- Other unboxed types are very occasionally allowed as type
--- arguments depending on the kind of the type constructor
---
--- For example, we want to reject things like:
---
--- instance Ord a => Ord (forall s. T s a)
--- and
--- g :: T s (forall b.b)
---
--- NB: unboxed tuples can have polymorphic or unboxed args.
--- This happens in the workers for functions returning
--- product types with polymorphic components.
--- But not in user code.
--- Anyway, they are dealt with by a special case in check_tau_type
-
-check_arg_type ctxt rank ty
- | isKind ty = return () -- IA0_NOTE: Do we need to check a kind?
- | otherwise
- = do { impred <- xoptM Opt_ImpredicativeTypes
- ; let rank' = case rank of -- Predictive => must be monotype
- MustBeMonoType -> MustBeMonoType -- Monotype, regardless
- _other | impred -> ArbitraryRank
- | otherwise -> tyConArgMonoType
- -- Make sure that MustBeMonoType is propagated,
- -- so that we don't suggest -XImpredicativeTypes in
- -- (Ord (forall a.a)) => a -> a
- -- and so that if it Must be a monotype, we check that it is!
-
- ; check_type ctxt rank' ty
- ; checkTc (not (isUnLiftedType ty)) (unliftedArgErr ty) }
- -- NB the isUnLiftedType test also checks for
- -- T State#
- -- where there is an illegal partial application of State# (which has
- -- kind * -> #); see Note [The kind invariant] in TypeRep
-
-----------------------------------------
-forAllTyErr :: Rank -> Type -> SDoc
-forAllTyErr rank ty
- = vcat [ hang (ptext (sLit "Illegal polymorphic or qualified type:")) 2 (ppr ty)
- , suggestion ]
- where
- suggestion = case rank of
- LimitedRank {} -> ptext (sLit "Perhaps you intended to use -XRankNTypes or -XRank2Types")
- MonoType d -> d
- _ -> empty -- Polytype is always illegal
-
-unliftedArgErr, ubxArgTyErr :: Type -> SDoc
-unliftedArgErr ty = sep [ptext (sLit "Illegal unlifted type:"), ppr ty]
-ubxArgTyErr ty = sep [ptext (sLit "Illegal unboxed tuple type as function argument:"), ppr ty]
-
-kindErr :: Kind -> SDoc
-kindErr kind = sep [ptext (sLit "Expecting an ordinary type, but found a type of kind"), ppr kind]
-\end{code}
-
-Note [Liberal type synonyms]
-~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-If -XLiberalTypeSynonyms is on, expand closed type synonyms *before*
-doing validity checking. This allows us to instantiate a synonym defn
-with a for-all type, or with a partially-applied type synonym.
- e.g. type T a b = a
- type S m = m ()
- f :: S (T Int)
-Here, T is partially applied, so it's illegal in H98. But if you
-expand S first, then T we get just
- f :: Int
-which is fine.
-
-IMPORTANT: suppose T is a type synonym. Then we must do validity
-checking on an appliation (T ty1 ty2)
-
- *either* before expansion (i.e. check ty1, ty2)
- *or* after expansion (i.e. expand T ty1 ty2, and then check)
- BUT NOT BOTH
-
-If we do both, we get exponential behaviour!!
-
- data TIACons1 i r c = c i ::: r c
- type TIACons2 t x = TIACons1 t (TIACons1 t x)
- type TIACons3 t x = TIACons2 t (TIACons1 t x)
- type TIACons4 t x = TIACons2 t (TIACons2 t x)
- type TIACons7 t x = TIACons4 t (TIACons3 t x)
-
-
-%************************************************************************
-%* *
-\subsection{Checking a theta or source type}
-%* *
-%************************************************************************
-
-\begin{code}
-checkValidTheta :: UserTypeCtxt -> ThetaType -> TcM ()
-checkValidTheta ctxt theta
- = addErrCtxt (checkThetaCtxt ctxt theta) (check_valid_theta ctxt theta)
-
--------------------------
-check_valid_theta :: UserTypeCtxt -> [PredType] -> TcM ()
-check_valid_theta _ []
- = return ()
-check_valid_theta ctxt theta
- = do { dflags <- getDynFlags
- ; warnTc (wopt Opt_WarnDuplicateConstraints dflags &&
- notNull dups) (dupPredWarn dups)
- ; mapM_ (check_pred_ty dflags ctxt) theta }
- where
- (_,dups) = removeDups cmpPred theta
-
--------------------------
-check_pred_ty :: DynFlags -> UserTypeCtxt -> PredType -> TcM ()
--- Check the validity of a predicate in a signature
--- We look through any type synonyms; any constraint kinded
--- type synonyms have been checked at their definition site
-
-check_pred_ty dflags ctxt pred
- | Just (tc,tys) <- tcSplitTyConApp_maybe pred
- = case () of
- _ | Just cls <- tyConClass_maybe tc
- -> check_class_pred dflags ctxt cls tys
-
- | tc `hasKey` eqTyConKey
- , let [_, ty1, ty2] = tys
- -> check_eq_pred dflags ctxt ty1 ty2
-
- | isTupleTyCon tc
- -> check_tuple_pred dflags ctxt pred tys
-
- | otherwise -- X t1 t2, where X is presumably a
- -- type/data family returning ConstraintKind
- -> check_irred_pred dflags ctxt pred tys
-
- | (TyVarTy _, arg_tys) <- tcSplitAppTys pred
- = check_irred_pred dflags ctxt pred arg_tys
-
- | otherwise
- = badPred pred
-
-badPred :: PredType -> TcM ()
-badPred pred = failWithTc (ptext (sLit "Malformed predicate") <+> quotes (ppr pred))
-
-check_class_pred :: DynFlags -> UserTypeCtxt -> Class -> [TcType] -> TcM ()
-check_class_pred dflags ctxt cls tys
- = do { -- Class predicates are valid in all contexts
- ; checkTc (arity == n_tys) arity_err
-
- -- Check the form of the argument types
- ; mapM_ checkValidMonoType tys
- ; checkTc (check_class_pred_tys dflags ctxt tys)
- (predTyVarErr (mkClassPred cls tys) $$ how_to_allow)
- }
- where
- class_name = className cls
- arity = classArity cls
- n_tys = length tys
- arity_err = arityErr "Class" class_name arity n_tys
- how_to_allow = parens (ptext (sLit "Use -XFlexibleContexts to permit this"))
-
-
-check_eq_pred :: DynFlags -> UserTypeCtxt -> TcType -> TcType -> TcM ()
-check_eq_pred dflags _ctxt ty1 ty2
- = do { -- Equational constraints are valid in all contexts if type
- -- families are permitted
- ; checkTc (xopt Opt_TypeFamilies dflags || xopt Opt_GADTs dflags)
- (eqPredTyErr (mkEqPred ty1 ty2))
-
- -- Check the form of the argument types
- ; checkValidMonoType ty1
- ; checkValidMonoType ty2
- }
-
-check_tuple_pred :: DynFlags -> UserTypeCtxt -> PredType -> [PredType] -> TcM ()
-check_tuple_pred dflags ctxt pred ts
- = do { checkTc (xopt Opt_ConstraintKinds dflags)
- (predTupleErr pred)
- ; mapM_ (check_pred_ty dflags ctxt) ts }
- -- This case will not normally be executed because
- -- without -XConstraintKinds tuple types are only kind-checked as *
-
-check_irred_pred :: DynFlags -> UserTypeCtxt -> PredType -> [TcType] -> TcM ()
-check_irred_pred dflags ctxt pred arg_tys
- -- The predicate looks like (X t1 t2) or (x t1 t2) :: Constraint
- -- But X is not a synonym; that's been expanded already
- --
- -- Allowing irreducible predicates in class superclasses is somewhat dangerous
- -- because we can write:
- --
- -- type family Fooish x :: * -> Constraint
- -- type instance Fooish () = Foo
- -- class Fooish () a => Foo a where
- --
- -- This will cause the constraint simplifier to loop because every time we canonicalise a
- -- (Foo a) class constraint we add a (Fooish () a) constraint which will be immediately
- -- solved to add+canonicalise another (Foo a) constraint.
- --
- -- It is equally dangerous to allow them in instance heads because in that case the
- -- Paterson conditions may not detect duplication of a type variable or size change.
- = do { checkTc (xopt Opt_ConstraintKinds dflags)
- (predIrredErr pred)
- ; mapM_ checkValidMonoType arg_tys
- ; unless (xopt Opt_UndecidableInstances dflags) $
- -- Make sure it is OK to have an irred pred in this context
- checkTc (case ctxt of ClassSCCtxt _ -> False; InstDeclCtxt -> False; _ -> True)
- (predIrredBadCtxtErr pred) }
-
--------------------------
-check_class_pred_tys :: DynFlags -> UserTypeCtxt -> [KindOrType] -> Bool
-check_class_pred_tys dflags ctxt kts
- = case ctxt of
- SpecInstCtxt -> True -- {-# SPECIALISE instance Eq (T Int) #-} is fine
- InstDeclCtxt -> flexible_contexts || undecidable_ok || all tcIsTyVarTy tys
- -- Further checks on head and theta in
- -- checkInstTermination
- _ -> flexible_contexts || all tyvar_head tys
- where
- (_, tys) = span isKind kts -- see Note [Kind polymorphic type classes]
- flexible_contexts = xopt Opt_FlexibleContexts dflags
- undecidable_ok = xopt Opt_UndecidableInstances dflags
-
--------------------------
-tyvar_head :: Type -> Bool
-tyvar_head ty -- Haskell 98 allows predicates of form
- | tcIsTyVarTy ty = True -- C (a ty1 .. tyn)
- | otherwise -- where a is a type variable
- = case tcSplitAppTy_maybe ty of
- Just (ty, _) -> tyvar_head ty
- Nothing -> False
-\end{code}
-
-Note [Kind polymorphic type classes]
-~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-MultiParam check:
-
- class C f where... -- C :: forall k. k -> Constraint
- instance C Maybe where...
-
- The dictionary gets type [C * Maybe] even if it's not a MultiParam
- type class.
-
-Flexibility check:
-
- class C f where... -- C :: forall k. k -> Constraint
- data D a = D a
- instance C D where
-
- The dictionary gets type [C * (D *)]. IA0_TODO it should be
- generalized actually.
-
-Note [The ambiguity check for type signatures]
-~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-checkAmbiguity is a check on user-supplied type signatures. It is
-*purely* there to report functions that cannot possibly be called. So for
-example we want to reject:
- f :: C a => Int
-The idea is there can be no legal calls to 'f' because every call will
-give rise to an ambiguous constraint. We could soundly omit the
-ambiguity check on type signatures entirely, at the expense of
-delaying ambiguity errors to call sites. Indeed, the flag
--XAllowAmbiguousTypes switches off the ambiguity check.
-
-What about things like this:
- class D a b | a -> b where ..
- h :: D Int b => Int
-The Int may well fix 'b' at the call site, so that signature should
-not be rejected. Moreover, using *visible* fundeps is too
-conservative. Consider
- class X a b where ...
- class D a b | a -> b where ...
- instance D a b => X [a] b where...
- h :: X a b => a -> a
-Here h's type looks ambiguous in 'b', but here's a legal call:
- ...(h [True])...
-That gives rise to a (X [Bool] beta) constraint, and using the
-instance means we need (D Bool beta) and that fixes 'beta' via D's
-fundep!
-
-Behind all these special cases there is a simple guiding principle.
-Consider
-
- f :: <type>
- f = ...blah...
-
- g :: <type>
- g = f
-
-You would think that the definition of g would surely typecheck!
-After all f has exactly the same type, and g=f. But in fact f's type
-is instantiated and the instantiated constraints are solved against
-the originals, so in the case an ambiguous type it won't work.
-Consider our earlier example f :: C a => Int. Then in g's definition,
-we'll instantiate to (C alpha) and try to deduce (C alpha) from (C a),
-and fail.
-
-So in fact we use this as our *definition* of ambiguity. We use a
-very similar test for *inferred* types, to ensure that they are
-unambiguous. See Note [Impedence matching] in TcBinds.
-
-This test is very conveniently implemented by calling
- tcSubType <type> <type>
-This neatly takes account of the functional dependecy stuff above,
-and implict parameter (see Note [Implicit parameters and ambiguity]).
-
-What about this, though?
- g :: C [a] => Int
-Is every call to 'g' ambiguous? After all, we might have
- intance C [a] where ...
-at the call site. So maybe that type is ok! Indeed even f's
-quintessentially ambiguous type might, just possibly be callable:
-with -XFlexibleInstances we could have
- instance C a where ...
-and now a call could be legal after all! Well, we'll reject this
-unless the instance is available *here*.
-
-Side note: the ambiguity check is only used for *user* types, not for
-types coming from inteface files. The latter can legitimately have
-ambiguous types. Example
-
- class S a where s :: a -> (Int,Int)
- instance S Char where s _ = (1,1)
- f:: S a => [a] -> Int -> (Int,Int)
- f (_::[a]) x = (a*x,b)
- where (a,b) = s (undefined::a)
-
-Here the worker for f gets the type
- fw :: forall a. S a => Int -> (# Int, Int #)
-
-Note [Implicit parameters and ambiguity]
-~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-Only a *class* predicate can give rise to ambiguity
-An *implicit parameter* cannot. For example:
- foo :: (?x :: [a]) => Int
- foo = length ?x
-is fine. The call site will suppply a particular 'x'
-
-Furthermore, the type variables fixed by an implicit parameter
-propagate to the others. E.g.
- foo :: (Show a, ?x::[a]) => Int
- foo = show (?x++?x)
-The type of foo looks ambiguous. But it isn't, because at a call site
-we might have
- let ?x = 5::Int in foo
-and all is well. In effect, implicit parameters are, well, parameters,
-so we can take their type variables into account as part of the
-"tau-tvs" stuff. This is done in the function 'FunDeps.grow'.
-\begin{code}
-checkThetaCtxt :: UserTypeCtxt -> ThetaType -> SDoc
-checkThetaCtxt ctxt theta
- = vcat [ptext (sLit "In the context:") <+> pprTheta theta,
- ptext (sLit "While checking") <+> pprUserTypeCtxt ctxt ]
-
-eqPredTyErr, predTyVarErr, predTupleErr, predIrredErr, predIrredBadCtxtErr :: PredType -> SDoc
-eqPredTyErr pred = ptext (sLit "Illegal equational constraint") <+> pprType pred
- $$
- parens (ptext (sLit "Use -XGADTs or -XTypeFamilies to permit this"))
-predTyVarErr pred = hang (ptext (sLit "Non type-variable argument"))
- 2 (ptext (sLit "in the constraint:") <+> pprType pred)
-predTupleErr pred = hang (ptext (sLit "Illegal tuple constraint:") <+> pprType pred)
- 2 (parens (ptext (sLit "Use -XConstraintKinds to permit this")))
-predIrredErr pred = hang (ptext (sLit "Illegal constraint:") <+> pprType pred)
- 2 (parens (ptext (sLit "Use -XConstraintKinds to permit this")))
-predIrredBadCtxtErr pred = hang (ptext (sLit "Illegal constraint") <+> quotes (pprType pred)
- <+> ptext (sLit "in a superclass/instance context"))
- 2 (parens (ptext (sLit "Use -XUndecidableInstances to permit this")))
-
-constraintSynErr :: Type -> SDoc
-constraintSynErr kind = hang (ptext (sLit "Illegal constraint synonym of kind:") <+> quotes (ppr kind))
- 2 (parens (ptext (sLit "Use -XConstraintKinds to permit this")))
-
-dupPredWarn :: [[PredType]] -> SDoc
-dupPredWarn dups = ptext (sLit "Duplicate constraint(s):") <+> pprWithCommas pprType (map head dups)
-
-arityErr :: Outputable a => String -> a -> Int -> Int -> SDoc
-arityErr kind name n m
- = hsep [ text kind, quotes (ppr name), ptext (sLit "should have"),
- n_arguments <> comma, text "but has been given",
- if m==0 then text "none" else int m]
- where
- n_arguments | n == 0 = ptext (sLit "no arguments")
- | n == 1 = ptext (sLit "1 argument")
- | True = hsep [int n, ptext (sLit "arguments")]
-\end{code}
-
-%************************************************************************
-%* *
-\subsection{Checking for a decent instance head type}
-%* *
-%************************************************************************
-
-@checkValidInstHead@ checks the type {\em and} its syntactic constraints:
-it must normally look like: @instance Foo (Tycon a b c ...) ...@
-
-The exceptions to this syntactic checking: (1)~if the @GlasgowExts@
-flag is on, or (2)~the instance is imported (they must have been
-compiled elsewhere). In these cases, we let them go through anyway.
-
-We can also have instances for functions: @instance Foo (a -> b) ...@.
-
-\begin{code}
-checkValidInstHead :: UserTypeCtxt -> Class -> [Type] -> TcM ()
-checkValidInstHead ctxt clas cls_args
- = do { dflags <- getDynFlags
-
- -- Check language restrictions;
- -- but not for SPECIALISE isntance pragmas
- ; let ty_args = dropWhile isKind cls_args
- ; unless spec_inst_prag $
- do { checkTc (xopt Opt_TypeSynonymInstances dflags ||
- all tcInstHeadTyNotSynonym ty_args)
- (instTypeErr clas cls_args head_type_synonym_msg)
- ; checkTc (xopt Opt_FlexibleInstances dflags ||
- all tcInstHeadTyAppAllTyVars ty_args)
- (instTypeErr clas cls_args head_type_args_tyvars_msg)
- ; checkTc (xopt Opt_MultiParamTypeClasses dflags ||
- isSingleton ty_args) -- Only count type arguments
- (instTypeErr clas cls_args head_one_type_msg) }
-
- -- May not contain type family applications
- ; mapM_ checkTyFamFreeness ty_args
-
- ; mapM_ checkValidMonoType ty_args
- -- For now, I only allow tau-types (not polytypes) in
- -- the head of an instance decl.
- -- E.g. instance C (forall a. a->a) is rejected
- -- One could imagine generalising that, but I'm not sure
- -- what all the consequences might be
- }
-
- where
- spec_inst_prag = case ctxt of { SpecInstCtxt -> True; _ -> False }
-
- head_type_synonym_msg = parens (
- text "All instance types must be of the form (T t1 ... tn)" $$
- text "where T is not a synonym." $$
- text "Use -XTypeSynonymInstances if you want to disable this.")
-
- head_type_args_tyvars_msg = parens (vcat [
- text "All instance types must be of the form (T a1 ... an)",
- text "where a1 ... an are *distinct type variables*,",
- text "and each type variable appears at most once in the instance head.",
- text "Use -XFlexibleInstances if you want to disable this."])
-
- head_one_type_msg = parens (
- text "Only one type can be given in an instance head." $$
- text "Use -XMultiParamTypeClasses if you want to allow more.")
-
-instTypeErr :: Class -> [Type] -> SDoc -> SDoc
-instTypeErr cls tys msg
- = hang (ptext (sLit "Illegal instance declaration for")
- <+> quotes (pprClassPred cls tys))
- 2 msg
-\end{code}
-
-validDeivPred checks for OK 'deriving' context. See Note [Exotic
-derived instance contexts] in TcSimplify. However the predicate is
-here because it uses sizeTypes, fvTypes.
-
-Also check for a bizarre corner case, when the derived instance decl
-would look like
- instance C a b => D (T a) where ...
-Note that 'b' isn't a parameter of T. This gives rise to all sorts of
-problems; in particular, it's hard to compare solutions for equality
-when finding the fixpoint, and that means the inferContext loop does
-not converge. See Trac #5287.
-
-\begin{code}
-validDerivPred :: TyVarSet -> PredType -> Bool
-validDerivPred tv_set pred
- = case classifyPredType pred of
- ClassPred _ tys -> hasNoDups fvs
- && sizeTypes tys == length fvs
- && all (`elemVarSet` tv_set) fvs
- TuplePred ps -> all (validDerivPred tv_set) ps
- _ -> True -- Non-class predicates are ok
- where
- fvs = fvType pred
-\end{code}
-
-
-%************************************************************************
-%* *
-\subsection{Checking instance for termination}
-%* *
-%************************************************************************
-
-\begin{code}
-checkValidInstance :: UserTypeCtxt -> LHsType Name -> Type
- -> TcM ([TyVar], ThetaType, Class, [Type])
-checkValidInstance ctxt hs_type ty
- = do { let (tvs, theta, tau) = tcSplitSigmaTy ty
- ; case getClassPredTys_maybe tau of {
- Nothing -> failWithTc (ptext (sLit "Malformed instance type")) ;
- Just (clas,inst_tys) ->
- do { setSrcSpan head_loc (checkValidInstHead ctxt clas inst_tys)
- ; checkValidTheta ctxt theta
-
- -- The Termination and Coverate Conditions
- -- Check that instance inference will terminate (if we care)
- -- For Haskell 98 this will already have been done by checkValidTheta,
- -- but as we may be using other extensions we need to check.
- --
- -- Note that the Termination Condition is *more conservative* than
- -- the checkAmbiguity test we do on other type signatures
- -- e.g. Bar a => Bar Int is ambiguous, but it also fails
- -- the termination condition, because 'a' appears more often
- -- in the constraint than in the head
- ; undecidable_ok <- xoptM Opt_UndecidableInstances
- ; if undecidable_ok
- then do checkAmbiguity ctxt ty
- checkTc (checkInstLiberalCoverage clas theta inst_tys)
- (instTypeErr clas inst_tys liberal_msg)
- else do { checkInstTermination inst_tys theta
- ; checkTc (checkInstCoverage clas inst_tys)
- (instTypeErr clas inst_tys msg) }
-
- ; return (tvs, theta, clas, inst_tys) } } }
- where
- msg = parens (vcat [ptext (sLit "the Coverage Condition fails for one of the functional dependencies;"),
- undecidableMsg])
-
- liberal_msg = vcat
- [ ptext $ sLit "Multiple uses of this instance may be inconsistent"
- , ptext $ sLit "with the functional dependencies of the class."
- ]
- -- The location of the "head" of the instance
- head_loc = case hs_type of
- L _ (HsForAllTy _ _ _ (L loc _)) -> loc
- L loc _ -> loc
-\end{code}
-
-Note [Paterson conditions]
-~~~~~~~~~~~~~~~~~~~~~~~~~~
-Termination test: the so-called "Paterson conditions" (see Section 5 of
-"Understanding functionsl dependencies via Constraint Handling Rules,
-JFP Jan 2007).
-
-We check that each assertion in the context satisfies:
- (1) no variable has more occurrences in the assertion than in the head, and
- (2) the assertion has fewer constructors and variables (taken together
- and counting repetitions) than the head.
-This is only needed with -fglasgow-exts, as Haskell 98 restrictions
-(which have already been checked) guarantee termination.
-
-The underlying idea is that
-
- for any ground substitution, each assertion in the
- context has fewer type constructors than the head.
-
-
-\begin{code}
-checkInstTermination :: [TcType] -> ThetaType -> TcM ()
--- See Note [Paterson conditions]
-checkInstTermination tys theta
- = mapM_ check theta
- where
- fvs = fvTypes tys
- size = sizeTypes tys
- check pred
- | not (null bad_tvs)
- = addErrTc (predUndecErr pred (nomoreMsg bad_tvs) $$ parens undecidableMsg)
- | sizePred pred >= size
- = addErrTc (predUndecErr pred smallerMsg $$ parens undecidableMsg)
- | otherwise
- = return ()
- where
- bad_tvs = filterOut isKindVar (fvType pred \\ fvs)
- -- Rightly or wrongly, we only check for
- -- excessive occurrences of *type* variables.
- -- e.g. type instance Demote {T k} a = T (Demote {k} (Any {k}))
-
-predUndecErr :: PredType -> SDoc -> SDoc
-predUndecErr pred msg = sep [msg,
- nest 2 (ptext (sLit "in the constraint:") <+> pprType pred)]
-
-nomoreMsg :: [TcTyVar] -> SDoc
-nomoreMsg tvs
- = sep [ ptext (sLit "Variable") <> plural tvs <+> quotes (pprWithCommas ppr tvs)
- , (if isSingleton tvs then ptext (sLit "occurs")
- else ptext (sLit "occur"))
- <+> ptext (sLit "more often than in the instance head") ]
-
-smallerMsg, undecidableMsg :: SDoc
-smallerMsg = ptext (sLit "Constraint is no smaller than the instance head")
-undecidableMsg = ptext (sLit "Use -XUndecidableInstances to permit this")
-\end{code}
-
-
-
-Note [Associated type instances]
-~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-We allow this:
- class C a where
- type T x a
- instance C Int where
- type T (S y) Int = y
- type T Z Int = Char
-
-Note that
- a) The variable 'x' is not bound by the class decl
- b) 'x' is instantiated to a non-type-variable in the instance
- c) There are several type instance decls for T in the instance
-
-All this is fine. Of course, you can't give any *more* instances
-for (T ty Int) elsewhere, becuase it's an *associated* type.
-
-Note [Checking consistent instantiation]
-~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- class C a b where
- type T a x b
-
- instance C [p] Int
- type T [p] y Int = (p,y,y) -- Induces the family instance TyCon
- -- type TR p y = (p,y,y)
-
-So we
- * Form the mini-envt from the class type variables a,b
- to the instance decl types [p],Int: [a->[p], b->Int]
-
- * Look at the tyvars a,x,b of the type family constructor T
- (it shares tyvars with the class C)
-
- * Apply the mini-evnt to them, and check that the result is
- consistent with the instance types [p] y Int
-
-We do *not* assume (at this point) the the bound variables of
-the assoicated type instance decl are the same as for the parent
-instance decl. So, for example,
-
- instance C [p] Int
- type T [q] y Int = ...
-
-would work equally well. Reason: making the *kind* variables line
-up is much harder. Example (Trac #7282):
- class Foo (xs :: [k]) where
- type Bar xs :: *
-
- instance Foo '[] where
- type Bar '[] = Int
-Here the instance decl really looks like
- instance Foo k ('[] k) where
- type Bar k ('[] k) = Int
-but the k's are not scoped, and hence won't match Uniques.
-
-So instead we just match structure, with tcMatchTyX, and check
-that distinct type variales match 1-1 with distinct type variables.
-
-HOWEVER, we *still* make the instance type variables scope over the
-type instances, to pick up non-obvious kinds. Eg
- class Foo (a :: k) where
- type F a
- instance Foo (b :: k -> k) where
- type F b = Int
-Here the instance is kind-indexed and really looks like
- type F (k->k) (b::k->k) = Int
-But if the 'b' didn't scope, we would make F's instance too
-poly-kinded.
-
-\begin{code}
-checkConsistentFamInst
- :: Maybe ( Class
- , VarEnv Type ) -- ^ Class of associated type
- -- and instantiation of class TyVars
- -> TyCon -- ^ Family tycon
- -> [TyVar] -- ^ Type variables of the family instance
- -> [Type] -- ^ Type patterns from instance
- -> TcM ()
--- See Note [Checking consistent instantiation]
-
-checkConsistentFamInst Nothing _ _ _ = return ()
-checkConsistentFamInst (Just (clas, mini_env)) fam_tc at_tvs at_tys
- = do { -- Check that the associated type indeed comes from this class
- checkTc (Just clas == tyConAssoc_maybe fam_tc)
- (badATErr (className clas) (tyConName fam_tc))
-
- -- See Note [Checking consistent instantiation] in TcTyClsDecls
- -- Check right to left, so that we spot type variable
- -- inconsistencies before (more confusing) kind variables
- ; discardResult $ foldrM check_arg emptyTvSubst $
- tyConTyVars fam_tc `zip` at_tys }
- where
- at_tv_set = mkVarSet at_tvs
-
- check_arg :: (TyVar, Type) -> TvSubst -> TcM TvSubst
- check_arg (fam_tc_tv, at_ty) subst
- | Just inst_ty <- lookupVarEnv mini_env fam_tc_tv
- = case tcMatchTyX at_tv_set subst at_ty inst_ty of
- Just subst | all_distinct subst -> return subst
- _ -> failWithTc $ wrongATArgErr at_ty inst_ty
- -- No need to instantiate here, becuase the axiom
- -- uses the same type variables as the assocated class
- | otherwise
- = return subst -- Allow non-type-variable instantiation
- -- See Note [Associated type instances]
-
- all_distinct :: TvSubst -> Bool
- -- True if all the variables mapped the substitution
- -- map to *distinct* type *variables*
- all_distinct subst = go [] at_tvs
- where
- go _ [] = True
- go acc (tv:tvs) = case lookupTyVar subst tv of
- Nothing -> go acc tvs
- Just ty | Just tv' <- tcGetTyVar_maybe ty
- , tv' `notElem` acc
- -> go (tv' : acc) tvs
- _other -> False
-
-badATErr :: Name -> Name -> SDoc
-badATErr clas op
- = hsep [ptext (sLit "Class"), quotes (ppr clas),
- ptext (sLit "does not have an associated type"), quotes (ppr op)]
-
-wrongATArgErr :: Type -> Type -> SDoc
-wrongATArgErr ty instTy =
- sep [ ptext (sLit "Type indexes must match class instance head")
- , ptext (sLit "Found") <+> quotes (ppr ty)
- <+> ptext (sLit "but expected") <+> quotes (ppr instTy)
- ]
-\end{code}
-
-
-%************************************************************************
-%* *
- Checking type instance well-formedness and termination
-%* *
-%************************************************************************
-
-\begin{code}
--- Check that a "type instance" is well-formed (which includes decidability
--- unless -XUndecidableInstances is given).
---
-checkValidTyFamInst :: Maybe ( Class, VarEnv Type )
- -> TyCon -> CoAxBranch -> TcM ()
-checkValidTyFamInst mb_clsinfo fam_tc
- (CoAxBranch { cab_tvs = tvs, cab_lhs = typats
- , cab_rhs = rhs, cab_loc = loc })
- = setSrcSpan loc $
- do { checkValidFamPats fam_tc tvs typats
-
- -- The right-hand side is a tau type
- ; checkValidMonoType rhs
-
- -- We have a decidable instance unless otherwise permitted
- ; undecidable_ok <- xoptM Opt_UndecidableInstances
- ; unless undecidable_ok $
- mapM_ addErrTc (checkFamInstRhs typats (tcTyFamInsts rhs))
-
- -- Check that type patterns match the class instance head
- ; checkConsistentFamInst mb_clsinfo fam_tc tvs typats }
-
--- Make sure that each type family application is
--- (1) strictly smaller than the lhs,
--- (2) mentions no type variable more often than the lhs, and
--- (3) does not contain any further type family instances.
---
-checkFamInstRhs :: [Type] -- lhs
- -> [(TyCon, [Type])] -- type family instances
- -> [MsgDoc]
-checkFamInstRhs lhsTys famInsts
- = mapCatMaybes check famInsts
- where
- size = sizeTypes lhsTys
- fvs = fvTypes lhsTys
- check (tc, tys)
- | not (all isTyFamFree tys)
- = Just (famInstUndecErr famInst nestedMsg $$ parens undecidableMsg)
- | not (null bad_tvs)
- = Just (famInstUndecErr famInst (nomoreMsg bad_tvs) $$ parens undecidableMsg)
- | size <= sizeTypes tys
- = Just (famInstUndecErr famInst smallerAppMsg $$ parens undecidableMsg)
- | otherwise
- = Nothing
- where
- famInst = TyConApp tc tys
- bad_tvs = filterOut isKindVar (fvTypes tys \\ fvs)
- -- Rightly or wrongly, we only check for
- -- excessive occurrences of *type* variables.
- -- e.g. type instance Demote {T k} a = T (Demote {k} (Any {k}))
-
-checkValidFamPats :: TyCon -> [TyVar] -> [Type] -> TcM ()
--- Patterns in a 'type instance' or 'data instance' decl should
--- a) contain no type family applications
--- (vanilla synonyms are fine, though)
--- b) properly bind all their free type variables
--- e.g. we disallow (Trac #7536)
--- type T a = Int
--- type instance F (T a) = a
-checkValidFamPats fam_tc tvs ty_pats
- = do { mapM_ checkTyFamFreeness ty_pats
- ; let unbound_tvs = filterOut (`elemVarSet` exactTyVarsOfTypes ty_pats) tvs
- ; checkTc (null unbound_tvs) (famPatErr fam_tc unbound_tvs ty_pats) }
-
--- Ensure that no type family instances occur in a type.
---
-checkTyFamFreeness :: Type -> TcM ()
-checkTyFamFreeness ty
- = checkTc (isTyFamFree ty) $
- tyFamInstIllegalErr ty
-
--- Check that a type does not contain any type family applications.
---
-isTyFamFree :: Type -> Bool
-isTyFamFree = null . tcTyFamInsts
-
--- Error messages
-
-tyFamInstIllegalErr :: Type -> SDoc
-tyFamInstIllegalErr ty
- = hang (ptext (sLit "Illegal type synonym family application in instance") <>
- colon) 2 $
- ppr ty
-
-famInstUndecErr :: Type -> SDoc -> SDoc
-famInstUndecErr ty msg
- = sep [msg,
- nest 2 (ptext (sLit "in the type family application:") <+>
- pprType ty)]
-
-famPatErr :: TyCon -> [TyVar] -> [Type] -> SDoc
-famPatErr fam_tc tvs pats
- = hang (ptext (sLit "Family instance purports to bind type variable") <> plural tvs
- <+> pprQuotedList tvs)
- 2 (hang (ptext (sLit "but the real LHS (expanding synonyms) is:"))
- 2 (pprTypeApp fam_tc (map expandTypeSynonyms pats) <+> ptext (sLit "= ...")))
-
-nestedMsg, smallerAppMsg :: SDoc
-nestedMsg = ptext (sLit "Nested type family application")
-smallerAppMsg = ptext (sLit "Application is no smaller than the instance head")
-\end{code}
-
-%************************************************************************
-%* *
-\subsection{Auxiliary functions}
-%* *
-%************************************************************************
-
-\begin{code}
--- Free variables of a type, retaining repetitions, and expanding synonyms
-fvType :: Type -> [TyVar]
-fvType ty | Just exp_ty <- tcView ty = fvType exp_ty
-fvType (TyVarTy tv) = [tv]
-fvType (TyConApp _ tys) = fvTypes tys
-fvType (LitTy {}) = []
-fvType (FunTy arg res) = fvType arg ++ fvType res
-fvType (AppTy fun arg) = fvType fun ++ fvType arg
-fvType (ForAllTy tyvar ty) = filter (/= tyvar) (fvType ty)
-
-fvTypes :: [Type] -> [TyVar]
-fvTypes tys = concat (map fvType tys)
-
-sizeType :: Type -> Int
--- Size of a type: the number of variables and constructors
-sizeType ty | Just exp_ty <- tcView ty = sizeType exp_ty
-sizeType (TyVarTy {}) = 1
-sizeType (TyConApp _ tys) = sizeTypes tys + 1
-sizeType (LitTy {}) = 1
-sizeType (FunTy arg res) = sizeType arg + sizeType res + 1
-sizeType (AppTy fun arg) = sizeType fun + sizeType arg
-sizeType (ForAllTy _ ty) = sizeType ty
-
-sizeTypes :: [Type] -> Int
--- IA0_NOTE: Avoid kinds.
-sizeTypes xs = sum (map sizeType tys)
- where tys = filter (not . isKind) xs
-
--- Size of a predicate
---
--- We are considering whether class constraints terminate.
--- Equality constraints and constraints for the implicit
--- parameter class always termiante so it is safe to say "size 0".
--- (Implicit parameter constraints always terminate because
--- there are no instances for them---they are only solved by
--- "local instances" in expressions).
--- See Trac #4200.
-sizePred :: PredType -> Int
-sizePred ty = goClass ty
- where
- goClass p | isIPPred p = 0
- | otherwise = go (classifyPredType p)
-
- go (ClassPred _ tys') = sizeTypes tys'
- go (EqPred {}) = 0
- go (TuplePred ts) = sum (map goClass ts)
- go (IrredPred ty) = sizeType ty
-\end{code}
-
-Note [Paterson conditions on PredTypes]
-~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-We are considering whether *class* constraints terminate
-(see Note [Paterson conditions]). Precisely, the Paterson conditions
-would have us check that "the constraint has fewer constructors and variables
-(taken together and counting repetitions) than the head.".
-
-However, we can be a bit more refined by looking at which kind of constraint
-this actually is. There are two main tricks:
-
- 1. It seems like it should be OK not to count the tuple type constructor
- for a PredType like (Show a, Eq a) :: Constraint, since we don't
- count the "implicit" tuple in the ThetaType itself.
-
- In fact, the Paterson test just checks *each component* of the top level
- ThetaType against the size bound, one at a time. By analogy, it should be
- OK to return the size of the *largest* tuple component as the size of the
- whole tuple.
-
- 2. Once we get into an implicit parameter or equality we
- can't get back to a class constraint, so it's safe
- to say "size 0". See Trac #4200.
-
-NB: we don't want to detect PredTypes in sizeType (and then call
-sizePred on them), or we might get an infinite loop if that PredType
-is irreducible. See Trac #5581.
+%
+% (c) The University of Glasgow 2006
+% (c) The GRASP/AQUA Project, Glasgow University, 1992-1998
+%
+
+\begin{code}
+module TcValidity (
+ Rank, UserTypeCtxt(..), checkValidType, checkValidMonoType,
+ expectedKindInCtxt,
+ checkValidTheta, checkValidFamPats,
+ checkValidInstHead, checkValidInstance, validDerivPred,
+ checkInstTermination, checkValidTyFamInst, checkTyFamFreeness,
+ checkConsistentFamInst,
+ arityErr, badATErr
+ ) where
+
+#include "HsVersions.h"
+
+-- friends:
+import TcUnify ( tcSubType )
+import TcSimplify ( simplifyTop )
+import TypeRep
+import TcType
+import TcMType
+import Type
+import Unify( tcMatchTyX )
+import Kind
+import CoAxiom
+import Class
+import TyCon
+
+-- others:
+import HsSyn -- HsType
+import TcRnMonad -- TcType, amongst others
+import FunDeps
+import Name
+import VarEnv
+import VarSet
+import ErrUtils
+import PrelNames
+import DynFlags
+import Util
+import Maybes
+import ListSetOps
+import SrcLoc
+import Outputable
+import FastString
+
+import Control.Monad
+import Data.List ( (\\) )
+\end{code}
+
+
+%************************************************************************
+%* *
+ Checking for ambiguity
+%* *
+%************************************************************************
+
+
+\begin{code}
+checkAmbiguity :: UserTypeCtxt -> Type -> TcM ()
+checkAmbiguity ctxt ty
+ = do { allow_ambiguous <- xoptM Opt_AllowAmbiguousTypes
+ ; unless allow_ambiguous $
+ do {(subst, _tvs) <- tcInstSkolTyVars (varSetElems (tyVarsOfType ty))
+ ; let ty' = substTy subst ty
+ -- The type might have free TyVars,
+ -- so we skolemise them as TcTyVars
+ -- Tiresome; but the type inference engine expects TcTyVars
+ ; (_wrap, wanted) <- addErrCtxtM (mk_msg ty') $
+ captureConstraints $
+ tcSubType (AmbigOrigin ctxt) ctxt ty' ty'
+
+ -- Solve the constraints eagerly because an ambiguous type
+ -- can cause a cascade of further errors. The free tyvars
+ -- are skolemised, so we can safely use tcSimplifyTop
+ ; _ev_binds <- simplifyTop wanted
+
+ ; return () } }
+ where
+ mk_msg ty tidy_env
+ = return (tidy_env', msg)
+ where
+ (tidy_env', tidy_ty) = tidyOpenType tidy_env ty
+ msg = hang (ptext (sLit "In the ambiguity check for:"))
+ 2 (ppr tidy_ty)
+\end{code}
+
+
+%************************************************************************
+%* *
+ Checking validity of a user-defined type
+%* *
+%************************************************************************
+
+When dealing with a user-written type, we first translate it from an HsType
+to a Type, performing kind checking, and then check various things that should
+be true about it. We don't want to perform these checks at the same time
+as the initial translation because (a) they are unnecessary for interface-file
+types and (b) when checking a mutually recursive group of type and class decls,
+we can't "look" at the tycons/classes yet. Also, the checks are are rather
+diverse, and used to really mess up the other code.
+
+One thing we check for is 'rank'.
+
+ Rank 0: monotypes (no foralls)
+ Rank 1: foralls at the front only, Rank 0 inside
+ Rank 2: foralls at the front, Rank 1 on left of fn arrow,
+
+ basic ::= tyvar | T basic ... basic
+
+ r2 ::= forall tvs. cxt => r2a
+ r2a ::= r1 -> r2a | basic
+ r1 ::= forall tvs. cxt => r0
+ r0 ::= r0 -> r0 | basic
+
+Another thing is to check that type synonyms are saturated.
+This might not necessarily show up in kind checking.
+ type A i = i
+ data T k = MkT (k Int)
+ f :: T A -- BAD!
+
+
+\begin{code}
+checkValidType :: UserTypeCtxt -> Type -> TcM ()
+-- Checks that the type is valid for the given context
+-- Not used for instance decls; checkValidInstance instead
+checkValidType ctxt ty
+ = do { traceTc "checkValidType" (ppr ty <+> text "::" <+> ppr (typeKind ty))
+ ; rankn_flag <- xoptM Opt_RankNTypes
+ ; let gen_rank :: Rank -> Rank
+ gen_rank r | rankn_flag = ArbitraryRank
+ | otherwise = r
+
+ rank1 = gen_rank r1
+ rank0 = gen_rank r0
+
+ r0 = rankZeroMonoType
+ r1 = LimitedRank True r0
+
+ rank
+ = case ctxt of
+ DefaultDeclCtxt-> MustBeMonoType
+ ResSigCtxt -> MustBeMonoType
+ LamPatSigCtxt -> rank0
+ BindPatSigCtxt -> rank0
+ RuleSigCtxt _ -> rank1
+ TySynCtxt _ -> rank0
+
+ ExprSigCtxt -> rank1
+ FunSigCtxt _ -> rank1
+ InfSigCtxt _ -> ArbitraryRank -- Inferred type
+ ConArgCtxt _ -> rank1 -- We are given the type of the entire
+ -- constructor, hence rank 1
+
+ ForSigCtxt _ -> rank1
+ SpecInstCtxt -> rank1
+ ThBrackCtxt -> rank1
+ GhciCtxt -> ArbitraryRank
+ _ -> panic "checkValidType"
+ -- Can't happen; not used for *user* sigs
+
+ -- Check the internal validity of the type itself
+ ; check_type ctxt rank ty
+
+ -- Check that the thing has kind Type, and is lifted if necessary
+ -- Do this second, because we can't usefully take the kind of an
+ -- ill-formed type such as (a~Int)
+ ; check_kind ctxt ty }
+
+checkValidMonoType :: Type -> TcM ()
+checkValidMonoType ty = check_mono_type SigmaCtxt MustBeMonoType ty
+
+
+check_kind :: UserTypeCtxt -> TcType -> TcM ()
+-- Check that the type's kind is acceptable for the context
+check_kind ctxt ty
+ | TySynCtxt {} <- ctxt
+ = do { ck <- xoptM Opt_ConstraintKinds
+ ; unless ck $
+ checkTc (not (returnsConstraintKind actual_kind))
+ (constraintSynErr actual_kind) }
+
+ | Just k <- expectedKindInCtxt ctxt
+ = checkTc (tcIsSubKind actual_kind k) (kindErr actual_kind)
+
+ | otherwise
+ = return () -- Any kind will do
+ where
+ actual_kind = typeKind ty
+
+-- Depending on the context, we might accept any kind (for instance, in a TH
+-- splice), or only certain kinds (like in type signatures).
+expectedKindInCtxt :: UserTypeCtxt -> Maybe Kind
+expectedKindInCtxt (TySynCtxt _) = Nothing -- Any kind will do
+expectedKindInCtxt ThBrackCtxt = Nothing
+expectedKindInCtxt GhciCtxt = Nothing
+expectedKindInCtxt (ForSigCtxt _) = Just liftedTypeKind
+expectedKindInCtxt InstDeclCtxt = Just constraintKind
+expectedKindInCtxt SpecInstCtxt = Just constraintKind
+expectedKindInCtxt _ = Just openTypeKind
+\end{code}
+
+Note [Higher rank types]
+~~~~~~~~~~~~~~~~~~~~~~~~
+Technically
+ Int -> forall a. a->a
+is still a rank-1 type, but it's not Haskell 98 (Trac #5957). So the
+validity checker allow a forall after an arrow only if we allow it
+before -- that is, with Rank2Types or RankNTypes
+
+\begin{code}
+data Rank = ArbitraryRank -- Any rank ok
+
+ | LimitedRank -- Note [Higher rank types]
+ Bool -- Forall ok at top
+ Rank -- Use for function arguments
+
+ | MonoType SDoc -- Monotype, with a suggestion of how it could be a polytype
+
+ | MustBeMonoType -- Monotype regardless of flags
+
+rankZeroMonoType, tyConArgMonoType, synArgMonoType :: Rank
+rankZeroMonoType = MonoType (ptext (sLit "Perhaps you intended to use -XRankNTypes or -XRank2Types"))
+tyConArgMonoType = MonoType (ptext (sLit "Perhaps you intended to use -XImpredicativeTypes"))
+synArgMonoType = MonoType (ptext (sLit "Perhaps you intended to use -XLiberalTypeSynonyms"))
+
+funArgResRank :: Rank -> (Rank, Rank) -- Function argument and result
+funArgResRank (LimitedRank _ arg_rank) = (arg_rank, LimitedRank (forAllAllowed arg_rank) arg_rank)
+funArgResRank other_rank = (other_rank, other_rank)
+
+forAllAllowed :: Rank -> Bool
+forAllAllowed ArbitraryRank = True
+forAllAllowed (LimitedRank forall_ok _) = forall_ok
+forAllAllowed _ = False
+
+----------------------------------------
+check_mono_type :: UserTypeCtxt -> Rank
+ -> KindOrType -> TcM () -- No foralls anywhere
+ -- No unlifted types of any kind
+check_mono_type ctxt rank ty
+ | isKind ty = return () -- IA0_NOTE: Do we need to check kinds?
+ | otherwise
+ = do { check_type ctxt rank ty
+ ; checkTc (not (isUnLiftedType ty)) (unliftedArgErr ty) }
+
+check_type :: UserTypeCtxt -> Rank -> Type -> TcM ()
+-- The args say what the *type context* requires, independent
+-- of *flag* settings. You test the flag settings at usage sites.
+--
+-- Rank is allowed rank for function args
+-- Rank 0 means no for-alls anywhere
+
+check_type ctxt rank ty
+ | not (null tvs && null theta)
+ = do { checkTc (forAllAllowed rank) (forAllTyErr rank ty)
+ -- Reject e.g. (Maybe (?x::Int => Int)),
+ -- with a decent error message
+ ; check_valid_theta ctxt theta
+ ; check_type ctxt rank tau -- Allow foralls to right of arrow
+ ; checkAmbiguity ctxt ty }
+ where
+ (tvs, theta, tau) = tcSplitSigmaTy ty
+
+check_type _ _ (TyVarTy _) = return ()
+
+check_type ctxt rank (FunTy arg_ty res_ty)
+ = do { check_type ctxt arg_rank arg_ty
+ ; check_type ctxt res_rank res_ty }
+ where
+ (arg_rank, res_rank) = funArgResRank rank
+
+check_type ctxt rank (AppTy ty1 ty2)
+ = do { check_arg_type ctxt rank ty1
+ ; check_arg_type ctxt rank ty2 }
+
+check_type ctxt rank ty@(TyConApp tc tys)
+ | isSynTyCon tc
+ = do { -- Check that the synonym has enough args
+ -- This applies equally to open and closed synonyms
+ -- It's OK to have an *over-applied* type synonym
+ -- data Tree a b = ...
+ -- type Foo a = Tree [a]
+ -- f :: Foo a b -> ...
+ checkTc (tyConArity tc <= length tys) arity_msg
+
+ -- See Note [Liberal type synonyms]
+ ; liberal <- xoptM Opt_LiberalTypeSynonyms
+ ; if not liberal || isSynFamilyTyCon tc then
+ -- For H98 and synonym families, do check the type args
+ mapM_ (check_mono_type ctxt synArgMonoType) tys
+
+ else -- In the liberal case (only for closed syns), expand then check
+ case tcView ty of
+ Just ty' -> check_type ctxt rank ty'
+ Nothing -> pprPanic "check_tau_type" (ppr ty)
+ }
+
+ | isUnboxedTupleTyCon tc
+ = do { ub_tuples_allowed <- xoptM Opt_UnboxedTuples
+ ; checkTc ub_tuples_allowed ubx_tup_msg
+
+ ; impred <- xoptM Opt_ImpredicativeTypes
+ ; let rank' = if impred then ArbitraryRank else tyConArgMonoType
+ -- c.f. check_arg_type
+ -- However, args are allowed to be unlifted, or
+ -- more unboxed tuples, so can't use check_arg_ty
+ ; mapM_ (check_type ctxt rank') tys }
+
+ | otherwise
+ = mapM_ (check_arg_type ctxt rank) tys
+
+ where
+ n_args = length tys
+ tc_arity = tyConArity tc
+
+ arity_msg = arityErr "Type synonym" (tyConName tc) tc_arity n_args
+ ubx_tup_msg = ubxArgTyErr ty
+
+check_type _ _ (LitTy {}) = return ()
+
+check_type _ _ ty = pprPanic "check_type" (ppr ty)
+
+----------------------------------------
+check_arg_type :: UserTypeCtxt -> Rank -> KindOrType -> TcM ()
+-- The sort of type that can instantiate a type variable,
+-- or be the argument of a type constructor.
+-- Not an unboxed tuple, but now *can* be a forall (since impredicativity)
+-- Other unboxed types are very occasionally allowed as type
+-- arguments depending on the kind of the type constructor
+--
+-- For example, we want to reject things like:
+--
+-- instance Ord a => Ord (forall s. T s a)
+-- and
+-- g :: T s (forall b.b)
+--
+-- NB: unboxed tuples can have polymorphic or unboxed args.
+-- This happens in the workers for functions returning
+-- product types with polymorphic components.
+-- But not in user code.
+-- Anyway, they are dealt with by a special case in check_tau_type
+
+check_arg_type ctxt rank ty
+ | isKind ty = return () -- IA0_NOTE: Do we need to check a kind?
+ | otherwise
+ = do { impred <- xoptM Opt_ImpredicativeTypes
+ ; let rank' = case rank of -- Predictive => must be monotype
+ MustBeMonoType -> MustBeMonoType -- Monotype, regardless
+ _other | impred -> ArbitraryRank
+ | otherwise -> tyConArgMonoType
+ -- Make sure that MustBeMonoType is propagated,
+ -- so that we don't suggest -XImpredicativeTypes in
+ -- (Ord (forall a.a)) => a -> a
+ -- and so that if it Must be a monotype, we check that it is!
+
+ ; check_type ctxt rank' ty
+ ; checkTc (not (isUnLiftedType ty)) (unliftedArgErr ty) }
+ -- NB the isUnLiftedType test also checks for
+ -- T State#
+ -- where there is an illegal partial application of State# (which has
+ -- kind * -> #); see Note [The kind invariant] in TypeRep
+
+----------------------------------------
+forAllTyErr :: Rank -> Type -> SDoc
+forAllTyErr rank ty
+ = vcat [ hang (ptext (sLit "Illegal polymorphic or qualified type:")) 2 (ppr ty)
+ , suggestion ]
+ where
+ suggestion = case rank of
+ LimitedRank {} -> ptext (sLit "Perhaps you intended to use -XRankNTypes or -XRank2Types")
+ MonoType d -> d
+ _ -> empty -- Polytype is always illegal
+
+unliftedArgErr, ubxArgTyErr :: Type -> SDoc
+unliftedArgErr ty = sep [ptext (sLit "Illegal unlifted type:"), ppr ty]
+ubxArgTyErr ty = sep [ptext (sLit "Illegal unboxed tuple type as function argument:"), ppr ty]
+
+kindErr :: Kind -> SDoc
+kindErr kind = sep [ptext (sLit "Expecting an ordinary type, but found a type of kind"), ppr kind]
+\end{code}
+
+Note [Liberal type synonyms]
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+If -XLiberalTypeSynonyms is on, expand closed type synonyms *before*
+doing validity checking. This allows us to instantiate a synonym defn
+with a for-all type, or with a partially-applied type synonym.
+ e.g. type T a b = a
+ type S m = m ()
+ f :: S (T Int)
+Here, T is partially applied, so it's illegal in H98. But if you
+expand S first, then T we get just
+ f :: Int
+which is fine.
+
+IMPORTANT: suppose T is a type synonym. Then we must do validity
+checking on an appliation (T ty1 ty2)
+
+ *either* before expansion (i.e. check ty1, ty2)
+ *or* after expansion (i.e. expand T ty1 ty2, and then check)
+ BUT NOT BOTH
+
+If we do both, we get exponential behaviour!!
+
+ data TIACons1 i r c = c i ::: r c
+ type TIACons2 t x = TIACons1 t (TIACons1 t x)
+ type TIACons3 t x = TIACons2 t (TIACons1 t x)
+ type TIACons4 t x = TIACons2 t (TIACons2 t x)
+ type TIACons7 t x = TIACons4 t (TIACons3 t x)
+
+
+%************************************************************************
+%* *
+\subsection{Checking a theta or source type}
+%* *
+%************************************************************************
+
+\begin{code}
+checkValidTheta :: UserTypeCtxt -> ThetaType -> TcM ()
+checkValidTheta ctxt theta
+ = addErrCtxt (checkThetaCtxt ctxt theta) (check_valid_theta ctxt theta)
+
+-------------------------
+check_valid_theta :: UserTypeCtxt -> [PredType] -> TcM ()
+check_valid_theta _ []
+ = return ()
+check_valid_theta ctxt theta
+ = do { dflags <- getDynFlags
+ ; warnTc (wopt Opt_WarnDuplicateConstraints dflags &&
+ notNull dups) (dupPredWarn dups)
+ ; mapM_ (check_pred_ty dflags ctxt) theta }
+ where
+ (_,dups) = removeDups cmpPred theta
+
+-------------------------
+check_pred_ty :: DynFlags -> UserTypeCtxt -> PredType -> TcM ()
+-- Check the validity of a predicate in a signature
+-- We look through any type synonyms; any constraint kinded
+-- type synonyms have been checked at their definition site
+
+check_pred_ty dflags ctxt pred
+ | Just (tc,tys) <- tcSplitTyConApp_maybe pred
+ = case () of
+ _ | Just cls <- tyConClass_maybe tc
+ -> check_class_pred dflags ctxt cls tys
+
+ | tc `hasKey` eqTyConKey
+ , let [_, ty1, ty2] = tys
+ -> check_eq_pred dflags ctxt ty1 ty2
+
+ | isTupleTyCon tc
+ -> check_tuple_pred dflags ctxt pred tys
+
+ | otherwise -- X t1 t2, where X is presumably a
+ -- type/data family returning ConstraintKind
+ -> check_irred_pred dflags ctxt pred tys
+
+ | (TyVarTy _, arg_tys) <- tcSplitAppTys pred
+ = check_irred_pred dflags ctxt pred arg_tys
+
+ | otherwise
+ = badPred pred
+
+badPred :: PredType -> TcM ()
+badPred pred = failWithTc (ptext (sLit "Malformed predicate") <+> quotes (ppr pred))
+
+check_class_pred :: DynFlags -> UserTypeCtxt -> Class -> [TcType] -> TcM ()
+check_class_pred dflags ctxt cls tys
+ = do { -- Class predicates are valid in all contexts
+ ; checkTc (arity == n_tys) arity_err
+
+ -- Check the form of the argument types
+ ; mapM_ checkValidMonoType tys
+ ; checkTc (check_class_pred_tys dflags ctxt tys)
+ (predTyVarErr (mkClassPred cls tys) $$ how_to_allow)
+ }
+ where
+ class_name = className cls
+ arity = classArity cls
+ n_tys = length tys
+ arity_err = arityErr "Class" class_name arity n_tys
+ how_to_allow = parens (ptext (sLit "Use -XFlexibleContexts to permit this"))
+
+
+check_eq_pred :: DynFlags -> UserTypeCtxt -> TcType -> TcType -> TcM ()
+check_eq_pred dflags _ctxt ty1 ty2
+ = do { -- Equational constraints are valid in all contexts if type
+ -- families are permitted
+ ; checkTc (xopt Opt_TypeFamilies dflags || xopt Opt_GADTs dflags)
+ (eqPredTyErr (mkEqPred ty1 ty2))
+
+ -- Check the form of the argument types
+ ; checkValidMonoType ty1
+ ; checkValidMonoType ty2
+ }
+
+check_tuple_pred :: DynFlags -> UserTypeCtxt -> PredType -> [PredType] -> TcM ()
+check_tuple_pred dflags ctxt pred ts
+ = do { checkTc (xopt Opt_ConstraintKinds dflags)
+ (predTupleErr pred)
+ ; mapM_ (check_pred_ty dflags ctxt) ts }
+ -- This case will not normally be executed because
+ -- without -XConstraintKinds tuple types are only kind-checked as *
+
+check_irred_pred :: DynFlags -> UserTypeCtxt -> PredType -> [TcType] -> TcM ()
+check_irred_pred dflags ctxt pred arg_tys
+ -- The predicate looks like (X t1 t2) or (x t1 t2) :: Constraint
+ -- But X is not a synonym; that's been expanded already
+ --
+ -- Allowing irreducible predicates in class superclasses is somewhat dangerous
+ -- because we can write:
+ --
+ -- type family Fooish x :: * -> Constraint
+ -- type instance Fooish () = Foo
+ -- class Fooish () a => Foo a where
+ --
+ -- This will cause the constraint simplifier to loop because every time we canonicalise a
+ -- (Foo a) class constraint we add a (Fooish () a) constraint which will be immediately
+ -- solved to add+canonicalise another (Foo a) constraint.
+ --
+ -- It is equally dangerous to allow them in instance heads because in that case the
+ -- Paterson conditions may not detect duplication of a type variable or size change.
+ = do { checkTc (xopt Opt_ConstraintKinds dflags)
+ (predIrredErr pred)
+ ; mapM_ checkValidMonoType arg_tys
+ ; unless (xopt Opt_UndecidableInstances dflags) $
+ -- Make sure it is OK to have an irred pred in this context
+ checkTc (case ctxt of ClassSCCtxt _ -> False; InstDeclCtxt -> False; _ -> True)
+ (predIrredBadCtxtErr pred) }
+
+-------------------------
+check_class_pred_tys :: DynFlags -> UserTypeCtxt -> [KindOrType] -> Bool
+check_class_pred_tys dflags ctxt kts
+ = case ctxt of
+ SpecInstCtxt -> True -- {-# SPECIALISE instance Eq (T Int) #-} is fine
+ InstDeclCtxt -> flexible_contexts || undecidable_ok || all tcIsTyVarTy tys
+ -- Further checks on head and theta in
+ -- checkInstTermination
+ _ -> flexible_contexts || all tyvar_head tys
+ where
+ (_, tys) = span isKind kts -- see Note [Kind polymorphic type classes]
+ flexible_contexts = xopt Opt_FlexibleContexts dflags
+ undecidable_ok = xopt Opt_UndecidableInstances dflags
+
+-------------------------
+tyvar_head :: Type -> Bool
+tyvar_head ty -- Haskell 98 allows predicates of form
+ | tcIsTyVarTy ty = True -- C (a ty1 .. tyn)
+ | otherwise -- where a is a type variable
+ = case tcSplitAppTy_maybe ty of
+ Just (ty, _) -> tyvar_head ty
+ Nothing -> False
+\end{code}
+
+Note [Kind polymorphic type classes]
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+MultiParam check:
+
+ class C f where... -- C :: forall k. k -> Constraint
+ instance C Maybe where...
+
+ The dictionary gets type [C * Maybe] even if it's not a MultiParam
+ type class.
+
+Flexibility check:
+
+ class C f where... -- C :: forall k. k -> Constraint
+ data D a = D a
+ instance C D where
+
+ The dictionary gets type [C * (D *)]. IA0_TODO it should be
+ generalized actually.
+
+Note [The ambiguity check for type signatures]
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+checkAmbiguity is a check on user-supplied type signatures. It is
+*purely* there to report functions that cannot possibly be called. So for
+example we want to reject:
+ f :: C a => Int
+The idea is there can be no legal calls to 'f' because every call will
+give rise to an ambiguous constraint. We could soundly omit the
+ambiguity check on type signatures entirely, at the expense of
+delaying ambiguity errors to call sites. Indeed, the flag
+-XAllowAmbiguousTypes switches off the ambiguity check.
+
+What about things like this:
+ class D a b | a -> b where ..
+ h :: D Int b => Int
+The Int may well fix 'b' at the call site, so that signature should
+not be rejected. Moreover, using *visible* fundeps is too
+conservative. Consider
+ class X a b where ...
+ class D a b | a -> b where ...
+ instance D a b => X [a] b where...
+ h :: X a b => a -> a
+Here h's type looks ambiguous in 'b', but here's a legal call:
+ ...(h [True])...
+That gives rise to a (X [Bool] beta) constraint, and using the
+instance means we need (D Bool beta) and that fixes 'beta' via D's
+fundep!
+
+Behind all these special cases there is a simple guiding principle.
+Consider
+
+ f :: <type>
+ f = ...blah...
+
+ g :: <type>
+ g = f
+
+You would think that the definition of g would surely typecheck!
+After all f has exactly the same type, and g=f. But in fact f's type
+is instantiated and the instantiated constraints are solved against
+the originals, so in the case an ambiguous type it won't work.
+Consider our earlier example f :: C a => Int. Then in g's definition,
+we'll instantiate to (C alpha) and try to deduce (C alpha) from (C a),
+and fail.
+
+So in fact we use this as our *definition* of ambiguity. We use a
+very similar test for *inferred* types, to ensure that they are
+unambiguous. See Note [Impedence matching] in TcBinds.
+
+This test is very conveniently implemented by calling
+ tcSubType <type> <type>
+This neatly takes account of the functional dependecy stuff above,
+and implict parameter (see Note [Implicit parameters and ambiguity]).
+
+What about this, though?
+ g :: C [a] => Int
+Is every call to 'g' ambiguous? After all, we might have
+ intance C [a] where ...
+at the call site. So maybe that type is ok! Indeed even f's
+quintessentially ambiguous type might, just possibly be callable:
+with -XFlexibleInstances we could have
+ instance C a where ...
+and now a call could be legal after all! Well, we'll reject this
+unless the instance is available *here*.
+
+Side note: the ambiguity check is only used for *user* types, not for
+types coming from inteface files. The latter can legitimately have
+ambiguous types. Example
+
+ class S a where s :: a -> (Int,Int)
+ instance S Char where s _ = (1,1)
+ f:: S a => [a] -> Int -> (Int,Int)
+ f (_::[a]) x = (a*x,b)
+ where (a,b) = s (undefined::a)
+
+Here the worker for f gets the type
+ fw :: forall a. S a => Int -> (# Int, Int #)
+
+Note [Implicit parameters and ambiguity]
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+Only a *class* predicate can give rise to ambiguity
+An *implicit parameter* cannot. For example:
+ foo :: (?x :: [a]) => Int
+ foo = length ?x
+is fine. The call site will suppply a particular 'x'
+
+Furthermore, the type variables fixed by an implicit parameter
+propagate to the others. E.g.
+ foo :: (Show a, ?x::[a]) => Int
+ foo = show (?x++?x)
+The type of foo looks ambiguous. But it isn't, because at a call site
+we might have
+ let ?x = 5::Int in foo
+and all is well. In effect, implicit parameters are, well, parameters,
+so we can take their type variables into account as part of the
+"tau-tvs" stuff. This is done in the function 'FunDeps.grow'.
+\begin{code}
+checkThetaCtxt :: UserTypeCtxt -> ThetaType -> SDoc
+checkThetaCtxt ctxt theta
+ = vcat [ptext (sLit "In the context:") <+> pprTheta theta,
+ ptext (sLit "While checking") <+> pprUserTypeCtxt ctxt ]
+
+eqPredTyErr, predTyVarErr, predTupleErr, predIrredErr, predIrredBadCtxtErr :: PredType -> SDoc
+eqPredTyErr pred = ptext (sLit "Illegal equational constraint") <+> pprType pred
+ $$
+ parens (ptext (sLit "Use -XGADTs or -XTypeFamilies to permit this"))
+predTyVarErr pred = hang (ptext (sLit "Non type-variable argument"))
+ 2 (ptext (sLit "in the constraint:") <+> pprType pred)
+predTupleErr pred = hang (ptext (sLit "Illegal tuple constraint:") <+> pprType pred)
+ 2 (parens (ptext (sLit "Use -XConstraintKinds to permit this")))
+predIrredErr pred = hang (ptext (sLit "Illegal constraint:") <+> pprType pred)
+ 2 (parens (ptext (sLit "Use -XConstraintKinds to permit this")))
+predIrredBadCtxtErr pred = hang (ptext (sLit "Illegal constraint") <+> quotes (pprType pred)
+ <+> ptext (sLit "in a superclass/instance context"))
+ 2 (parens (ptext (sLit "Use -XUndecidableInstances to permit this")))
+
+constraintSynErr :: Type -> SDoc
+constraintSynErr kind = hang (ptext (sLit "Illegal constraint synonym of kind:") <+> quotes (ppr kind))
+ 2 (parens (ptext (sLit "Use -XConstraintKinds to permit this")))
+
+dupPredWarn :: [[PredType]] -> SDoc
+dupPredWarn dups = ptext (sLit "Duplicate constraint(s):") <+> pprWithCommas pprType (map head dups)
+
+arityErr :: Outputable a => String -> a -> Int -> Int -> SDoc
+arityErr kind name n m
+ = hsep [ text kind, quotes (ppr name), ptext (sLit "should have"),
+ n_arguments <> comma, text "but has been given",
+ if m==0 then text "none" else int m]
+ where
+ n_arguments | n == 0 = ptext (sLit "no arguments")
+ | n == 1 = ptext (sLit "1 argument")
+ | True = hsep [int n, ptext (sLit "arguments")]
+\end{code}
+
+%************************************************************************
+%* *
+\subsection{Checking for a decent instance head type}
+%* *
+%************************************************************************
+
+@checkValidInstHead@ checks the type {\em and} its syntactic constraints:
+it must normally look like: @instance Foo (Tycon a b c ...) ...@
+
+The exceptions to this syntactic checking: (1)~if the @GlasgowExts@
+flag is on, or (2)~the instance is imported (they must have been
+compiled elsewhere). In these cases, we let them go through anyway.
+
+We can also have instances for functions: @instance Foo (a -> b) ...@.
+
+\begin{code}
+checkValidInstHead :: UserTypeCtxt -> Class -> [Type] -> TcM ()
+checkValidInstHead ctxt clas cls_args
+ = do { dflags <- getDynFlags
+
+ -- Check language restrictions;
+ -- but not for SPECIALISE isntance pragmas
+ ; let ty_args = dropWhile isKind cls_args
+ ; unless spec_inst_prag $
+ do { checkTc (xopt Opt_TypeSynonymInstances dflags ||
+ all tcInstHeadTyNotSynonym ty_args)
+ (instTypeErr clas cls_args head_type_synonym_msg)
+ ; checkTc (xopt Opt_FlexibleInstances dflags ||
+ all tcInstHeadTyAppAllTyVars ty_args)
+ (instTypeErr clas cls_args head_type_args_tyvars_msg)
+ ; checkTc (xopt Opt_NullaryTypeClasses dflags ||
+ not (null ty_args))
+ (instTypeErr clas cls_args head_no_type_msg)
+ ; checkTc (xopt Opt_MultiParamTypeClasses dflags ||
+ length ty_args <= 1) -- Only count type arguments
+ (instTypeErr clas cls_args head_one_type_msg) }
+
+ -- May not contain type family applications
+ ; mapM_ checkTyFamFreeness ty_args
+
+ ; mapM_ checkValidMonoType ty_args
+ -- For now, I only allow tau-types (not polytypes) in
+ -- the head of an instance decl.
+ -- E.g. instance C (forall a. a->a) is rejected
+ -- One could imagine generalising that, but I'm not sure
+ -- what all the consequences might be
+ }
+
+ where
+ spec_inst_prag = case ctxt of { SpecInstCtxt -> True; _ -> False }
+
+ head_type_synonym_msg = parens (
+ text "All instance types must be of the form (T t1 ... tn)" $$
+ text "where T is not a synonym." $$
+ text "Use -XTypeSynonymInstances if you want to disable this.")
+
+ head_type_args_tyvars_msg = parens (vcat [
+ text "All instance types must be of the form (T a1 ... an)",
+ text "where a1 ... an are *distinct type variables*,",
+ text "and each type variable appears at most once in the instance head.",
+ text "Use -XFlexibleInstances if you want to disable this."])
+
+ head_one_type_msg = parens (
+ text "Only one type can be given in an instance head." $$
+ text "Use -XMultiParamTypeClasses if you want to allow more.")
+
+ head_no_type_msg = parens (
+ text "No parameters in the instance head." $$
+ text "Use -XNullaryTypeClasses if you want to allow this.")
+
+instTypeErr :: Class -> [Type] -> SDoc -> SDoc
+instTypeErr cls tys msg
+ = hang (ptext (sLit "Illegal instance declaration for")
+ <+> quotes (pprClassPred cls tys))
+ 2 msg
+\end{code}
+
+validDeivPred checks for OK 'deriving' context. See Note [Exotic
+derived instance contexts] in TcSimplify. However the predicate is
+here because it uses sizeTypes, fvTypes.
+
+Also check for a bizarre corner case, when the derived instance decl
+would look like
+ instance C a b => D (T a) where ...
+Note that 'b' isn't a parameter of T. This gives rise to all sorts of
+problems; in particular, it's hard to compare solutions for equality
+when finding the fixpoint, and that means the inferContext loop does
+not converge. See Trac #5287.
+
+\begin{code}
+validDerivPred :: TyVarSet -> PredType -> Bool
+validDerivPred tv_set pred
+ = case classifyPredType pred of
+ ClassPred _ tys -> hasNoDups fvs
+ && sizeTypes tys == length fvs
+ && all (`elemVarSet` tv_set) fvs
+ TuplePred ps -> all (validDerivPred tv_set) ps
+ _ -> True -- Non-class predicates are ok
+ where
+ fvs = fvType pred
+\end{code}
+
+
+%************************************************************************
+%* *
+\subsection{Checking instance for termination}
+%* *
+%************************************************************************
+
+\begin{code}
+checkValidInstance :: UserTypeCtxt -> LHsType Name -> Type
+ -> TcM ([TyVar], ThetaType, Class, [Type])
+checkValidInstance ctxt hs_type ty
+ = do { let (tvs, theta, tau) = tcSplitSigmaTy ty
+ ; case getClassPredTys_maybe tau of {
+ Nothing -> failWithTc (ptext (sLit "Malformed instance type")) ;
+ Just (clas,inst_tys) ->
+ do { setSrcSpan head_loc (checkValidInstHead ctxt clas inst_tys)
+ ; checkValidTheta ctxt theta
+
+ -- The Termination and Coverate Conditions
+ -- Check that instance inference will terminate (if we care)
+ -- For Haskell 98 this will already have been done by checkValidTheta,
+ -- but as we may be using other extensions we need to check.
+ --
+ -- Note that the Termination Condition is *more conservative* than
+ -- the checkAmbiguity test we do on other type signatures
+ -- e.g. Bar a => Bar Int is ambiguous, but it also fails
+ -- the termination condition, because 'a' appears more often
+ -- in the constraint than in the head
+ ; undecidable_ok <- xoptM Opt_UndecidableInstances
+ ; if undecidable_ok
+ then do checkAmbiguity ctxt ty
+ checkTc (checkInstLiberalCoverage clas theta inst_tys)
+ (instTypeErr clas inst_tys liberal_msg)
+ else do { checkInstTermination inst_tys theta
+ ; checkTc (checkInstCoverage clas inst_tys)
+ (instTypeErr clas inst_tys msg) }
+
+ ; return (tvs, theta, clas, inst_tys) } } }
+ where
+ msg = parens (vcat [ptext (sLit "the Coverage Condition fails for one of the functional dependencies;"),
+ undecidableMsg])
+
+ liberal_msg = vcat
+ [ ptext $ sLit "Multiple uses of this instance may be inconsistent"
+ , ptext $ sLit "with the functional dependencies of the class."
+ ]
+ -- The location of the "head" of the instance
+ head_loc = case hs_type of
+ L _ (HsForAllTy _ _ _ (L loc _)) -> loc
+ L loc _ -> loc
+\end{code}
+
+Note [Paterson conditions]
+~~~~~~~~~~~~~~~~~~~~~~~~~~
+Termination test: the so-called "Paterson conditions" (see Section 5 of
+"Understanding functionsl dependencies via Constraint Handling Rules,
+JFP Jan 2007).
+
+We check that each assertion in the context satisfies:
+ (1) no variable has more occurrences in the assertion than in the head, and
+ (2) the assertion has fewer constructors and variables (taken together
+ and counting repetitions) than the head.
+This is only needed with -fglasgow-exts, as Haskell 98 restrictions
+(which have already been checked) guarantee termination.
+
+The underlying idea is that
+
+ for any ground substitution, each assertion in the
+ context has fewer type constructors than the head.
+
+
+\begin{code}
+checkInstTermination :: [TcType] -> ThetaType -> TcM ()
+-- See Note [Paterson conditions]
+checkInstTermination tys theta
+ = mapM_ check theta
+ where
+ fvs = fvTypes tys
+ size = sizeTypes tys
+ check pred
+ | not (null bad_tvs)
+ = addErrTc (predUndecErr pred (nomoreMsg bad_tvs) $$ parens undecidableMsg)
+ | sizePred pred >= size
+ = addErrTc (predUndecErr pred smallerMsg $$ parens undecidableMsg)
+ | otherwise
+ = return ()
+ where
+ bad_tvs = filterOut isKindVar (fvType pred \\ fvs)
+ -- Rightly or wrongly, we only check for
+ -- excessive occurrences of *type* variables.
+ -- e.g. type instance Demote {T k} a = T (Demote {k} (Any {k}))
+
+predUndecErr :: PredType -> SDoc -> SDoc
+predUndecErr pred msg = sep [msg,
+ nest 2 (ptext (sLit "in the constraint:") <+> pprType pred)]
+
+nomoreMsg :: [TcTyVar] -> SDoc
+nomoreMsg tvs
+ = sep [ ptext (sLit "Variable") <> plural tvs <+> quotes (pprWithCommas ppr tvs)
+ , (if isSingleton tvs then ptext (sLit "occurs")
+ else ptext (sLit "occur"))
+ <+> ptext (sLit "more often than in the instance head") ]
+
+smallerMsg, undecidableMsg :: SDoc
+smallerMsg = ptext (sLit "Constraint is no smaller than the instance head")
+undecidableMsg = ptext (sLit "Use -XUndecidableInstances to permit this")
+\end{code}
+
+
+
+Note [Associated type instances]
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+We allow this:
+ class C a where
+ type T x a
+ instance C Int where
+ type T (S y) Int = y
+ type T Z Int = Char
+
+Note that
+ a) The variable 'x' is not bound by the class decl
+ b) 'x' is instantiated to a non-type-variable in the instance
+ c) There are several type instance decls for T in the instance
+
+All this is fine. Of course, you can't give any *more* instances
+for (T ty Int) elsewhere, becuase it's an *associated* type.
+
+Note [Checking consistent instantiation]
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ class C a b where
+ type T a x b
+
+ instance C [p] Int
+ type T [p] y Int = (p,y,y) -- Induces the family instance TyCon
+ -- type TR p y = (p,y,y)
+
+So we
+ * Form the mini-envt from the class type variables a,b
+ to the instance decl types [p],Int: [a->[p], b->Int]
+
+ * Look at the tyvars a,x,b of the type family constructor T
+ (it shares tyvars with the class C)
+
+ * Apply the mini-evnt to them, and check that the result is
+ consistent with the instance types [p] y Int
+
+We do *not* assume (at this point) the the bound variables of
+the assoicated type instance decl are the same as for the parent
+instance decl. So, for example,
+
+ instance C [p] Int
+ type T [q] y Int = ...
+
+would work equally well. Reason: making the *kind* variables line
+up is much harder. Example (Trac #7282):
+ class Foo (xs :: [k]) where
+ type Bar xs :: *
+
+ instance Foo '[] where
+ type Bar '[] = Int
+Here the instance decl really looks like
+ instance Foo k ('[] k) where
+ type Bar k ('[] k) = Int
+but the k's are not scoped, and hence won't match Uniques.
+
+So instead we just match structure, with tcMatchTyX, and check
+that distinct type variales match 1-1 with distinct type variables.
+
+HOWEVER, we *still* make the instance type variables scope over the
+type instances, to pick up non-obvious kinds. Eg
+ class Foo (a :: k) where
+ type F a
+ instance Foo (b :: k -> k) where
+ type F b = Int
+Here the instance is kind-indexed and really looks like
+ type F (k->k) (b::k->k) = Int
+But if the 'b' didn't scope, we would make F's instance too
+poly-kinded.
+
+\begin{code}
+checkConsistentFamInst
+ :: Maybe ( Class
+ , VarEnv Type ) -- ^ Class of associated type
+ -- and instantiation of class TyVars
+ -> TyCon -- ^ Family tycon
+ -> [TyVar] -- ^ Type variables of the family instance
+ -> [Type] -- ^ Type patterns from instance
+ -> TcM ()
+-- See Note [Checking consistent instantiation]
+
+checkConsistentFamInst Nothing _ _ _ = return ()
+checkConsistentFamInst (Just (clas, mini_env)) fam_tc at_tvs at_tys
+ = do { -- Check that the associated type indeed comes from this class
+ checkTc (Just clas == tyConAssoc_maybe fam_tc)
+ (badATErr (className clas) (tyConName fam_tc))
+
+ -- See Note [Checking consistent instantiation] in TcTyClsDecls
+ -- Check right to left, so that we spot type variable
+ -- inconsistencies before (more confusing) kind variables
+ ; discardResult $ foldrM check_arg emptyTvSubst $
+ tyConTyVars fam_tc `zip` at_tys }
+ where
+ at_tv_set = mkVarSet at_tvs
+
+ check_arg :: (TyVar, Type) -> TvSubst -> TcM TvSubst
+ check_arg (fam_tc_tv, at_ty) subst
+ | Just inst_ty <- lookupVarEnv mini_env fam_tc_tv
+ = case tcMatchTyX at_tv_set subst at_ty inst_ty of
+ Just subst | all_distinct subst -> return subst
+ _ -> failWithTc $ wrongATArgErr at_ty inst_ty
+ -- No need to instantiate here, becuase the axiom
+ -- uses the same type variables as the assocated class
+ | otherwise
+ = return subst -- Allow non-type-variable instantiation
+ -- See Note [Associated type instances]
+
+ all_distinct :: TvSubst -> Bool
+ -- True if all the variables mapped the substitution
+ -- map to *distinct* type *variables*
+ all_distinct subst = go [] at_tvs
+ where
+ go _ [] = True
+ go acc (tv:tvs) = case lookupTyVar subst tv of
+ Nothing -> go acc tvs
+ Just ty | Just tv' <- tcGetTyVar_maybe ty
+ , tv' `notElem` acc
+ -> go (tv' : acc) tvs
+ _other -> False
+
+badATErr :: Name -> Name -> SDoc
+badATErr clas op
+ = hsep [ptext (sLit "Class"), quotes (ppr clas),
+ ptext (sLit "does not have an associated type"), quotes (ppr op)]
+
+wrongATArgErr :: Type -> Type -> SDoc
+wrongATArgErr ty instTy =
+ sep [ ptext (sLit "Type indexes must match class instance head")
+ , ptext (sLit "Found") <+> quotes (ppr ty)
+ <+> ptext (sLit "but expected") <+> quotes (ppr instTy)
+ ]
+\end{code}
+
+
+%************************************************************************
+%* *
+ Checking type instance well-formedness and termination
+%* *
+%************************************************************************
+
+\begin{code}
+-- Check that a "type instance" is well-formed (which includes decidability
+-- unless -XUndecidableInstances is given).
+--
+checkValidTyFamInst :: Maybe ( Class, VarEnv Type )
+ -> TyCon -> CoAxBranch -> TcM ()
+checkValidTyFamInst mb_clsinfo fam_tc
+ (CoAxBranch { cab_tvs = tvs, cab_lhs = typats
+ , cab_rhs = rhs, cab_loc = loc })
+ = setSrcSpan loc $
+ do { checkValidFamPats fam_tc tvs typats
+
+ -- The right-hand side is a tau type
+ ; checkValidMonoType rhs
+
+ -- We have a decidable instance unless otherwise permitted
+ ; undecidable_ok <- xoptM Opt_UndecidableInstances
+ ; unless undecidable_ok $
+ mapM_ addErrTc (checkFamInstRhs typats (tcTyFamInsts rhs))
+
+ -- Check that type patterns match the class instance head
+ ; checkConsistentFamInst mb_clsinfo fam_tc tvs typats }
+
+-- Make sure that each type family application is
+-- (1) strictly smaller than the lhs,
+-- (2) mentions no type variable more often than the lhs, and
+-- (3) does not contain any further type family instances.
+--
+checkFamInstRhs :: [Type] -- lhs
+ -> [(TyCon, [Type])] -- type family instances
+ -> [MsgDoc]
+checkFamInstRhs lhsTys famInsts
+ = mapCatMaybes check famInsts
+ where
+ size = sizeTypes lhsTys
+ fvs = fvTypes lhsTys
+ check (tc, tys)
+ | not (all isTyFamFree tys)
+ = Just (famInstUndecErr famInst nestedMsg $$ parens undecidableMsg)
+ | not (null bad_tvs)
+ = Just (famInstUndecErr famInst (nomoreMsg bad_tvs) $$ parens undecidableMsg)
+ | size <= sizeTypes tys
+ = Just (famInstUndecErr famInst smallerAppMsg $$ parens undecidableMsg)
+ | otherwise
+ = Nothing
+ where
+ famInst = TyConApp tc tys
+ bad_tvs = filterOut isKindVar (fvTypes tys \\ fvs)
+ -- Rightly or wrongly, we only check for
+ -- excessive occurrences of *type* variables.
+ -- e.g. type instance Demote {T k} a = T (Demote {k} (Any {k}))
+
+checkValidFamPats :: TyCon -> [TyVar] -> [Type] -> TcM ()
+-- Patterns in a 'type instance' or 'data instance' decl should
+-- a) contain no type family applications
+-- (vanilla synonyms are fine, though)
+-- b) properly bind all their free type variables
+-- e.g. we disallow (Trac #7536)
+-- type T a = Int
+-- type instance F (T a) = a
+checkValidFamPats fam_tc tvs ty_pats
+ = do { mapM_ checkTyFamFreeness ty_pats
+ ; let unbound_tvs = filterOut (`elemVarSet` exactTyVarsOfTypes ty_pats) tvs
+ ; checkTc (null unbound_tvs) (famPatErr fam_tc unbound_tvs ty_pats) }
+
+-- Ensure that no type family instances occur in a type.
+--
+checkTyFamFreeness :: Type -> TcM ()
+checkTyFamFreeness ty
+ = checkTc (isTyFamFree ty) $
+ tyFamInstIllegalErr ty
+
+-- Check that a type does not contain any type family applications.
+--
+isTyFamFree :: Type -> Bool
+isTyFamFree = null . tcTyFamInsts
+
+-- Error messages
+
+tyFamInstIllegalErr :: Type -> SDoc
+tyFamInstIllegalErr ty
+ = hang (ptext (sLit "Illegal type synonym family application in instance") <>
+ colon) 2 $
+ ppr ty
+
+famInstUndecErr :: Type -> SDoc -> SDoc
+famInstUndecErr ty msg
+ = sep [msg,
+ nest 2 (ptext (sLit "in the type family application:") <+>
+ pprType ty)]
+
+famPatErr :: TyCon -> [TyVar] -> [Type] -> SDoc
+famPatErr fam_tc tvs pats
+ = hang (ptext (sLit "Family instance purports to bind type variable") <> plural tvs
+ <+> pprQuotedList tvs)
+ 2 (hang (ptext (sLit "but the real LHS (expanding synonyms) is:"))
+ 2 (pprTypeApp fam_tc (map expandTypeSynonyms pats) <+> ptext (sLit "= ...")))
+
+nestedMsg, smallerAppMsg :: SDoc
+nestedMsg = ptext (sLit "Nested type family application")
+smallerAppMsg = ptext (sLit "Application is no smaller than the instance head")
+\end{code}
+
+%************************************************************************
+%* *
+\subsection{Auxiliary functions}
+%* *
+%************************************************************************
+
+\begin{code}
+-- Free variables of a type, retaining repetitions, and expanding synonyms
+fvType :: Type -> [TyVar]
+fvType ty | Just exp_ty <- tcView ty = fvType exp_ty
+fvType (TyVarTy tv) = [tv]
+fvType (TyConApp _ tys) = fvTypes tys
+fvType (LitTy {}) = []
+fvType (FunTy arg res) = fvType arg ++ fvType res
+fvType (AppTy fun arg) = fvType fun ++ fvType arg
+fvType (ForAllTy tyvar ty) = filter (/= tyvar) (fvType ty)
+
+fvTypes :: [Type] -> [TyVar]
+fvTypes tys = concat (map fvType tys)
+
+sizeType :: Type -> Int
+-- Size of a type: the number of variables and constructors
+sizeType ty | Just exp_ty <- tcView ty = sizeType exp_ty
+sizeType (TyVarTy {}) = 1
+sizeType (TyConApp _ tys) = sizeTypes tys + 1
+sizeType (LitTy {}) = 1
+sizeType (FunTy arg res) = sizeType arg + sizeType res + 1
+sizeType (AppTy fun arg) = sizeType fun + sizeType arg
+sizeType (ForAllTy _ ty) = sizeType ty
+
+sizeTypes :: [Type] -> Int
+-- IA0_NOTE: Avoid kinds.
+sizeTypes xs = sum (map sizeType tys)
+ where tys = filter (not . isKind) xs
+
+-- Size of a predicate
+--
+-- We are considering whether class constraints terminate.
+-- Equality constraints and constraints for the implicit
+-- parameter class always termiante so it is safe to say "size 0".
+-- (Implicit parameter constraints always terminate because
+-- there are no instances for them---they are only solved by
+-- "local instances" in expressions).
+-- See Trac #4200.
+sizePred :: PredType -> Int
+sizePred ty = goClass ty
+ where
+ goClass p | isIPPred p = 0
+ | otherwise = go (classifyPredType p)
+
+ go (ClassPred _ tys') = sizeTypes tys'
+ go (EqPred {}) = 0
+ go (TuplePred ts) = sum (map goClass ts)
+ go (IrredPred ty) = sizeType ty
+\end{code}
+
+Note [Paterson conditions on PredTypes]
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+We are considering whether *class* constraints terminate
+(see Note [Paterson conditions]). Precisely, the Paterson conditions
+would have us check that "the constraint has fewer constructors and variables
+(taken together and counting repetitions) than the head.".
+
+However, we can be a bit more refined by looking at which kind of constraint
+this actually is. There are two main tricks:
+
+ 1. It seems like it should be OK not to count the tuple type constructor
+ for a PredType like (Show a, Eq a) :: Constraint, since we don't
+ count the "implicit" tuple in the ThetaType itself.
+
+ In fact, the Paterson test just checks *each component* of the top level
+ ThetaType against the size bound, one at a time. By analogy, it should be
+ OK to return the size of the *largest* tuple component as the size of the
+ whole tuple.
+
+ 2. Once we get into an implicit parameter or equality we
+ can't get back to a class constraint, so it's safe
+ to say "size 0". See Trac #4200.
+
+NB: we don't want to detect PredTypes in sizeType (and then call
+sizePred on them), or we might get an infinite loop if that PredType
+is irreducible. See Trac #5581.
diff --git a/docs/users_guide/flags.xml b/docs/users_guide/flags.xml
index f5f51b0d4e..4766e5a520 100644
--- a/docs/users_guide/flags.xml
+++ b/docs/users_guide/flags.xml
@@ -1124,6 +1124,12 @@
<entry><option>-XNoMultiParamTypeClasses</option></entry>
</row>
<row>
+ <entry><option>-XNullaryTypeClasses</option></entry>
+ <entry>Enable <link linkend="nullary-type-classes">nullary (no parameter) type classes</link>.</entry>
+ <entry>dynamic</entry>
+ <entry><option>-XNoNullaryTypeClasses</option></entry>
+ </row>
+ <row>
<entry><option>-XFunctionalDependencies</option></entry>
<entry>Enable <link linkend="functional-dependencies">functional dependencies</link>.</entry>
<entry>dynamic</entry>
diff --git a/docs/users_guide/glasgow_exts.xml b/docs/users_guide/glasgow_exts.xml
index 16d180aaba..c396237f27 100644
--- a/docs/users_guide/glasgow_exts.xml
+++ b/docs/users_guide/glasgow_exts.xml
@@ -3795,6 +3795,35 @@ We use default signatures to simplify generic programming in GHC
</sect3>
+
+<sect3 id="nullary-type-classes">
+<title>Nullary type classes</title>
+Nullary (no parameter) type classes are enabled with <option>-XNullaryTypeClasses</option>.
+Since there are no available parameters, there can be at most one instance
+of a nullary class. A nullary type class might be used to document some assumption
+in a type signature (such as reliance on the Riemann hypothesis) or add some
+globally configurable settings in a program. For example,
+
+<programlisting>
+ class RiemannHypothesis where
+ assumeRH :: a -> a
+
+ -- Deterministic version of the Miller test
+ -- correctness depends on the generalized Riemann hypothesis
+ isPrime :: RiemannHypothesis => Integer -> Bool
+ isPrime n = assumeRH (...)
+</programlisting>
+
+The type signature of <literal>isPrime</literal> informs users that its correctness
+depends on an unproven conjecture. If the function is used, the user has
+to acknowledge the dependence with:
+
+<programlisting>
+ instance RiemannHypothesis where
+ assumeRH = id
+</programlisting>
+
+</sect3>
</sect2>
<sect2 id="functional-dependencies">