diff --git a/compiler/prelude/TysWiredIn.hs b/compiler/prelude/TysWiredIn.hs index 18cf53093d49e8858f1c978babfc3a1f0b60fc95..6e028fcf34e2e2cbbe2b0d280c9f9864691ff446 100644 --- a/compiler/prelude/TysWiredIn.hs +++ b/compiler/prelude/TysWiredIn.hs @@ -691,6 +691,7 @@ isBuiltInOcc_maybe occ = -- unboxed tuple data/tycon "(##)" -> Just $ tup_name Unboxed 0 + "Unit#" -> Just $ tup_name Unboxed 1 _ | Just rest <- "(#" `stripPrefix` name , (commas, rest') <- BS.span (==',') rest , "#)" <- rest' diff --git a/libraries/template-haskell/Language/Haskell/TH/Syntax.hs b/libraries/template-haskell/Language/Haskell/TH/Syntax.hs index 4e21e8b841362c2b2af3aa67b2568f85cde9f098..c9bccf665f19946e03503fd28585eb100f0b04eb 100644 --- a/libraries/template-haskell/Language/Haskell/TH/Syntax.hs +++ b/libraries/template-haskell/Language/Haskell/TH/Syntax.hs @@ -1187,20 +1187,17 @@ unboxedTupleDataName :: Int -> Name -- | Unboxed tuple type constructor unboxedTupleTypeName :: Int -> Name -unboxedTupleDataName 0 = error "unboxedTupleDataName 0" -unboxedTupleDataName 1 = error "unboxedTupleDataName 1" -unboxedTupleDataName n = mk_unboxed_tup_name (n-1) DataName - -unboxedTupleTypeName 0 = error "unboxedTupleTypeName 0" -unboxedTupleTypeName 1 = error "unboxedTupleTypeName 1" -unboxedTupleTypeName n = mk_unboxed_tup_name (n-1) TcClsName +unboxedTupleDataName n = mk_unboxed_tup_name n DataName +unboxedTupleTypeName n = mk_unboxed_tup_name n TcClsName mk_unboxed_tup_name :: Int -> NameSpace -> Name -mk_unboxed_tup_name n_commas space - = Name occ (NameG space (mkPkgName "ghc-prim") tup_mod) +mk_unboxed_tup_name n space + = Name (mkOccName tup_occ) (NameG space (mkPkgName "ghc-prim") tup_mod) where - occ = mkOccName ("(#" ++ replicate n_commas ',' ++ "#)") - tup_mod = mkModName "GHC.Tuple" + tup_occ | n == 1 = "Unit#" -- See Note [One-tuples] in TysWiredIn + | otherwise = "(#" ++ replicate n_commas ',' ++ "#)" + n_commas = n - 1 + tup_mod = mkModName "GHC.Tuple" ----------------------------------------------------- -- Locations diff --git a/libraries/template-haskell/changelog.md b/libraries/template-haskell/changelog.md index c4b8f034cfb5cfcfe260f3cc7ea89b2c08ad5094..1f41a6a5283f67550baea4b8ab2d96881f64637d 100644 --- a/libraries/template-haskell/changelog.md +++ b/libraries/template-haskell/changelog.md @@ -16,6 +16,9 @@ * Add support for attaching deriving strategies to `deriving` statements (#10598) + * `unboxedTupleTypeName` and `unboxedTupleDataName` now work for unboxed + 0-tuples and 1-tuples (#12977) + ## 2.11.0.0 *May 2016* * Bundled with GHC 8.0.1 diff --git a/testsuite/tests/th/T12977.hs b/testsuite/tests/th/T12977.hs new file mode 100644 index 0000000000000000000000000000000000000000..69832b89d883fd8578ddb33918d68d9a2939a7ef --- /dev/null +++ b/testsuite/tests/th/T12977.hs @@ -0,0 +1,12 @@ +{-# LANGUAGE TemplateHaskell #-} +{-# LANGUAGE UnboxedTuples #-} +module T12977 where + +import Language.Haskell.TH.Lib +import Language.Haskell.TH.Syntax + +zero :: () -> $(conT (unboxedTupleTypeName 0)) +zero () = $(conE (unboxedTupleDataName 0)) + +one :: () -> $(conT (unboxedTupleTypeName 1) `appT` conT ''Int) +one () = $(conE (unboxedTupleDataName 1)) 42 diff --git a/testsuite/tests/th/all.T b/testsuite/tests/th/all.T index b144419f45cd760ec9539bbde1c1ffe34f6b7d38..c2c9fa28fd71c97d0956d7b7d2d4bf10c4e44d17 100644 --- a/testsuite/tests/th/all.T +++ b/testsuite/tests/th/all.T @@ -444,3 +444,4 @@ test('T12646', normal, compile, ['-v0']) test('T12788', extra_clean(['T12788_Lib.hi', 'T12788_Lib.o']), multimod_compile_fail, ['T12788.hs', '-v0 ' + config.ghc_th_way_flags]) +test('T12977', normal, compile, ['-v0'])