summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlan Zimmerman <alan.zimm@gmail.com>2021-10-02 12:01:48 +0100
committerMarge Bot <ben+marge-bot@smart-cactus.org>2021-10-06 00:11:42 -0400
commit89e98bdf6e966f42b13a58dc4a5bbeb14d88ff15 (patch)
tree2b84cc834dac147a466c53b6e7b41298039dc966
parent435ff39871776f73c946353689ea4f0305cc4501 (diff)
downloadhaskell-89e98bdf6e966f42b13a58dc4a5bbeb14d88ff15.tar.gz
EPA: Remove duplicate AnnOpenP/AnnCloseP in DataDecl
The parens EPAs were added in the tyvars where they belong, but also at the top level of the declaration. Closes #20452
-rw-r--r--compiler/GHC/Parser/PostProcess.hs29
-rw-r--r--testsuite/tests/parser/should_compile/DumpParsedAst.stderr14
-rw-r--r--testsuite/tests/parser/should_compile/T20452.hs9
-rw-r--r--testsuite/tests/parser/should_compile/T20452.stderr592
-rw-r--r--testsuite/tests/parser/should_compile/all.T1
5 files changed, 618 insertions, 27 deletions
diff --git a/compiler/GHC/Parser/PostProcess.hs b/compiler/GHC/Parser/PostProcess.hs
index 55b3c0d8a9..198a14ec72 100644
--- a/compiler/GHC/Parser/PostProcess.hs
+++ b/compiler/GHC/Parser/PostProcess.hs
@@ -194,9 +194,9 @@ mkClassDecl loc' (L _ (mcxt, tycl_hdr)) fds where_cls layoutInfo annsIn
= do { let loc = noAnnSrcSpan loc'
; (binds, sigs, ats, at_defs, _, docs) <- cvBindsAndSigs where_cls
; (cls, tparams, fixity, ann) <- checkTyClHdr True tycl_hdr
- ; (tyvars,annst) <- checkTyVars (text "class") whereDots cls tparams
+ ; tyvars <- checkTyVars (text "class") whereDots cls tparams
; cs <- getCommentsFor (locA loc) -- Get any remaining comments
- ; let anns' = addAnns (EpAnn (spanAsAnchor $ locA loc) annsIn emptyComments) (ann++annst) cs
+ ; let anns' = addAnns (EpAnn (spanAsAnchor $ locA loc) annsIn emptyComments) ann cs
; return (L loc (ClassDecl { tcdCExt = (anns', NoAnnSortKey, layoutInfo)
, tcdCtxt = mcxt
, tcdLName = cls, tcdTyVars = tyvars
@@ -220,9 +220,9 @@ mkTyData loc' new_or_data cType (L _ (mcxt, tycl_hdr))
ksig data_cons (L _ maybe_deriv) annsIn
= do { let loc = noAnnSrcSpan loc'
; (tc, tparams, fixity, ann) <- checkTyClHdr False tycl_hdr
- ; (tyvars, anns) <- checkTyVars (ppr new_or_data) equalsDots tc tparams
+ ; tyvars <- checkTyVars (ppr new_or_data) equalsDots tc tparams
; cs <- getCommentsFor (locA loc) -- Get any remaining comments
- ; let anns' = addAnns (EpAnn (spanAsAnchor $ locA loc) annsIn emptyComments) (ann ++ anns) cs
+ ; let anns' = addAnns (EpAnn (spanAsAnchor $ locA loc) annsIn emptyComments) ann cs
; defn <- mkDataDefn new_or_data cType mcxt ksig data_cons maybe_deriv
; return (L loc (DataDecl { tcdDExt = anns',
tcdLName = tc, tcdTyVars = tyvars,
@@ -254,9 +254,9 @@ mkTySynonym :: SrcSpan
mkTySynonym loc lhs rhs annsIn
= do { (tc, tparams, fixity, ann) <- checkTyClHdr False lhs
; cs1 <- getCommentsFor loc -- Add any API Annotations to the top SrcSpan [temp]
- ; (tyvars, anns) <- checkTyVars (text "type") equalsDots tc tparams
+ ; tyvars <- checkTyVars (text "type") equalsDots tc tparams
; cs2 <- getCommentsFor loc -- Add any API Annotations to the top SrcSpan [temp]
- ; let anns' = addAnns (EpAnn (spanAsAnchor loc) annsIn emptyComments) (ann ++ anns) (cs1 Semi.<> cs2)
+ ; let anns' = addAnns (EpAnn (spanAsAnchor loc) annsIn emptyComments) ann (cs1 Semi.<> cs2)
; return (L (noAnnSrcSpan loc) (SynDecl
{ tcdSExt = anns'
, tcdLName = tc, tcdTyVars = tyvars
@@ -349,9 +349,9 @@ mkFamDecl :: SrcSpan
mkFamDecl loc info topLevel lhs ksig injAnn annsIn
= do { (tc, tparams, fixity, ann) <- checkTyClHdr False lhs
; cs1 <- getCommentsFor loc -- Add any API Annotations to the top SrcSpan [temp]
- ; (tyvars, anns) <- checkTyVars (ppr info) equals_or_where tc tparams
+ ; tyvars <- checkTyVars (ppr info) equals_or_where tc tparams
; cs2 <- getCommentsFor loc -- Add any API Annotations to the top SrcSpan [temp]
- ; let anns' = addAnns (EpAnn (spanAsAnchor loc) annsIn emptyComments) (ann++anns) (cs1 Semi.<> cs2)
+ ; let anns' = addAnns (EpAnn (spanAsAnchor loc) annsIn emptyComments) ann (cs1 Semi.<> cs2)
; return (L (noAnnSrcSpan loc) (FamDecl noExtField
(FamilyDecl
{ fdExt = anns'
@@ -843,13 +843,12 @@ eitherToP (Left err) = addFatalError err
eitherToP (Right thing) = return thing
checkTyVars :: SDoc -> SDoc -> LocatedN RdrName -> [LHsTypeArg GhcPs]
- -> P ( LHsQTyVars GhcPs -- the synthesized type variables
- , [AddEpAnn] ) -- action which adds annotations
+ -> P (LHsQTyVars GhcPs) -- the synthesized type variables
-- ^ Check whether the given list of type parameters are all type variables
-- (possibly with a kind signature).
checkTyVars pp_what equals_or_where tc tparms
- = do { (tvs, anns) <- fmap unzip $ mapM check tparms
- ; return (mkHsQTvs tvs, concat anns) }
+ = do { tvs <- mapM check tparms
+ ; return (mkHsQTvs tvs) }
where
check (HsTypeArg _ ki@(L loc _)) = addFatalError $ mkPlainErrorMsgEnvelope (locA loc) $
(PsErrUnexpectedTypeAppInDecl ki pp_what (unLoc tc))
@@ -858,12 +857,10 @@ checkTyVars pp_what equals_or_where tc tparms
(PsErrMalformedDecl pp_what (unLoc tc))
-- Keep around an action for adjusting the annotations of extra parens
chkParens :: [AddEpAnn] -> EpAnnComments -> LHsType GhcPs
- -> P (LHsTyVarBndr () GhcPs, [AddEpAnn])
+ -> 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 = do
- tv <- chk acc cs ty
- return (tv, reverse acc)
+ chkParens acc cs ty = chk acc cs ty
-- Check that the name space is correct!
chk :: [AddEpAnn] -> EpAnnComments -> LHsType GhcPs -> P (LHsTyVarBndr () GhcPs)
diff --git a/testsuite/tests/parser/should_compile/DumpParsedAst.stderr b/testsuite/tests/parser/should_compile/DumpParsedAst.stderr
index d68daf6738..d42a808c62 100644
--- a/testsuite/tests/parser/should_compile/DumpParsedAst.stderr
+++ b/testsuite/tests/parser/should_compile/DumpParsedAst.stderr
@@ -189,9 +189,7 @@
[(AddEpAnn AnnType (EpaSpan { DumpParsedAst.hs:10:1-4 }))
,(AddEpAnn AnnFamily (EpaSpan { DumpParsedAst.hs:10:6-11 }))
,(AddEpAnn AnnDcolon (EpaSpan { DumpParsedAst.hs:10:32-33 }))
- ,(AddEpAnn AnnWhere (EpaSpan { DumpParsedAst.hs:10:41-45 }))
- ,(AddEpAnn AnnCloseP (EpaSpan { DumpParsedAst.hs:10:30 }))
- ,(AddEpAnn AnnOpenP (EpaSpan { DumpParsedAst.hs:10:20 }))]
+ ,(AddEpAnn AnnWhere (EpaSpan { DumpParsedAst.hs:10:41-45 }))]
(EpaComments
[]))
(ClosedTypeFamily
@@ -468,9 +466,7 @@
{ DumpParsedAst.hs:15:1-29 }
(UnchangedAnchor))
[(AddEpAnn AnnData (EpaSpan { DumpParsedAst.hs:15:1-4 }))
- ,(AddEpAnn AnnEqual (EpaSpan { DumpParsedAst.hs:15:19 }))
- ,(AddEpAnn AnnCloseP (EpaSpan { DumpParsedAst.hs:15:17 }))
- ,(AddEpAnn AnnOpenP (EpaSpan { DumpParsedAst.hs:15:10 }))]
+ ,(AddEpAnn AnnEqual (EpaSpan { DumpParsedAst.hs:15:19 }))]
(EpaComments
[]))
(L
@@ -631,11 +627,7 @@
[(AddEpAnn AnnType (EpaSpan { DumpParsedAst.hs:17:1-4 }))
,(AddEpAnn AnnFamily (EpaSpan { DumpParsedAst.hs:17:6-11 }))
,(AddEpAnn AnnDcolon (EpaSpan { DumpParsedAst.hs:17:42-43 }))
- ,(AddEpAnn AnnWhere (EpaSpan { DumpParsedAst.hs:17:50-54 }))
- ,(AddEpAnn AnnCloseP (EpaSpan { DumpParsedAst.hs:17:23 }))
- ,(AddEpAnn AnnOpenP (EpaSpan { DumpParsedAst.hs:17:16 }))
- ,(AddEpAnn AnnCloseP (EpaSpan { DumpParsedAst.hs:17:40 }))
- ,(AddEpAnn AnnOpenP (EpaSpan { DumpParsedAst.hs:17:25 }))]
+ ,(AddEpAnn AnnWhere (EpaSpan { DumpParsedAst.hs:17:50-54 }))]
(EpaComments
[]))
(ClosedTypeFamily
diff --git a/testsuite/tests/parser/should_compile/T20452.hs b/testsuite/tests/parser/should_compile/T20452.hs
new file mode 100644
index 0000000000..54a7e83908
--- /dev/null
+++ b/testsuite/tests/parser/should_compile/T20452.hs
@@ -0,0 +1,9 @@
+{-# LANGUAGE DataKinds #-}
+{-# OPTIONS -ddump-parsed-ast #-}
+module T20452 where
+
+data Proxy1 (a :: k) = Proxy1
+data Proxy2 ((a :: k)) = Proxy2
+
+class Prods1 (lhs :: Int) (name :: String) (rhs :: [(String, String)]) where {}
+class Prods2 ((lhs :: Int)) ((name :: String)) ((rhs :: [(String, String)])) where {}
diff --git a/testsuite/tests/parser/should_compile/T20452.stderr b/testsuite/tests/parser/should_compile/T20452.stderr
new file mode 100644
index 0000000000..47a05d5770
--- /dev/null
+++ b/testsuite/tests/parser/should_compile/T20452.stderr
@@ -0,0 +1,592 @@
+
+==================== Parser AST ====================
+
+(L
+ { T20452.hs:1:1 }
+ (HsModule
+ (EpAnn
+ (Anchor
+ { T20452.hs:1:1 }
+ (UnchangedAnchor))
+ (AnnsModule
+ [(AddEpAnn AnnModule (EpaSpan { T20452.hs:3:1-6 }))
+ ,(AddEpAnn AnnWhere (EpaSpan { T20452.hs:3:15-19 }))]
+ (AnnList
+ (Nothing)
+ (Nothing)
+ (Nothing)
+ []
+ []))
+ (EpaCommentsBalanced
+ []
+ [(L
+ (Anchor
+ { T20452.hs:10:1 }
+ (UnchangedAnchor))
+ (EpaComment
+ (EpaEofComment)
+ { T20452.hs:10:1 }))]))
+ (VirtualBraces
+ (1))
+ (Just
+ (L
+ { T20452.hs:3:8-13 }
+ {ModuleName: T20452}))
+ (Nothing)
+ []
+ [(L
+ (SrcSpanAnn (EpAnn
+ (Anchor
+ { T20452.hs:5:1-31 }
+ (UnchangedAnchor))
+ (AnnListItem
+ [])
+ (EpaComments
+ [])) { T20452.hs:5:1-31 })
+ (TyClD
+ (NoExtField)
+ (DataDecl
+ (EpAnn
+ (Anchor
+ { T20452.hs:5:1-31 }
+ (UnchangedAnchor))
+ [(AddEpAnn AnnData (EpaSpan { T20452.hs:5:1-4 }))
+ ,(AddEpAnn AnnEqual (EpaSpan { T20452.hs:5:24 }))]
+ (EpaComments
+ []))
+ (L
+ (SrcSpanAnn (EpAnnNotUsed) { T20452.hs:5:6-11 })
+ (Unqual
+ {OccName: Proxy1}))
+ (HsQTvs
+ (NoExtField)
+ [(L
+ (SrcSpanAnn (EpAnnNotUsed) { T20452.hs:5:14-21 })
+ (KindedTyVar
+ (EpAnn
+ (Anchor
+ { T20452.hs:5:14-21 }
+ (UnchangedAnchor))
+ [(AddEpAnn AnnDcolon (EpaSpan { T20452.hs:5:17-18 }))
+ ,(AddEpAnn AnnOpenP (EpaSpan { T20452.hs:5:14 }))
+ ,(AddEpAnn AnnCloseP (EpaSpan { T20452.hs:5:21 }))]
+ (EpaComments
+ []))
+ (())
+ (L
+ (SrcSpanAnn (EpAnnNotUsed) { T20452.hs:5:15 })
+ (Unqual
+ {OccName: a}))
+ (L
+ (SrcSpanAnn (EpAnnNotUsed) { T20452.hs:5:20 })
+ (HsTyVar
+ (EpAnn
+ (Anchor
+ { T20452.hs:5:20 }
+ (UnchangedAnchor))
+ []
+ (EpaComments
+ []))
+ (NotPromoted)
+ (L
+ (SrcSpanAnn (EpAnnNotUsed) { T20452.hs:5:20 })
+ (Unqual
+ {OccName: k}))))))])
+ (Prefix)
+ (HsDataDefn
+ (NoExtField)
+ (DataType)
+ (Nothing)
+ (Nothing)
+ (Nothing)
+ [(L
+ (SrcSpanAnn (EpAnnNotUsed) { T20452.hs:5:26-31 })
+ (ConDeclH98
+ (EpAnn
+ (Anchor
+ { T20452.hs:5:26-31 }
+ (UnchangedAnchor))
+ []
+ (EpaComments
+ []))
+ (L
+ (SrcSpanAnn (EpAnnNotUsed) { T20452.hs:5:26-31 })
+ (Unqual
+ {OccName: Proxy1}))
+ (False)
+ []
+ (Nothing)
+ (PrefixCon
+ []
+ [])
+ (Nothing)))]
+ []))))
+ ,(L
+ (SrcSpanAnn (EpAnn
+ (Anchor
+ { T20452.hs:6:1-31 }
+ (UnchangedAnchor))
+ (AnnListItem
+ [])
+ (EpaComments
+ [])) { T20452.hs:6:1-31 })
+ (TyClD
+ (NoExtField)
+ (DataDecl
+ (EpAnn
+ (Anchor
+ { T20452.hs:6:1-31 }
+ (UnchangedAnchor))
+ [(AddEpAnn AnnData (EpaSpan { T20452.hs:6:1-4 }))
+ ,(AddEpAnn AnnEqual (EpaSpan { T20452.hs:6:24 }))]
+ (EpaComments
+ []))
+ (L
+ (SrcSpanAnn (EpAnnNotUsed) { T20452.hs:6:6-11 })
+ (Unqual
+ {OccName: Proxy2}))
+ (HsQTvs
+ (NoExtField)
+ [(L
+ (SrcSpanAnn (EpAnnNotUsed) { T20452.hs:6:13-22 })
+ (KindedTyVar
+ (EpAnn
+ (Anchor
+ { T20452.hs:6:13-22 }
+ (UnchangedAnchor))
+ [(AddEpAnn AnnDcolon (EpaSpan { T20452.hs:6:17-18 }))
+ ,(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
+ []))
+ (())
+ (L
+ (SrcSpanAnn (EpAnnNotUsed) { T20452.hs:6:15 })
+ (Unqual
+ {OccName: a}))
+ (L
+ (SrcSpanAnn (EpAnnNotUsed) { T20452.hs:6:20 })
+ (HsTyVar
+ (EpAnn
+ (Anchor
+ { T20452.hs:6:20 }
+ (UnchangedAnchor))
+ []
+ (EpaComments
+ []))
+ (NotPromoted)
+ (L
+ (SrcSpanAnn (EpAnnNotUsed) { T20452.hs:6:20 })
+ (Unqual
+ {OccName: k}))))))])
+ (Prefix)
+ (HsDataDefn
+ (NoExtField)
+ (DataType)
+ (Nothing)
+ (Nothing)
+ (Nothing)
+ [(L
+ (SrcSpanAnn (EpAnnNotUsed) { T20452.hs:6:26-31 })
+ (ConDeclH98
+ (EpAnn
+ (Anchor
+ { T20452.hs:6:26-31 }
+ (UnchangedAnchor))
+ []
+ (EpaComments
+ []))
+ (L
+ (SrcSpanAnn (EpAnnNotUsed) { T20452.hs:6:26-31 })
+ (Unqual
+ {OccName: Proxy2}))
+ (False)
+ []
+ (Nothing)
+ (PrefixCon
+ []
+ [])
+ (Nothing)))]
+ []))))
+ ,(L
+ (SrcSpanAnn (EpAnn
+ (Anchor
+ { T20452.hs:8:1-85 }
+ (UnchangedAnchor))
+ (AnnListItem
+ [])
+ (EpaComments
+ [])) { T20452.hs:8:1-85 })
+ (TyClD
+ (NoExtField)
+ (ClassDecl
+ ((,,)
+ (EpAnn
+ (Anchor
+ { T20452.hs:8:1-85 }
+ (UnchangedAnchor))
+ [(AddEpAnn AnnClass (EpaSpan { T20452.hs:8:1-5 }))
+ ,(AddEpAnn AnnWhere (EpaSpan { T20452.hs:8:78-82 }))
+ ,(AddEpAnn AnnOpenC (EpaSpan { T20452.hs:8:84 }))
+ ,(AddEpAnn AnnCloseC (EpaSpan { T20452.hs:8:85 }))]
+ (EpaComments
+ []))
+ (NoAnnSortKey)
+ (ExplicitBraces))
+ (Nothing)
+ (L
+ (SrcSpanAnn (EpAnnNotUsed) { T20452.hs:8:7-12 })
+ (Unqual
+ {OccName: Prods1}))
+ (HsQTvs
+ (NoExtField)
+ [(L
+ (SrcSpanAnn (EpAnnNotUsed) { T20452.hs:8:15-26 })
+ (KindedTyVar
+ (EpAnn
+ (Anchor
+ { T20452.hs:8:15-26 }
+ (UnchangedAnchor))
+ [(AddEpAnn AnnDcolon (EpaSpan { T20452.hs:8:20-21 }))
+ ,(AddEpAnn AnnOpenP (EpaSpan { T20452.hs:8:15 }))
+ ,(AddEpAnn AnnCloseP (EpaSpan { T20452.hs:8:26 }))]
+ (EpaComments
+ []))
+ (())
+ (L
+ (SrcSpanAnn (EpAnnNotUsed) { T20452.hs:8:16-18 })
+ (Unqual
+ {OccName: lhs}))
+ (L
+ (SrcSpanAnn (EpAnnNotUsed) { T20452.hs:8:23-25 })
+ (HsTyVar
+ (EpAnn
+ (Anchor
+ { T20452.hs:8:23-25 }
+ (UnchangedAnchor))
+ []
+ (EpaComments
+ []))
+ (NotPromoted)
+ (L
+ (SrcSpanAnn (EpAnnNotUsed) { T20452.hs:8:23-25 })
+ (Unqual
+ {OccName: Int}))))))
+ ,(L
+ (SrcSpanAnn (EpAnnNotUsed) { T20452.hs:8:30-45 })
+ (KindedTyVar
+ (EpAnn
+ (Anchor
+ { T20452.hs:8:30-45 }
+ (UnchangedAnchor))
+ [(AddEpAnn AnnDcolon (EpaSpan { T20452.hs:8:36-37 }))
+ ,(AddEpAnn AnnOpenP (EpaSpan { T20452.hs:8:30 }))
+ ,(AddEpAnn AnnCloseP (EpaSpan { T20452.hs:8:45 }))]
+ (EpaComments
+ []))
+ (())
+ (L
+ (SrcSpanAnn (EpAnnNotUsed) { T20452.hs:8:31-34 })
+ (Unqual
+ {OccName: name}))
+ (L
+ (SrcSpanAnn (EpAnnNotUsed) { T20452.hs:8:39-44 })
+ (HsTyVar
+ (EpAnn
+ (Anchor
+ { T20452.hs:8:39-44 }
+ (UnchangedAnchor))
+ []
+ (EpaComments
+ []))
+ (NotPromoted)
+ (L
+ (SrcSpanAnn (EpAnnNotUsed) { T20452.hs:8:39-44 })
+ (Unqual
+ {OccName: String}))))))
+ ,(L
+ (SrcSpanAnn (EpAnnNotUsed) { T20452.hs:8:49-75 })
+ (KindedTyVar
+ (EpAnn
+ (Anchor
+ { T20452.hs:8:49-75 }
+ (UnchangedAnchor))
+ [(AddEpAnn AnnDcolon (EpaSpan { T20452.hs:8:54-55 }))
+ ,(AddEpAnn AnnOpenP (EpaSpan { T20452.hs:8:49 }))
+ ,(AddEpAnn AnnCloseP (EpaSpan { T20452.hs:8:75 }))]
+ (EpaComments
+ []))
+ (())
+ (L
+ (SrcSpanAnn (EpAnnNotUsed) { T20452.hs:8:50-52 })
+ (Unqual
+ {OccName: rhs}))
+ (L
+ (SrcSpanAnn (EpAnnNotUsed) { T20452.hs:8:57-74 })
+ (HsListTy
+ (EpAnn
+ (Anchor
+ { T20452.hs:8:57 }
+ (UnchangedAnchor))
+ (AnnParen
+ (AnnParensSquare)
+ (EpaSpan { T20452.hs:8:57 })
+ (EpaSpan { T20452.hs:8:74 }))
+ (EpaComments
+ []))
+ (L
+ (SrcSpanAnn (EpAnnNotUsed) { T20452.hs:8:58-73 })
+ (HsTupleTy
+ (EpAnn
+ (Anchor
+ { T20452.hs:8:58 }
+ (UnchangedAnchor))
+ (AnnParen
+ (AnnParens)
+ (EpaSpan { T20452.hs:8:58 })
+ (EpaSpan { T20452.hs:8:73 }))
+ (EpaComments
+ []))
+ (HsBoxedOrConstraintTuple)
+ [(L
+ (SrcSpanAnn (EpAnn
+ (Anchor
+ { T20452.hs:8:59-64 }
+ (UnchangedAnchor))
+ (AnnListItem
+ [(AddCommaAnn
+ (EpaSpan { T20452.hs:8:65 }))])
+ (EpaComments
+ [])) { T20452.hs:8:59-64 })
+ (HsTyVar
+ (EpAnn
+ (Anchor
+ { T20452.hs:8:59-64 }
+ (UnchangedAnchor))
+ []
+ (EpaComments
+ []))
+ (NotPromoted)
+ (L
+ (SrcSpanAnn (EpAnnNotUsed) { T20452.hs:8:59-64 })
+ (Unqual
+ {OccName: String}))))
+ ,(L
+ (SrcSpanAnn (EpAnnNotUsed) { T20452.hs:8:67-72 })
+ (HsTyVar
+ (EpAnn
+ (Anchor
+ { T20452.hs:8:67-72 }
+ (UnchangedAnchor))
+ []
+ (EpaComments
+ []))
+ (NotPromoted)
+ (L
+ (SrcSpanAnn (EpAnnNotUsed) { T20452.hs:8:67-72 })
+ (Unqual
+ {OccName: String}))))]))))))])
+ (Prefix)
+ []
+ []
+ {Bag(LocatedA (HsBind GhcPs)):
+ []}
+ []
+ []
+ [])))
+ ,(L
+ (SrcSpanAnn (EpAnn
+ (Anchor
+ { T20452.hs:9:1-85 }
+ (UnchangedAnchor))
+ (AnnListItem
+ [])
+ (EpaComments
+ [])) { T20452.hs:9:1-85 })
+ (TyClD
+ (NoExtField)
+ (ClassDecl
+ ((,,)
+ (EpAnn
+ (Anchor
+ { T20452.hs:9:1-85 }
+ (UnchangedAnchor))
+ [(AddEpAnn AnnClass (EpaSpan { T20452.hs:9:1-5 }))
+ ,(AddEpAnn AnnWhere (EpaSpan { T20452.hs:9:78-82 }))
+ ,(AddEpAnn AnnOpenC (EpaSpan { T20452.hs:9:84 }))
+ ,(AddEpAnn AnnCloseC (EpaSpan { T20452.hs:9:85 }))]
+ (EpaComments
+ []))
+ (NoAnnSortKey)
+ (ExplicitBraces))
+ (Nothing)
+ (L
+ (SrcSpanAnn (EpAnnNotUsed) { T20452.hs:9:7-12 })
+ (Unqual
+ {OccName: Prods2}))
+ (HsQTvs
+ (NoExtField)
+ [(L
+ (SrcSpanAnn (EpAnnNotUsed) { T20452.hs:9:14-27 })
+ (KindedTyVar
+ (EpAnn
+ (Anchor
+ { T20452.hs:9:14-27 }
+ (UnchangedAnchor))
+ [(AddEpAnn AnnDcolon (EpaSpan { T20452.hs:9:20-21 }))
+ ,(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
+ []))
+ (())
+ (L
+ (SrcSpanAnn (EpAnnNotUsed) { T20452.hs:9:16-18 })
+ (Unqual
+ {OccName: lhs}))
+ (L
+ (SrcSpanAnn (EpAnnNotUsed) { T20452.hs:9:23-25 })
+ (HsTyVar
+ (EpAnn
+ (Anchor
+ { T20452.hs:9:23-25 }
+ (UnchangedAnchor))
+ []
+ (EpaComments
+ []))
+ (NotPromoted)
+ (L
+ (SrcSpanAnn (EpAnnNotUsed) { T20452.hs:9:23-25 })
+ (Unqual
+ {OccName: Int}))))))
+ ,(L
+ (SrcSpanAnn (EpAnnNotUsed) { T20452.hs:9:29-46 })
+ (KindedTyVar
+ (EpAnn
+ (Anchor
+ { T20452.hs:9:29-46 }
+ (UnchangedAnchor))
+ [(AddEpAnn AnnDcolon (EpaSpan { T20452.hs:9:36-37 }))
+ ,(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
+ []))
+ (())
+ (L
+ (SrcSpanAnn (EpAnnNotUsed) { T20452.hs:9:31-34 })
+ (Unqual
+ {OccName: name}))
+ (L
+ (SrcSpanAnn (EpAnnNotUsed) { T20452.hs:9:39-44 })
+ (HsTyVar
+ (EpAnn
+ (Anchor
+ { T20452.hs:9:39-44 }
+ (UnchangedAnchor))
+ []
+ (EpaComments
+ []))
+ (NotPromoted)
+ (L
+ (SrcSpanAnn (EpAnnNotUsed) { T20452.hs:9:39-44 })
+ (Unqual
+ {OccName: String}))))))
+ ,(L
+ (SrcSpanAnn (EpAnnNotUsed) { T20452.hs:9:48-76 })
+ (KindedTyVar
+ (EpAnn
+ (Anchor
+ { T20452.hs:9:48-76 }
+ (UnchangedAnchor))
+ [(AddEpAnn AnnDcolon (EpaSpan { T20452.hs:9:54-55 }))
+ ,(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
+ []))
+ (())
+ (L
+ (SrcSpanAnn (EpAnnNotUsed) { T20452.hs:9:50-52 })
+ (Unqual
+ {OccName: rhs}))
+ (L
+ (SrcSpanAnn (EpAnnNotUsed) { T20452.hs:9:57-74 })
+ (HsListTy
+ (EpAnn
+ (Anchor
+ { T20452.hs:9:57 }
+ (UnchangedAnchor))
+ (AnnParen
+ (AnnParensSquare)
+ (EpaSpan { T20452.hs:9:57 })
+ (EpaSpan { T20452.hs:9:74 }))
+ (EpaComments
+ []))
+ (L
+ (SrcSpanAnn (EpAnnNotUsed) { T20452.hs:9:58-73 })
+ (HsTupleTy
+ (EpAnn
+ (Anchor
+ { T20452.hs:9:58 }
+ (UnchangedAnchor))
+ (AnnParen
+ (AnnParens)
+ (EpaSpan { T20452.hs:9:58 })
+ (EpaSpan { T20452.hs:9:73 }))
+ (EpaComments
+ []))
+ (HsBoxedOrConstraintTuple)
+ [(L
+ (SrcSpanAnn (EpAnn
+ (Anchor
+ { T20452.hs:9:59-64 }
+ (UnchangedAnchor))
+ (AnnListItem
+ [(AddCommaAnn
+ (EpaSpan { T20452.hs:9:65 }))])
+ (EpaComments
+ [])) { T20452.hs:9:59-64 })
+ (HsTyVar
+ (EpAnn
+ (Anchor
+ { T20452.hs:9:59-64 }
+ (UnchangedAnchor))
+ []
+ (EpaComments
+ []))
+ (NotPromoted)
+ (L
+ (SrcSpanAnn (EpAnnNotUsed) { T20452.hs:9:59-64 })
+ (Unqual
+ {OccName: String}))))
+ ,(L
+ (SrcSpanAnn (EpAnnNotUsed) { T20452.hs:9:67-72 })
+ (HsTyVar
+ (EpAnn
+ (Anchor
+ { T20452.hs:9:67-72 }
+ (UnchangedAnchor))
+ []
+ (EpaComments
+ []))
+ (NotPromoted)
+ (L
+ (SrcSpanAnn (EpAnnNotUsed) { T20452.hs:9:67-72 })
+ (Unqual
+ {OccName: String}))))]))))))])
+ (Prefix)
+ []
+ []
+ {Bag(LocatedA (HsBind GhcPs)):
+ []}
+ []
+ []
+ [])))]
+ (Nothing)
+ (Nothing)))
diff --git a/testsuite/tests/parser/should_compile/all.T b/testsuite/tests/parser/should_compile/all.T
index e2d4303b7e..d24321a103 100644
--- a/testsuite/tests/parser/should_compile/all.T
+++ b/testsuite/tests/parser/should_compile/all.T
@@ -178,3 +178,4 @@ test('T19082', normal, compile, [''])
test('T19521', normal, compile, [''])
test('T20186', normal, compile, [''])
+test('T20452', normal, compile, [''])