diff options
author | Richard Eisenberg <rae@richarde.dev> | 2019-07-23 15:39:06 -0400 |
---|---|---|
committer | Marge Bot <ben+marge-bot@smart-cactus.org> | 2019-10-03 12:17:13 -0400 |
commit | 3b9d4907582e6d167cb7e7a8b1011ad3b0bf646b (patch) | |
tree | 81a58b6b594c98c3ce45e63302a41ab76be74a1a /compiler/prelude | |
parent | 60229e9ee23afd302766475462767516cc294409 (diff) | |
download | haskell-3b9d4907582e6d167cb7e7a8b1011ad3b0bf646b.tar.gz |
Note [Don't flatten tuples from HsSyn] in MkCore
Previously, we would sometimes flatten 1-tuples and sometimes
not. This didn't cause damage because there is no way to
generate HsSyn with 1-tuples. But, with the upcoming fix to #16881,
there will be. Without this patch, obscure lint errors would
have resulted.
No test case, as there is not yet a way to tickle this.
Diffstat (limited to 'compiler/prelude')
-rw-r--r-- | compiler/prelude/TysWiredIn.hs | 28 |
1 files changed, 23 insertions, 5 deletions
diff --git a/compiler/prelude/TysWiredIn.hs b/compiler/prelude/TysWiredIn.hs index be4bfe1ce9..4d6b7f8027 100644 --- a/compiler/prelude/TysWiredIn.hs +++ b/compiler/prelude/TysWiredIn.hs @@ -68,7 +68,7 @@ module TysWiredIn ( justDataCon, justDataConName, promotedJustDataCon, -- * Tuples - mkTupleTy, mkBoxedTupleTy, + mkTupleTy, mkTupleTy1, mkBoxedTupleTy, tupleTyCon, tupleDataCon, tupleTyConName, promotedTupleDataCon, unitTyCon, unitDataCon, unitDataConId, unitTy, unitTyConKey, @@ -695,9 +695,18 @@ for one-tuples. So in ghc-prim:GHC.Tuple we see the declarations: data Unit a = Unit a data (a,b) = (a,b) +There is no way to write a boxed one-tuple in Haskell, but it can be +created in Template Haskell or in, e.g., `deriving` code. There is +nothing special about one-tuples in Core; in particular, they have no +custom pretty-printing, just using `Unit`. + NB (Feb 16): for /constraint/ one-tuples I have 'Unit%' but no class decl in GHC.Classes, so I think this part may not work properly. But it's unused I think. + +See also Note [Flattening one-tuples] in MkCore and +Note [Don't flatten tuples from HsSyn] in MkCore. + -} -- | Built-in syntax isn't "in scope" so these OccNames map to wired-in Names @@ -1556,15 +1565,24 @@ done by enumeration\srcloc{lib/prelude/InTup?.hs}. -} -- | Make a tuple type. The list of types should /not/ include any --- RuntimeRep specifications. +-- RuntimeRep specifications. Boxed 1-tuples are flattened. +-- See Note [One-tuples] mkTupleTy :: Boxity -> [Type] -> Type -- Special case for *boxed* 1-tuples, which are represented by the type itself mkTupleTy Boxed [ty] = ty -mkTupleTy Boxed tys = mkTyConApp (tupleTyCon Boxed (length tys)) tys -mkTupleTy Unboxed tys = mkTyConApp (tupleTyCon Unboxed (length tys)) - (map getRuntimeRep tys ++ tys) +mkTupleTy boxity tys = mkTupleTy1 boxity tys + +-- | Make a tuple type. The list of types should /not/ include any +-- RuntimeRep specifications. Boxed 1-tuples are *not* flattened. +-- See Note [One-tuples] and Note [Don't flatten tuples from HsSyn] +-- in MkCore +mkTupleTy1 :: Boxity -> [Type] -> Type +mkTupleTy1 Boxed tys = mkTyConApp (tupleTyCon Boxed (length tys)) tys +mkTupleTy1 Unboxed tys = mkTyConApp (tupleTyCon Unboxed (length tys)) + (map getRuntimeRep tys ++ tys) -- | Build the type of a small tuple that holds the specified type of thing +-- Flattens 1-tuples. See Note [One-tuples]. mkBoxedTupleTy :: [Type] -> Type mkBoxedTupleTy tys = mkTupleTy Boxed tys |