[Git][ghc/ghc][master] Rename () into Unit, (,,...,,) into Tuple<n> (#21294)
Marge Bot (@marge-bot)
gitlab at gitlab.haskell.org
Tue Mar 21 15:17:46 UTC 2023
Marge Bot pushed to branch master at Glasgow Haskell Compiler / GHC
Commits:
a13affce by Andrei Borzenkov at 2023-03-21T11:17:17-04:00
Rename () into Unit, (,,...,,) into Tuple<n> (#21294)
This patch implements a part of GHC Proposal #475.
The key change is in GHC.Tuple.Prim:
- data () = ()
- data (a,b) = (a,b)
- data (a,b,c) = (a,b,c)
...
+ data Unit = ()
+ data Tuple2 a b = (a,b)
+ data Tuple3 a b c = (a,b,c)
...
And the rest of the patch makes sure that Unit and Tuple<n>
are pretty-printed as () and (,,...,,) in various contexts.
Updates the haddock submodule.
Co-authored-by: Vladislav Zavialov <vlad.z.4096 at gmail.com>
- - - - -
26 changed files:
- compiler/GHC/Builtin/Names.hs
- compiler/GHC/Builtin/Types.hs
- compiler/GHC/Builtin/Uniques.hs
- compiler/GHC/Types/Name.hs
- compiler/GHC/Types/Name/Cache.hs
- compiler/GHC/Types/Name/Ppr.hs
- libraries/base/Data/Typeable/Internal.hs
- libraries/ghc-prim/GHC/Tuple.hs
- libraries/ghc-prim/GHC/Tuple/Prim.hs
- testsuite/tests/ghc-api/T18522-dbg-ppr.stdout
- testsuite/tests/ghci/scripts/T12550.stdout
- testsuite/tests/ghci/scripts/T4127.stdout
- testsuite/tests/ghci/scripts/T4175.stdout
- testsuite/tests/ghci/scripts/T7627.stdout
- testsuite/tests/ghci/scripts/ghci011.stdout
- testsuite/tests/hiefile/should_run/HieQueries.stdout
- + testsuite/tests/module/TupleTyConUserSyntax.hs
- + testsuite/tests/module/TupleTyConUserSyntaxA.hs
- testsuite/tests/module/all.T
- testsuite/tests/partial-sigs/should_fail/NamedWildcardsNotInMonotype.stderr
- testsuite/tests/roles/should_compile/T8958.stderr
- testsuite/tests/stranal/sigs/T21119.stderr
- testsuite/tests/stranal/sigs/T21888.stderr
- testsuite/tests/th/T12478_4.stderr
- testsuite/tests/typecheck/should_compile/T18529.stderr
- utils/haddock
Changes:
=====================================
compiler/GHC/Builtin/Names.hs
=====================================
@@ -2796,6 +2796,7 @@ Situations in which we apply this special logic:
pretendNameIsInScope :: Name -> Bool
pretendNameIsInScope n
= isBuiltInSyntax n
+ || isTupleTyConName n
|| any (n `hasKey`)
[ liftedTypeKindTyConKey, unliftedTypeKindTyConKey
, liftedDataConKey, unliftedDataConKey
=====================================
compiler/GHC/Builtin/Types.hs
=====================================
@@ -18,7 +18,7 @@ module GHC.Builtin.Types (
mkWiredInIdName, -- used in GHC.Types.Id.Make
-- * All wired in things
- wiredInTyCons, isBuiltInOcc_maybe, isPunOcc_maybe,
+ wiredInTyCons, isBuiltInOcc_maybe, isTupleTyOcc_maybe, isPunOcc_maybe,
-- * Bool
boolTy, boolTyCon, boolTyCon_RDR, boolTyConName,
@@ -209,6 +209,10 @@ import qualified Data.ByteString.Char8 as BS
import Data.Foldable
import Data.List ( elemIndex, intersperse )
+import Numeric ( showInt )
+
+import Text.Read (readMaybe)
+import Data.Char (ord, isDigit)
alpha_tyvar :: [TyVar]
alpha_tyvar = [alphaTyVar]
@@ -734,16 +738,16 @@ Basically it keeps everything uniform.
However the /naming/ of the type/data constructors for one-tuples is a
bit odd:
- 3-tuples: (,,) (,,)#
- 2-tuples: (,) (,)#
+ 3-tuples: Tuple3 (,,)#
+ 2-tuples: Tuple2 (,)#
1-tuples: ??
- 0-tuples: () ()#
+ 0-tuples: Unit ()#
Zero-tuples have used up the logical name. So we use 'Solo' and 'Solo#'
for one-tuples. So in ghc-prim:GHC.Tuple we see the declarations:
- data () = ()
+ data Unit = ()
data Solo a = MkSolo a
- data (a,b) = (a,b)
+ data Tuple2 a b = (a,b)
There is no way to write a boxed one-tuple in Haskell using tuple syntax.
They can, however, be written using other methods:
@@ -852,13 +856,54 @@ isBuiltInOcc_maybe occ =
choose_ns tc dc
| isTcClsNameSpace ns = tc
| isDataConNameSpace ns = dc
- | otherwise = pprPanic "tup_name" (ppr occ)
+ | otherwise = pprPanic "tup_name" (ppr occ <+> parens (pprNameSpace ns))
where ns = occNameSpace occ
tup_name boxity arity
= choose_ns (getName (tupleTyCon boxity arity))
(getName (tupleDataCon boxity arity))
+isTupleTyOcc_maybe :: Module -> OccName -> Maybe Name
+isTupleTyOcc_maybe mod occ
+ | mod == gHC_TUPLE_PRIM
+ = match_occ
+ where
+ match_occ
+ | occ == occName unitTyConName = Just unitTyConName
+ | occ == occName soloTyConName = Just soloTyConName
+ | otherwise = isTupleNTyOcc_maybe occ
+isTupleTyOcc_maybe _ _ = Nothing
+
+
+-- | This is only for Tuple<n>, not for Unit or Solo
+isTupleNTyOcc_maybe :: OccName -> Maybe Name
+isTupleNTyOcc_maybe occ =
+ case occNameString occ of
+ 'T':'u':'p':'l':'e':str | Just n <- readInt str, n > 1
+ -> Just (tupleTyConName BoxedTuple n)
+ _ -> Nothing
+
+-- | See Note [Small Ints parsing]
+readInt :: String -> Maybe Int
+readInt s = case s of
+ [c] | isDigit c -> Just (digit_to_int c)
+ [c1, c2] | isDigit c1, isDigit c2
+ -> Just (digit_to_int c1 * 10 + digit_to_int c2)
+ _ -> readMaybe s
+ where
+ digit_to_int :: Char -> Int
+ digit_to_int c = ord c - ord '0'
+
+{-
+Note [Small Ints parsing]
+~~~~~~~~~~~~~~~~~~~~~~~~~
+Currently, tuples in Haskell have a maximum arity of 64.
+To parse strings of length 1 and 2 more efficiently, we
+can utilize an ad-hoc solution that matches their characters.
+This results in a speedup of up to 40 times compared to using
+`readMaybe @Int` on my machine.
+-}
+
-- When resolving names produced by Template Haskell (see thOrigRdrName
-- in GHC.ThToHs), we want ghc-prim:GHC.Types.List to yield an Exact name, not
-- an Orig name.
@@ -872,6 +917,10 @@ isPunOcc_maybe :: Module -> OccName -> Maybe Name
isPunOcc_maybe mod occ
| mod == gHC_TYPES, occ == occName listTyConName
= Just listTyConName
+ | mod == gHC_TUPLE_PRIM, occ == occName unitTyConName
+ = Just unitTyConName
+ | mod == gHC_TUPLE_PRIM
+ = isTupleNTyOcc_maybe occ
isPunOcc_maybe _ _ = Nothing
mkTupleOcc :: NameSpace -> Boxity -> Arity -> OccName
@@ -887,10 +936,15 @@ mkTupleStr Boxed = mkBoxedTupleStr
mkTupleStr Unboxed = const mkUnboxedTupleStr
mkBoxedTupleStr :: NameSpace -> Arity -> String
-mkBoxedTupleStr _ 0 = "()"
-mkBoxedTupleStr ns 1 | isDataConNameSpace ns = "MkSolo" -- See Note [One-tuples]
-mkBoxedTupleStr _ 1 = "Solo" -- See Note [One-tuples]
-mkBoxedTupleStr _ ar = '(' : commas ar ++ ")"
+mkBoxedTupleStr ns 0
+ | isDataConNameSpace ns = "()"
+ | otherwise = "Unit"
+mkBoxedTupleStr ns 1
+ | isDataConNameSpace ns = "MkSolo" -- See Note [One-tuples]
+ | otherwise = "Solo"
+mkBoxedTupleStr ns ar
+ | isDataConNameSpace ns = '(' : commas ar ++ ")"
+ | otherwise = "Tuple" ++ showInt ar ""
mkUnboxedTupleStr :: Arity -> String
mkUnboxedTupleStr 0 = "(##)"
@@ -1052,7 +1106,7 @@ mk_tuple Boxed arity = (tycon, tuple_con)
boxity = Boxed
modu = gHC_TUPLE_PRIM
tc_name = mkWiredInName modu (mkTupleOcc tcName boxity arity) tc_uniq
- (ATyCon tycon) BuiltInSyntax
+ (ATyCon tycon) UserSyntax
dc_name = mkWiredInName modu (mkTupleOcc dataName boxity arity) dc_uniq
(AConLike (RealDataCon tuple_con)) BuiltInSyntax
tc_uniq = mkTupleTyConUnique boxity arity
@@ -1126,6 +1180,9 @@ mk_ctuple arity = (tycon, tuple_con, sc_sel_ids_arr)
unitTyCon :: TyCon
unitTyCon = tupleTyCon Boxed 0
+unitTyConName :: Name
+unitTyConName = tyConName unitTyCon
+
unitTyConKey :: Unique
unitTyConKey = getUnique unitTyCon
@@ -1138,6 +1195,9 @@ unitDataConId = dataConWorkId unitDataCon
soloTyCon :: TyCon
soloTyCon = tupleTyCon Boxed 1
+soloTyConName :: Name
+soloTyConName = tyConName soloTyCon
+
pairTyCon :: TyCon
pairTyCon = tupleTyCon Boxed 2
=====================================
compiler/GHC/Builtin/Uniques.hs
=====================================
@@ -19,6 +19,7 @@ module GHC.Builtin.Uniques
-- *** Vanilla
, mkTupleTyConUnique
, mkTupleDataConUnique
+ , isTupleTyConUnique
-- *** Constraint
, mkCTupleTyConUnique
, mkCTupleDataConUnique
@@ -266,6 +267,17 @@ mkTupleTyConUnique :: Boxity -> Arity -> Unique
mkTupleTyConUnique Boxed a = mkUnique '4' (2*a)
mkTupleTyConUnique Unboxed a = mkUnique '5' (2*a)
+-- | This function is an inverse of `mkTupleTyConUnique`
+isTupleTyConUnique :: Unique -> Maybe (Boxity, Arity)
+isTupleTyConUnique u =
+ case (tag, i) of
+ ('4', 0) -> Just (Boxed, arity)
+ ('5', 0) -> Just (Unboxed, arity)
+ _ -> Nothing
+ where
+ (tag, n) = unpkUnique u
+ (arity, i) = quotRem n 2
+
getTupleTyConName :: Boxity -> Int -> Name
getTupleTyConName boxity n =
case n `divMod` 2 of
=====================================
compiler/GHC/Types/Name.hs
=====================================
@@ -64,7 +64,7 @@ module GHC.Types.Name (
isSystemName, isInternalName, isExternalName,
isTyVarName, isTyConName, isDataConName,
isValName, isVarName, isDynLinkName,
- isWiredInName, isWiredIn, isBuiltInSyntax,
+ isWiredInName, isWiredIn, isBuiltInSyntax, isTupleTyConName,
isHoleName,
wiredInNameTyThing_maybe,
nameIsLocalOrFrom, nameIsExternalOrFrom, nameIsHomePackage,
@@ -103,6 +103,8 @@ import GHC.Utils.Panic
import Control.DeepSeq
import Data.Data
import qualified Data.Semigroup as S
+import GHC.Types.Basic (Boxity(Boxed))
+import GHC.Builtin.Uniques (isTupleTyConUnique)
{-
************************************************************************
@@ -282,6 +284,9 @@ isBuiltInSyntax :: Name -> Bool
isBuiltInSyntax (Name {n_sort = WiredIn _ _ BuiltInSyntax}) = True
isBuiltInSyntax _ = False
+isTupleTyConName :: Name -> Bool
+isTupleTyConName = isJust . isTupleTyConUnique . getUnique
+
isExternalName (Name {n_sort = External _}) = True
isExternalName (Name {n_sort = WiredIn _ _ _}) = True
isExternalName _ = False
@@ -339,7 +344,14 @@ is_interactive_or_from from mod = from == mod || isInteractiveModule mod
-- Return the pun for a name if available.
-- Used for pretty-printing under ListTuplePuns.
namePun_maybe :: Name -> Maybe FastString
-namePun_maybe name | getUnique name == getUnique listTyCon = Just (fsLit "[]")
+namePun_maybe name
+ | getUnique name == getUnique listTyCon = Just (fsLit "[]")
+
+ | Just (Boxed, ar) <- isTupleTyConUnique (getUnique name)
+ , ar /= 1 = Just (fsLit $ '(' : commas ar ++ ")")
+ where
+ commas ar = replicate (ar-1) ','
+
namePun_maybe _ = Nothing
nameIsLocalOrFrom :: Module -> Name -> Bool
=====================================
compiler/GHC/Types/Name/Cache.hs
=====================================
@@ -1,4 +1,3 @@
-
{-# LANGUAGE RankNTypes #-}
-- | The Name Cache
@@ -30,6 +29,8 @@ import GHC.Utils.Panic
import Control.Concurrent.MVar
import Control.Monad
+import Control.Applicative
+
{-
@@ -58,8 +59,8 @@ site, we fix it up.
Note [Built-in syntax and the OrigNameCache]
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-Built-in syntax like tuples and unboxed sums are quite ubiquitous. To lower
-their cost we use two tricks,
+Built-in syntax like unboxed sums and punned syntax like tuples are quite
+ubiquitous. To lower their cost we use two tricks,
a. We specially encode tuple and sum Names in interface files' symbol tables
to avoid having to look up their names while loading interface files.
@@ -69,13 +70,14 @@ their cost we use two tricks,
in GHC.Iface.Binary and for details.
b. We don't include them in the Orig name cache but instead parse their
- OccNames (in isBuiltInOcc_maybe) to avoid bloating the name cache with
- them.
+ OccNames (in isBuiltInOcc_maybe and isPunOcc_maybe) to avoid bloating
+ the name cache with them.
Why is the second measure necessary? Good question; afterall, 1) the parser
-emits built-in syntax directly as Exact RdrNames, and 2) built-in syntax never
-needs to looked-up during interface loading due to (a). It turns out that there
-are two reasons why we might look up an Orig RdrName for built-in syntax,
+emits built-in and punned syntax directly as Exact RdrNames, and 2) built-in
+and punned syntax never needs to looked-up during interface loading due to (a).
+It turns out that there are two reasons why we might look up an Orig RdrName
+for built-in and punned syntax,
* If you use setRdrNameSpace on an Exact RdrName it may be
turned into an Orig RdrName.
@@ -103,7 +105,7 @@ takeUniqFromNameCache (NameCache c _) = uniqFromMask c
lookupOrigNameCache :: OrigNameCache -> Module -> OccName -> Maybe Name
lookupOrigNameCache nc mod occ
| mod == gHC_TYPES || mod == gHC_PRIM || mod == gHC_TUPLE_PRIM
- , Just name <- isBuiltInOcc_maybe occ
+ , Just name <- isBuiltInOcc_maybe occ <|> isPunOcc_maybe mod occ
= -- See Note [Known-key names], 3(c) in GHC.Builtin.Names
-- Special case for tuples; there are too many
-- of them to pre-populate the original-name cache
=====================================
compiler/GHC/Types/Name/Ppr.hs
=====================================
@@ -23,6 +23,7 @@ import GHC.Utils.Panic
import GHC.Utils.Misc
import GHC.Builtin.Types.Prim ( fUNTyConName )
import GHC.Builtin.Types
+import Data.Maybe (isJust)
{-
@@ -120,7 +121,9 @@ mkQualName env = qual_name where
, tYPETyConName
, fUNTyConName, unrestrictedFunTyConName
, oneDataConName
+ , listTyConName
, manyDataConName ]
+ || isJust (isTupleTyOcc_maybe mod occ)
right_name gre = greDefinitionModule gre == Just mod
=====================================
libraries/base/Data/Typeable/Internal.hs
=====================================
@@ -91,7 +91,9 @@ import GHC.Base
import qualified GHC.Arr as A
import Data.Either (Either (..))
import Data.Type.Equality
-import GHC.List ( splitAt, foldl', elem )
+import GHC.List ( splitAt, foldl', elem, replicate )
+import GHC.Unicode (isDigit)
+import GHC.Num ((-), (+), (*))
import GHC.Word
import GHC.Show
import GHC.TypeLits ( KnownChar, charVal', KnownSymbol, symbolVal'
@@ -879,9 +881,12 @@ showTypeable _ rep
-- Take care only to render saturated tuple tycon applications
-- with tuple notation (#14341).
- | isTupleTyCon tc,
+ | Just _ <- isTupleTyCon tc,
Just _ <- TrType `eqTypeRep` typeRepKind rep =
showChar '(' . showArgs (showChar ',') tys . showChar ')'
+ -- Print (,,,) instead of Tuple4
+ | Just n <- isTupleTyCon tc, [] <- tys =
+ showChar '(' . showString (replicate (n-1) ',') . showChar ')'
where (tc, tys) = splitApps rep
showTypeable _ (TrTyCon {trTyCon = tycon, trKindVars = []})
= showTyCon tycon
@@ -970,10 +975,26 @@ funTyCon = typeRepTyCon (typeRep @(->))
isListTyCon :: TyCon -> Bool
isListTyCon tc = tc == typeRepTyCon (typeRep :: TypeRep [])
-isTupleTyCon :: TyCon -> Bool
+isTupleTyCon :: TyCon -> Maybe Int
isTupleTyCon tc
- | ('(':',':_) <- tyConName tc = True
- | otherwise = False
+ | tyConPackage tc == "ghc-prim"
+ , tyConModule tc == "GHC.Tuple.Prim"
+ = case tyConName tc of
+ "Unit" -> Just 0
+ 'T' : 'u' : 'p' : 'l' : 'e' : arity -> readTwoDigits arity
+ _ -> Nothing
+ | otherwise = Nothing
+
+-- | See Note [Small Ints parsing] in GHC.Builtin.Types
+readTwoDigits :: String -> Maybe Int
+readTwoDigits s = case s of
+ [c] | isDigit c -> Just (digit_to_int c)
+ [c1, c2] | isDigit c1, isDigit c2
+ -> Just (digit_to_int c1 * 10 + digit_to_int c2)
+ _ -> Nothing
+ where
+ digit_to_int :: Char -> Int
+ digit_to_int c = ord c - ord '0'
-- This is only an approximation. We don't have the general
-- character-classification machinery here, so we just do our best.
=====================================
libraries/ghc-prim/GHC/Tuple.hs
=====================================
@@ -5,7 +5,7 @@
-- Module : GHC.Tuple
-- Copyright : (c) The University of Glasgow 2001
-- License : BSD-style (see the file libraries/ghc-prim/LICENSE)
---
+--
-- Maintainer : libraries at haskell.org
-- Stability : experimental
-- Portability : non-portable (GHC extensions)
=====================================
libraries/ghc-prim/GHC/Tuple/Prim.hs
=====================================
@@ -22,16 +22,16 @@ import GHC.CString () -- Make sure we do it first, so that the
default () -- Double and Integer aren't available yet
--- | The unit datatype @()@ has one non-undefined member, the nullary
+-- | The unit datatype @Unit@ has one non-undefined member, the nullary
-- constructor @()@.
-data () = ()
+data Unit = ()
-- The desugarer uses 1-tuples,
--- but "()" is already used up for 0-tuples
+-- but "Unit" is already used up for 0-tuples
-- See Note [One-tuples] in GHC.Builtin.Types
--- | @Solo@ is the canonical lifted 1-tuple, just like '(,)' is the canonical
--- lifted 2-tuple (pair) and '(,,)' is the canonical lifted 3-tuple (triple).
+-- | @Solo@ is the canonical lifted 1-tuple, just like 'Tuple2' is the canonical
+-- lifted 2-tuple (pair) and 'Tuple3' is the canonical lifted 3-tuple (triple).
--
-- The most important feature of @Solo@ is that it is possible to force its
-- "outside" (usually by pattern matching) without forcing its "inside",
@@ -107,146 +107,148 @@ getSolo :: Solo a -> a
-- to have getSolo as its own separate function (#20562)
getSolo (MkSolo a) = a
-data (a,b) = (a,b)
-data (a,b,c) = (a,b,c)
-data (a,b,c,d) = (a,b,c,d)
-data (a,b,c,d,e) = (a,b,c,d,e)
-data (a,b,c,d,e,f) = (a,b,c,d,e,f)
-data (a,b,c,d,e,f,g) = (a,b,c,d,e,f,g)
-data (a,b,c,d,e,f,g,h) = (a,b,c,d,e,f,g,h)
-data (a,b,c,d,e,f,g,h,i) = (a,b,c,d,e,f,g,h,i)
-data (a,b,c,d,e,f,g,h,i,j) = (a,b,c,d,e,f,g,h,i,j)
-data (a,b,c,d,e,f,g,h,i,j,k) = (a,b,c,d,e,f,g,h,i,j,k)
-data (a,b,c,d,e,f,g,h,i,j,k,l) = (a,b,c,d,e,f,g,h,i,j,k,l)
-data (a,b,c,d,e,f,g,h,i,j,k,l,m) = (a,b,c,d,e,f,g,h,i,j,k,l,m)
-data (a,b,c,d,e,f,g,h,i,j,k,l,m,n) = (a,b,c,d,e,f,g,h,i,j,k,l,m,n)
-data (a,b,c,d,e,f,g,h,i,j,k,l,m,n,o) = (a,b,c,d,e,f,g,h,i,j,k,l,m,n,o)
-data (a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p) = (a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p)
-data (a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q) = (a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q)
-data (a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r) = (a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r)
-data (a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s) = (a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s)
-data (a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t) = (a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t)
-data (a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u) = (a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u)
-data (a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v) = (a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v)
-data (a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w) = (a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w)
-data (a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x) = (a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x)
-data (a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y) = (a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y)
-data (a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z) = (a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z)
+type Tuple0 = Unit
+type Tuple1 = Solo
+data Tuple2 a b = (a,b)
+data Tuple3 a b c = (a,b,c)
+data Tuple4 a b c d = (a,b,c,d)
+data Tuple5 a b c d e = (a,b,c,d,e)
+data Tuple6 a b c d e f = (a,b,c,d,e,f)
+data Tuple7 a b c d e f g = (a,b,c,d,e,f,g)
+data Tuple8 a b c d e f g h = (a,b,c,d,e,f,g,h)
+data Tuple9 a b c d e f g h i = (a,b,c,d,e,f,g,h,i)
+data Tuple10 a b c d e f g h i j = (a,b,c,d,e,f,g,h,i,j)
+data Tuple11 a b c d e f g h i j k = (a,b,c,d,e,f,g,h,i,j,k)
+data Tuple12 a b c d e f g h i j k l = (a,b,c,d,e,f,g,h,i,j,k,l)
+data Tuple13 a b c d e f g h i j k l m = (a,b,c,d,e,f,g,h,i,j,k,l,m)
+data Tuple14 a b c d e f g h i j k l m n = (a,b,c,d,e,f,g,h,i,j,k,l,m,n)
+data Tuple15 a b c d e f g h i j k l m n o = (a,b,c,d,e,f,g,h,i,j,k,l,m,n,o)
+data Tuple16 a b c d e f g h i j k l m n o p = (a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p)
+data Tuple17 a b c d e f g h i j k l m n o p q = (a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q)
+data Tuple18 a b c d e f g h i j k l m n o p q r = (a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r)
+data Tuple19 a b c d e f g h i j k l m n o p q r s = (a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s)
+data Tuple20 a b c d e f g h i j k l m n o p q r s t = (a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t)
+data Tuple21 a b c d e f g h i j k l m n o p q r s t u = (a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u)
+data Tuple22 a b c d e f g h i j k l m n o p q r s t u v = (a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v)
+data Tuple23 a b c d e f g h i j k l m n o p q r s t u v w = (a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w)
+data Tuple24 a b c d e f g h i j k l m n o p q r s t u v w x = (a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x)
+data Tuple25 a b c d e f g h i j k l m n o p q r s t u v w x y = (a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y)
+data Tuple26 a b c d e f g h i j k l m n o p q r s t u v w x y z = (a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z)
-data (a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z,a1)
+data Tuple27 a b c d e f g h i j k l m n o p q r s t u v w x y z a1
= (a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z,a1)
-data (a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z,a1,b1)
+data Tuple28 a b c d e f g h i j k l m n o p q r s t u v w x y z a1 b1
= (a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z,a1,b1)
-data (a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z,a1,b1,c1)
+data Tuple29 a b c d e f g h i j k l m n o p q r s t u v w x y z a1 b1 c1
= (a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z,a1,b1,c1)
-data (a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z,a1,b1,c1,d1)
+data Tuple30 a b c d e f g h i j k l m n o p q r s t u v w x y z a1 b1 c1 d1
= (a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z,a1,b1,c1,d1)
-data (a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z,a1,b1,c1,d1,e1)
+data Tuple31 a b c d e f g h i j k l m n o p q r s t u v w x y z a1 b1 c1 d1 e1
= (a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z,a1,b1,c1,d1,e1)
-data (a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z,a1,b1,c1,d1,e1,f1)
+data Tuple32 a b c d e f g h i j k l m n o p q r s t u v w x y z a1 b1 c1 d1 e1 f1
= (a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z,a1,b1,c1,d1,e1,f1)
-data (a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z,a1,b1,c1,d1,e1,f1,g1)
+data Tuple33 a b c d e f g h i j k l m n o p q r s t u v w x y z a1 b1 c1 d1 e1 f1 g1
= (a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z,a1,b1,c1,d1,e1,f1,g1)
-data (a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z,a1,b1,c1,d1,e1,f1,g1,h1)
+data Tuple34 a b c d e f g h i j k l m n o p q r s t u v w x y z a1 b1 c1 d1 e1 f1 g1 h1
= (a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z,a1,b1,c1,d1,e1,f1,g1,h1)
-data (a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z,a1,b1,c1,d1,e1,f1,g1,h1,i1)
+data Tuple35 a b c d e f g h i j k l m n o p q r s t u v w x y z a1 b1 c1 d1 e1 f1 g1 h1 i1
= (a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z,a1,b1,c1,d1,e1,f1,g1,h1,i1)
-data (a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z,a1,b1,c1,d1,e1,f1,g1,h1,i1,j1)
+data Tuple36 a b c d e f g h i j k l m n o p q r s t u v w x y z a1 b1 c1 d1 e1 f1 g1 h1 i1 j1
= (a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z,a1,b1,c1,d1,e1,f1,g1,h1,i1,j1)
-data (a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z,a1,b1,c1,d1,e1,f1,g1,h1,i1,j1,k1)
+data Tuple37 a b c d e f g h i j k l m n o p q r s t u v w x y z a1 b1 c1 d1 e1 f1 g1 h1 i1 j1 k1
= (a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z,a1,b1,c1,d1,e1,f1,g1,h1,i1,j1,k1)
-data (a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z,a1,b1,c1,d1,e1,f1,g1,h1,i1,j1,k1,l1)
+data Tuple38 a b c d e f g h i j k l m n o p q r s t u v w x y z a1 b1 c1 d1 e1 f1 g1 h1 i1 j1 k1 l1
= (a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z,a1,b1,c1,d1,e1,f1,g1,h1,i1,j1,k1,l1)
-data (a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z,a1,b1,c1,d1,e1,f1,g1,h1,i1,j1,k1,l1,m1)
+data Tuple39 a b c d e f g h i j k l m n o p q r s t u v w x y z a1 b1 c1 d1 e1 f1 g1 h1 i1 j1 k1 l1 m1
= (a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z,a1,b1,c1,d1,e1,f1,g1,h1,i1,j1,k1,l1,m1)
-data (a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z,a1,b1,c1,d1,e1,f1,g1,h1,i1,j1,k1,l1,m1,n1)
+data Tuple40 a b c d e f g h i j k l m n o p q r s t u v w x y z a1 b1 c1 d1 e1 f1 g1 h1 i1 j1 k1 l1 m1 n1
= (a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z,a1,b1,c1,d1,e1,f1,g1,h1,i1,j1,k1,l1,m1,n1)
-data (a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z,a1,b1,c1,d1,e1,f1,g1,h1,i1,j1,k1,l1,m1,n1,o1)
+data Tuple41 a b c d e f g h i j k l m n o p q r s t u v w x y z a1 b1 c1 d1 e1 f1 g1 h1 i1 j1 k1 l1 m1 n1 o1
= (a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z,a1,b1,c1,d1,e1,f1,g1,h1,i1,j1,k1,l1,m1,n1,o1)
-data (a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z,a1,b1,c1,d1,e1,f1,g1,h1,i1,j1,k1,l1,m1,n1,o1,p1)
+data Tuple42 a b c d e f g h i j k l m n o p q r s t u v w x y z a1 b1 c1 d1 e1 f1 g1 h1 i1 j1 k1 l1 m1 n1 o1 p1
= (a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z,a1,b1,c1,d1,e1,f1,g1,h1,i1,j1,k1,l1,m1,n1,o1,p1)
-data (a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z,a1,b1,c1,d1,e1,f1,g1,h1,i1,j1,k1,l1,m1,n1,o1,p1,q1)
+data Tuple43 a b c d e f g h i j k l m n o p q r s t u v w x y z a1 b1 c1 d1 e1 f1 g1 h1 i1 j1 k1 l1 m1 n1 o1 p1 q1
= (a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z,a1,b1,c1,d1,e1,f1,g1,h1,i1,j1,k1,l1,m1,n1,o1,p1,q1)
-data (a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z,a1,b1,c1,d1,e1,f1,g1,h1,i1,j1,k1,l1,m1,n1,o1,p1,q1,
- r1)
+data Tuple44 a b c d e f g h i j k l m n o p q r s t u v w x y z a1 b1 c1 d1 e1 f1 g1 h1 i1 j1 k1 l1 m1 n1 o1 p1 q1
+ r1
= (a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z,a1,b1,c1,d1,e1,f1,g1,h1,i1,j1,k1,l1,m1,n1,o1,p1,q1,
r1)
-data (a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z,a1,b1,c1,d1,e1,f1,g1,h1,i1,j1,k1,l1,m1,n1,o1,p1,q1,
- r1,s1)
+data Tuple45 a b c d e f g h i j k l m n o p q r s t u v w x y z a1 b1 c1 d1 e1 f1 g1 h1 i1 j1 k1 l1 m1 n1 o1 p1 q1
+ r1 s1
= (a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z,a1,b1,c1,d1,e1,f1,g1,h1,i1,j1,k1,l1,m1,n1,o1,p1,q1,r1,s1)
-data (a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z,a1,b1,c1,d1,e1,f1,g1,h1,i1,j1,k1,l1,m1,n1,o1,p1,q1,
- r1,s1,t1)
+data Tuple46 a b c d e f g h i j k l m n o p q r s t u v w x y z a1 b1 c1 d1 e1 f1 g1 h1 i1 j1 k1 l1 m1 n1 o1 p1 q1
+ r1 s1 t1
= (a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z,a1,b1,c1,d1,e1,f1,g1,h1,i1,j1,k1,l1,m1,n1,o1,p1,q1,
r1,s1,t1)
-data (a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z,a1,b1,c1,d1,e1,f1,g1,h1,i1,j1,k1,l1,m1,n1,o1,p1,q1,
- r1,s1,t1,u1)
+data Tuple47 a b c d e f g h i j k l m n o p q r s t u v w x y z a1 b1 c1 d1 e1 f1 g1 h1 i1 j1 k1 l1 m1 n1 o1 p1 q1
+ r1 s1 t1 u1
= (a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z,a1,b1,c1,d1,e1,f1,g1,h1,i1,j1,k1,l1,m1,n1,o1,p1,q1,
r1,s1,t1,u1)
-data (a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z,a1,b1,c1,d1,e1,f1,g1,h1,i1,j1,k1,l1,m1,n1,o1,p1,q1,
- r1,s1,t1,u1,v1)
+data Tuple48 a b c d e f g h i j k l m n o p q r s t u v w x y z a1 b1 c1 d1 e1 f1 g1 h1 i1 j1 k1 l1 m1 n1 o1 p1 q1
+ r1 s1 t1 u1 v1
= (a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z,a1,b1,c1,d1,e1,f1,g1,h1,i1,j1,k1,l1,m1,n1,o1,p1,q1,
r1,s1,t1,u1,v1)
-data (a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z,a1,b1,c1,d1,e1,f1,g1,h1,i1,j1,k1,l1,m1,n1,o1,p1,q1,
- r1,s1,t1,u1,v1,w1)
+data Tuple49 a b c d e f g h i j k l m n o p q r s t u v w x y z a1 b1 c1 d1 e1 f1 g1 h1 i1 j1 k1 l1 m1 n1 o1 p1 q1
+ r1 s1 t1 u1 v1 w1
= (a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z,a1,b1,c1,d1,e1,f1,g1,h1,i1,j1,k1,l1,m1,n1,o1,p1,q1,
r1,s1,t1,u1,v1,w1)
-data (a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z,a1,b1,c1,d1,e1,f1,g1,h1,i1,j1,k1,l1,m1,n1,o1,p1,q1,
- r1,s1,t1,u1,v1,w1,x1)
+data Tuple50 a b c d e f g h i j k l m n o p q r s t u v w x y z a1 b1 c1 d1 e1 f1 g1 h1 i1 j1 k1 l1 m1 n1 o1 p1 q1
+ r1 s1 t1 u1 v1 w1 x1
= (a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z,a1,b1,c1,d1,e1,f1,g1,h1,i1,j1,k1,l1,m1,n1,o1,p1,q1,
r1,s1,t1,u1,v1,w1,x1)
-data (a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z,a1,b1,c1,d1,e1,f1,g1,h1,i1,j1,k1,l1,m1,n1,o1,p1,q1,
- r1,s1,t1,u1,v1,w1,x1,y1)
+data Tuple51 a b c d e f g h i j k l m n o p q r s t u v w x y z a1 b1 c1 d1 e1 f1 g1 h1 i1 j1 k1 l1 m1 n1 o1 p1 q1
+ r1 s1 t1 u1 v1 w1 x1 y1
= (a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z,a1,b1,c1,d1,e1,f1,g1,h1,i1,j1,k1,l1,m1,n1,o1,p1,q1,
r1,s1,t1,u1,v1,w1,x1,y1)
-data (a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z,a1,b1,c1,d1,e1,f1,g1,h1,i1,j1,k1,l1,m1,n1,o1,p1,q1,
- r1,s1,t1,u1,v1,w1,x1,y1,z1)
+data Tuple52 a b c d e f g h i j k l m n o p q r s t u v w x y z a1 b1 c1 d1 e1 f1 g1 h1 i1 j1 k1 l1 m1 n1 o1 p1 q1
+ r1 s1 t1 u1 v1 w1 x1 y1 z1
= (a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z,a1,b1,c1,d1,e1,f1,g1,h1,i1,j1,k1,l1,m1,n1,o1,p1,q1,
r1,s1,t1,u1,v1,w1,x1,y1,z1)
-data (a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z,a1,b1,c1,d1,e1,f1,g1,h1,i1,j1,k1,l1,m1,n1,o1,p1,q1,
- r1,s1,t1,u1,v1,w1,x1,y1,z1,a2)
+data Tuple53 a b c d e f g h i j k l m n o p q r s t u v w x y z a1 b1 c1 d1 e1 f1 g1 h1 i1 j1 k1 l1 m1 n1 o1 p1 q1
+ r1 s1 t1 u1 v1 w1 x1 y1 z1 a2
= (a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z,a1,b1,c1,d1,e1,f1,g1,h1,i1,j1,k1,l1,m1,n1,o1,p1,q1,
r1,s1,t1,u1,v1,w1,x1,y1,z1,a2)
-data (a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z,a1,b1,c1,d1,e1,f1,g1,h1,i1,j1,k1,l1,m1,n1,o1,p1,q1,
- r1,s1,t1,u1,v1,w1,x1,y1,z1,a2,b2)
+data Tuple54 a b c d e f g h i j k l m n o p q r s t u v w x y z a1 b1 c1 d1 e1 f1 g1 h1 i1 j1 k1 l1 m1 n1 o1 p1 q1
+ r1 s1 t1 u1 v1 w1 x1 y1 z1 a2 b2
= (a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z,a1,b1,c1,d1,e1,f1,g1,h1,i1,j1,k1,l1,m1,n1,o1,p1,q1,
r1,s1,t1,u1,v1,w1,x1,y1,z1,a2,b2)
-data (a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z,a1,b1,c1,d1,e1,f1,g1,h1,i1,j1,k1,l1,m1,n1,o1,p1,q1,
- r1,s1,t1,u1,v1,w1,x1,y1,z1,a2,b2,c2)
+data Tuple55 a b c d e f g h i j k l m n o p q r s t u v w x y z a1 b1 c1 d1 e1 f1 g1 h1 i1 j1 k1 l1 m1 n1 o1 p1 q1
+ r1 s1 t1 u1 v1 w1 x1 y1 z1 a2 b2 c2
= (a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z,a1,b1,c1,d1,e1,f1,g1,h1,i1,j1,k1,l1,m1,n1,o1,p1,q1,
r1,s1,t1,u1,v1,w1,x1,y1,z1,a2,b2,c2)
-data (a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z,a1,b1,c1,d1,e1,f1,g1,h1,i1,j1,k1,l1,m1,n1,o1,p1,q1,
- r1,s1,t1,u1,v1,w1,x1,y1,z1,a2,b2,c2,d2)
+data Tuple56 a b c d e f g h i j k l m n o p q r s t u v w x y z a1 b1 c1 d1 e1 f1 g1 h1 i1 j1 k1 l1 m1 n1 o1 p1 q1
+ r1 s1 t1 u1 v1 w1 x1 y1 z1 a2 b2 c2 d2
= (a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z,a1,b1,c1,d1,e1,f1,g1,h1,i1,j1,k1,l1,m1,n1,o1,p1,q1,
r1,s1,t1,u1,v1,w1,x1,y1,z1,a2,b2,c2,d2)
-data (a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z,a1,b1,c1,d1,e1,f1,g1,h1,i1,j1,k1,l1,m1,n1,o1,p1,q1,
- r1,s1,t1,u1,v1,w1,x1,y1,z1,a2,b2,c2,d2,e2)
+data Tuple57 a b c d e f g h i j k l m n o p q r s t u v w x y z a1 b1 c1 d1 e1 f1 g1 h1 i1 j1 k1 l1 m1 n1 o1 p1 q1
+ r1 s1 t1 u1 v1 w1 x1 y1 z1 a2 b2 c2 d2 e2
= (a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z,a1,b1,c1,d1,e1,f1,g1,h1,i1,j1,k1,l1,m1,n1,o1,p1,q1,
r1,s1,t1,u1,v1,w1,x1,y1,z1,a2,b2,c2,d2,e2)
-data (a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z,a1,b1,c1,d1,e1,f1,g1,h1,i1,j1,k1,l1,m1,n1,o1,p1,q1,
- r1,s1,t1,u1,v1,w1,x1,y1,z1,a2,b2,c2,d2,e2,f2)
+data Tuple58 a b c d e f g h i j k l m n o p q r s t u v w x y z a1 b1 c1 d1 e1 f1 g1 h1 i1 j1 k1 l1 m1 n1 o1 p1 q1
+ r1 s1 t1 u1 v1 w1 x1 y1 z1 a2 b2 c2 d2 e2 f2
= (a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z,a1,b1,c1,d1,e1,f1,g1,h1,i1,j1,k1,l1,m1,n1,o1,p1,q1,
r1,s1,t1,u1,v1,w1,x1,y1,z1,a2,b2,c2,d2,e2,f2)
-data (a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z,a1,b1,c1,d1,e1,f1,g1,h1,i1,j1,k1,l1,m1,n1,o1,p1,q1,
- r1,s1,t1,u1,v1,w1,x1,y1,z1,a2,b2,c2,d2,e2,f2,g2)
+data Tuple59 a b c d e f g h i j k l m n o p q r s t u v w x y z a1 b1 c1 d1 e1 f1 g1 h1 i1 j1 k1 l1 m1 n1 o1 p1 q1
+ r1 s1 t1 u1 v1 w1 x1 y1 z1 a2 b2 c2 d2 e2 f2 g2
= (a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z,a1,b1,c1,d1,e1,f1,g1,h1,i1,j1,k1,l1,m1,n1,o1,p1,q1,
r1,s1,t1,u1,v1,w1,x1,y1,z1,a2,b2,c2,d2,e2,f2,g2)
-data (a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z,a1,b1,c1,d1,e1,f1,g1,h1,i1,j1,k1,l1,m1,n1,o1,p1,q1,
- r1,s1,t1,u1,v1,w1,x1,y1,z1,a2,b2,c2,d2,e2,f2,g2,h2)
+data Tuple60 a b c d e f g h i j k l m n o p q r s t u v w x y z a1 b1 c1 d1 e1 f1 g1 h1 i1 j1 k1 l1 m1 n1 o1 p1 q1
+ r1 s1 t1 u1 v1 w1 x1 y1 z1 a2 b2 c2 d2 e2 f2 g2 h2
= (a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z,a1,b1,c1,d1,e1,f1,g1,h1,i1,j1,k1,l1,m1,n1,o1,p1,q1,
r1,s1,t1,u1,v1,w1,x1,y1,z1,a2,b2,c2,d2,e2,f2,g2,h2)
-data (a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z,a1,b1,c1,d1,e1,f1,g1,h1,i1,j1,k1,l1,m1,n1,o1,p1,q1,
- r1,s1,t1,u1,v1,w1,x1,y1,z1,a2,b2,c2,d2,e2,f2,g2,h2,i2)
+data Tuple61 a b c d e f g h i j k l m n o p q r s t u v w x y z a1 b1 c1 d1 e1 f1 g1 h1 i1 j1 k1 l1 m1 n1 o1 p1 q1
+ r1 s1 t1 u1 v1 w1 x1 y1 z1 a2 b2 c2 d2 e2 f2 g2 h2 i2
= (a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z,a1,b1,c1,d1,e1,f1,g1,h1,i1,j1,k1,l1,m1,n1,o1,p1,q1,
r1,s1,t1,u1,v1,w1,x1,y1,z1,a2,b2,c2,d2,e2,f2,g2,h2,i2)
-data (a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z,a1,b1,c1,d1,e1,f1,g1,h1,i1,j1,k1,l1,m1,n1,o1,p1,q1,
- r1,s1,t1,u1,v1,w1,x1,y1,z1,a2,b2,c2,d2,e2,f2,g2,h2,i2,j2)
+data Tuple62 a b c d e f g h i j k l m n o p q r s t u v w x y z a1 b1 c1 d1 e1 f1 g1 h1 i1 j1 k1 l1 m1 n1 o1 p1 q1
+ r1 s1 t1 u1 v1 w1 x1 y1 z1 a2 b2 c2 d2 e2 f2 g2 h2 i2 j2
= (a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z,a1,b1,c1,d1,e1,f1,g1,h1,i1,j1,k1,l1,m1,n1,o1,p1,q1,
r1,s1,t1,u1,v1,w1,x1,y1,z1,a2,b2,c2,d2,e2,f2,g2,h2,i2,j2)
-data (a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z,a1,b1,c1,d1,e1,f1,g1,h1,i1,j1,k1,l1,m1,n1,o1,p1,q1,
- r1,s1,t1,u1,v1,w1,x1,y1,z1,a2,b2,c2,d2,e2,f2,g2,h2,i2,j2,k2)
+data Tuple63 a b c d e f g h i j k l m n o p q r s t u v w x y z a1 b1 c1 d1 e1 f1 g1 h1 i1 j1 k1 l1 m1 n1 o1 p1 q1
+ r1 s1 t1 u1 v1 w1 x1 y1 z1 a2 b2 c2 d2 e2 f2 g2 h2 i2 j2 k2
= (a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z,a1,b1,c1,d1,e1,f1,g1,h1,i1,j1,k1,l1,m1,n1,o1,p1,q1,
r1,s1,t1,u1,v1,w1,x1,y1,z1,a2,b2,c2,d2,e2,f2,g2,h2,i2,j2,k2)
-data (a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z,a1,b1,c1,d1,e1,f1,g1,h1,i1,j1,k1,l1,m1,n1,o1,p1,q1,
- r1,s1,t1,u1,v1,w1,x1,y1,z1,a2,b2,c2,d2,e2,f2,g2,h2,i2,j2,k2,l2)
+data Tuple64 a b c d e f g h i j k l m n o p q r s t u v w x y z a1 b1 c1 d1 e1 f1 g1 h1 i1 j1 k1 l1 m1 n1 o1 p1 q1
+ r1 s1 t1 u1 v1 w1 x1 y1 z1 a2 b2 c2 d2 e2 f2 g2 h2 i2 j2 k2 l2
= (a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z,a1,b1,c1,d1,e1,f1,g1,h1,i1,j1,k1,l1,m1,n1,o1,p1,q1,
r1,s1,t1,u1,v1,w1,x1,y1,z1,a2,b2,c2,d2,e2,f2,g2,h2,i2,j2,k2,l2)
=====================================
testsuite/tests/ghc-api/T18522-dbg-ppr.stdout
=====================================
@@ -1,2 +1 @@
-forall k{tv}[tv] {j{tv}[tv]}.
-forall a{tv}[tv] b{tv}[tv] -> (){(w) tc}
+forall k{tv}[tv] {j{tv}[tv]}. forall a{tv}[tv] b{tv}[tv] -> ()
=====================================
testsuite/tests/ghci/scripts/T12550.stdout
=====================================
@@ -23,6 +23,11 @@ class Functor f where
(<$) ∷ ∀ a b. a → f b → f a
{-# MINIMAL fmap #-}
-- Defined in ‘GHC.Base’
+instance ∀ r. Functor ((->) r) -- Defined in ‘GHC.Base’
+instance Functor IO -- Defined in ‘GHC.Base’
+instance Functor [] -- Defined in ‘GHC.Base’
+instance Functor Maybe -- Defined in ‘GHC.Base’
+instance Functor Solo -- Defined in ‘GHC.Base’
instance ∀ a. Functor ((,) a) -- Defined in ‘GHC.Base’
instance ∀ a b. Functor ((,,) a b) -- Defined in ‘GHC.Base’
instance ∀ a b c. Functor ((,,,) a b c) -- Defined in ‘GHC.Base’
@@ -32,11 +37,6 @@ instance ∀ a b c d e. Functor ((,,,,,) a b c d e)
-- Defined in ‘GHC.Base’
instance ∀ a b c d e f. Functor ((,,,,,,) a b c d e f)
-- Defined in ‘GHC.Base’
-instance ∀ r. Functor ((->) r) -- Defined in ‘GHC.Base’
-instance Functor IO -- Defined in ‘GHC.Base’
-instance Functor [] -- Defined in ‘GHC.Base’
-instance Functor Maybe -- Defined in ‘GHC.Base’
-instance Functor Solo -- Defined in ‘GHC.Base’
instance ∀ a. Functor (Either a) -- Defined in ‘Data.Either’
instance ∀ (f ∷ ★ → ★) (g ∷ ★ → ★).
(Functor f, Functor g) ⇒
=====================================
testsuite/tests/ghci/scripts/T4127.stdout
=====================================
@@ -1 +1 @@
-[InstanceD Nothing [] (AppT (ConT GHC.Base.Monad) (AppT (ConT GHC.Tuple.Prim.(,)) (VarT a_0))) [ValD (VarP GHC.Base.>>=) (NormalB (VarE GHC.Err.undefined)) []]]
+[InstanceD Nothing [] (AppT (ConT GHC.Base.Monad) (AppT (ConT GHC.Tuple.Prim.Tuple2) (VarT a_0))) [ValD (VarP GHC.Base.>>=) (NormalB (VarE GHC.Err.undefined)) []]]
=====================================
testsuite/tests/ghci/scripts/T4175.stdout
=====================================
@@ -22,8 +22,8 @@ type family E a where
E () = Bool
E Int = String
-- Defined at T4175.hs:25:1
-type () :: *
-data () = ()
+type Unit :: *
+data Unit = ()
-- Defined in ‘GHC.Tuple.Prim’
instance [safe] C () -- Defined at T4175.hs:22:10
instance Monoid () -- Defined in ‘GHC.Base’
=====================================
testsuite/tests/ghci/scripts/T7627.stdout
=====================================
@@ -1,5 +1,5 @@
-type () :: *
-data () = ()
+type Unit :: *
+data Unit = ()
-- Defined in ‘GHC.Tuple.Prim’
instance Monoid () -- Defined in ‘GHC.Base’
instance Semigroup () -- Defined in ‘GHC.Base’
@@ -16,8 +16,8 @@ data (##) = (##)
(##) :: (# #)
( ) :: ()
(# #) :: (# #)
-type (,) :: * -> * -> *
-data (,) a b = (,) a b
+type Tuple2 :: * -> * -> *
+data Tuple2 a b = (,) a b
-- Defined in ‘GHC.Tuple.Prim’
instance Traversable ((,) a) -- Defined in ‘Data.Traversable’
instance (Monoid a, Monoid b) => Monoid (a, b)
@@ -27,13 +27,13 @@ instance (Semigroup a, Semigroup b) => Semigroup (a, b)
instance Foldable ((,) a) -- Defined in ‘Data.Foldable’
instance (Bounded a, Bounded b) => Bounded (a, b)
-- Defined in ‘GHC.Enum’
-instance (Eq a, Eq b) => Eq (a, b) -- Defined in ‘GHC.Classes’
-instance (Ord a, Ord b) => Ord (a, b) -- Defined in ‘GHC.Classes’
instance (Read a, Read b) => Read (a, b) -- Defined in ‘GHC.Read’
-instance (Show a, Show b) => Show (a, b) -- Defined in ‘GHC.Show’
instance Monoid a => Applicative ((,) a) -- Defined in ‘GHC.Base’
instance Functor ((,) a) -- Defined in ‘GHC.Base’
instance Monoid a => Monad ((,) a) -- Defined in ‘GHC.Base’
+instance (Eq a, Eq b) => Eq (a, b) -- Defined in ‘GHC.Classes’
+instance (Ord a, Ord b) => Ord (a, b) -- Defined in ‘GHC.Classes’
+instance (Show a, Show b) => Show (a, b) -- Defined in ‘GHC.Show’
type (#,#) :: *
-> *
-> TYPE
=====================================
testsuite/tests/ghci/scripts/ghci011.stdout
=====================================
@@ -13,8 +13,8 @@ instance MonadFail [] -- Defined in ‘Control.Monad.Fail’
instance Monad [] -- Defined in ‘GHC.Base’
instance Eq a => Eq [a] -- Defined in ‘GHC.Classes’
instance Ord a => Ord [a] -- Defined in ‘GHC.Classes’
-type () :: *
-data () = ()
+type Unit :: *
+data Unit = ()
-- Defined in ‘GHC.Tuple.Prim’
instance Monoid () -- Defined in ‘GHC.Base’
instance Semigroup () -- Defined in ‘GHC.Base’
@@ -24,8 +24,8 @@ instance Enum () -- Defined in ‘GHC.Enum’
instance Ord () -- Defined in ‘GHC.Classes’
instance Show () -- Defined in ‘GHC.Show’
instance Eq () -- Defined in ‘GHC.Classes’
-type (,) :: * -> * -> *
-data (,) a b = (,) a b
+type Tuple2 :: * -> * -> *
+data Tuple2 a b = (,) a b
-- Defined in ‘GHC.Tuple.Prim’
instance Traversable ((,) a) -- Defined in ‘Data.Traversable’
instance (Monoid a, Monoid b) => Monoid (a, b)
@@ -35,9 +35,9 @@ instance (Semigroup a, Semigroup b) => Semigroup (a, b)
instance Foldable ((,) a) -- Defined in ‘Data.Foldable’
instance (Bounded a, Bounded b) => Bounded (a, b)
-- Defined in ‘GHC.Enum’
+instance (Read a, Read b) => Read (a, b) -- Defined in ‘GHC.Read’
instance (Eq a, Eq b) => Eq (a, b) -- Defined in ‘GHC.Classes’
instance (Ord a, Ord b) => Ord (a, b) -- Defined in ‘GHC.Classes’
-instance (Read a, Read b) => Read (a, b) -- Defined in ‘GHC.Read’
instance (Show a, Show b) => Show (a, b) -- Defined in ‘GHC.Show’
instance Monoid a => Applicative ((,) a) -- Defined in ‘GHC.Base’
instance Functor ((,) a) -- Defined in ‘GHC.Base’
=====================================
testsuite/tests/hiefile/should_run/HieQueries.stdout
=====================================
@@ -46,7 +46,7 @@ At point (23,9), we found:
|
`- ┌
│ $dShow at HieQueries.hs:23:1-22, of type: Show (Integer, x, A)
- │ is an evidence variable bound by a let, depending on: [$fShow(,,),
+ │ is an evidence variable bound by a let, depending on: [$fShowTuple3,
│ $dShow, $dShow, $dShow]
│ with scope: LocalScope HieQueries.hs:23:1-22
│ bound at: HieQueries.hs:23:1-22
@@ -54,7 +54,7 @@ At point (23,9), we found:
└
|
+- ┌
- | │ $fShow(,,) at HieQueries.hs:23:1-22, of type: forall a b c. (Show a, Show b, Show c) => Show (a, b, c)
+ | │ $fShowTuple3 at HieQueries.hs:23:1-22, of type: forall a b c. (Show a, Show b, Show c) => Show (a, b, c)
| │ is a usage of an external evidence variable
| │ Defined in `GHC.Show'
| └
=====================================
testsuite/tests/module/TupleTyConUserSyntax.hs
=====================================
@@ -0,0 +1,13 @@
+module TupleTyConUserSyntax where
+
+import TupleTyConUserSyntaxA
+
+type T1 = Tuple1
+
+type T2 = Tuple2
+
+type T23 = Tuple23
+
+type T46 = Tuple46
+
+type T64 = Tuple64
\ No newline at end of file
=====================================
testsuite/tests/module/TupleTyConUserSyntaxA.hs
=====================================
@@ -0,0 +1,11 @@
+module TupleTyConUserSyntaxA (module GHC.Tuple) where
+
+import GHC.Tuple
+
+type T1 = Tuple1
+
+type T2 = Tuple2
+
+type T23 = Tuple23
+
+type T64 = Tuple64
\ No newline at end of file
=====================================
testsuite/tests/module/all.T
=====================================
@@ -295,3 +295,5 @@ test('T13704b', [], multimod_compile, ['T13704b1.hs T13704b2.hs', '-main-is T137
test('T20562', normal, compile, [''])
test('T21752', [extra_files(['T21752A.hs', 'T21752.hs'])], multimod_compile, ['T21752', '-v0'])
+
+test('TupleTyConUserSyntax', [extra_files(['TupleTyConUserSyntaxA.hs', 'TupleTyConUserSyntax.hs'])], multimod_compile, ['TupleTyConUserSyntax', '-v0'])
=====================================
testsuite/tests/partial-sigs/should_fail/NamedWildcardsNotInMonotype.stderr
=====================================
@@ -8,7 +8,7 @@ NamedWildcardsNotInMonotype.hs:5:1: error: [GHC-39999]
The type variable ‘w0’ is ambiguous
Potentially matching instances:
instance Eq Ordering -- Defined in ‘GHC.Classes’
- instance Eq () -- Defined in ‘GHC.Classes’
+ instance Eq a => Eq (Solo a) -- Defined in ‘GHC.Classes’
...plus 22 others
...plus four instances involving out-of-scope types
(use -fprint-potential-instances to see them all)
=====================================
testsuite/tests/roles/should_compile/T8958.stderr
=====================================
@@ -18,7 +18,7 @@ CLASS INSTANCES
-- Defined at T8958.hs:11:10
instance [incoherent] Nominal a -- Defined at T8958.hs:8:10
Dependent modules: []
-Dependent packages: [base-4.17.0.0]
+Dependent packages: [base-4.18.0.0]
==================== Typechecker ====================
T8958.$tcMap
@@ -53,7 +53,7 @@ $krep [InlPrag=[~]]
= GHC.Types.KindRepFun GHC.Types.krep$* GHC.Types.krep$Constraint
$krep [InlPrag=[~]]
= GHC.Types.KindRepTyConApp
- GHC.Tuple.Prim.$tc(,)
+ GHC.Tuple.Prim.$tcTuple2
((:) @GHC.Types.KindRep
$krep ((:) @GHC.Types.KindRep $krep [] @GHC.Types.KindRep))
$krep [InlPrag=[~]]
=====================================
testsuite/tests/stranal/sigs/T21119.stderr
=====================================
@@ -1,7 +1,7 @@
==================== Strictness signatures ====================
-T21119.$fMyShow(,): <1!A>
T21119.$fMyShowInt: <1!A>
+T21119.$fMyShowTuple2: <1!A>
T21119.get: <1!P(1!P(L),1!P(L))><1!P(L)><1L>
T21119.getIO: <1P(1L,ML)><1L><ML><L>
T21119.indexError: <1C(1,L)><1!B><S!S><S>b
@@ -10,8 +10,8 @@ T21119.throwIndexError: <MC(1,L)><MA><L><L><L>x
==================== Cpr signatures ====================
-T21119.$fMyShow(,):
T21119.$fMyShowInt:
+T21119.$fMyShowTuple2:
T21119.get:
T21119.getIO: 1
T21119.indexError: b
@@ -20,8 +20,8 @@ T21119.throwIndexError: b
==================== Strictness signatures ====================
-T21119.$fMyShow(,): <1!A>
T21119.$fMyShowInt: <1!A>
+T21119.$fMyShowTuple2: <1!A>
T21119.get: <1!P(1!P(L),1!P(L))><1!P(L)><1L>
T21119.getIO: <1P(1L,ML)><1L><ML><L>
T21119.indexError: <1C(1,L)><1!B><S!S><S>b
=====================================
testsuite/tests/stranal/sigs/T21888.stderr
=====================================
@@ -1,30 +1,30 @@
==================== Strictness signatures ====================
-Data.MemoTrie.$fHasTrie(): <L>
-Data.MemoTrie.$fHasTrie(,): <1C(1,L)><LC(S,L)><L>
Data.MemoTrie.$fHasTrieBool: <1!P(L,L)>
Data.MemoTrie.$fHasTrieEither: <1C(1,L)><1C(1,L)><1!P(L,L)>
Data.MemoTrie.$fHasTrieInteger: <1!P(1!P(S,1!P(1!P(S,1L),1!P(S,1L))),1!P(S,1!P(1!P(S,1L),1!P(S,1L))))>b
Data.MemoTrie.$fHasTrieList: <SC(S,L)><1!P(L,L)>
+Data.MemoTrie.$fHasTrieTuple2: <1C(1,L)><LC(S,L)><L>
+Data.MemoTrie.$fHasTrieUnit: <L>
==================== Cpr signatures ====================
-Data.MemoTrie.$fHasTrie():
-Data.MemoTrie.$fHasTrie(,):
Data.MemoTrie.$fHasTrieBool:
Data.MemoTrie.$fHasTrieEither:
Data.MemoTrie.$fHasTrieInteger:
Data.MemoTrie.$fHasTrieList:
+Data.MemoTrie.$fHasTrieTuple2:
+Data.MemoTrie.$fHasTrieUnit:
==================== Strictness signatures ====================
-Data.MemoTrie.$fHasTrie(): <L>
-Data.MemoTrie.$fHasTrie(,): <1C(1,L)><LC(S,L)><L>
Data.MemoTrie.$fHasTrieBool: <1!P(L,L)>
Data.MemoTrie.$fHasTrieEither: <1C(1,L)><1C(1,L)><1!P(L,L)>
Data.MemoTrie.$fHasTrieInteger: <1!P(1!P(B,1!P(1!P(B,1!P(L,L)),1!P(B,1!P(L,L)))),1!P(B,1!P(1!B,1!B)))>b
Data.MemoTrie.$fHasTrieList: <SC(S,L)><1!P(L,L)>
+Data.MemoTrie.$fHasTrieTuple2: <1C(1,L)><LC(S,L)><L>
+Data.MemoTrie.$fHasTrieUnit: <L>
=====================================
testsuite/tests/th/T12478_4.stderr
=====================================
@@ -2,5 +2,5 @@
T12478_4.hs:7:7: error: [GHC-97721]
• Illegal sum arity: 1
Sums must have an arity of at least 2
- When splicing a TH type: (# #) GHC.Tuple.Prim.()
+ When splicing a TH type: (# #) GHC.Tuple.Prim.Unit
• In the untyped splice: $(unboxedSumT 1 `appT` conT ''())
=====================================
testsuite/tests/typecheck/should_compile/T18529.stderr
=====================================
@@ -6,7 +6,7 @@ TYPE CONSTRUCTORS
COERCION AXIOMS
axiom Bug.N:C :: forall a b. C a b = a -> b -> ()
Dependent modules: []
-Dependent packages: [base-4.17.0.0]
+Dependent packages: [base-4.18.0.0]
==================== Typechecker ====================
Bug.$tcC
@@ -32,7 +32,7 @@ $krep [InlPrag=[~]]
= GHC.Types.KindRepFun GHC.Types.krep$* GHC.Types.krep$Constraint
$krep [InlPrag=[~]]
= GHC.Types.KindRepTyConApp
- GHC.Tuple.Prim.$tc() [] @GHC.Types.KindRep
+ GHC.Tuple.Prim.$tcUnit [] @GHC.Types.KindRep
Bug.$trModule
= GHC.Types.Module
(GHC.Types.TrNameS "main"#) (GHC.Types.TrNameS "Bug"#)
=====================================
utils/haddock
=====================================
@@ -1 +1 @@
-Subproject commit 519a95998b09a2c9c7a42c3a0cf2ca0c4358bb49
+Subproject commit 1f22a95c1db942fce2623b9daa26f66d193a4e7f
View it on GitLab: https://gitlab.haskell.org/ghc/ghc/-/commit/a13affce1a6196ccff6c126112ab26823c85e727
--
View it on GitLab: https://gitlab.haskell.org/ghc/ghc/-/commit/a13affce1a6196ccff6c126112ab26823c85e727
You're receiving this email because of your account on gitlab.haskell.org.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.haskell.org/pipermail/ghc-commits/attachments/20230321/e3551cce/attachment-0001.html>
More information about the ghc-commits
mailing list