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:

a ~ (Int -> Int)

Now desugars to:

HsOpTy a (~) (HsOpTy Int (->) Int)

Which GHC interprets as being:

a ~ Int -> Int

Or, equivalently:

(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 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:
parent 331081b0
......@@ -1437,7 +1437,13 @@ cvtTypeKind ty_str ty
| [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
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment