diff options
author | Simon Peyton Jones <simonpj@microsoft.com> | 2018-11-15 09:02:11 +0000 |
---|---|---|
committer | Simon Peyton Jones <simonpj@microsoft.com> | 2018-11-15 11:50:52 +0000 |
commit | ae2c9b40f5b6bf272251d1f4107c60003f541b62 (patch) | |
tree | eb786f1cd10c872df876871a44baf7a2ef97abef /compiler/utils | |
parent | 0ce66be953becf7c9de3cbea406953306b4db3b1 (diff) | |
download | haskell-ae2c9b40f5b6bf272251d1f4107c60003f541b62.tar.gz |
Smarter HsType pretty-print for promoted datacons
Fix Trac #15898, by being smarter about when to print
a space before a promoted data constructor, in a HsType.
I had to implement a mildly tiresome function
HsType.lhsTypeHasLeadingPromotionQuote
It has multiple cases, of course, but it's very simple.
The patch improves the error-message output in a bunch of
cases, and (to my surprise) actually fixes a bug in the
output of T14343 (Trac #14343), thus
- In the expression: _ :: Proxy '('( 'True, 'False), 'False)
+ In the expression: _ :: Proxy '( '( 'True, 'False), 'False)
I discovered that there were two copies of the PromotionFlag
type (a boolean, with helpfully named data cons), one in
IfaceType and one in HsType. So I combined into one,
PromotionFlag, and moved it to BasicTypes. That's why
quite a few files are touched, but it's all routine.
Diffstat (limited to 'compiler/utils')
-rw-r--r-- | compiler/utils/Binary.hs | 11 |
1 files changed, 11 insertions, 0 deletions
diff --git a/compiler/utils/Binary.hs b/compiler/utils/Binary.hs index a38af74efe..63efd14a5b 100644 --- a/compiler/utils/Binary.hs +++ b/compiler/utils/Binary.hs @@ -945,6 +945,17 @@ instance Binary LeftOrRight where 0 -> return CLeft _ -> return CRight } +instance Binary PromotionFlag where + put_ bh NotPromoted = putByte bh 0 + put_ bh IsPromoted = putByte bh 1 + + get bh = do + n <- getByte bh + case n of + 0 -> return NotPromoted + 1 -> return IsPromoted + _ -> fail "Binary(IsPromoted): fail)" + instance Binary Fingerprint where put_ h (Fingerprint w1 w2) = do put_ h w1; put_ h w2 get h = do w1 <- get h; w2 <- get h; return (Fingerprint w1 w2) |