Commit e34157d4 authored by chak@cse.unsw.edu.au.'s avatar chak@cse.unsw.edu.au.
Browse files

Improved error messages for higher-rank equality contexts

parent e062d977
......@@ -1071,10 +1071,13 @@ checkFreeness forall_tyvars theta
complain pred = addErrTc (freeErr pred)
freeErr pred
= sep [ptext SLIT("All of the type variables in the constraint") <+> quotes (pprPred pred) <+>
ptext SLIT("are already in scope"),
nest 4 (ptext SLIT("(at least one must be universally quantified here)"))
]
= sep [ ptext SLIT("All of the type variables in the constraint") <+>
quotes (pprPred pred)
, ptext SLIT("are already in scope") <+>
ptext SLIT("(at least one must be universally quantified here)")
, nest 4 $
ptext SLIT("(Use -XFlexibleContexts to lift this restriction)")
]
\end{code}
\begin{code}
......@@ -1085,7 +1088,7 @@ checkThetaCtxt ctxt theta
badPredTyErr sty = ptext SLIT("Illegal constraint") <+> pprPred sty
eqPredTyErr sty = ptext SLIT("Illegal equational constraint") <+> pprPred sty
$$
parens (ptext SLIT("Use -ftype-families to permit this"))
parens (ptext SLIT("Use -XTypeFamilies to permit this"))
predTyVarErr pred = sep [ptext SLIT("Non type-variable argument"),
nest 2 (ptext SLIT("in the constraint:") <+> pprPred pred)]
dupPredWarn dups = ptext SLIT("Duplicate constraint(s):") <+> pprWithCommas pprPred (map head dups)
......
......@@ -501,14 +501,22 @@ ppr_type p (FunTy ty1 ty2)
ppr_forall_type :: Prec -> Type -> SDoc
ppr_forall_type p ty
= maybeParen p FunPrec $
sep [pprForAll tvs, pprThetaArrow ctxt, pprType tau]
sep [pprForAll tvs, pprThetaArrow (ctxt1 ++ ctxt2), pprType tau]
where
(tvs, rho) = split1 [] ty
(ctxt, tau) = split2 [] rho
split1 tvs (ForAllTy tv ty) = split1 (tv:tvs) ty
split1 tvs (NoteTy _ ty) = split1 tvs ty
split1 tvs ty = (reverse tvs, ty)
(tvs, ctxt1, rho) = split1 [] [] ty
(ctxt2, tau) = split2 [] rho
-- We need to be extra careful here as equality constraints will occur as
-- type variables with an equality kind. So, while collecting quantified
-- variables, we separate the coercion variables out and turn them into
-- equality predicates.
split1 tvs eqs (ForAllTy tv ty)
| isCoVar tv = split1 tvs (eq:eqs) ty
| otherwise = split1 (tv:tvs) eqs ty
where
PredTy eq = tyVarKind tv
split1 tvs eqs (NoteTy _ ty) = split1 tvs eqs ty
split1 tvs eqs ty = (reverse tvs, reverse eqs, ty)
split2 ps (NoteTy _ arg -- Rather a disgusting case
`FunTy` res) = split2 ps (arg `FunTy` res)
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment