From ce9268f652cc4c46af75ae765f859480cf081cda Mon Sep 17 00:00:00 2001 From: "simonpj@microsoft.com" Date: Fri, 4 Jan 2008 12:58:14 +0000 Subject: [PATCH] Do not consult -XGADTs flag when pattern matching on GADTs See Trac #2004, and Note [Flags and equational constraints] in TcPat. --- compiler/typecheck/TcPat.lhs | 20 ++++++++++++++------ 1 file changed, 14 insertions(+), 6 deletions(-) diff --git a/compiler/typecheck/TcPat.lhs b/compiler/typecheck/TcPat.lhs index f9e7127..defe6fb 100644 --- a/compiler/typecheck/TcPat.lhs +++ b/compiler/typecheck/TcPat.lhs @@ -867,11 +867,8 @@ refineAlt con pstate ex_tvs [] pat_ty = return pstate -- Common case: no equational constraints refineAlt con pstate ex_tvs co_vars pat_ty - = do { opt_gadt <- doptM Opt_GADTs -- No type-refinement unless GADTs are on - ; if (not opt_gadt) then return pstate - else do - - { checkTc (isRigidTy pat_ty) (nonRigidMatch con) + = -- See Note [Flags and equational constraints] + do { checkTc (isRigidTy pat_ty) (nonRigidMatch con) -- We are matching against a GADT constructor with non-trivial -- constraints, but pattern type is wobbly. For now we fail. -- We can make sense of this, however: @@ -899,9 +896,20 @@ refineAlt con pstate ex_tvs co_vars pat_ty vcat [ ppr con <+> ppr ex_tvs, ppr [(v, tyVarKind v) | v <- co_vars], ppr reft] - } } } + } } \end{code} +Note [Flags and equational constraints] +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +If there are equational constraints, we take account of them +regardless of flag settings; -XGADTs etc applies only to the +*definition* of a data type. + +An alternative would be also to reject a program that *used* +constructors with equational constraints. But want we should avoid at +all costs is simply to *ignore* the constraints, since that gives +incomprehensible errors (Trac #2004). + %************************************************************************ %* * -- 1.7.10.4