From 5b51b2a24cbe69070a2f34efd93de55d807b836b Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Mario=20Bla=C5=BEevi=C4=87?= <blamario@protonmail.com>
Date: Thu, 26 Oct 2023 09:28:33 -0400
Subject: [PATCH] Fix and test for issue #24111, TH.Ppr output of pattern
 synonyms

---
 .../template-haskell/Language/Haskell/TH/Ppr.hs      |  9 +++++----
 testsuite/tests/th/T24111.hs                         | 12 ++++++++++++
 testsuite/tests/th/T24111.stdout                     |  7 +++++++
 testsuite/tests/th/all.T                             |  1 +
 4 files changed, 25 insertions(+), 4 deletions(-)
 create mode 100644 testsuite/tests/th/T24111.hs
 create mode 100644 testsuite/tests/th/T24111.stdout

diff --git a/libraries/template-haskell/Language/Haskell/TH/Ppr.hs b/libraries/template-haskell/Language/Haskell/TH/Ppr.hs
index a654cb384303..65be9831770d 100644
--- a/libraries/template-haskell/Language/Haskell/TH/Ppr.hs
+++ b/libraries/template-haskell/Language/Haskell/TH/Ppr.hs
@@ -14,7 +14,7 @@ import Language.Haskell.TH.Syntax
 import Data.Word ( Word8 )
 import Data.Char ( toLower, chr)
 import GHC.Show  ( showMultiLineString )
-import GHC.Lexeme( startsVarSym )
+import GHC.Lexeme( isVarSymChar )
 import Data.Ratio ( numerator, denominator )
 import Data.Foldable ( toList )
 import Prelude hiding ((<>))
@@ -122,8 +122,8 @@ isSymOcc :: Name -> Bool
 isSymOcc n
   = case nameBase n of
       []    -> True  -- Empty name; weird
-      (c:_) -> startsVarSym c
-                   -- c.f. OccName.startsVarSym in GHC itself
+      (c:_) -> isVarSymChar c
+                   -- c.f. isVarSymChar in GHC itself
 
 pprInfixExp :: Exp -> Doc
 pprInfixExp (VarE v) = pprName' Infix v
@@ -471,7 +471,8 @@ ppr_dec _ (PatSynD name args dir pat)
     pprNameArgs | InfixPatSyn a1 a2 <- args = ppr a1 <+> pprName' Infix name <+> ppr a2
                 | otherwise                 = pprName' Applied name <+> ppr args
     pprPatRHS   | ExplBidir cls <- dir = hang (ppr pat <+> text "where")
-                                           nestDepth (pprName' Applied name <+> ppr cls)
+                                              nestDepth
+                                              (vcat $ (pprName' Applied name <+>) . ppr <$> cls)
                 | otherwise            = ppr pat
 ppr_dec _ (PatSynSigD name ty)
   = pprPatSynSig name ty
diff --git a/testsuite/tests/th/T24111.hs b/testsuite/tests/th/T24111.hs
new file mode 100644
index 000000000000..8296f28992e6
--- /dev/null
+++ b/testsuite/tests/th/T24111.hs
@@ -0,0 +1,12 @@
+{-# LANGUAGE Haskell2010, PatternSynonyms, TemplateHaskell, ViewPatterns #-}
+
+import Language.Haskell.TH (runQ)
+import Language.Haskell.TH.Ppr (pprint)
+
+main = do
+  runQ [d|pattern (:+) :: Int -> Int -> (Int, Int);
+          pattern x :+ y = (x, y)|] >>= putStrLn . pprint
+  runQ [d|pattern A :: Int -> String;
+          pattern A n <- (read -> n) where {
+            A 0 = "hi";
+            A 1 = "bye"}|] >>= putStrLn . pprint
diff --git a/testsuite/tests/th/T24111.stdout b/testsuite/tests/th/T24111.stdout
new file mode 100644
index 000000000000..1a30bb8fd790
--- /dev/null
+++ b/testsuite/tests/th/T24111.stdout
@@ -0,0 +1,7 @@
+pattern (:+_0) :: GHC.Types.Int ->
+                  GHC.Types.Int -> (GHC.Types.Int, GHC.Types.Int)
+pattern x_1 :+_0 y_2 = (x_1, y_2)
+pattern A_0 :: GHC.Types.Int -> GHC.Base.String
+pattern A_0 n_1 <- (Text.Read.read -> n_1) where
+                       A_0 0 = "hi"
+                       A_0 1 = "bye"
diff --git a/testsuite/tests/th/all.T b/testsuite/tests/th/all.T
index cdcdd479798e..7f016b50d4aa 100644
--- a/testsuite/tests/th/all.T
+++ b/testsuite/tests/th/all.T
@@ -597,3 +597,4 @@ test('T23962', normal, compile_and_run, [''])
 test('T23968', normal, compile_and_run, [''])
 test('T23971', normal, compile_and_run, [''])
 test('T23986', normal, compile_and_run, [''])
+test('T24111', normal, compile_and_run, [''])
-- 
GitLab