Handle Char#, Addr# in TH quasiquoter (fixes #10620)
authorRyanGlScott <ryan.gl.scott@ku.edu>
Thu, 16 Jul 2015 22:05:14 +0000 (00:05 +0200)
committerBen Gamari <ben@smart-cactus.org>
Thu, 16 Jul 2015 22:08:10 +0000 (00:08 +0200)
commit2c9de9c9a3df8e855c883139b0cb2fd41801bd67
tree537691587672cacd63f077ec38d36094e7e5fb59
parent2c5c29722c78e089eda0baa7ff89154b58f23165
Handle Char#, Addr# in TH quasiquoter (fixes #10620)

DsMeta does not attempt to handle quasiquoted Char# or Addr# values,
which causes expressions like `$([| 'a'# |])` or `$([| "abc"# |])` to
fail
with an `Exotic literal not (yet) handled by Template Haskell` error.

To fix this, the API of `template-haskell` had to be changed so that
`Lit`
now has an extra constructor `CharPrimL` (a `StringPrimL` constructor
already
existed, but it wasn't used). In addition, `DsMeta` has to manipulate
`CoreExpr`s directly that involve `Word8`s. In order to do this,
`Word8` had
to be added as a wired-in type to `TysWiredIn`.

Actually converting from `HsCharPrim` and `HsStringPrim` to `CharPrimL`
and
`StringPrimL`, respectively, is pretty straightforward after that, since
both `HsCharPrim` and `CharPrimL` use `Char` internally, and
`HsStringPrim`
uses a `ByteString` internally, which can easily be converted to
`[Word8]`,
which is what `StringPrimL` uses.

Reviewers: goldfire, austin, simonpj, bgamari

Reviewed By: simonpj, bgamari

Subscribers: thomie

Differential Revision: https://phabricator.haskell.org/D1054

GHC Trac Issues: #10620
13 files changed:
compiler/deSugar/DsMeta.hs
compiler/hsSyn/Convert.hs
compiler/prelude/PrelNames.hs
compiler/prelude/THNames.hs
compiler/prelude/TysWiredIn.hs
docs/users_guide/glasgow_exts.xml
libraries/template-haskell/Language/Haskell/TH.hs
libraries/template-haskell/Language/Haskell/TH/Lib.hs
libraries/template-haskell/Language/Haskell/TH/Ppr.hs
libraries/template-haskell/Language/Haskell/TH/Syntax.hs
testsuite/tests/th/T10620.hs [new file with mode: 0644]
testsuite/tests/th/T10620.stdout [new file with mode: 0644]
testsuite/tests/th/all.T