X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=compiler%2Ftypecheck%2FTcPat.lhs;h=bef5ec742b1f2de5178060ffa764038cc526347b;hb=269210b04b1428ae5270f15024ab9af23c7497fc;hp=82ac5e3596a53c1558c6800ed3f58f2b7b09a5fd;hpb=d95190caa3e09b33bca8544051043954ebd89c73;p=ghc-hetmet.git diff --git a/compiler/typecheck/TcPat.lhs b/compiler/typecheck/TcPat.lhs index 82ac5e3..bef5ec7 100644 --- a/compiler/typecheck/TcPat.lhs +++ b/compiler/typecheck/TcPat.lhs @@ -365,8 +365,11 @@ tc_pat pstate lpat@(LazyPat pat) pat_ty thing_inside -- getLIE/extendLIEs: see Note [Hopping the LIE in lazy patterns] -- Check no existentials - ; if (null pat_tvs) then return () - else lazyPatErr lpat pat_tvs + ; unless (null pat_tvs) $ lazyPatErr lpat pat_tvs + + -- Check there are no unlifted types under the lazy pattern + ; when (any (isUnLiftedType . idType) $ collectPatBinders pat') $ + lazyUnliftedPatErr lpat -- Check that the pattern has a lifted type ; pat_tv <- newBoxyTyVar liftedTypeKind @@ -1040,6 +1043,12 @@ lazyPatErr _ tvs hang (ptext (sLit "A lazy (~) pattern cannot match existential or GADT data constructors")) 2 (vcat (map pprSkolTvBinding tvs)) +lazyUnliftedPatErr :: OutputableBndr name => Pat name -> TcM () +lazyUnliftedPatErr pat + = failWithTc $ + hang (ptext (sLit "A lazy (~) pattern cannot contain unlifted types")) + 2 (ppr pat) + nonRigidMatch :: PatCtxt -> DataCon -> SDoc nonRigidMatch ctxt con = hang (ptext (sLit "GADT pattern match in non-rigid context for") <+> quotes (ppr con))