Commit b8a797ec authored by Ryan Scott's avatar Ryan Scott Committed by Ben Gamari

Fix #15815 by parenthesizing the arguments to infix ~

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
parent 331081b0
......@@ -1437,7 +1437,13 @@ cvtTypeKind ty_str ty
EqualityT
| [x',y'] <- tys' ->
returnL (HsOpTy noExt x' (noLoc eqTyCon_RDR) y')
let px = parenthesizeHsType opPrec x'
py = parenthesizeHsType opPrec y'
in returnL (HsOpTy noExt px (noLoc eqTyCon_RDR) py)
-- The long-term goal is to remove the above case entirely and
-- subsume it under the case for InfixT. See #15815, comment:6,
-- for more details.
| otherwise ->
mk_apps (HsTyVar noExt NotPromoted
(noLoc eqTyCon_RDR)) tys'
......
{-# LANGUAGE TemplateHaskell #-}
module T15815A where
mkFoo tyQ = [d|
foo :: a ~ $(tyQ) => a
foo = undefined
|]
{-# LANGUAGE TemplateHaskell, GADTs #-}
module T15815B where
import T15815A
mkFoo [t| Int -> Int |]
......@@ -446,3 +446,5 @@ test('T15738', normal, compile, ['-v0 -ddump-splices -dsuppress-uniques'])
test('T15783', normal, multimod_compile,
['T15783A', '-v0 ' + config.ghc_th_way_flags])
test('T15792', normal, compile, ['-v0 -dsuppress-uniques'])
test('T15815', normal, multimod_compile,
['T15815B', '-v0 ' + config.ghc_th_way_flags])
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment