Skip to content
  • Ryan Scott's avatar
    Fix #15815 by parenthesizing the arguments to infix ~ · b8a797ec
    Ryan Scott authored
    An unfortunate consequence of commit
    b9483981 (`Remove HsEqTy and XEqTy`)
    is infix uses of `~` in TH quotes now desugar differently than
    before. In particular, we have that:
    
    ```haskell
    a ~ (Int -> Int)
    ```
    
    Now desugars to:
    
    ```haskell
    HsOpTy a (~) (HsOpTy Int (->) Int)
    ```
    
    Which GHC interprets as being:
    
    ```haskell
    a ~ Int -> Int
    ```
    
    Or, equivalently:
    
    ```haskell
    (a ~ Int) -> Int
    ```
    
    Which is different than what was intended! This is the cause
    of #15815.
    
    All of this has revealed that we likely need to renovate the way we
    desugar infix type operators to be more consistent with the treatment
    for infix expressions (see
    https://ghc.haskell.org/trac/ghc/ticket/15815#comment:5 for more on
    this.) Doing so would constitute a breaking change, however, so we
    will likely want to wait until another major GHC release to do this.
    
    In the meantime, this patch offers a non-invasive change to the way
    that infix uses of `~` are desugared. This makes the program
    in #15815 compile again by inserting extra `HsParTy`s around the
    arguments to `~` if they are lacking them.
    
    Test Plan: make test TEST=T15815
    
    Reviewers: int-index, goldfire, bgamari
    
    Reviewed By: int-index
    
    Subscribers: int-e, rwbarton, carter
    
    GHC Trac Issues: #15815
    
    Differential Revision: https://phabricator.haskell.org/D5274
    b8a797ec