summaryrefslogtreecommitdiff
path: root/testsuite
diff options
context:
space:
mode:
authorRyan Scott <ryan.gl.scott@gmail.com>2018-10-28 16:08:11 -0400
committerBen Gamari <ben@smart-cactus.org>2018-10-30 14:58:32 -0400
commit2567e8f341ef638b8a93054d1be75c176bfaee66 (patch)
treef98fb41a009e91224e6f635668427d2e7d863fbc /testsuite
parent377fe39888b1c711d15c94583ec83680d8ae7bf4 (diff)
downloadhaskell-2567e8f341ef638b8a93054d1be75c176bfaee66.tar.gz
Fix #15815 by parenthesizing the arguments to infix ~
An unfortunate consequence of commit b9483981d128f55d8dae3f434f49fa6b5b30c779 (`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 (cherry picked from commit b8a797ecc34a309bd78f5a290e3554642a3a478a)
Diffstat (limited to 'testsuite')
-rw-r--r--testsuite/tests/th/T15815A.hs7
-rw-r--r--testsuite/tests/th/T15815B.hs6
-rw-r--r--testsuite/tests/th/all.T2
3 files changed, 15 insertions, 0 deletions
diff --git a/testsuite/tests/th/T15815A.hs b/testsuite/tests/th/T15815A.hs
new file mode 100644
index 0000000000..4025f3856c
--- /dev/null
+++ b/testsuite/tests/th/T15815A.hs
@@ -0,0 +1,7 @@
+{-# LANGUAGE TemplateHaskell #-}
+module T15815A where
+
+mkFoo tyQ = [d|
+ foo :: a ~ $(tyQ) => a
+ foo = undefined
+ |]
diff --git a/testsuite/tests/th/T15815B.hs b/testsuite/tests/th/T15815B.hs
new file mode 100644
index 0000000000..32bf2edfd5
--- /dev/null
+++ b/testsuite/tests/th/T15815B.hs
@@ -0,0 +1,6 @@
+{-# LANGUAGE TemplateHaskell, GADTs #-}
+module T15815B where
+
+import T15815A
+
+mkFoo [t| Int -> Int |]
diff --git a/testsuite/tests/th/all.T b/testsuite/tests/th/all.T
index 6e564461e0..ddc2708f1e 100644
--- a/testsuite/tests/th/all.T
+++ b/testsuite/tests/th/all.T
@@ -425,3 +425,5 @@ test('T15550', normal, compile, ['-v0 -ddump-splices -dsuppress-uniques'])
test('T15572', normal, compile, ['-v0 -ddump-splices -dsuppress-uniques'])
test('T15481', normal, compile, ['-v0 -ddump-splices -dsuppress-uniques'])
test('TH_recover_warns', normal, compile, ['-v0 -ddump-splices -dsuppress-uniques'])
+test('T15815', normal, multimod_compile,
+ ['T15815B', '-v0 ' + config.ghc_th_way_flags])