Skip to content

-ddump-splices doesn't parenthesize type/data families correctly in 8.2.1

The pretty-printed code which -ddump-splices has regressed since 8.0. If you compile this code:

{-# LANGUAGE TemplateHaskell #-}                                                          
{-# LANGUAGE TypeFamilies #-}                                                             
{-# OPTIONS_GHC -ddump-splices #-}                                                        
module Bug where                                                                          
                                                                                          
$([d| type family Foo a b                                                                 
      type instance Foo (Maybe a) b = Either (Maybe a) (Maybe b)                          
                                                                                          
      data family Bar a b                                                                 
      data instance Bar (Maybe a) b = BarMaybe (Maybe a) (Maybe b)                        
    |])

with GHC 8.0.2, you get this:

GHCi, version 8.0.2: http://www.haskell.org/ghc/  :? for help                             
Loaded GHCi configuration from /home/rgscott/.ghci                                        
[1 of 1] Compiling Bug              ( Bug.hs, interpreted )                               
Bug.hs:(6,3)-(11,6): Splicing declarations                                                
    [d| type family Foo_a13C a_a13G b_a13H
        data family Bar_a13B a_a13E b_a13F
        
        data instance Bar_a13B (Maybe a_a13I) b_a13J
          = BarMaybe_a13D (Maybe a_a13I) (Maybe b_a13J)
        type instance Foo_a13C (Maybe a_a13K) b_a13L = Either (Maybe a_a13K) (Maybe b_a13L) |]
  ======>
    type family Foo_a3O6 a_a3O9 b_a3Oa
    type instance Foo_a3O6 (Maybe a_a3Ob) b_a3Oc = Either (Maybe a_a3Ob) (Maybe b_a3Oc)
    data family Bar_a3O7 a_a3Od b_a3Oe
    data instance Bar_a3O7 (Maybe a_a3Of) b_a3Og
      = BarMaybe_a3O8 (Maybe a_a3Of) (Maybe b_a3Og)

Looks good. But in GHC 8.2.1, the output of -ddump-splices lacks many sets of parentheses which are necessary for correctness!

GHCi, version 8.2.0.20170403: http://www.haskell.org/ghc/  :? for help
Loaded GHCi configuration from /home/rgscott/.ghci
[1 of 1] Compiling Bug              ( Bug.hs, interpreted )
Bug.hs:(6,3)-(11,6): Splicing declarations
    [d| type family Foo_a1ty a_a1tC b_a1tD
        data family Bar_a1tx a_a1tA b_a1tB
        
        type instance Foo_a1ty (Maybe a_a1tG) b_a1tH = Either (Maybe a_a1tG) (Maybe b_a1tH)
        data instance Bar_a1tx (Maybe a_a1tE) b_a1tF
          = BarMaybe_a1tz (Maybe a_a1tE) (Maybe b_a1tF) |]
  ======>
    type family Foo_a4ia a_a4id b_a4ie
    type instance Foo_a4ia Maybe a_a4if b_a4ig = Either (Maybe a_a4if) (Maybe b_a4ig)
    data family Bar_a4ib a_a4ih b_a4ii
    data instance Bar_a4ib Maybe a_a4ij b_a4ik
      = BarMaybe_a4ic Maybe a_a4ij Maybe b_a4ik

This pops up both in the arguments to type instance Foo ... and data instance Bar ..., as well as the arguments to the data constructor BarMaybe.

cc'ing alanz, since I suspect this is related to #13199 (closed).

Trac metadata
Trac field Value
Version 8.1
Type Bug
TypeOfFailure OtherFailure
Priority normal
Resolution Unresolved
Component Template Haskell
Test case
Differential revisions
BlockedBy
Related
Blocking
CC alanz
Operating system
Architecture
To upload designs, you'll need to enable LFS and have an admin enable hashed storage. More information