summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--compiler/GHC/Parser.y40
-rw-r--r--compiler/GHC/Parser/Annotation.hs36
-rw-r--r--compiler/GHC/Parser/Lexer.x7
-rw-r--r--compiler/GHC/Parser/PostProcess.hs98
-rw-r--r--testsuite/tests/parser/should_compile/DumpSemis.hs45
-rw-r--r--testsuite/tests/parser/should_compile/DumpSemis.stderr2072
-rw-r--r--testsuite/tests/parser/should_compile/T20452.stderr8
-rw-r--r--testsuite/tests/parser/should_compile/all.T2
-rw-r--r--utils/check-exact/Main.hs3
9 files changed, 2236 insertions, 75 deletions
diff --git a/compiler/GHC/Parser.y b/compiler/GHC/Parser.y
index 0cc1bc732a..b0b6a89e52 100644
--- a/compiler/GHC/Parser.y
+++ b/compiler/GHC/Parser.y
@@ -936,7 +936,7 @@ body2 :: { (AnnList
top :: { ([TrailingAnn]
,([LImportDecl GhcPs], [LHsDecl GhcPs])) }
- : semis top1 { ($1, $2) }
+ : semis top1 { (reverse $1, $2) }
top1 :: { ([LImportDecl GhcPs], [LHsDecl GhcPs]) }
: importdecls_semi topdecls_cs_semi { (reverse $1, cvTopDecls $2) }
@@ -1085,7 +1085,7 @@ importdecls
importdecls_semi :: { [LImportDecl GhcPs] }
importdecls_semi
: importdecls_semi importdecl semis1
- {% do { i <- amsAl $2 (comb2 (reLoc $2) $3) (unLoc $3)
+ {% do { i <- amsAl $2 (comb2 (reLoc $2) $3) (reverse $ unLoc $3)
; return (i : $1)} }
| {- empty -} { [] }
@@ -1187,7 +1187,7 @@ topdecls :: { OrdList (LHsDecl GhcPs) }
-- May have trailing semicolons, can be empty
topdecls_semi :: { OrdList (LHsDecl GhcPs) }
- : topdecls_semi topdecl semis1 {% do { t <- amsAl $2 (comb2 (reLoc $2) $3) (unLoc $3)
+ : topdecls_semi topdecl semis1 {% do { t <- amsAl $2 (comb2 (reLoc $2) $3) (reverse $ unLoc $3)
; return ($1 `snocOL` t) }}
| {- empty -} { nilOL }
@@ -1200,7 +1200,7 @@ topdecls_cs :: { OrdList (LHsDecl GhcPs) }
-- May have trailing semicolons, can be empty
topdecls_cs_semi :: { OrdList (LHsDecl GhcPs) }
- : topdecls_cs_semi topdecl_cs semis1 {% do { t <- amsAl $2 (comb2 (reLoc $2) $3) (unLoc $3)
+ : topdecls_cs_semi topdecl_cs semis1 {% do { t <- amsAl $2 (comb2 (reLoc $2) $3) (reverse $ unLoc $3)
; return ($1 `snocOL` t) }}
| {- empty -} { nilOL }
@@ -1680,7 +1680,7 @@ decl_cls : at_decl_cls { $1 }
decls_cls :: { Located ([AddEpAnn],OrdList (LHsDecl GhcPs)) } -- Reversed
: decls_cls ';' decl_cls {% if isNilOL (snd $ unLoc $1)
- then return (sLLlA $1 $> ((mz AnnSemi $2) ++ (fst $ unLoc $1)
+ then return (sLLlA $1 $> ((fst $ unLoc $1) ++ (mz AnnSemi $2)
, unitOL $3))
else case (snd $ unLoc $1) of
SnocOL hs t -> do
@@ -1688,7 +1688,7 @@ decls_cls :: { Located ([AddEpAnn],OrdList (LHsDecl GhcPs)) } -- Reversed
return (sLLlA $1 $> (fst $ unLoc $1
, snocOL hs t' `appOL` unitOL $3)) }
| decls_cls ';' {% if isNilOL (snd $ unLoc $1)
- then return (sLL $1 $> ((mz AnnSemi $2) ++ (fst $ unLoc $1)
+ then return (sLL $1 $> ( (fst $ unLoc $1) ++ (mz AnnSemi $2)
,snd $ unLoc $1))
else case (snd $ unLoc $1) of
SnocOL hs t -> do
@@ -1726,7 +1726,7 @@ decl_inst : at_decl_inst { sL1A $1 (unitOL (sL1 $1 (InstD noExtFi
decls_inst :: { Located ([AddEpAnn],OrdList (LHsDecl GhcPs)) } -- Reversed
: decls_inst ';' decl_inst {% if isNilOL (snd $ unLoc $1)
- then return (sLL $1 $> ((mz AnnSemi $2) ++ (fst $ unLoc $1)
+ then return (sLL $1 $> ((fst $ unLoc $1) ++ (mz AnnSemi $2)
, unLoc $3))
else case (snd $ unLoc $1) of
SnocOL hs t -> do
@@ -1734,7 +1734,7 @@ decls_inst :: { Located ([AddEpAnn],OrdList (LHsDecl GhcPs)) } -- Reversed
return (sLL $1 $> (fst $ unLoc $1
, snocOL hs t' `appOL` unLoc $3)) }
| decls_inst ';' {% if isNilOL (snd $ unLoc $1)
- then return (sLL $1 $> ((mz AnnSemi $2) ++ (fst $ unLoc $1)
+ then return (sLL $1 $> ((fst $ unLoc $1) ++ (mz AnnSemi $2)
,snd $ unLoc $1))
else case (snd $ unLoc $1) of
SnocOL hs t -> do
@@ -1764,7 +1764,7 @@ where_inst :: { Located ([AddEpAnn]
--
decls :: { Located ([TrailingAnn], OrdList (LHsDecl GhcPs)) }
: decls ';' decl {% if isNilOL (snd $ unLoc $1)
- then return (sLLlA $1 $> ((msemi $2) ++ (fst $ unLoc $1)
+ then return (sLLlA $1 $> ((fst $ unLoc $1) ++ (msemi $2)
, unitOL $3))
else case (snd $ unLoc $1) of
SnocOL hs t -> do
@@ -1775,7 +1775,7 @@ decls :: { Located ([TrailingAnn], OrdList (LHsDecl GhcPs)) }
return (rest `seq` this `seq` these `seq`
(sLLlA $1 $> (fst $ unLoc $1, these))) }
| decls ';' {% if isNilOL (snd $ unLoc $1)
- then return (sLL $1 $> (((msemi $2) ++ (fst $ unLoc $1)
+ then return (sLL $1 $> (((fst $ unLoc $1) ++ (msemi $2)
,snd $ unLoc $1)))
else case (snd $ unLoc $1) of
SnocOL hs t -> do
@@ -3217,21 +3217,21 @@ alts :: { forall b. DisambECP b => PV (Located ([AddEpAnn],[LMatch GhcPs (Loc
: alts1 { $1 >>= \ $1 -> return $
sL1 $1 (fst $ unLoc $1,snd $ unLoc $1) }
| ';' alts { $2 >>= \ $2 -> return $
- sLL $1 $> (((mz AnnSemi $1) ++ (fst $ unLoc $2))
+ sLL $1 $> (((mz AnnSemi $1) ++ (fst $ unLoc $2) )
,snd $ unLoc $2) }
alts1 :: { forall b. DisambECP b => PV (Located ([AddEpAnn],[LMatch GhcPs (LocatedA b)])) }
: alts1 ';' alt { $1 >>= \ $1 ->
$3 >>= \ $3 ->
case snd $ unLoc $1 of
- [] -> return (sLL $1 (reLoc $>) ((mz AnnSemi $2) ++(fst $ unLoc $1)
+ [] -> return (sLL $1 (reLoc $>) ((fst $ unLoc $1) ++ (mz AnnSemi $2)
,[$3]))
(h:t) -> do
h' <- addTrailingSemiA h (gl $2)
return (sLL $1 (reLoc $>) (fst $ unLoc $1,$3 : h' : t)) }
| alts1 ';' { $1 >>= \ $1 ->
case snd $ unLoc $1 of
- [] -> return (sLL $1 $> ((mz AnnSemi $2) ++(fst $ unLoc $1)
+ [] -> return (sLL $1 $> ((fst $ unLoc $1) ++ (mz AnnSemi $2)
,[]))
(h:t) -> do
h' <- addTrailingSemiA h (gl $2)
@@ -3301,9 +3301,9 @@ apats :: { [LPat GhcPs] }
stmtlist :: { forall b. DisambECP b => PV (LocatedL [LocatedA (Stmt GhcPs (LocatedA b))]) }
: '{' stmts '}' { $2 >>= \ $2 -> amsrl
- (sLL $1 $> (reverse $ snd $ unLoc $2)) (AnnList (Just $ glR $2) (Just $ moc $1) (Just $ mcc $3) (fst $ unLoc $2) []) } -- AZ:performance of reverse?
+ (sLL $1 $> (reverse $ snd $ unLoc $2)) (AnnList (Just $ glR $2) (Just $ moc $1) (Just $ mcc $3) (fromOL $ fst $ unLoc $2) []) }
| vocurly stmts close { $2 >>= \ $2 -> amsrl
- (L (gl $2) (reverse $ snd $ unLoc $2)) (AnnList (Just $ glR $2) Nothing Nothing (fst $ unLoc $2) []) }
+ (L (gl $2) (reverse $ snd $ unLoc $2)) (AnnList (Just $ glR $2) Nothing Nothing (fromOL $ fst $ unLoc $2) []) }
-- do { ;; s ; s ; ; s ;; }
-- The last Stmt should be an expression, but that's hard to enforce
@@ -3311,11 +3311,11 @@ stmtlist :: { forall b. DisambECP b => PV (LocatedL [LocatedA (Stmt GhcPs (Locat
-- So we use BodyStmts throughout, and switch the last one over
-- in ParseUtils.checkDo instead
-stmts :: { forall b. DisambECP b => PV (Located ([AddEpAnn],[LStmt GhcPs (LocatedA b)])) }
+stmts :: { forall b. DisambECP b => PV (Located (OrdList AddEpAnn,[LStmt GhcPs (LocatedA b)])) }
: stmts ';' stmt { $1 >>= \ $1 ->
$3 >>= \ ($3 :: LStmt GhcPs (LocatedA b)) ->
case (snd $ unLoc $1) of
- [] -> return (sLL $1 (reLoc $>) ((mj AnnSemi $2) : (fst $ unLoc $1)
+ [] -> return (sLL $1 (reLoc $>) ((fst $ unLoc $1) `snocOL` (mj AnnSemi $2)
,$3 : (snd $ unLoc $1)))
(h:t) -> do
{ h' <- addTrailingSemiA h (gl $2)
@@ -3323,13 +3323,13 @@ stmts :: { forall b. DisambECP b => PV (Located ([AddEpAnn],[LStmt GhcPs (Locate
| stmts ';' { $1 >>= \ $1 ->
case (snd $ unLoc $1) of
- [] -> return (sLL $1 $> ((mj AnnSemi $2) : (fst $ unLoc $1),snd $ unLoc $1))
+ [] -> return (sLL $1 $> ((fst $ unLoc $1) `snocOL` (mj AnnSemi $2),snd $ unLoc $1))
(h:t) -> do
{ h' <- addTrailingSemiA h (gl $2)
; return $ sL1 $1 (fst $ unLoc $1,h':t) }}
| stmt { $1 >>= \ $1 ->
- return $ sL1A $1 ([],[$1]) }
- | {- empty -} { return $ noLoc ([],[]) }
+ return $ sL1A $1 (nilOL,[$1]) }
+ | {- empty -} { return $ noLoc (nilOL,[]) }
-- For typing stmts at the GHCi prompt, where
diff --git a/compiler/GHC/Parser/Annotation.hs b/compiler/GHC/Parser/Annotation.hs
index 1692d394b5..9555291530 100644
--- a/compiler/GHC/Parser/Annotation.hs
+++ b/compiler/GHC/Parser/Annotation.hs
@@ -100,7 +100,7 @@ import qualified GHC.Data.Strict as Strict
{-
Note [exact print annotations]
-~~~~~~~~~~~~~~~~~~~~~~
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Given a parse tree of a Haskell module, how can we reconstruct
the original Haskell source code, retaining all whitespace and
source code comments? We need to track the locations of all
@@ -394,7 +394,7 @@ instance Outputable EpaComment where
-- The usual way an 'AddEpAnn' is created is using the 'mj' ("make
-- jump") function, and then it can be inserted into the appropriate
-- annotation.
-data AddEpAnn = AddEpAnn AnnKeywordId EpaLocation deriving (Data,Eq,Ord)
+data AddEpAnn = AddEpAnn AnnKeywordId EpaLocation deriving (Data,Eq)
-- | The anchor for an @'AnnKeywordId'@. The Parser inserts the
-- @'EpaSpan'@ variant, giving the exact location of the original item
@@ -460,6 +460,9 @@ instance Outputable EpaLocation where
instance Outputable AddEpAnn where
ppr (AddEpAnn kw ss) = text "AddEpAnn" <+> ppr kw <+> ppr ss
+instance Ord AddEpAnn where
+ compare (AddEpAnn kw1 loc1) (AddEpAnn kw2 loc2) = compare (loc1, kw1) (loc2,kw2)
+
-- ---------------------------------------------------------------------
-- | The exact print annotations (EPAs) are kept in the HsSyn AST for
@@ -802,7 +805,8 @@ addTrailingAnnToL s t cs EpAnnNotUsed
addTrailingAnnToL _ t cs n = n { anns = addTrailing (anns n)
, comments = comments n <> cs }
where
- addTrailing n = n { al_trailing = t : al_trailing n }
+ -- See Note [list append in addTrailing*]
+ addTrailing n = n { al_trailing = al_trailing n ++ [t]}
-- | Helper function used in the parser to add a 'TrailingAnn' items
-- to an existing annotation.
@@ -813,7 +817,8 @@ addTrailingAnnToA s t cs EpAnnNotUsed
addTrailingAnnToA _ t cs n = n { anns = addTrailing (anns n)
, comments = comments n <> cs }
where
- addTrailing n = n { lann_trailing = t : lann_trailing n }
+ -- See Note [list append in addTrailing*]
+ addTrailing n = n { lann_trailing = lann_trailing n ++ [t] }
-- | Helper function used in the parser to add a comma location to an
-- existing annotation.
@@ -822,8 +827,29 @@ addTrailingCommaToN s EpAnnNotUsed l
= EpAnn (spanAsAnchor s) (NameAnnTrailing [AddCommaAnn l]) emptyComments
addTrailingCommaToN _ n l = n { anns = addTrailing (anns n) l }
where
+ -- See Note [list append in addTrailing*]
addTrailing :: NameAnn -> EpaLocation -> NameAnn
- addTrailing n l = n { nann_trailing = AddCommaAnn l : nann_trailing n }
+ addTrailing n l = n { nann_trailing = nann_trailing n ++ [AddCommaAnn l]}
+
+{-
+Note [list append in addTrailing*]
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+The addTrailingAnnToL, addTrailingAnnToA and addTrailingCommaToN
+functions are used to add a separator for an item when it occurs in a
+list. So they are used to capture a comma, vbar, semicolon and similar.
+
+In general, a given element will have zero or one of these. In
+extreme (test) cases, there may be multiple semicolons.
+
+In exact printing we sometimes convert the EpaLocation variant for an
+trailing annotation to the EpaDelta variant, which cannot be sorted.
+
+Hence it is critical that these annotations are captured in the order
+they appear in the original source file.
+
+And so we use the less efficient list append to preserve the order,
+knowing that in most cases the original list is empty.
+-}
-- ---------------------------------------------------------------------
diff --git a/compiler/GHC/Parser/Lexer.x b/compiler/GHC/Parser/Lexer.x
index 10568814d7..d74d17be8f 100644
--- a/compiler/GHC/Parser/Lexer.x
+++ b/compiler/GHC/Parser/Lexer.x
@@ -3490,12 +3490,11 @@ clean_pragma prag = canon_ws (map toLower (unprefix prag))
-}
--- |Given a 'SrcSpan' that surrounds a 'HsPar' or 'HsParTy', generate
+-- |Given a 'RealSrcSpan' that surrounds a 'HsPar' or 'HsParTy', generate
-- 'AddEpAnn' values for the opening and closing bordering on the start
-- and end of the span
-mkParensEpAnn :: SrcSpan -> [AddEpAnn]
-mkParensEpAnn (UnhelpfulSpan _) = []
-mkParensEpAnn (RealSrcSpan ss _) = [AddEpAnn AnnOpenP (EpaSpan lo),AddEpAnn AnnCloseP (EpaSpan lc)]
+mkParensEpAnn :: RealSrcSpan -> (AddEpAnn, AddEpAnn)
+mkParensEpAnn ss = (AddEpAnn AnnOpenP (EpaSpan lo),AddEpAnn AnnCloseP (EpaSpan lc))
where
f = srcSpanFile ss
sl = srcSpanStartLine ss
diff --git a/compiler/GHC/Parser/PostProcess.hs b/compiler/GHC/Parser/PostProcess.hs
index ae19e7b7b3..b5511334ec 100644
--- a/compiler/GHC/Parser/PostProcess.hs
+++ b/compiler/GHC/Parser/PostProcess.hs
@@ -852,26 +852,36 @@ checkTyVars pp_what equals_or_where tc tparms
where
check (HsTypeArg _ ki@(L loc _)) = addFatalError $ mkPlainErrorMsgEnvelope (locA loc) $
(PsErrUnexpectedTypeAppInDecl ki pp_what (unLoc tc))
- check (HsValArg ty) = chkParens [] emptyComments ty
+ check (HsValArg ty) = chkParens [] [] emptyComments ty
check (HsArgPar sp) = addFatalError $ mkPlainErrorMsgEnvelope sp $
(PsErrMalformedDecl pp_what (unLoc tc))
-- Keep around an action for adjusting the annotations of extra parens
- chkParens :: [AddEpAnn] -> EpAnnComments -> LHsType GhcPs
+ chkParens :: [AddEpAnn] -> [AddEpAnn] -> EpAnnComments -> LHsType GhcPs
-> P (LHsTyVarBndr () GhcPs)
- chkParens acc cs (L l (HsParTy an ty))
- = chkParens (mkParensEpAnn (locA l) ++ acc) (cs Semi.<> epAnnComments an) ty
- chkParens acc cs ty = chk acc cs ty
+ chkParens ops cps cs (L l (HsParTy an ty))
+ = let
+ (o,c) = mkParensEpAnn (realSrcSpan $ locA l)
+ in
+ chkParens (o:ops) (c:cps) (cs Semi.<> epAnnComments an) ty
+ chkParens ops cps cs ty = chk ops cps cs ty
-- Check that the name space is correct!
- chk :: [AddEpAnn] -> EpAnnComments -> LHsType GhcPs -> P (LHsTyVarBndr () GhcPs)
- chk an cs (L l (HsKindSig annk (L annt (HsTyVar ann _ (L lv tv))) k))
+ chk :: [AddEpAnn] -> [AddEpAnn] -> EpAnnComments -> LHsType GhcPs -> P (LHsTyVarBndr () GhcPs)
+ chk ops cps cs (L l (HsKindSig annk (L annt (HsTyVar ann _ (L lv tv))) k))
| isRdrTyVar tv
- = return (L (widenLocatedAn (l Semi.<> annt) an)
- (KindedTyVar (addAnns (annk Semi.<> ann) an cs) () (L lv tv) k))
- chk an cs (L l (HsTyVar ann _ (L ltv tv)))
- | isRdrTyVar tv = return (L (widenLocatedAn l an)
+ = let
+ an = (reverse ops) ++ cps
+ in
+ return (L (widenLocatedAn (l Semi.<> annt) an)
+ (KindedTyVar (addAnns (annk Semi.<> ann) an cs) () (L lv tv) k))
+ chk ops cps cs (L l (HsTyVar ann _ (L ltv tv)))
+ | isRdrTyVar tv
+ = let
+ an = (reverse ops) ++ cps
+ in
+ return (L (widenLocatedAn l an)
(UserTyVar (addAnns ann an cs) () (L ltv tv)))
- chk _ _ t@(L loc _)
+ chk _ _ _ t@(L loc _)
= addFatalError $ mkPlainErrorMsgEnvelope (locA loc) $
(PsErrUnexpectedTypeInDecl t pp_what (unLoc tc) tparms equals_or_where)
@@ -951,34 +961,36 @@ checkTyClHdr :: Bool -- True <=> class header
-- Int :*: Bool into (:*:, [Int, Bool])
-- returning the pieces
checkTyClHdr is_cls ty
- = goL ty [] [] Prefix
+ = goL ty [] [] [] Prefix
where
- goL (L l ty) acc ann fix = go (locA l) ty acc ann fix
+ goL (L l ty) acc ops cps fix = go (locA l) ty acc ops cps fix
-- workaround to define '*' despite StarIsType
- go _ (HsParTy an (L l (HsStarTy _ isUni))) acc ann' fix
+ go _ (HsParTy an (L l (HsStarTy _ isUni))) acc ops' cps' fix
= do { addPsMessage (locA l) PsWarnStarBinder
; let name = mkOccName tcClsName (starSym isUni)
; let a' = newAnns l an
; return (L a' (Unqual name), acc, fix
- , ann') }
-
- go _ (HsTyVar _ _ ltc@(L _ tc)) acc ann fix
- | isRdrTc tc = return (ltc, acc, fix, ann)
- go _ (HsOpTy _ t1 ltc@(L _ tc) t2) acc ann _fix
- | isRdrTc tc = return (ltc, HsValArg t1:HsValArg t2:acc, Infix, ann)
- go l (HsParTy _ ty) acc ann fix = goL ty acc (ann ++mkParensEpAnn l) fix
- go _ (HsAppTy _ t1 t2) acc ann fix = goL t1 (HsValArg t2:acc) ann fix
- go _ (HsAppKindTy l ty ki) acc ann fix = goL ty (HsTypeArg l ki:acc) ann fix
- go l (HsTupleTy _ HsBoxedOrConstraintTuple ts) [] ann fix
+ , (reverse ops') ++ cps') }
+
+ go _ (HsTyVar _ _ ltc@(L _ tc)) acc ops cps fix
+ | isRdrTc tc = return (ltc, acc, fix, (reverse ops) ++ cps)
+ go _ (HsOpTy _ t1 ltc@(L _ tc) t2) acc ops cps _fix
+ | isRdrTc tc = return (ltc, HsValArg t1:HsValArg t2:acc, Infix, (reverse ops) ++ cps)
+ go l (HsParTy _ ty) acc ops cps fix = goL ty acc (o:ops) (c:cps) fix
+ where
+ (o,c) = mkParensEpAnn (realSrcSpan l)
+ go _ (HsAppTy _ t1 t2) acc ops cps fix = goL t1 (HsValArg t2:acc) ops cps fix
+ go _ (HsAppKindTy l ty ki) acc ops cps fix = goL ty (HsTypeArg l ki:acc) ops cps fix
+ go l (HsTupleTy _ HsBoxedOrConstraintTuple ts) [] ops cps fix
= return (L (noAnnSrcSpan l) (nameRdrName tup_name)
- , map HsValArg ts, fix, ann)
+ , map HsValArg ts, fix, (reverse ops)++cps)
where
arity = length ts
tup_name | is_cls = cTupleTyConName arity
| otherwise = getName (tupleTyCon Boxed arity)
-- See Note [Unit tuples] in GHC.Hs.Type (TODO: is this still relevant?)
- go l _ _ _ _
+ go l _ _ _ _ _
= addFatalError $ mkPlainErrorMsgEnvelope l $
(PsErrMalformedTyOrClDecl ty)
@@ -1054,7 +1066,8 @@ checkContext orig_t@(L (SrcSpanAnn _ l) _orig_t) =
EpAnnNotUsed -> ([],[],emptyComments)
EpAnn _ (AnnParen _ o c) cs -> ([o],[c],cs)
return (L (SrcSpanAnn (EpAnn (spanAsAnchor l)
- (AnnContext Nothing (op Semi.<> oparens) (cp Semi.<> cparens)) (cs Semi.<> cs')) l) ts)
+ -- Append parens so that the original order in the source is maintained
+ (AnnContext Nothing (oparens ++ op) (cp ++ cparens)) (cs Semi.<> cs')) l) ts)
check (opi,cpi,csi) (L _lp1 (HsParTy ann' ty))
-- to be sure HsParTy doesn't get into the way
@@ -1311,26 +1324,29 @@ isFunLhs :: LocatedA (PatBuilder GhcPs)
[LocatedA (PatBuilder GhcPs)],[AddEpAnn]))
-- A variable binding is parsed as a FunBind.
-- Just (fun, is_infix, arg_pats) if e is a function LHS
-isFunLhs e = go e [] []
+isFunLhs e = go e [] [] []
where
- go (L _ (PatBuilderVar (L loc f))) es ann
- | not (isRdrDataCon f) = return (Just (L loc f, Prefix, es, ann))
- go (L _ (PatBuilderApp f e)) es ann = go f (e:es) ann
- go (L l (PatBuilderPar _ e _)) es@(_:_) ann
- = go e es (ann ++ mkParensEpAnn (locA l))
- go (L loc (PatBuilderOpApp l (L loc' op) r (EpAnn loca anns cs))) es ann
+ go (L _ (PatBuilderVar (L loc f))) es ops cps
+ | not (isRdrDataCon f) = return (Just (L loc f, Prefix, es, (reverse ops) ++ cps))
+ go (L _ (PatBuilderApp f e)) es ops cps = go f (e:es) ops cps
+ go (L l (PatBuilderPar _ e _)) es@(_:_) ops cps
+ = let
+ (o,c) = mkParensEpAnn (realSrcSpan $ locA l)
+ in
+ go e es (o:ops) (c:cps)
+ go (L loc (PatBuilderOpApp l (L loc' op) r (EpAnn loca anns cs))) es ops cps
| not (isRdrDataCon op) -- We have found the function!
- = return (Just (L loc' op, Infix, (l:r:es), (anns ++ ann)))
+ = return (Just (L loc' op, Infix, (l:r:es), (anns ++ reverse ops ++ cps)))
| otherwise -- Infix data con; keep going
- = do { mb_l <- go l es ann
+ = do { mb_l <- go l es ops cps
; case mb_l of
- Just (op', Infix, j : k : es', ann')
- -> return (Just (op', Infix, j : op_app : es', ann'))
+ Just (op', Infix, j : k : es', anns')
+ -> return (Just (op', Infix, j : op_app : es', anns'))
where
op_app = L loc (PatBuilderOpApp k
- (L loc' op) r (EpAnn loca anns cs))
+ (L loc' op) r (EpAnn loca (reverse ops++cps) cs))
_ -> return Nothing }
- go _ _ _ = return Nothing
+ go _ _ _ _ = return Nothing
mkBangTy :: EpAnn [AddEpAnn] -> SrcStrictness -> LHsType GhcPs -> HsType GhcPs
mkBangTy anns strictness =
diff --git a/testsuite/tests/parser/should_compile/DumpSemis.hs b/testsuite/tests/parser/should_compile/DumpSemis.hs
new file mode 100644
index 0000000000..9f2f9629d8
--- /dev/null
+++ b/testsuite/tests/parser/should_compile/DumpSemis.hs
@@ -0,0 +1,45 @@
+module DumpSemis where
+
+-- Make sure we get all the semicolons in statements
+;;;; ;;
+import Data.List
+; ; ;
+import Data.Kind
+ ; ;;
+foo :: IO ()
+foo = do
+ do { ;;;; a }
+ a
+; ;;
+bar :: IO ()
+bar = do
+ { ; ;
+ a ;;
+ b
+ }
+ ; ;; ;
+baz :: IO ()
+baz = do { ;; s ; s ; ; s ;; }
+;
+a = undefined
+b = undefined
+s = undefined
+;
+class LiftingMonad2 ((trans :: Type)) where
+ proof :: trans -> Int
+;
+f :: ((Eq a, Ord a)) => a -> a
+f x = x
+;
+ ;;x=let{;;;;;y=2;;z=3;;;;}in y;
+;
+fot x =
+ case x of
+ { ;;; -- leading
+ 0 -> 'a'; -- case 0
+ 1 -> 'b' -- case 1
+ ; 2 -> 'c' ; -- case 2
+ ; 3 -> 'd' -- case 3
+ ;;; -- case 4
+ }
+;
diff --git a/testsuite/tests/parser/should_compile/DumpSemis.stderr b/testsuite/tests/parser/should_compile/DumpSemis.stderr
new file mode 100644
index 0000000000..05465b8a75
--- /dev/null
+++ b/testsuite/tests/parser/should_compile/DumpSemis.stderr
@@ -0,0 +1,2072 @@
+
+==================== Parser AST ====================
+
+(L
+ { DumpSemis.hs:1:1 }
+ (HsModule
+ (EpAnn
+ (Anchor
+ { DumpSemis.hs:1:1 }
+ (UnchangedAnchor))
+ (AnnsModule
+ [(AddEpAnn AnnModule (EpaSpan { DumpSemis.hs:1:1-6 }))
+ ,(AddEpAnn AnnWhere (EpaSpan { DumpSemis.hs:1:18-22 }))]
+ (AnnList
+ (Nothing)
+ (Nothing)
+ (Nothing)
+ []
+ [(AddSemiAnn
+ (EpaSpan { DumpSemis.hs:4:1 }))
+ ,(AddSemiAnn
+ (EpaSpan { DumpSemis.hs:4:2 }))
+ ,(AddSemiAnn
+ (EpaSpan { DumpSemis.hs:4:3 }))
+ ,(AddSemiAnn
+ (EpaSpan { DumpSemis.hs:4:4 }))
+ ,(AddSemiAnn
+ (EpaSpan { DumpSemis.hs:4:7 }))
+ ,(AddSemiAnn
+ (EpaSpan { DumpSemis.hs:4:8 }))]))
+ (EpaCommentsBalanced
+ []
+ [(L
+ (Anchor
+ { DumpSemis.hs:46:1 }
+ (UnchangedAnchor))
+ (EpaComment
+ (EpaEofComment)
+ { DumpSemis.hs:46:1 }))]))
+ (VirtualBraces
+ (1))
+ (Just
+ (L
+ { DumpSemis.hs:1:8-16 }
+ {ModuleName: DumpSemis}))
+ (Nothing)
+ [(L
+ (SrcSpanAnn (EpAnn
+ (Anchor
+ { DumpSemis.hs:5:1-16 }
+ (UnchangedAnchor))
+ (AnnListItem
+ [(AddSemiAnn
+ (EpaSpan { DumpSemis.hs:6:1 }))
+ ,(AddSemiAnn
+ (EpaSpan { DumpSemis.hs:6:3 }))
+ ,(AddSemiAnn
+ (EpaSpan { DumpSemis.hs:6:5 }))])
+ (EpaComments
+ [])) { DumpSemis.hs:5:1-16 })
+ (ImportDecl
+ (EpAnn
+ (Anchor
+ { DumpSemis.hs:5:1-6 }
+ (UnchangedAnchor))
+ (EpAnnImportDecl
+ (EpaSpan { DumpSemis.hs:5:1-6 })
+ (Nothing)
+ (Nothing)
+ (Nothing)
+ (Nothing)
+ (Nothing))
+ (EpaComments
+ []))
+ (NoSourceText)
+ (L
+ { DumpSemis.hs:5:8-16 }
+ {ModuleName: Data.List})
+ (Nothing)
+ (NotBoot)
+ (False)
+ (NotQualified)
+ (False)
+ (Nothing)
+ (Nothing)))
+ ,(L
+ (SrcSpanAnn (EpAnn
+ (Anchor
+ { DumpSemis.hs:7:1-16 }
+ (UnchangedAnchor))
+ (AnnListItem
+ [(AddSemiAnn
+ (EpaSpan { DumpSemis.hs:8:4 }))
+ ,(AddSemiAnn
+ (EpaSpan { DumpSemis.hs:8:6 }))
+ ,(AddSemiAnn
+ (EpaSpan { DumpSemis.hs:8:7 }))])
+ (EpaComments
+ [])) { DumpSemis.hs:7:1-16 })
+ (ImportDecl
+ (EpAnn
+ (Anchor
+ { DumpSemis.hs:7:1-6 }
+ (UnchangedAnchor))
+ (EpAnnImportDecl
+ (EpaSpan { DumpSemis.hs:7:1-6 })
+ (Nothing)
+ (Nothing)
+ (Nothing)
+ (Nothing)
+ (Nothing))
+ (EpaComments
+ []))
+ (NoSourceText)
+ (L
+ { DumpSemis.hs:7:8-16 }
+ {ModuleName: Data.Kind})
+ (Nothing)
+ (NotBoot)
+ (False)
+ (NotQualified)
+ (False)
+ (Nothing)
+ (Nothing)))]
+ [(L
+ (SrcSpanAnn (EpAnn
+ (Anchor
+ { DumpSemis.hs:9:1-12 }
+ (UnchangedAnchor))
+ (AnnListItem
+ [])
+ (EpaComments
+ [])) { DumpSemis.hs:9:1-12 })
+ (SigD
+ (NoExtField)
+ (TypeSig
+ (EpAnn
+ (Anchor
+ { DumpSemis.hs:9:1-3 }
+ (UnchangedAnchor))
+ (AnnSig
+ (AddEpAnn AnnDcolon (EpaSpan { DumpSemis.hs:9:5-6 }))
+ [])
+ (EpaComments
+ []))
+ [(L
+ (SrcSpanAnn (EpAnnNotUsed) { DumpSemis.hs:9:1-3 })
+ (Unqual
+ {OccName: foo}))]
+ (HsWC
+ (NoExtField)
+ (L
+ (SrcSpanAnn (EpAnnNotUsed) { DumpSemis.hs:9:8-12 })
+ (HsSig
+ (NoExtField)
+ (HsOuterImplicit
+ (NoExtField))
+ (L
+ (SrcSpanAnn (EpAnnNotUsed) { DumpSemis.hs:9:8-12 })
+ (HsAppTy
+ (NoExtField)
+ (L
+ (SrcSpanAnn (EpAnnNotUsed) { DumpSemis.hs:9:8-9 })
+ (HsTyVar
+ (EpAnn
+ (Anchor
+ { DumpSemis.hs:9:8-9 }
+ (UnchangedAnchor))
+ []
+ (EpaComments
+ []))
+ (NotPromoted)
+ (L
+ (SrcSpanAnn (EpAnnNotUsed) { DumpSemis.hs:9:8-9 })
+ (Unqual
+ {OccName: IO}))))
+ (L
+ (SrcSpanAnn (EpAnnNotUsed) { DumpSemis.hs:9:11-12 })
+ (HsTupleTy
+ (EpAnn
+ (Anchor
+ { DumpSemis.hs:9:11 }
+ (UnchangedAnchor))
+ (AnnParen
+ (AnnParens)
+ (EpaSpan { DumpSemis.hs:9:11 })
+ (EpaSpan { DumpSemis.hs:9:12 }))
+ (EpaComments
+ []))
+ (HsBoxedOrConstraintTuple)
+ []))))))))))
+ ,(L
+ (SrcSpanAnn (EpAnn
+ (Anchor
+ { DumpSemis.hs:(10,1)-(12,3) }
+ (UnchangedAnchor))
+ (AnnListItem
+ [(AddSemiAnn
+ (EpaSpan { DumpSemis.hs:13:1 }))
+ ,(AddSemiAnn
+ (EpaSpan { DumpSemis.hs:13:3 }))
+ ,(AddSemiAnn
+ (EpaSpan { DumpSemis.hs:13:4 }))])
+ (EpaComments
+ [])) { DumpSemis.hs:(10,1)-(12,3) })
+ (ValD
+ (NoExtField)
+ (FunBind
+ (NoExtField)
+ (L
+ (SrcSpanAnn (EpAnnNotUsed) { DumpSemis.hs:10:1-3 })
+ (Unqual
+ {OccName: foo}))
+ (MG
+ (NoExtField)
+ (L
+ (SrcSpanAnn (EpAnnNotUsed) { DumpSemis.hs:(10,1)-(12,3) })
+ [(L
+ (SrcSpanAnn (EpAnnNotUsed) { DumpSemis.hs:(10,1)-(12,3) })
+ (Match
+ (EpAnn
+ (Anchor
+ { DumpSemis.hs:(10,1)-(12,3) }
+ (UnchangedAnchor))
+ []
+ (EpaComments
+ []))
+ (FunRhs
+ (L
+ (SrcSpanAnn (EpAnnNotUsed) { DumpSemis.hs:10:1-3 })
+ (Unqual
+ {OccName: foo}))
+ (Prefix)
+ (NoSrcStrict))
+ []
+ (GRHSs
+ (EpaComments
+ [])
+ [(L
+ { DumpSemis.hs:(10,5)-(12,3) }
+ (GRHS
+ (EpAnn
+ (Anchor
+ { DumpSemis.hs:(10,5)-(12,3) }
+ (UnchangedAnchor))
+ (GrhsAnn
+ (Nothing)
+ (AddEpAnn AnnEqual (EpaSpan { DumpSemis.hs:10:5 })))
+ (EpaComments
+ []))
+ []
+ (L
+ (SrcSpanAnn (EpAnnNotUsed) { DumpSemis.hs:(10,7)-(12,3) })
+ (HsDo
+ (EpAnn
+ (Anchor
+ { DumpSemis.hs:(10,7)-(12,3) }
+ (UnchangedAnchor))
+ (AnnList
+ (Just
+ (Anchor
+ { DumpSemis.hs:(11,3)-(12,3) }
+ (UnchangedAnchor)))
+ (Nothing)
+ (Nothing)
+ [(AddEpAnn AnnDo (EpaSpan { DumpSemis.hs:10:7-8 }))]
+ [])
+ (EpaComments
+ []))
+ (DoExpr
+ (Nothing))
+ (L
+ (SrcSpanAnn (EpAnn
+ (Anchor
+ { DumpSemis.hs:(11,3)-(12,3) }
+ (UnchangedAnchor))
+ (AnnList
+ (Just
+ (Anchor
+ { DumpSemis.hs:(11,3)-(12,3) }
+ (UnchangedAnchor)))
+ (Nothing)
+ (Nothing)
+ []
+ [])
+ (EpaComments
+ [])) { DumpSemis.hs:(11,3)-(12,3) })
+ [(L
+ (SrcSpanAnn (EpAnnNotUsed) { DumpSemis.hs:11:3-15 })
+ (BodyStmt
+ (NoExtField)
+ (L
+ (SrcSpanAnn (EpAnnNotUsed) { DumpSemis.hs:11:3-15 })
+ (HsDo
+ (EpAnn
+ (Anchor
+ { DumpSemis.hs:11:3-15 }
+ (UnchangedAnchor))
+ (AnnList
+ (Just
+ (Anchor
+ { DumpSemis.hs:11:6-15 }
+ (UnchangedAnchor)))
+ (Nothing)
+ (Nothing)
+ [(AddEpAnn AnnDo (EpaSpan { DumpSemis.hs:11:3-4 }))]
+ [])
+ (EpaComments
+ []))
+ (DoExpr
+ (Nothing))
+ (L
+ (SrcSpanAnn (EpAnn
+ (Anchor
+ { DumpSemis.hs:11:6-15 }
+ (UnchangedAnchor))
+ (AnnList
+ (Just
+ (Anchor
+ { DumpSemis.hs:11:8-13 }
+ (UnchangedAnchor)))
+ (Just
+ (AddEpAnn AnnOpenC (EpaSpan { DumpSemis.hs:11:6 })))
+ (Just
+ (AddEpAnn AnnCloseC (EpaSpan { DumpSemis.hs:11:15 })))
+ [(AddEpAnn AnnSemi (EpaSpan { DumpSemis.hs:11:8 }))
+ ,(AddEpAnn AnnSemi (EpaSpan { DumpSemis.hs:11:9 }))
+ ,(AddEpAnn AnnSemi (EpaSpan { DumpSemis.hs:11:10 }))
+ ,(AddEpAnn AnnSemi (EpaSpan { DumpSemis.hs:11:11 }))]
+ [])
+ (EpaComments
+ [])) { DumpSemis.hs:11:6-15 })
+ [(L
+ (SrcSpanAnn (EpAnnNotUsed) { DumpSemis.hs:11:13 })
+ (BodyStmt
+ (NoExtField)
+ (L
+ (SrcSpanAnn (EpAnnNotUsed) { DumpSemis.hs:11:13 })
+ (HsVar
+ (NoExtField)
+ (L
+ (SrcSpanAnn (EpAnnNotUsed) { DumpSemis.hs:11:13 })
+ (Unqual
+ {OccName: a}))))
+ (NoExtField)
+ (NoExtField)))])))
+ (NoExtField)
+ (NoExtField)))
+ ,(L
+ (SrcSpanAnn (EpAnnNotUsed) { DumpSemis.hs:12:3 })
+ (BodyStmt
+ (NoExtField)
+ (L
+ (SrcSpanAnn (EpAnnNotUsed) { DumpSemis.hs:12:3 })
+ (HsVar
+ (NoExtField)
+ (L
+ (SrcSpanAnn (EpAnnNotUsed) { DumpSemis.hs:12:3 })
+ (Unqual
+ {OccName: a}))))
+ (NoExtField)
+ (NoExtField)))])))))]
+ (EmptyLocalBinds
+ (NoExtField)))))])
+ (FromSource))
+ [])))
+ ,(L
+ (SrcSpanAnn (EpAnn
+ (Anchor
+ { DumpSemis.hs:14:1-12 }
+ (UnchangedAnchor))
+ (AnnListItem
+ [])
+ (EpaComments
+ [])) { DumpSemis.hs:14:1-12 })
+ (SigD
+ (NoExtField)
+ (TypeSig
+ (EpAnn
+ (Anchor
+ { DumpSemis.hs:14:1-3 }
+ (UnchangedAnchor))
+ (AnnSig
+ (AddEpAnn AnnDcolon (EpaSpan { DumpSemis.hs:14:5-6 }))
+ [])
+ (EpaComments
+ []))
+ [(L
+ (SrcSpanAnn (EpAnnNotUsed) { DumpSemis.hs:14:1-3 })
+ (Unqual
+ {OccName: bar}))]
+ (HsWC
+ (NoExtField)
+ (L
+ (SrcSpanAnn (EpAnnNotUsed) { DumpSemis.hs:14:8-12 })
+ (HsSig
+ (NoExtField)
+ (HsOuterImplicit
+ (NoExtField))
+ (L
+ (SrcSpanAnn (EpAnnNotUsed) { DumpSemis.hs:14:8-12 })
+ (HsAppTy
+ (NoExtField)
+ (L
+ (SrcSpanAnn (EpAnnNotUsed) { DumpSemis.hs:14:8-9 })
+ (HsTyVar
+ (EpAnn
+ (Anchor
+ { DumpSemis.hs:14:8-9 }
+ (UnchangedAnchor))
+ []
+ (EpaComments
+ []))
+ (NotPromoted)
+ (L
+ (SrcSpanAnn (EpAnnNotUsed) { DumpSemis.hs:14:8-9 })
+ (Unqual
+ {OccName: IO}))))
+ (L
+ (SrcSpanAnn (EpAnnNotUsed) { DumpSemis.hs:14:11-12 })
+ (HsTupleTy
+ (EpAnn
+ (Anchor
+ { DumpSemis.hs:14:11 }
+ (UnchangedAnchor))
+ (AnnParen
+ (AnnParens)
+ (EpaSpan { DumpSemis.hs:14:11 })
+ (EpaSpan { DumpSemis.hs:14:12 }))
+ (EpaComments
+ []))
+ (HsBoxedOrConstraintTuple)
+ []))))))))))
+ ,(L
+ (SrcSpanAnn (EpAnn
+ (Anchor
+ { DumpSemis.hs:(15,1)-(19,3) }
+ (UnchangedAnchor))
+ (AnnListItem
+ [(AddSemiAnn
+ (EpaSpan { DumpSemis.hs:20:2 }))
+ ,(AddSemiAnn
+ (EpaSpan { DumpSemis.hs:20:4 }))
+ ,(AddSemiAnn
+ (EpaSpan { DumpSemis.hs:20:5 }))
+ ,(AddSemiAnn
+ (EpaSpan { DumpSemis.hs:20:8 }))])
+ (EpaComments
+ [])) { DumpSemis.hs:(15,1)-(19,3) })
+ (ValD
+ (NoExtField)
+ (FunBind
+ (NoExtField)
+ (L
+ (SrcSpanAnn (EpAnnNotUsed) { DumpSemis.hs:15:1-3 })
+ (Unqual
+ {OccName: bar}))
+ (MG
+ (NoExtField)
+ (L
+ (SrcSpanAnn (EpAnnNotUsed) { DumpSemis.hs:(15,1)-(19,3) })
+ [(L
+ (SrcSpanAnn (EpAnnNotUsed) { DumpSemis.hs:(15,1)-(19,3) })
+ (Match
+ (EpAnn
+ (Anchor
+ { DumpSemis.hs:(15,1)-(19,3) }
+ (UnchangedAnchor))
+ []
+ (EpaComments
+ []))
+ (FunRhs
+ (L
+ (SrcSpanAnn (EpAnnNotUsed) { DumpSemis.hs:15:1-3 })
+ (Unqual
+ {OccName: bar}))
+ (Prefix)
+ (NoSrcStrict))
+ []
+ (GRHSs
+ (EpaComments
+ [])
+ [(L
+ { DumpSemis.hs:(15,5)-(19,3) }
+ (GRHS
+ (EpAnn
+ (Anchor
+ { DumpSemis.hs:(15,5)-(19,3) }
+ (UnchangedAnchor))
+ (GrhsAnn
+ (Nothing)
+ (AddEpAnn AnnEqual (EpaSpan { DumpSemis.hs:15:5 })))
+ (EpaComments
+ []))
+ []
+ (L
+ (SrcSpanAnn (EpAnnNotUsed) { DumpSemis.hs:(15,7)-(19,3) })
+ (HsDo
+ (EpAnn
+ (Anchor
+ { DumpSemis.hs:(15,7)-(19,3) }
+ (UnchangedAnchor))
+ (AnnList
+ (Just
+ (Anchor
+ { DumpSemis.hs:(16,3)-(19,3) }
+ (UnchangedAnchor)))
+ (Nothing)
+ (Nothing)
+ [(AddEpAnn AnnDo (EpaSpan { DumpSemis.hs:15:7-8 }))]
+ [])
+ (EpaComments
+ []))
+ (DoExpr
+ (Nothing))
+ (L
+ (SrcSpanAnn (EpAnn
+ (Anchor
+ { DumpSemis.hs:(16,3)-(19,3) }
+ (UnchangedAnchor))
+ (AnnList
+ (Just
+ (Anchor
+ { DumpSemis.hs:(16,5)-(18,5) }
+ (UnchangedAnchor)))
+ (Just
+ (AddEpAnn AnnOpenC (EpaSpan { DumpSemis.hs:16:3 })))
+ (Just
+ (AddEpAnn AnnCloseC (EpaSpan { DumpSemis.hs:19:3 })))
+ [(AddEpAnn AnnSemi (EpaSpan { DumpSemis.hs:16:5 }))
+ ,(AddEpAnn AnnSemi (EpaSpan { DumpSemis.hs:16:8 }))]
+ [])
+ (EpaComments
+ [])) { DumpSemis.hs:(16,3)-(19,3) })
+ [(L
+ (SrcSpanAnn (EpAnn
+ (Anchor
+ { DumpSemis.hs:17:5 }
+ (UnchangedAnchor))
+ (AnnListItem
+ [(AddSemiAnn
+ (EpaSpan { DumpSemis.hs:17:7 }))
+ ,(AddSemiAnn
+ (EpaSpan { DumpSemis.hs:17:8 }))])
+ (EpaComments
+ [])) { DumpSemis.hs:17:5 })
+ (BodyStmt
+ (NoExtField)
+ (L
+ (SrcSpanAnn (EpAnnNotUsed) { DumpSemis.hs:17:5 })
+ (HsVar
+ (NoExtField)
+ (L
+ (SrcSpanAnn (EpAnnNotUsed) { DumpSemis.hs:17:5 })
+ (Unqual
+ {OccName: a}))))
+ (NoExtField)
+ (NoExtField)))
+ ,(L
+ (SrcSpanAnn (EpAnnNotUsed) { DumpSemis.hs:18:5 })
+ (BodyStmt
+ (NoExtField)
+ (L
+ (SrcSpanAnn (EpAnnNotUsed) { DumpSemis.hs:18:5 })
+ (HsVar
+ (NoExtField)
+ (L
+ (SrcSpanAnn (EpAnnNotUsed) { DumpSemis.hs:18:5 })
+ (Unqual
+ {OccName: b}))))
+ (NoExtField)
+ (NoExtField)))])))))]
+ (EmptyLocalBinds
+ (NoExtField)))))])
+ (FromSource))
+ [])))
+ ,(L
+ (SrcSpanAnn (EpAnn
+ (Anchor
+ { DumpSemis.hs:21:1-12 }
+ (UnchangedAnchor))
+ (AnnListItem
+ [])
+ (EpaComments
+ [])) { DumpSemis.hs:21:1-12 })
+ (SigD
+ (NoExtField)
+ (TypeSig
+ (EpAnn
+ (Anchor
+ { DumpSemis.hs:21:1-3 }
+ (UnchangedAnchor))
+ (AnnSig
+ (AddEpAnn AnnDcolon (EpaSpan { DumpSemis.hs:21:5-6 }))
+ [])
+ (EpaComments
+ []))
+ [(L
+ (SrcSpanAnn (EpAnnNotUsed) { DumpSemis.hs:21:1-3 })
+ (Unqual
+ {OccName: baz}))]
+ (HsWC
+ (NoExtField)
+ (L
+ (SrcSpanAnn (EpAnnNotUsed) { DumpSemis.hs:21:8-12 })
+ (HsSig
+ (NoExtField)
+ (HsOuterImplicit
+ (NoExtField))
+ (L
+ (SrcSpanAnn (EpAnnNotUsed) { DumpSemis.hs:21:8-12 })
+ (HsAppTy
+ (NoExtField)
+ (L
+ (SrcSpanAnn (EpAnnNotUsed) { DumpSemis.hs:21:8-9 })
+ (HsTyVar
+ (EpAnn
+ (Anchor
+ { DumpSemis.hs:21:8-9 }
+ (UnchangedAnchor))
+ []
+ (EpaComments
+ []))
+ (NotPromoted)
+ (L
+ (SrcSpanAnn (EpAnnNotUsed) { DumpSemis.hs:21:8-9 })
+ (Unqual
+ {OccName: IO}))))
+ (L
+ (SrcSpanAnn (EpAnnNotUsed) { DumpSemis.hs:21:11-12 })
+ (HsTupleTy
+ (EpAnn
+ (Anchor
+ { DumpSemis.hs:21:11 }
+ (UnchangedAnchor))
+ (AnnParen
+ (AnnParens)
+ (EpaSpan { DumpSemis.hs:21:11 })
+ (EpaSpan { DumpSemis.hs:21:12 }))
+ (EpaComments
+ []))
+ (HsBoxedOrConstraintTuple)
+ []))))))))))
+ ,(L
+ (SrcSpanAnn (EpAnn
+ (Anchor
+ { DumpSemis.hs:22:1-30 }
+ (UnchangedAnchor))
+ (AnnListItem
+ [(AddSemiAnn
+ (EpaSpan { DumpSemis.hs:23:1 }))])
+ (EpaComments
+ [])) { DumpSemis.hs:22:1-30 })
+ (ValD
+ (NoExtField)
+ (FunBind
+ (NoExtField)
+ (L
+ (SrcSpanAnn (EpAnnNotUsed) { DumpSemis.hs:22:1-3 })
+ (Unqual
+ {OccName: baz}))
+ (MG
+ (NoExtField)
+ (L
+ (SrcSpanAnn (EpAnnNotUsed) { DumpSemis.hs:22:1-30 })
+ [(L
+ (SrcSpanAnn (EpAnnNotUsed) { DumpSemis.hs:22:1-30 })
+ (Match
+ (EpAnn
+ (Anchor
+ { DumpSemis.hs:22:1-30 }
+ (UnchangedAnchor))
+ []
+ (EpaComments
+ []))
+ (FunRhs
+ (L
+ (SrcSpanAnn (EpAnnNotUsed) { DumpSemis.hs:22:1-3 })
+ (Unqual
+ {OccName: baz}))
+ (Prefix)
+ (NoSrcStrict))
+ []
+ (GRHSs
+ (EpaComments
+ [])
+ [(L
+ { DumpSemis.hs:22:5-30 }
+ (GRHS
+ (EpAnn
+ (Anchor
+ { DumpSemis.hs:22:5-30 }
+ (UnchangedAnchor))
+ (GrhsAnn
+ (Nothing)
+ (AddEpAnn AnnEqual (EpaSpan { DumpSemis.hs:22:5 })))
+ (EpaComments
+ []))
+ []
+ (L
+ (SrcSpanAnn (EpAnnNotUsed) { DumpSemis.hs:22:7-30 })
+ (HsDo
+ (EpAnn
+ (Anchor
+ { DumpSemis.hs:22:7-30 }
+ (UnchangedAnchor))
+ (AnnList
+ (Just
+ (Anchor
+ { DumpSemis.hs:22:10-30 }
+ (UnchangedAnchor)))
+ (Nothing)
+ (Nothing)
+ [(AddEpAnn AnnDo (EpaSpan { DumpSemis.hs:22:7-8 }))]
+ [])
+ (EpaComments
+ []))
+ (DoExpr
+ (Nothing))
+ (L
+ (SrcSpanAnn (EpAnn
+ (Anchor
+ { DumpSemis.hs:22:10-30 }
+ (UnchangedAnchor))
+ (AnnList
+ (Just
+ (Anchor
+ { DumpSemis.hs:22:12-25 }
+ (UnchangedAnchor)))
+ (Just
+ (AddEpAnn AnnOpenC (EpaSpan { DumpSemis.hs:22:10 })))
+ (Just
+ (AddEpAnn AnnCloseC (EpaSpan { DumpSemis.hs:22:30 })))
+ [(AddEpAnn AnnSemi (EpaSpan { DumpSemis.hs:22:12 }))
+ ,(AddEpAnn AnnSemi (EpaSpan { DumpSemis.hs:22:13 }))]
+ [])
+ (EpaComments
+ [])) { DumpSemis.hs:22:10-30 })
+ [(L
+ (SrcSpanAnn (EpAnn
+ (Anchor
+ { DumpSemis.hs:22:15 }
+ (UnchangedAnchor))
+ (AnnListItem
+ [(AddSemiAnn
+ (EpaSpan { DumpSemis.hs:22:17 }))])
+ (EpaComments
+ [])) { DumpSemis.hs:22:15 })
+ (BodyStmt
+ (NoExtField)
+ (L
+ (SrcSpanAnn (EpAnnNotUsed) { DumpSemis.hs:22:15 })
+ (HsVar
+ (NoExtField)
+ (L
+ (SrcSpanAnn (EpAnnNotUsed) { DumpSemis.hs:22:15 })
+ (Unqual
+ {OccName: s}))))
+ (NoExtField)
+ (NoExtField)))
+ ,(L
+ (SrcSpanAnn (EpAnn
+ (Anchor
+ { DumpSemis.hs:22:19 }
+ (UnchangedAnchor))
+ (AnnListItem
+ [(AddSemiAnn
+ (EpaSpan { DumpSemis.hs:22:21 }))
+ ,(AddSemiAnn
+ (EpaSpan { DumpSemis.hs:22:23 }))])
+ (EpaComments
+ [])) { DumpSemis.hs:22:19 })
+ (BodyStmt
+ (NoExtField)
+ (L
+ (SrcSpanAnn (EpAnnNotUsed) { DumpSemis.hs:22:19 })
+ (HsVar
+ (NoExtField)
+ (L
+ (SrcSpanAnn (EpAnnNotUsed) { DumpSemis.hs:22:19 })
+ (Unqual
+ {OccName: s}))))
+ (NoExtField)
+ (NoExtField)))
+ ,(L
+ (SrcSpanAnn (EpAnn
+ (Anchor
+ { DumpSemis.hs:22:25 }
+ (UnchangedAnchor))
+ (AnnListItem
+ [(AddSemiAnn
+ (EpaSpan { DumpSemis.hs:22:27 }))
+ ,(AddSemiAnn
+ (EpaSpan { DumpSemis.hs:22:28 }))])
+ (EpaComments
+ [])) { DumpSemis.hs:22:25 })
+ (BodyStmt
+ (NoExtField)
+ (L
+ (SrcSpanAnn (EpAnnNotUsed) { DumpSemis.hs:22:25 })
+ (HsVar
+ (NoExtField)
+ (L
+ (SrcSpanAnn (EpAnnNotUsed) { DumpSemis.hs:22:25 })
+ (Unqual
+ {OccName: s}))))
+ (NoExtField)
+ (NoExtField)))])))))]
+ (EmptyLocalBinds
+ (NoExtField)))))])
+ (FromSource))
+ [])))
+ ,(L
+ (SrcSpanAnn (EpAnn
+ (Anchor
+ { DumpSemis.hs:24:1-13 }
+ (UnchangedAnchor))
+ (AnnListItem
+ [])
+ (EpaComments
+ [])) { DumpSemis.hs:24:1-13 })
+ (ValD
+ (NoExtField)
+ (FunBind
+ (NoExtField)
+ (L
+ (SrcSpanAnn (EpAnnNotUsed) { DumpSemis.hs:24:1 })
+ (Unqual
+ {OccName: a}))
+ (MG
+ (NoExtField)
+ (L
+ (SrcSpanAnn (EpAnnNotUsed) { DumpSemis.hs:24:1-13 })
+ [(L
+ (SrcSpanAnn (EpAnnNotUsed) { DumpSemis.hs:24:1-13 })
+ (Match
+ (EpAnn
+ (Anchor
+ { DumpSemis.hs:24:1-13 }
+ (UnchangedAnchor))
+ []
+ (EpaComments
+ []))
+ (FunRhs
+ (L
+ (SrcSpanAnn (EpAnnNotUsed) { DumpSemis.hs:24:1 })
+ (Unqual
+ {OccName: a}))
+ (Prefix)
+ (NoSrcStrict))
+ []
+ (GRHSs
+ (EpaComments
+ [])
+ [(L
+ { DumpSemis.hs:24:3-13 }
+ (GRHS
+ (EpAnn
+ (Anchor
+ { DumpSemis.hs:24:3-13 }
+ (UnchangedAnchor))
+ (GrhsAnn
+ (Nothing)
+ (AddEpAnn AnnEqual (EpaSpan { DumpSemis.hs:24:3 })))
+ (EpaComments
+ []))
+ []
+ (L
+ (SrcSpanAnn (EpAnnNotUsed) { DumpSemis.hs:24:5-13 })
+ (HsVar
+ (NoExtField)
+ (L
+ (SrcSpanAnn (EpAnnNotUsed) { DumpSemis.hs:24:5-13 })
+ (Unqual
+ {OccName: undefined}))))))]
+ (EmptyLocalBinds
+ (NoExtField)))))])
+ (FromSource))
+ [])))
+ ,(L
+ (SrcSpanAnn (EpAnn
+ (Anchor
+ { DumpSemis.hs:25:1-13 }
+ (UnchangedAnchor))
+ (AnnListItem
+ [])
+ (EpaComments
+ [])) { DumpSemis.hs:25:1-13 })
+ (ValD
+ (NoExtField)
+ (FunBind
+ (NoExtField)
+ (L
+ (SrcSpanAnn (EpAnnNotUsed) { DumpSemis.hs:25:1 })
+ (Unqual
+ {OccName: b}))
+ (MG
+ (NoExtField)
+ (L
+ (SrcSpanAnn (EpAnnNotUsed) { DumpSemis.hs:25:1-13 })
+ [(L
+ (SrcSpanAnn (EpAnnNotUsed) { DumpSemis.hs:25:1-13 })
+ (Match
+ (EpAnn
+ (Anchor
+ { DumpSemis.hs:25:1-13 }
+ (UnchangedAnchor))
+ []
+ (EpaComments
+ []))
+ (FunRhs
+ (L
+ (SrcSpanAnn (EpAnnNotUsed) { DumpSemis.hs:25:1 })
+ (Unqual
+ {OccName: b}))
+ (Prefix)
+ (NoSrcStrict))
+ []
+ (GRHSs
+ (EpaComments
+ [])
+ [(L
+ { DumpSemis.hs:25:3-13 }
+ (GRHS
+ (EpAnn
+ (Anchor
+ { DumpSemis.hs:25:3-13 }
+ (UnchangedAnchor))
+ (GrhsAnn
+ (Nothing)
+ (AddEpAnn AnnEqual (EpaSpan { DumpSemis.hs:25:3 })))
+ (EpaComments
+ []))
+ []
+ (L
+ (SrcSpanAnn (EpAnnNotUsed) { DumpSemis.hs:25:5-13 })
+ (HsVar
+ (NoExtField)
+ (L
+ (SrcSpanAnn (EpAnnNotUsed) { DumpSemis.hs:25:5-13 })
+ (Unqual
+ {OccName: undefined}))))))]
+ (EmptyLocalBinds
+ (NoExtField)))))])
+ (FromSource))
+ [])))
+ ,(L
+ (SrcSpanAnn (EpAnn
+ (Anchor
+ { DumpSemis.hs:26:1-13 }
+ (UnchangedAnchor))
+ (AnnListItem
+ [(AddSemiAnn
+ (EpaSpan { DumpSemis.hs:27:1 }))])
+ (EpaComments
+ [])) { DumpSemis.hs:26:1-13 })
+ (ValD
+ (NoExtField)
+ (FunBind
+ (NoExtField)
+ (L
+ (SrcSpanAnn (EpAnnNotUsed) { DumpSemis.hs:26:1 })
+ (Unqual
+ {OccName: s}))
+ (MG
+ (NoExtField)
+ (L
+ (SrcSpanAnn (EpAnnNotUsed) { DumpSemis.hs:26:1-13 })
+ [(L
+ (SrcSpanAnn (EpAnnNotUsed) { DumpSemis.hs:26:1-13 })
+ (Match
+ (EpAnn
+ (Anchor
+ { DumpSemis.hs:26:1-13 }
+ (UnchangedAnchor))
+ []
+ (EpaComments
+ []))
+ (FunRhs
+ (L
+ (SrcSpanAnn (EpAnnNotUsed) { DumpSemis.hs:26:1 })
+ (Unqual
+ {OccName: s}))
+ (Prefix)
+ (NoSrcStrict))
+ []
+ (GRHSs
+ (EpaComments
+ [])
+ [(L
+ { DumpSemis.hs:26:3-13 }
+ (GRHS
+ (EpAnn
+ (Anchor
+ { DumpSemis.hs:26:3-13 }
+ (UnchangedAnchor))
+ (GrhsAnn
+ (Nothing)
+ (AddEpAnn AnnEqual (EpaSpan { DumpSemis.hs:26:3 })))
+ (EpaComments
+ []))
+ []
+ (L
+ (SrcSpanAnn (EpAnnNotUsed) { DumpSemis.hs:26:5-13 })
+ (HsVar
+ (NoExtField)
+ (L
+ (SrcSpanAnn (EpAnnNotUsed) { DumpSemis.hs:26:5-13 })
+ (Unqual
+ {OccName: undefined}))))))]
+ (EmptyLocalBinds
+ (NoExtField)))))])
+ (FromSource))
+ [])))
+ ,(L
+ (SrcSpanAnn (EpAnn
+ (Anchor
+ { DumpSemis.hs:(28,1)-(29,23) }
+ (UnchangedAnchor))
+ (AnnListItem
+ [(AddSemiAnn
+ (EpaSpan { DumpSemis.hs:30:1 }))])
+ (EpaComments
+ [])) { DumpSemis.hs:(28,1)-(29,23) })
+ (TyClD
+ (NoExtField)
+ (ClassDecl
+ ((,,)
+ (EpAnn
+ (Anchor
+ { DumpSemis.hs:(28,1)-(29,23) }
+ (UnchangedAnchor))
+ [(AddEpAnn AnnClass (EpaSpan { DumpSemis.hs:28:1-5 }))
+ ,(AddEpAnn AnnWhere (EpaSpan { DumpSemis.hs:28:40-44 }))]
+ (EpaComments
+ []))
+ (NoAnnSortKey)
+ (VirtualBraces
+ (3)))
+ (Nothing)
+ (L
+ (SrcSpanAnn (EpAnnNotUsed) { DumpSemis.hs:28:7-19 })
+ (Unqual
+ {OccName: LiftingMonad2}))
+ (HsQTvs
+ (NoExtField)
+ [(L
+ (SrcSpanAnn (EpAnnNotUsed) { DumpSemis.hs:28:22-38 })
+ (KindedTyVar
+ (EpAnn
+ (Anchor
+ { DumpSemis.hs:28:22-38 }
+ (UnchangedAnchor))
+ [(AddEpAnn AnnDcolon (EpaSpan { DumpSemis.hs:28:30-31 }))
+ ,(AddEpAnn AnnOpenP (EpaSpan { DumpSemis.hs:28:22 }))
+ ,(AddEpAnn AnnOpenP (EpaSpan { DumpSemis.hs:28:23 }))
+ ,(AddEpAnn AnnCloseP (EpaSpan { DumpSemis.hs:28:37 }))
+ ,(AddEpAnn AnnCloseP (EpaSpan { DumpSemis.hs:28:38 }))]
+ (EpaComments
+ []))
+ (())
+ (L
+ (SrcSpanAnn (EpAnnNotUsed) { DumpSemis.hs:28:24-28 })
+ (Unqual
+ {OccName: trans}))
+ (L
+ (SrcSpanAnn (EpAnnNotUsed) { DumpSemis.hs:28:33-36 })
+ (HsTyVar
+ (EpAnn
+ (Anchor
+ { DumpSemis.hs:28:33-36 }
+ (UnchangedAnchor))
+ []
+ (EpaComments
+ []))
+ (NotPromoted)
+ (L
+ (SrcSpanAnn (EpAnnNotUsed) { DumpSemis.hs:28:33-36 })
+ (Unqual
+ {OccName: Type}))))))])
+ (Prefix)
+ []
+ [(L
+ (SrcSpanAnn (EpAnnNotUsed) { DumpSemis.hs:29:3-23 })
+ (ClassOpSig
+ (EpAnn
+ (Anchor
+ { DumpSemis.hs:29:3-7 }
+ (UnchangedAnchor))
+ (AnnSig
+ (AddEpAnn AnnDcolon (EpaSpan { DumpSemis.hs:29:9-10 }))
+ [])
+ (EpaComments
+ []))
+ (False)
+ [(L
+ (SrcSpanAnn (EpAnnNotUsed) { DumpSemis.hs:29:3-7 })
+ (Unqual
+ {OccName: proof}))]
+ (L
+ (SrcSpanAnn (EpAnnNotUsed) { DumpSemis.hs:29:12-23 })
+ (HsSig
+ (NoExtField)
+ (HsOuterImplicit
+ (NoExtField))
+ (L
+ (SrcSpanAnn (EpAnnNotUsed) { DumpSemis.hs:29:12-23 })
+ (HsFunTy
+ (EpAnn
+ (Anchor
+ { DumpSemis.hs:29:12-16 }
+ (UnchangedAnchor))
+ (NoEpAnns)
+ (EpaComments
+ []))
+ (HsUnrestrictedArrow
+ (L
+ (TokenLoc
+ (EpaSpan { DumpSemis.hs:29:18-19 }))
+ (HsNormalTok)))
+ (L
+ (SrcSpanAnn (EpAnnNotUsed) { DumpSemis.hs:29:12-16 })
+ (HsTyVar
+ (EpAnn
+ (Anchor
+ { DumpSemis.hs:29:12-16 }
+ (UnchangedAnchor))
+ []
+ (EpaComments
+ []))
+ (NotPromoted)
+ (L
+ (SrcSpanAnn (EpAnnNotUsed) { DumpSemis.hs:29:12-16 })
+ (Unqual
+ {OccName: trans}))))
+ (L
+ (SrcSpanAnn (EpAnnNotUsed) { DumpSemis.hs:29:21-23 })
+ (HsTyVar
+ (EpAnn
+ (Anchor
+ { DumpSemis.hs:29:21-23 }
+ (UnchangedAnchor))
+ []
+ (EpaComments
+ []))
+ (NotPromoted)
+ (L
+ (SrcSpanAnn (EpAnnNotUsed) { DumpSemis.hs:29:21-23 })
+ (Unqual
+ {OccName: Int}))))))))))]
+ {Bag(LocatedA (HsBind GhcPs)):
+ []}
+ []
+ []
+ [])))
+ ,(L
+ (SrcSpanAnn (EpAnn
+ (Anchor
+ { DumpSemis.hs:31:1-30 }
+ (UnchangedAnchor))
+ (AnnListItem
+ [])
+ (EpaComments
+ [])) { DumpSemis.hs:31:1-30 })
+ (SigD
+ (NoExtField)
+ (TypeSig
+ (EpAnn
+ (Anchor
+ { DumpSemis.hs:31:1 }
+ (UnchangedAnchor))
+ (AnnSig
+ (AddEpAnn AnnDcolon (EpaSpan { DumpSemis.hs:31:3-4 }))
+ [])
+ (EpaComments
+ []))
+ [(L
+ (SrcSpanAnn (EpAnnNotUsed) { DumpSemis.hs:31:1 })
+ (Unqual
+ {OccName: f}))]
+ (HsWC
+ (NoExtField)
+ (L
+ (SrcSpanAnn (EpAnnNotUsed) { DumpSemis.hs:31:6-30 })
+ (HsSig
+ (NoExtField)
+ (HsOuterImplicit
+ (NoExtField))
+ (L
+ (SrcSpanAnn (EpAnnNotUsed) { DumpSemis.hs:31:6-30 })
+ (HsQualTy
+ (NoExtField)
+ (L
+ (SrcSpanAnn (EpAnn
+ (Anchor
+ { DumpSemis.hs:31:6-20 }
+ (UnchangedAnchor))
+ (AnnContext
+ (Just
+ ((,)
+ (NormalSyntax)
+ (EpaSpan { DumpSemis.hs:31:22-23 })))
+ [(EpaSpan { DumpSemis.hs:31:6 })
+ ,(EpaSpan { DumpSemis.hs:31:7 })]
+ [(EpaSpan { DumpSemis.hs:31:19 })
+ ,(EpaSpan { DumpSemis.hs:31:20 })])
+ (EpaComments
+ [])) { DumpSemis.hs:31:6-20 })
+ [(L
+ (SrcSpanAnn (EpAnn
+ (Anchor
+ { DumpSemis.hs:31:8-11 }
+ (UnchangedAnchor))
+ (AnnListItem
+ [(AddCommaAnn
+ (EpaSpan { DumpSemis.hs:31:12 }))])
+ (EpaComments
+ [])) { DumpSemis.hs:31:8-11 })
+ (HsAppTy
+ (NoExtField)
+ (L
+ (SrcSpanAnn (EpAnnNotUsed) { DumpSemis.hs:31:8-9 })
+ (HsTyVar
+ (EpAnn
+ (Anchor
+ { DumpSemis.hs:31:8-9 }
+ (UnchangedAnchor))
+ []
+ (EpaComments
+ []))
+ (NotPromoted)
+ (L
+ (SrcSpanAnn (EpAnnNotUsed) { DumpSemis.hs:31:8-9 })
+ (Unqual
+ {OccName: Eq}))))
+ (L
+ (SrcSpanAnn (EpAnnNotUsed) { DumpSemis.hs:31:11 })
+ (HsTyVar
+ (EpAnn
+ (Anchor
+ { DumpSemis.hs:31:11 }
+ (UnchangedAnchor))
+ []
+ (EpaComments
+ []))
+ (NotPromoted)
+ (L
+ (SrcSpanAnn (EpAnnNotUsed) { DumpSemis.hs:31:11 })
+ (Unqual
+ {OccName: a}))))))
+ ,(L
+ (SrcSpanAnn (EpAnnNotUsed) { DumpSemis.hs:31:14-18 })
+ (HsAppTy
+ (NoExtField)
+ (L
+ (SrcSpanAnn (EpAnnNotUsed) { DumpSemis.hs:31:14-16 })
+ (HsTyVar
+ (EpAnn
+ (Anchor
+ { DumpSemis.hs:31:14-16 }
+ (UnchangedAnchor))
+ []
+ (EpaComments
+ []))
+ (NotPromoted)
+ (L
+ (SrcSpanAnn (EpAnnNotUsed) { DumpSemis.hs:31:14-16 })
+ (Unqual
+ {OccName: Ord}))))
+ (L
+ (SrcSpanAnn (EpAnnNotUsed) { DumpSemis.hs:31:18 })
+ (HsTyVar
+ (EpAnn
+ (Anchor
+ { DumpSemis.hs:31:18 }
+ (UnchangedAnchor))
+ []
+ (EpaComments
+ []))
+ (NotPromoted)
+ (L
+ (SrcSpanAnn (EpAnnNotUsed) { DumpSemis.hs:31:18 })
+ (Unqual
+ {OccName: a}))))))])
+ (L
+ (SrcSpanAnn (EpAnnNotUsed) { DumpSemis.hs:31:25-30 })
+ (HsFunTy
+ (EpAnn
+ (Anchor
+ { DumpSemis.hs:31:25 }
+ (UnchangedAnchor))
+ (NoEpAnns)
+ (EpaComments
+ []))
+ (HsUnrestrictedArrow
+ (L
+ (TokenLoc
+ (EpaSpan { DumpSemis.hs:31:27-28 }))
+ (HsNormalTok)))
+ (L
+ (SrcSpanAnn (EpAnnNotUsed) { DumpSemis.hs:31:25 })
+ (HsTyVar
+ (EpAnn
+ (Anchor
+ { DumpSemis.hs:31:25 }
+ (UnchangedAnchor))
+ []
+ (EpaComments
+ []))
+ (NotPromoted)
+ (L
+ (SrcSpanAnn (EpAnnNotUsed) { DumpSemis.hs:31:25 })
+ (Unqual
+ {OccName: a}))))
+ (L
+ (SrcSpanAnn (EpAnnNotUsed) { DumpSemis.hs:31:30 })
+ (HsTyVar
+ (EpAnn
+ (Anchor
+ { DumpSemis.hs:31:30 }
+ (UnchangedAnchor))
+ []
+ (EpaComments
+ []))
+ (NotPromoted)
+ (L
+ (SrcSpanAnn (EpAnnNotUsed) { DumpSemis.hs:31:30 })
+ (Unqual
+ {OccName: a}))))))))))))))
+ ,(L
+ (SrcSpanAnn (EpAnn
+ (Anchor
+ { DumpSemis.hs:32:1-7 }
+ (UnchangedAnchor))
+ (AnnListItem
+ [])
+ (EpaComments
+ [])) { DumpSemis.hs:32:1-7 })
+ (ValD
+ (NoExtField)
+ (FunBind
+ (NoExtField)
+ (L
+ (SrcSpanAnn (EpAnnNotUsed) { DumpSemis.hs:32:1 })
+ (Unqual
+ {OccName: f}))
+ (MG
+ (NoExtField)
+ (L
+ (SrcSpanAnn (EpAnnNotUsed) { DumpSemis.hs:32:1-7 })
+ [(L
+ (SrcSpanAnn (EpAnn
+ (Anchor
+ { DumpSemis.hs:32:1-7 }
+ (UnchangedAnchor))
+ (AnnListItem
+ [(AddSemiAnn
+ (EpaSpan { DumpSemis.hs:33:1 }))
+ ,(AddSemiAnn
+ (EpaSpan { DumpSemis.hs:34:6 }))
+ ,(AddSemiAnn
+ (EpaSpan { DumpSemis.hs:34:7 }))])
+ (EpaComments
+ [])) { DumpSemis.hs:32:1-7 })
+ (Match
+ (EpAnn
+ (Anchor
+ { DumpSemis.hs:32:1-7 }
+ (UnchangedAnchor))
+ []
+ (EpaComments
+ []))
+ (FunRhs
+ (L
+ (SrcSpanAnn (EpAnnNotUsed) { DumpSemis.hs:32:1 })
+ (Unqual
+ {OccName: f}))
+ (Prefix)
+ (NoSrcStrict))
+ [(L
+ (SrcSpanAnn (EpAnnNotUsed) { DumpSemis.hs:32:3 })
+ (VarPat
+ (NoExtField)
+ (L
+ (SrcSpanAnn (EpAnnNotUsed) { DumpSemis.hs:32:3 })
+ (Unqual
+ {OccName: x}))))]
+ (GRHSs
+ (EpaComments
+ [])
+ [(L
+ { DumpSemis.hs:32:5-7 }
+ (GRHS
+ (EpAnn
+ (Anchor
+ { DumpSemis.hs:32:5-7 }
+ (UnchangedAnchor))
+ (GrhsAnn
+ (Nothing)
+ (AddEpAnn AnnEqual (EpaSpan { DumpSemis.hs:32:5 })))
+ (EpaComments
+ []))
+ []
+ (L
+ (SrcSpanAnn (EpAnnNotUsed) { DumpSemis.hs:32:7 })
+ (HsVar
+ (NoExtField)
+ (L
+ (SrcSpanAnn (EpAnnNotUsed) { DumpSemis.hs:32:7 })
+ (Unqual
+ {OccName: x}))))))]
+ (EmptyLocalBinds
+ (NoExtField)))))])
+ (FromSource))
+ [])))
+ ,(L
+ (SrcSpanAnn (EpAnn
+ (Anchor
+ { DumpSemis.hs:34:8-35 }
+ (UnchangedAnchor))
+ (AnnListItem
+ [(AddSemiAnn
+ (EpaSpan { DumpSemis.hs:34:36 }))
+ ,(AddSemiAnn
+ (EpaSpan { DumpSemis.hs:35:1 }))])
+ (EpaComments
+ [])) { DumpSemis.hs:34:8-35 })
+ (ValD
+ (NoExtField)
+ (FunBind
+ (NoExtField)
+ (L
+ (SrcSpanAnn (EpAnnNotUsed) { DumpSemis.hs:34:8 })
+ (Unqual
+ {OccName: x}))
+ (MG
+ (NoExtField)
+ (L
+ (SrcSpanAnn (EpAnnNotUsed) { DumpSemis.hs:34:8-35 })
+ [(L
+ (SrcSpanAnn (EpAnnNotUsed) { DumpSemis.hs:34:8-35 })
+ (Match
+ (EpAnn
+ (Anchor
+ { DumpSemis.hs:34:8-35 }
+ (UnchangedAnchor))
+ []
+ (EpaComments
+ []))
+ (FunRhs
+ (L
+ (SrcSpanAnn (EpAnnNotUsed) { DumpSemis.hs:34:8 })
+ (Unqual
+ {OccName: x}))
+ (Prefix)
+ (NoSrcStrict))
+ []
+ (GRHSs
+ (EpaComments
+ [])
+ [(L
+ { DumpSemis.hs:34:9-35 }
+ (GRHS
+ (EpAnn
+ (Anchor
+ { DumpSemis.hs:34:9-35 }
+ (UnchangedAnchor))
+ (GrhsAnn
+ (Nothing)
+ (AddEpAnn AnnEqual (EpaSpan { DumpSemis.hs:34:9 })))
+ (EpaComments
+ []))
+ []
+ (L
+ (SrcSpanAnn (EpAnnNotUsed) { DumpSemis.hs:34:10-35 })
+ (HsLet
+ (EpAnn
+ (Anchor
+ { DumpSemis.hs:34:10-35 }
+ (UnchangedAnchor))
+ (AnnsLet
+ (EpaSpan { DumpSemis.hs:34:10-12 })
+ (EpaSpan { DumpSemis.hs:34:32-33 }))
+ (EpaComments
+ []))
+ (HsValBinds
+ (EpAnn
+ (Anchor
+ { DumpSemis.hs:34:13-31 }
+ (UnchangedAnchor))
+ (AnnList
+ (Just
+ (Anchor
+ { DumpSemis.hs:34:14-30 }
+ (UnchangedAnchor)))
+ (Just
+ (AddEpAnn AnnOpenC (EpaSpan { DumpSemis.hs:34:13 })))
+ (Just
+ (AddEpAnn AnnCloseC (EpaSpan { DumpSemis.hs:34:31 })))
+ []
+ [(AddSemiAnn
+ (EpaSpan { DumpSemis.hs:34:14 }))
+ ,(AddSemiAnn
+ (EpaSpan { DumpSemis.hs:34:15 }))
+ ,(AddSemiAnn
+ (EpaSpan { DumpSemis.hs:34:16 }))
+ ,(AddSemiAnn
+ (EpaSpan { DumpSemis.hs:34:17 }))
+ ,(AddSemiAnn
+ (EpaSpan { DumpSemis.hs:34:18 }))])
+ (EpaComments
+ []))
+ (ValBinds
+ (NoAnnSortKey)
+ {Bag(LocatedA (HsBind GhcPs)):
+ [(L
+ (SrcSpanAnn (EpAnn
+ (Anchor
+ { DumpSemis.hs:34:19-21 }
+ (UnchangedAnchor))
+ (AnnListItem
+ [(AddSemiAnn
+ (EpaSpan { DumpSemis.hs:34:22 }))
+ ,(AddSemiAnn
+ (EpaSpan { DumpSemis.hs:34:23 }))])
+ (EpaComments
+ [])) { DumpSemis.hs:34:19-21 })
+ (FunBind
+ (NoExtField)
+ (L
+ (SrcSpanAnn (EpAnnNotUsed) { DumpSemis.hs:34:19 })
+ (Unqual
+ {OccName: y}))
+ (MG
+ (NoExtField)
+ (L
+ (SrcSpanAnn (EpAnnNotUsed) { DumpSemis.hs:34:19-21 })
+ [(L
+ (SrcSpanAnn (EpAnnNotUsed) { DumpSemis.hs:34:19-21 })
+ (Match
+ (EpAnn
+ (Anchor
+ { DumpSemis.hs:34:19-21 }
+ (UnchangedAnchor))
+ []
+ (EpaComments
+ []))
+ (FunRhs
+ (L
+ (SrcSpanAnn (EpAnnNotUsed) { DumpSemis.hs:34:19 })
+ (Unqual
+ {OccName: y}))
+ (Prefix)
+ (NoSrcStrict))
+ []
+ (GRHSs
+ (EpaComments
+ [])
+ [(L
+ { DumpSemis.hs:34:20-21 }
+ (GRHS
+ (EpAnn
+ (Anchor
+ { DumpSemis.hs:34:20-21 }
+ (UnchangedAnchor))
+ (GrhsAnn
+ (Nothing)
+ (AddEpAnn AnnEqual (EpaSpan { DumpSemis.hs:34:20 })))
+ (EpaComments
+ []))
+ []
+ (L
+ (SrcSpanAnn (EpAnnNotUsed) { DumpSemis.hs:34:21 })
+ (HsOverLit
+ (EpAnn
+ (Anchor
+ { DumpSemis.hs:34:21 }
+ (UnchangedAnchor))
+ (NoEpAnns)
+ (EpaComments
+ []))
+ (OverLit
+ (NoExtField)
+ (HsIntegral
+ (IL
+ (SourceText 2)
+ (False)
+ (2))))))))]
+ (EmptyLocalBinds
+ (NoExtField)))))])
+ (FromSource))
+ []))
+ ,(L
+ (SrcSpanAnn (EpAnn
+ (Anchor
+ { DumpSemis.hs:34:24-26 }
+ (UnchangedAnchor))
+ (AnnListItem
+ [(AddSemiAnn
+ (EpaSpan { DumpSemis.hs:34:27 }))
+ ,(AddSemiAnn
+ (EpaSpan { DumpSemis.hs:34:28 }))
+ ,(AddSemiAnn
+ (EpaSpan { DumpSemis.hs:34:29 }))
+ ,(AddSemiAnn
+ (EpaSpan { DumpSemis.hs:34:30 }))])
+ (EpaComments
+ [])) { DumpSemis.hs:34:24-26 })
+ (FunBind
+ (NoExtField)
+ (L
+ (SrcSpanAnn (EpAnnNotUsed) { DumpSemis.hs:34:24 })
+ (Unqual
+ {OccName: z}))
+ (MG
+ (NoExtField)
+ (L
+ (SrcSpanAnn (EpAnnNotUsed) { DumpSemis.hs:34:24-26 })
+ [(L
+ (SrcSpanAnn (EpAnnNotUsed) { DumpSemis.hs:34:24-26 })
+ (Match
+ (EpAnn
+ (Anchor
+ { DumpSemis.hs:34:24-26 }
+ (UnchangedAnchor))
+ []
+ (EpaComments
+ []))
+ (FunRhs
+ (L
+ (SrcSpanAnn (EpAnnNotUsed) { DumpSemis.hs:34:24 })
+ (Unqual
+ {OccName: z}))
+ (Prefix)
+ (NoSrcStrict))
+ []
+ (GRHSs
+ (EpaComments
+ [])
+ [(L
+ { DumpSemis.hs:34:25-26 }
+ (GRHS
+ (EpAnn
+ (Anchor
+ { DumpSemis.hs:34:25-26 }
+ (UnchangedAnchor))
+ (GrhsAnn
+ (Nothing)
+ (AddEpAnn AnnEqual (EpaSpan { DumpSemis.hs:34:25 })))
+ (EpaComments
+ []))
+ []
+ (L
+ (SrcSpanAnn (EpAnnNotUsed) { DumpSemis.hs:34:26 })
+ (HsOverLit
+ (EpAnn
+ (Anchor
+ { DumpSemis.hs:34:26 }
+ (UnchangedAnchor))
+ (NoEpAnns)
+ (EpaComments
+ []))
+ (OverLit
+ (NoExtField)
+ (HsIntegral
+ (IL
+ (SourceText 3)
+ (False)
+ (3))))))))]
+ (EmptyLocalBinds
+ (NoExtField)))))])
+ (FromSource))
+ []))]}
+ []))
+ (L
+ (SrcSpanAnn (EpAnnNotUsed) { DumpSemis.hs:34:35 })
+ (HsVar
+ (NoExtField)
+ (L
+ (SrcSpanAnn (EpAnnNotUsed) { DumpSemis.hs:34:35 })
+ (Unqual
+ {OccName: y}))))))))]
+ (EmptyLocalBinds
+ (NoExtField)))))])
+ (FromSource))
+ [])))
+ ,(L
+ (SrcSpanAnn (EpAnn
+ (Anchor
+ { DumpSemis.hs:(36,1)-(44,4) }
+ (UnchangedAnchor))
+ (AnnListItem
+ [])
+ (EpaComments
+ [])) { DumpSemis.hs:(36,1)-(44,4) })
+ (ValD
+ (NoExtField)
+ (FunBind
+ (NoExtField)
+ (L
+ (SrcSpanAnn (EpAnnNotUsed) { DumpSemis.hs:36:1-3 })
+ (Unqual
+ {OccName: fot}))
+ (MG
+ (NoExtField)
+ (L
+ (SrcSpanAnn (EpAnnNotUsed) { DumpSemis.hs:(36,1)-(44,4) })
+ [(L
+ (SrcSpanAnn (EpAnn
+ (Anchor
+ { DumpSemis.hs:(36,1)-(44,4) }
+ (UnchangedAnchor))
+ (AnnListItem
+ [(AddSemiAnn
+ (EpaSpan { DumpSemis.hs:45:1 }))])
+ (EpaComments
+ [])) { DumpSemis.hs:(36,1)-(44,4) })
+ (Match
+ (EpAnn
+ (Anchor
+ { DumpSemis.hs:(36,1)-(44,4) }
+ (UnchangedAnchor))
+ []
+ (EpaComments
+ []))
+ (FunRhs
+ (L
+ (SrcSpanAnn (EpAnnNotUsed) { DumpSemis.hs:36:1-3 })
+ (Unqual
+ {OccName: fot}))
+ (Prefix)
+ (NoSrcStrict))
+ [(L
+ (SrcSpanAnn (EpAnnNotUsed) { DumpSemis.hs:36:5 })
+ (VarPat
+ (NoExtField)
+ (L
+ (SrcSpanAnn (EpAnnNotUsed) { DumpSemis.hs:36:5 })
+ (Unqual
+ {OccName: x}))))]
+ (GRHSs
+ (EpaComments
+ [])
+ [(L
+ { DumpSemis.hs:(36,7)-(44,4) }
+ (GRHS
+ (EpAnn
+ (Anchor
+ { DumpSemis.hs:(36,7)-(44,4) }
+ (UnchangedAnchor))
+ (GrhsAnn
+ (Nothing)
+ (AddEpAnn AnnEqual (EpaSpan { DumpSemis.hs:36:7 })))
+ (EpaComments
+ []))
+ []
+ (L
+ (SrcSpanAnn (EpAnnNotUsed) { DumpSemis.hs:(37,3)-(44,4) })
+ (HsCase
+ (EpAnn
+ (Anchor
+ { DumpSemis.hs:(37,3)-(44,4) }
+ (UnchangedAnchor))
+ (EpAnnHsCase
+ (EpaSpan { DumpSemis.hs:37:3-6 })
+ (EpaSpan { DumpSemis.hs:37:10-11 })
+ [])
+ (EpaComments
+ []))
+ (L
+ (SrcSpanAnn (EpAnnNotUsed) { DumpSemis.hs:37:8 })
+ (HsVar
+ (NoExtField)
+ (L
+ (SrcSpanAnn (EpAnnNotUsed) { DumpSemis.hs:37:8 })
+ (Unqual
+ {OccName: x}))))
+ (MG
+ (NoExtField)
+ (L
+ (SrcSpanAnn (EpAnn
+ (Anchor
+ { DumpSemis.hs:(38,4)-(44,4) }
+ (UnchangedAnchor))
+ (AnnList
+ (Just
+ (Anchor
+ { DumpSemis.hs:(38,6)-(43,13) }
+ (UnchangedAnchor)))
+ (Just
+ (AddEpAnn AnnOpenC (EpaSpan { DumpSemis.hs:38:4 })))
+ (Just
+ (AddEpAnn AnnCloseC (EpaSpan { DumpSemis.hs:44:4 })))
+ [(AddEpAnn AnnSemi (EpaSpan { DumpSemis.hs:38:6 }))
+ ,(AddEpAnn AnnSemi (EpaSpan { DumpSemis.hs:38:7 }))
+ ,(AddEpAnn AnnSemi (EpaSpan { DumpSemis.hs:38:8 }))]
+ [])
+ (EpaComments
+ [])) { DumpSemis.hs:(38,4)-(44,4) })
+ [(L
+ (SrcSpanAnn (EpAnn
+ (Anchor
+ { DumpSemis.hs:39:6-13 }
+ (UnchangedAnchor))
+ (AnnListItem
+ [(AddSemiAnn
+ (EpaSpan { DumpSemis.hs:39:14 }))])
+ (EpaComments
+ [])) { DumpSemis.hs:39:6-13 })
+ (Match
+ (EpAnn
+ (Anchor
+ { DumpSemis.hs:39:6 }
+ (UnchangedAnchor))
+ []
+ (EpaComments
+ []))
+ (CaseAlt)
+ [(L
+ (SrcSpanAnn (EpAnnNotUsed) { DumpSemis.hs:39:6 })
+ (NPat
+ (EpAnnNotUsed)
+ (L
+ { DumpSemis.hs:39:6 }
+ (OverLit
+ (NoExtField)
+ (HsIntegral
+ (IL
+ (SourceText 0)
+ (False)
+ (0)))))
+ (Nothing)
+ (NoExtField)))]
+ (GRHSs
+ (EpaComments
+ [])
+ [(L
+ { DumpSemis.hs:39:8-13 }
+ (GRHS
+ (EpAnn
+ (Anchor
+ { DumpSemis.hs:39:8-9 }
+ (UnchangedAnchor))
+ (GrhsAnn
+ (Nothing)
+ (AddEpAnn AnnRarrow (EpaSpan { DumpSemis.hs:39:8-9 })))
+ (EpaComments
+ []))
+ []
+ (L
+ (SrcSpanAnn (EpAnnNotUsed) { DumpSemis.hs:39:11-13 })
+ (HsLit
+ (EpAnn
+ (Anchor
+ { DumpSemis.hs:39:11-13 }
+ (UnchangedAnchor))
+ (NoEpAnns)
+ (EpaComments
+ []))
+ (HsChar
+ (SourceText 'a')
+ ('a'))))))]
+ (EmptyLocalBinds
+ (NoExtField)))))
+ ,(L
+ (SrcSpanAnn (EpAnn
+ (Anchor
+ { DumpSemis.hs:40:6-13 }
+ (UnchangedAnchor))
+ (AnnListItem
+ [(AddSemiAnn
+ (EpaSpan { DumpSemis.hs:41:4 }))])
+ (EpaComments
+ [])) { DumpSemis.hs:40:6-13 })
+ (Match
+ (EpAnn
+ (Anchor
+ { DumpSemis.hs:40:6 }
+ (UnchangedAnchor))
+ []
+ (EpaComments
+ []))
+ (CaseAlt)
+ [(L
+ (SrcSpanAnn (EpAnnNotUsed) { DumpSemis.hs:40:6 })
+ (NPat
+ (EpAnnNotUsed)
+ (L
+ { DumpSemis.hs:40:6 }
+ (OverLit
+ (NoExtField)
+ (HsIntegral
+ (IL
+ (SourceText 1)
+ (False)
+ (1)))))
+ (Nothing)
+ (NoExtField)))]
+ (GRHSs
+ (EpaComments
+ [])
+ [(L
+ { DumpSemis.hs:40:8-13 }
+ (GRHS
+ (EpAnn
+ (Anchor
+ { DumpSemis.hs:40:8-9 }
+ (UnchangedAnchor))
+ (GrhsAnn
+ (Nothing)
+ (AddEpAnn AnnRarrow (EpaSpan { DumpSemis.hs:40:8-9 })))
+ (EpaComments
+ []))
+ []
+ (L
+ (SrcSpanAnn (EpAnnNotUsed) { DumpSemis.hs:40:11-13 })
+ (HsLit
+ (EpAnn
+ (Anchor
+ { DumpSemis.hs:40:11-13 }
+ (UnchangedAnchor))
+ (NoEpAnns)
+ (EpaComments
+ []))
+ (HsChar
+ (SourceText 'b')
+ ('b'))))))]
+ (EmptyLocalBinds
+ (NoExtField)))))
+ ,(L
+ (SrcSpanAnn (EpAnn
+ (Anchor
+ { DumpSemis.hs:41:6-13 }
+ (UnchangedAnchor))
+ (AnnListItem
+ [(AddSemiAnn
+ (EpaSpan { DumpSemis.hs:41:15 }))
+ ,(AddSemiAnn
+ (EpaSpan { DumpSemis.hs:42:4 }))])
+ (EpaComments
+ [])) { DumpSemis.hs:41:6-13 })
+ (Match
+ (EpAnn
+ (Anchor
+ { DumpSemis.hs:41:6 }
+ (UnchangedAnchor))
+ []
+ (EpaComments
+ []))
+ (CaseAlt)
+ [(L
+ (SrcSpanAnn (EpAnnNotUsed) { DumpSemis.hs:41:6 })
+ (NPat
+ (EpAnnNotUsed)
+ (L
+ { DumpSemis.hs:41:6 }
+ (OverLit
+ (NoExtField)
+ (HsIntegral
+ (IL
+ (SourceText 2)
+ (False)
+ (2)))))
+ (Nothing)
+ (NoExtField)))]
+ (GRHSs
+ (EpaComments
+ [])
+ [(L
+ { DumpSemis.hs:41:8-13 }
+ (GRHS
+ (EpAnn
+ (Anchor
+ { DumpSemis.hs:41:8-9 }
+ (UnchangedAnchor))
+ (GrhsAnn
+ (Nothing)
+ (AddEpAnn AnnRarrow (EpaSpan { DumpSemis.hs:41:8-9 })))
+ (EpaComments
+ []))
+ []
+ (L
+ (SrcSpanAnn (EpAnnNotUsed) { DumpSemis.hs:41:11-13 })
+ (HsLit
+ (EpAnn
+ (Anchor
+ { DumpSemis.hs:41:11-13 }
+ (UnchangedAnchor))
+ (NoEpAnns)
+ (EpaComments
+ []))
+ (HsChar
+ (SourceText 'c')
+ ('c'))))))]
+ (EmptyLocalBinds
+ (NoExtField)))))
+ ,(L
+ (SrcSpanAnn (EpAnn
+ (Anchor
+ { DumpSemis.hs:42:6-13 }
+ (UnchangedAnchor))
+ (AnnListItem
+ [(AddSemiAnn
+ (EpaSpan { DumpSemis.hs:43:11 }))
+ ,(AddSemiAnn
+ (EpaSpan { DumpSemis.hs:43:12 }))
+ ,(AddSemiAnn
+ (EpaSpan { DumpSemis.hs:43:13 }))])
+ (EpaComments
+ [])) { DumpSemis.hs:42:6-13 })
+ (Match
+ (EpAnn
+ (Anchor
+ { DumpSemis.hs:42:6 }
+ (UnchangedAnchor))
+ []
+ (EpaComments
+ []))
+ (CaseAlt)
+ [(L
+ (SrcSpanAnn (EpAnnNotUsed) { DumpSemis.hs:42:6 })
+ (NPat
+ (EpAnnNotUsed)
+ (L
+ { DumpSemis.hs:42:6 }
+ (OverLit
+ (NoExtField)
+ (HsIntegral
+ (IL
+ (SourceText 3)
+ (False)
+ (3)))))
+ (Nothing)
+ (NoExtField)))]
+ (GRHSs
+ (EpaComments
+ [])
+ [(L
+ { DumpSemis.hs:42:8-13 }
+ (GRHS
+ (EpAnn
+ (Anchor
+ { DumpSemis.hs:42:8-9 }
+ (UnchangedAnchor))
+ (GrhsAnn
+ (Nothing)
+ (AddEpAnn AnnRarrow (EpaSpan { DumpSemis.hs:42:8-9 })))
+ (EpaComments
+ []))
+ []
+ (L
+ (SrcSpanAnn (EpAnnNotUsed) { DumpSemis.hs:42:11-13 })
+ (HsLit
+ (EpAnn
+ (Anchor
+ { DumpSemis.hs:42:11-13 }
+ (UnchangedAnchor))
+ (NoEpAnns)
+ (EpaComments
+ []))
+ (HsChar
+ (SourceText 'd')
+ ('d'))))))]
+ (EmptyLocalBinds
+ (NoExtField)))))])
+ (FromSource))))))]
+ (EmptyLocalBinds
+ (NoExtField)))))])
+ (FromSource))
+ [])))]
+ (Nothing)
+ (Nothing))) \ No newline at end of file
diff --git a/testsuite/tests/parser/should_compile/T20452.stderr b/testsuite/tests/parser/should_compile/T20452.stderr
index 47a05d5770..d1a11145fa 100644
--- a/testsuite/tests/parser/should_compile/T20452.stderr
+++ b/testsuite/tests/parser/should_compile/T20452.stderr
@@ -155,9 +155,9 @@
{ T20452.hs:6:13-22 }
(UnchangedAnchor))
[(AddEpAnn AnnDcolon (EpaSpan { T20452.hs:6:17-18 }))
+ ,(AddEpAnn AnnOpenP (EpaSpan { T20452.hs:6:13 }))
,(AddEpAnn AnnOpenP (EpaSpan { T20452.hs:6:14 }))
,(AddEpAnn AnnCloseP (EpaSpan { T20452.hs:6:21 }))
- ,(AddEpAnn AnnOpenP (EpaSpan { T20452.hs:6:13 }))
,(AddEpAnn AnnCloseP (EpaSpan { T20452.hs:6:22 }))]
(EpaComments
[]))
@@ -436,9 +436,9 @@
{ T20452.hs:9:14-27 }
(UnchangedAnchor))
[(AddEpAnn AnnDcolon (EpaSpan { T20452.hs:9:20-21 }))
+ ,(AddEpAnn AnnOpenP (EpaSpan { T20452.hs:9:14 }))
,(AddEpAnn AnnOpenP (EpaSpan { T20452.hs:9:15 }))
,(AddEpAnn AnnCloseP (EpaSpan { T20452.hs:9:26 }))
- ,(AddEpAnn AnnOpenP (EpaSpan { T20452.hs:9:14 }))
,(AddEpAnn AnnCloseP (EpaSpan { T20452.hs:9:27 }))]
(EpaComments
[]))
@@ -470,9 +470,9 @@
{ T20452.hs:9:29-46 }
(UnchangedAnchor))
[(AddEpAnn AnnDcolon (EpaSpan { T20452.hs:9:36-37 }))
+ ,(AddEpAnn AnnOpenP (EpaSpan { T20452.hs:9:29 }))
,(AddEpAnn AnnOpenP (EpaSpan { T20452.hs:9:30 }))
,(AddEpAnn AnnCloseP (EpaSpan { T20452.hs:9:45 }))
- ,(AddEpAnn AnnOpenP (EpaSpan { T20452.hs:9:29 }))
,(AddEpAnn AnnCloseP (EpaSpan { T20452.hs:9:46 }))]
(EpaComments
[]))
@@ -504,9 +504,9 @@
{ T20452.hs:9:48-76 }
(UnchangedAnchor))
[(AddEpAnn AnnDcolon (EpaSpan { T20452.hs:9:54-55 }))
+ ,(AddEpAnn AnnOpenP (EpaSpan { T20452.hs:9:48 }))
,(AddEpAnn AnnOpenP (EpaSpan { T20452.hs:9:49 }))
,(AddEpAnn AnnCloseP (EpaSpan { T20452.hs:9:75 }))
- ,(AddEpAnn AnnOpenP (EpaSpan { T20452.hs:9:48 }))
,(AddEpAnn AnnCloseP (EpaSpan { T20452.hs:9:76 }))]
(EpaComments
[]))
diff --git a/testsuite/tests/parser/should_compile/all.T b/testsuite/tests/parser/should_compile/all.T
index d24321a103..5f81a651c3 100644
--- a/testsuite/tests/parser/should_compile/all.T
+++ b/testsuite/tests/parser/should_compile/all.T
@@ -179,3 +179,5 @@ test('T19521', normal, compile, [''])
test('T20186', normal, compile, [''])
test('T20452', normal, compile, [''])
+
+test('DumpSemis', normal, compile, ['-dsuppress-uniques -ddump-parsed-ast'])
diff --git a/utils/check-exact/Main.hs b/utils/check-exact/Main.hs
index 71af87b760..f1a9ed812d 100644
--- a/utils/check-exact/Main.hs
+++ b/utils/check-exact/Main.hs
@@ -72,7 +72,7 @@ _tt = testOneFile changers "/home/alanz/mysrc/git.haskell.org/worktree/exactprin
-- "../../testsuite/tests/ghc-api/exactprint/RmDecl1.hs" (Just rmDecl1)
-- "../../testsuite/tests/ghc-api/exactprint/RmDecl2.hs" (Just rmDecl2)
-- "../../testsuite/tests/ghc-api/exactprint/RmDecl3.hs" (Just rmDecl3)
- "../../testsuite/tests/ghc-api/exactprint/RmDecl4.hs" (Just rmDecl4)
+ -- "../../testsuite/tests/ghc-api/exactprint/RmDecl4.hs" (Just rmDecl4)
-- "../../testsuite/tests/ghc-api/exactprint/RmDecl5.hs" (Just rmDecl5)
-- "../../testsuite/tests/ghc-api/exactprint/RmDecl6.hs" (Just rmDecl6)
-- "../../testsuite/tests/ghc-api/exactprint/RmDecl7.hs" (Just rmDecl7)
@@ -199,6 +199,7 @@ _tt = testOneFile changers "/home/alanz/mysrc/git.haskell.org/worktree/exactprin
-- "../../testsuite/tests/printer/PprLinearArrow.hs" Nothing
-- "../../testsuite/tests/printer/PprSemis.hs" Nothing
-- "../../testsuite/tests/printer/PprEmptyMostly.hs" Nothing
+ "../../testsuite/tests/parser/should_compile/DumpSemis.hs" Nothing
-- cloneT does not need a test, function can be retired