diff options
author | simonpj@microsoft.com <unknown> | 2009-05-28 07:53:06 +0000 |
---|---|---|
committer | simonpj@microsoft.com <unknown> | 2009-05-28 07:53:06 +0000 |
commit | 6e0f552430600d95768c1668b6d458c71a52f2d4 (patch) | |
tree | 344b89b4d6f55a7ee858ec01eb9fe4e387eb1386 /compiler/parser/RdrHsSyn.lhs | |
parent | 5eb2190d2aebc6e1a11780a43d31cbc7e831dd78 (diff) | |
download | haskell-6e0f552430600d95768c1668b6d458c71a52f2d4.tar.gz |
Fix Trac #3013: multiple constructors in a GADT decl
Makes GADT syntax consistent by allowing multiple constructors
to be given a single signature
data T wehre
A, B :: T
C :: Int -> t
Diffstat (limited to 'compiler/parser/RdrHsSyn.lhs')
-rw-r--r-- | compiler/parser/RdrHsSyn.lhs | 18 |
1 files changed, 13 insertions, 5 deletions
diff --git a/compiler/parser/RdrHsSyn.lhs b/compiler/parser/RdrHsSyn.lhs index 187d64d880..3ca1b29bf3 100644 --- a/compiler/parser/RdrHsSyn.lhs +++ b/compiler/parser/RdrHsSyn.lhs @@ -28,7 +28,7 @@ module RdrHsSyn ( -- -> (FastString, RdrName, RdrNameHsType) -- -> P RdrNameHsDecl mkExtName, -- RdrName -> CLabelString - mkGadtDecl, -- Located RdrName -> LHsType RdrName -> ConDecl RdrName + mkGadtDecl, -- [Located RdrName] -> LHsType RdrName -> ConDecl RdrName -- Bunch of functions in the parser monad for -- checking and constructing values @@ -813,11 +813,19 @@ checkValSig (L l (HsVar v)) ty checkValSig (L l _) _ = parseError l "Invalid type signature" -mkGadtDecl :: Located RdrName +mkGadtDecl :: [Located RdrName] -> LHsType RdrName -- assuming HsType - -> ConDecl RdrName -mkGadtDecl name (L _ (HsForAllTy _ qvars cxt ty)) = mk_gadt_con name qvars cxt ty -mkGadtDecl name ty = mk_gadt_con name [] (noLoc []) ty + -> [ConDecl RdrName] +-- We allow C,D :: ty +-- and expand it as if it had been +-- C :: ty; D :: ty +-- (Just like type signatures in general.) +mkGadtDecl names ty + = [mk_gadt_con name qvars cxt tau | name <- names] + where + (qvars,cxt,tau) = case ty of + L _ (HsForAllTy _ qvars cxt tau) -> (qvars, cxt, tau) + _ -> ([], noLoc [], ty) mk_gadt_con :: Located RdrName -> [LHsTyVarBndr RdrName] |