summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--compiler/GHC/Parser/Lexer.x12
-rw-r--r--testsuite/tests/parser/unicode/T18225A.hs13
-rw-r--r--testsuite/tests/parser/unicode/T18225B.hs11
-rw-r--r--testsuite/tests/parser/unicode/T18225B.stderr1
-rw-r--r--testsuite/tests/parser/unicode/all.T2
5 files changed, 35 insertions, 4 deletions
diff --git a/compiler/GHC/Parser/Lexer.x b/compiler/GHC/Parser/Lexer.x
index 5bdf4c41f3..7606dd3f9e 100644
--- a/compiler/GHC/Parser/Lexer.x
+++ b/compiler/GHC/Parser/Lexer.x
@@ -564,11 +564,11 @@ $tab { warnTab }
--
-- The precise rules are as follows:
--
--- * Identifiers, literals, and opening brackets (, (#, [, [|, [||, [p|, [e|,
--- [t|, {, are considered "opening tokens". The function followedByOpeningToken
--- tests whether the next token is an opening token.
+-- * Identifiers, literals, and opening brackets (, (#, (|, [, [|, [||, [p|,
+-- [e|, [t|, {, ⟦, ⦇, are considered "opening tokens". The function
+-- followedByOpeningToken tests whether the next token is an opening token.
--
--- * Identifiers, literals, and closing brackets ), #), ], |], },
+-- * Identifiers, literals, and closing brackets ), #), |), ], |], }, ⟧, ⦈,
-- are considered "closing tokens". The function precededByClosingToken tests
-- whether the previous token is a closing token.
--
@@ -1068,6 +1068,8 @@ followedByOpeningToken _ _ _ (AI _ buf)
('\"', _) -> True
('\'', _) -> True
('_', _) -> True
+ ('⟦', _) -> True
+ ('⦇', _) -> True
(c, _) -> isAlphaNum c
-- See Note [Whitespace-sensitive operator parsing]
@@ -1080,6 +1082,8 @@ precededByClosingToken _ (AI _ buf) _ _ =
'\"' -> True
'\'' -> True
'_' -> True
+ '⟧' -> True
+ '⦈' -> True
c -> isAlphaNum c
{-# INLINE nextCharIs #-}
diff --git a/testsuite/tests/parser/unicode/T18225A.hs b/testsuite/tests/parser/unicode/T18225A.hs
new file mode 100644
index 0000000000..5e340a3fe6
--- /dev/null
+++ b/testsuite/tests/parser/unicode/T18225A.hs
@@ -0,0 +1,13 @@
+{-# LANGUAGE TemplateHaskell #-}
+{-# LANGUAGE UnicodeSyntax #-}
+
+module T18225A where
+
+(!) :: IO a -> b -> b
+(!) _ = id
+
+test1 :: Int
+test1 = $⟦1⟧
+
+test2 :: Int
+test2 = ⟦2⟧!2
diff --git a/testsuite/tests/parser/unicode/T18225B.hs b/testsuite/tests/parser/unicode/T18225B.hs
new file mode 100644
index 0000000000..5bd15f1e13
--- /dev/null
+++ b/testsuite/tests/parser/unicode/T18225B.hs
@@ -0,0 +1,11 @@
+{-# LANGUAGE Arrows #-}
+{-# LANGUAGE TemplateHaskell #-}
+{-# LANGUAGE UnicodeSyntax #-}
+
+module T18225B where
+
+f :: (a, (b, c)) -> b
+f (_, (x, _)) = x
+
+test :: a -> a
+test = proc x -> ⦇f⦈$([|x|])
diff --git a/testsuite/tests/parser/unicode/T18225B.stderr b/testsuite/tests/parser/unicode/T18225B.stderr
new file mode 100644
index 0000000000..67cff08f21
--- /dev/null
+++ b/testsuite/tests/parser/unicode/T18225B.stderr
@@ -0,0 +1 @@
+T18225B.hs:11:23: Parse error in command: [| x |]
diff --git a/testsuite/tests/parser/unicode/all.T b/testsuite/tests/parser/unicode/all.T
index 55f7fd09be..54a3b7cb1f 100644
--- a/testsuite/tests/parser/unicode/all.T
+++ b/testsuite/tests/parser/unicode/all.T
@@ -28,3 +28,5 @@ test('T10907', normal, compile, [''])
test('T7650', normal, compile, [''])
test('brackets', normal, compile, [''])
+test('T18225A', normal, compile, [''])
+test('T18225B', normal, compile_fail, [''])