diff options
-rw-r--r-- | compiler/GHC/Parser/Lexer.x | 12 | ||||
-rw-r--r-- | testsuite/tests/parser/unicode/T18225A.hs | 13 | ||||
-rw-r--r-- | testsuite/tests/parser/unicode/T18225B.hs | 11 | ||||
-rw-r--r-- | testsuite/tests/parser/unicode/T18225B.stderr | 1 | ||||
-rw-r--r-- | testsuite/tests/parser/unicode/all.T | 2 |
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, ['']) |