UnboxedTuples can't be used as constraints
authorHE, Tao <sighingnow@gmail.com>
Thu, 1 Feb 2018 02:40:03 +0000 (21:40 -0500)
committerBen Gamari <ben@smart-cactus.org>
Thu, 1 Feb 2018 04:29:31 +0000 (23:29 -0500)
Fixes #14740.

Test Plan: make test TEST="14740"

Reviewers: bgamari, simonpj

Reviewed By: simonpj

Subscribers: simonpj, rwbarton, thomie, carter

GHC Trac Issues: #14740

Differential Revision: https://phabricator.haskell.org/D4359

compiler/parser/RdrHsSyn.hs
testsuite/tests/parser/should_fail/T14740.hs [new file with mode: 0644]
testsuite/tests/parser/should_fail/T14740.stderr [new file with mode: 0644]
testsuite/tests/parser/should_fail/all.T

index fcb1fed..357d224 100644 (file)
@@ -849,11 +849,22 @@ checkBlockArguments expr = case unLoc expr of
            $$ text "You could write it with parentheses"
            $$ text "Or perhaps you meant to enable BlockArguments?"
 
+-- | Validate the context constraints and break up a context into a list
+-- of predicates.
+--
+-- @
+--     (Eq a, Ord b)        -->  [Eq a, Ord b]
+--     Eq a                 -->  [Eq a]
+--     (Eq a)               -->  [Eq a]
+--     (((Eq a)))           -->  [Eq a]
+-- @
 checkContext :: LHsType GhcPs -> P ([AddAnn],LHsContext GhcPs)
 checkContext (L l orig_t)
   = check [] (L l orig_t)
  where
-  check anns (L lp (HsTupleTy _ ts))   -- (Eq a, Ord b) shows up as a tuple type
+  check anns (L lp (HsTupleTy HsBoxedOrConstraintTuple ts))
+    -- (Eq a, Ord b) shows up as a tuple type. Only boxed tuples can
+    -- be used as context constraints.
     = return (anns ++ mkParensApiAnn lp,L l ts)                -- Ditto ()
 
     -- don't let HsAppsTy get in the way
diff --git a/testsuite/tests/parser/should_fail/T14740.hs b/testsuite/tests/parser/should_fail/T14740.hs
new file mode 100644 (file)
index 0000000..b56687f
--- /dev/null
@@ -0,0 +1,6 @@
+{-# LANGUAGE UnboxedTuples #-}
+
+module T14740 where
+
+x :: ((##)) => ()
+x = ()
diff --git a/testsuite/tests/parser/should_fail/T14740.stderr b/testsuite/tests/parser/should_fail/T14740.stderr
new file mode 100644 (file)
index 0000000..8827873
--- /dev/null
@@ -0,0 +1,4 @@
+
+T14740.hs:5:7:
+     Expecting a lifted type, but ‘(# #)’ is unlifted
+     In the type signature: x :: ((# #)) => ()
index 6f6331f..ef47ed3 100644 (file)
@@ -106,6 +106,7 @@ test('T8501b', normal, compile_fail, [''])
 test('T8501c', normal, compile_fail, [''])
 test('T12610', normal, compile_fail, [''])
 test('T14588', normal, compile_fail, [''])
+test('T14740', normal, compile_fail, [''])
 
 test('NoNumericUnderscores0', normal, compile_fail, [''])
 test('NoNumericUnderscores1', normal, compile_fail, [''])