summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndrei Borzenkov <andreyborzenkov2002@gmail.com>2023-01-27 17:48:33 +0400
committerMarge Bot <ben+marge-bot@smart-cactus.org>2023-03-21 11:17:17 -0400
commita13affce1a6196ccff6c126112ab26823c85e727 (patch)
treef93cabe0d62bfe2c809437a885019bc92418a9c3
parent73d07c6e1986bd2b3516d4f009cc1e30ba804f06 (diff)
downloadhaskell-a13affce1a6196ccff6c126112ab26823c85e727.tar.gz
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@gmail.com>
-rw-r--r--compiler/GHC/Builtin/Names.hs1
-rw-r--r--compiler/GHC/Builtin/Types.hs84
-rw-r--r--compiler/GHC/Builtin/Uniques.hs12
-rw-r--r--compiler/GHC/Types/Name.hs16
-rw-r--r--compiler/GHC/Types/Name/Cache.hs20
-rw-r--r--compiler/GHC/Types/Name/Ppr.hs3
-rw-r--r--libraries/base/Data/Typeable/Internal.hs31
-rw-r--r--libraries/ghc-prim/GHC/Tuple.hs2
-rw-r--r--libraries/ghc-prim/GHC/Tuple/Prim.hs180
-rw-r--r--testsuite/tests/ghc-api/T18522-dbg-ppr.stdout3
-rw-r--r--testsuite/tests/ghci/scripts/T12550.stdout10
-rw-r--r--testsuite/tests/ghci/scripts/T4127.stdout2
-rw-r--r--testsuite/tests/ghci/scripts/T4175.stdout4
-rw-r--r--testsuite/tests/ghci/scripts/T7627.stdout14
-rw-r--r--testsuite/tests/ghci/scripts/ghci011.stdout10
-rw-r--r--testsuite/tests/hiefile/should_run/HieQueries.stdout4
-rw-r--r--testsuite/tests/module/TupleTyConUserSyntax.hs13
-rw-r--r--testsuite/tests/module/TupleTyConUserSyntaxA.hs11
-rw-r--r--testsuite/tests/module/all.T2
-rw-r--r--testsuite/tests/partial-sigs/should_fail/NamedWildcardsNotInMonotype.stderr2
-rw-r--r--testsuite/tests/roles/should_compile/T8958.stderr4
-rw-r--r--testsuite/tests/stranal/sigs/T21119.stderr6
-rw-r--r--testsuite/tests/stranal/sigs/T21888.stderr12
-rw-r--r--testsuite/tests/th/T12478_4.stderr2
-rw-r--r--testsuite/tests/typecheck/should_compile/T18529.stderr4
m---------utils/haddock0
26 files changed, 295 insertions, 157 deletions
diff --git a/compiler/GHC/Builtin/Names.hs b/compiler/GHC/Builtin/Names.hs
index 1c26e1aaa9..34bd17a23f 100644
--- a/compiler/GHC/Builtin/Names.hs
+++ b/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
diff --git a/compiler/GHC/Builtin/Types.hs b/compiler/GHC/Builtin/Types.hs
index 44d22f3676..59970daa3c 100644
--- a/compiler/GHC/Builtin/Types.hs
+++ b/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
diff --git a/compiler/GHC/Builtin/Uniques.hs b/compiler/GHC/Builtin/Uniques.hs
index 9da937f8c5..1a440792e5 100644
--- a/compiler/GHC/Builtin/Uniques.hs
+++ b/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
diff --git a/compiler/GHC/Types/Name.hs b/compiler/GHC/Types/Name.hs
index d201cfa5f0..7d441039e9 100644
--- a/compiler/GHC/Types/Name.hs
+++ b/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
diff --git a/compiler/GHC/Types/Name/Cache.hs b/compiler/GHC/Types/Name/Cache.hs
index 6e18c77b32..ef25b25f80 100644
--- a/compiler/GHC/Types/Name/Cache.hs
+++ b/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
diff --git a/compiler/GHC/Types/Name/Ppr.hs b/compiler/GHC/Types/Name/Ppr.hs
index 2670b27cd9..206ee2e782 100644
--- a/compiler/GHC/Types/Name/Ppr.hs
+++ b/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
diff --git a/libraries/base/Data/Typeable/Internal.hs b/libraries/base/Data/Typeable/Internal.hs
index 5ecdd49036..2700a2d2fe 100644
--- a/libraries/base/Data/Typeable/Internal.hs
+++ b/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.
diff --git a/libraries/ghc-prim/GHC/Tuple.hs b/libraries/ghc-prim/GHC/Tuple.hs
index c884108afa..ab2c92ef8b 100644
--- a/libraries/ghc-prim/GHC/Tuple.hs
+++ b/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@haskell.org
-- Stability : experimental
-- Portability : non-portable (GHC extensions)
diff --git a/libraries/ghc-prim/GHC/Tuple/Prim.hs b/libraries/ghc-prim/GHC/Tuple/Prim.hs
index 36c88e4bcb..8ab72012c8 100644
--- a/libraries/ghc-prim/GHC/Tuple/Prim.hs
+++ b/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)
diff --git a/testsuite/tests/ghc-api/T18522-dbg-ppr.stdout b/testsuite/tests/ghc-api/T18522-dbg-ppr.stdout
index c6e1d209e7..7daf9caf45 100644
--- a/testsuite/tests/ghc-api/T18522-dbg-ppr.stdout
+++ b/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] -> ()
diff --git a/testsuite/tests/ghci/scripts/T12550.stdout b/testsuite/tests/ghci/scripts/T12550.stdout
index 5c2dccb767..6d76942568 100644
--- a/testsuite/tests/ghci/scripts/T12550.stdout
+++ b/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) ⇒
diff --git a/testsuite/tests/ghci/scripts/T4127.stdout b/testsuite/tests/ghci/scripts/T4127.stdout
index 3d2fad2539..d1cab7c0cc 100644
--- a/testsuite/tests/ghci/scripts/T4127.stdout
+++ b/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)) []]]
diff --git a/testsuite/tests/ghci/scripts/T4175.stdout b/testsuite/tests/ghci/scripts/T4175.stdout
index 16b2ebc26a..c014d96b51 100644
--- a/testsuite/tests/ghci/scripts/T4175.stdout
+++ b/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’
diff --git a/testsuite/tests/ghci/scripts/T7627.stdout b/testsuite/tests/ghci/scripts/T7627.stdout
index ba4640d01b..9deefb75a1 100644
--- a/testsuite/tests/ghci/scripts/T7627.stdout
+++ b/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
diff --git a/testsuite/tests/ghci/scripts/ghci011.stdout b/testsuite/tests/ghci/scripts/ghci011.stdout
index 32190117fd..e0fbe20927 100644
--- a/testsuite/tests/ghci/scripts/ghci011.stdout
+++ b/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’
diff --git a/testsuite/tests/hiefile/should_run/HieQueries.stdout b/testsuite/tests/hiefile/should_run/HieQueries.stdout
index 11fc74a84f..42492acb0c 100644
--- a/testsuite/tests/hiefile/should_run/HieQueries.stdout
+++ b/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'
| └
diff --git a/testsuite/tests/module/TupleTyConUserSyntax.hs b/testsuite/tests/module/TupleTyConUserSyntax.hs
new file mode 100644
index 0000000000..12501795bd
--- /dev/null
+++ b/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
diff --git a/testsuite/tests/module/TupleTyConUserSyntaxA.hs b/testsuite/tests/module/TupleTyConUserSyntaxA.hs
new file mode 100644
index 0000000000..086e9a905d
--- /dev/null
+++ b/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
diff --git a/testsuite/tests/module/all.T b/testsuite/tests/module/all.T
index 415f40717e..516a252b8c 100644
--- a/testsuite/tests/module/all.T
+++ b/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'])
diff --git a/testsuite/tests/partial-sigs/should_fail/NamedWildcardsNotInMonotype.stderr b/testsuite/tests/partial-sigs/should_fail/NamedWildcardsNotInMonotype.stderr
index 388ba5a0a1..806bda59fb 100644
--- a/testsuite/tests/partial-sigs/should_fail/NamedWildcardsNotInMonotype.stderr
+++ b/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)
diff --git a/testsuite/tests/roles/should_compile/T8958.stderr b/testsuite/tests/roles/should_compile/T8958.stderr
index ec5ede1aa1..9a8e781e67 100644
--- a/testsuite/tests/roles/should_compile/T8958.stderr
+++ b/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=[~]]
diff --git a/testsuite/tests/stranal/sigs/T21119.stderr b/testsuite/tests/stranal/sigs/T21119.stderr
index 1c27b4c9a4..a0549af229 100644
--- a/testsuite/tests/stranal/sigs/T21119.stderr
+++ b/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
diff --git a/testsuite/tests/stranal/sigs/T21888.stderr b/testsuite/tests/stranal/sigs/T21888.stderr
index d52d0c7d78..ff046ca2cf 100644
--- a/testsuite/tests/stranal/sigs/T21888.stderr
+++ 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>
diff --git a/testsuite/tests/th/T12478_4.stderr b/testsuite/tests/th/T12478_4.stderr
index 2f1b3f4e50..852b104cd5 100644
--- a/testsuite/tests/th/T12478_4.stderr
+++ b/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 ''())
diff --git a/testsuite/tests/typecheck/should_compile/T18529.stderr b/testsuite/tests/typecheck/should_compile/T18529.stderr
index 71542931fc..21b41159d4 100644
--- a/testsuite/tests/typecheck/should_compile/T18529.stderr
+++ b/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"#)
diff --git a/utils/haddock b/utils/haddock
-Subproject 519a95998b09a2c9c7a42c3a0cf2ca0c4358bb4
+Subproject 1f22a95c1db942fce2623b9daa26f66d193a4e7