diff options
author | Vladislav Zavialov <vlad.z.4096@gmail.com> | 2019-10-30 08:44:34 +0300 |
---|---|---|
committer | Vladislav Zavialov <vlad.z.4096@gmail.com> | 2019-11-13 19:29:26 +0300 |
commit | 580bdec786315aff24dda6f4135e15ca062d4a4b (patch) | |
tree | 4b1666d14a368ef6333f57e2e9dd1be99acda77a /testsuite/tests | |
parent | a06cfb59d21c9cf6f53a8b1acedb075988a6c5ca (diff) | |
download | haskell-580bdec786315aff24dda6f4135e15ca062d4a4b.tar.gz |
Whitespace-sensitive bang patterns (#1087, #17162)
This patch implements a part of GHC Proposal #229 that covers three
operators:
* the bang operator (!)
* the tilde operator (~)
* the at operator (@)
Based on surrounding whitespace, these operators are disambiguated into
bang patterns, lazy patterns, strictness annotations, and type
applications.
This patch does NOT cover ($), ($$), and (-), which are left as future
work.
Metric Increase:
parsing001
Naperian
T4801
Metric Increase (test_env='i386-linux-deb9'):
haddock.base
haddock.Cabal
haddock.compiler
T14683
Diffstat (limited to 'testsuite/tests')
28 files changed, 119 insertions, 41 deletions
diff --git a/testsuite/tests/ghc-api/annotations/T10358.stdout b/testsuite/tests/ghc-api/annotations/T10358.stdout index 604c7dab36..28f516cb5e 100644 --- a/testsuite/tests/ghc-api/annotations/T10358.stdout +++ b/testsuite/tests/ghc-api/annotations/T10358.stdout @@ -16,12 +16,12 @@ ((Test10358.hs:(4,1)-(8,6),AnnSemi), [Test10358.hs:9:1]), ((Test10358.hs:(5,3)-(8,6),AnnIn), [Test10358.hs:8:3-4]), ((Test10358.hs:(5,3)-(8,6),AnnLet), [Test10358.hs:5:3-5]), -((Test10358.hs:5:7-16,AnnBang), [Test10358.hs:5:7]), +((Test10358.hs:5:7-10,AnnBang), [Test10358.hs:5:7]), ((Test10358.hs:5:7-16,AnnEqual), [Test10358.hs:5:12]), ((Test10358.hs:5:7-16,AnnFunId), [Test10358.hs:5:8-10]), ((Test10358.hs:5:7-16,AnnSemi), [Test10358.hs:5:17]), ((Test10358.hs:5:14-16,AnnVal), [Test10358.hs:5:15]), -((Test10358.hs:5:19-32,AnnBang), [Test10358.hs:5:19]), +((Test10358.hs:5:19-22,AnnBang), [Test10358.hs:5:19]), ((Test10358.hs:5:19-32,AnnEqual), [Test10358.hs:5:24]), ((Test10358.hs:5:19-32,AnnFunId), [Test10358.hs:5:20-22]), ((Test10358.hs:5:19-32,AnnSemi), [Test10358.hs:6:7]), diff --git a/testsuite/tests/module/mod69.stderr b/testsuite/tests/module/mod69.stderr index db7487485e..dea161115e 100644 --- a/testsuite/tests/module/mod69.stderr +++ b/testsuite/tests/module/mod69.stderr @@ -1,4 +1,4 @@ mod69.hs:3:7: error: - Pattern syntax in expression context: x@1 - Did you mean to enable TypeApplications? + @-pattern in expression context: x@1 + Type application syntax requires a space before '@' diff --git a/testsuite/tests/module/mod70.stderr b/testsuite/tests/module/mod70.stderr index 093f166ebd..6e9f854b7a 100644 --- a/testsuite/tests/module/mod70.stderr +++ b/testsuite/tests/module/mod70.stderr @@ -1,2 +1,4 @@ -mod70.hs:3:9: error: Pattern syntax in expression context: ~1 +mod70.hs:3:9: error: + Lazy pattern in expression context: ~1 + Did you mean to add a space after the '~'? diff --git a/testsuite/tests/parser/should_compile/T1087.hs b/testsuite/tests/parser/should_compile/T1087.hs new file mode 100644 index 0000000000..9ad85e2b7a --- /dev/null +++ b/testsuite/tests/parser/should_compile/T1087.hs @@ -0,0 +1,14 @@ +{-# LANGUAGE BangPatterns #-} + +module T1087 where + +prefix_1 = let at a !b = False in at 1 2 +prefix_2 = let (.!.) a !b = False in 1 .!. 2 + +infix_tilde_1 = let a `at` ~b = False in at 1 2 +infix_tilde_2 = let a .!. ~b = False in 1 .!. 2 +infix_tilde_3 = let ~a .!. b = False in 1 .!. 2 + +infix_bang_1 = let a .!. !b = False in 1 .!. 2 +infix_bang_2 = let a `at` !b = False in at 1 2 +infix_bang_3 = let !a .!. b = False in 1 .!. 2 diff --git a/testsuite/tests/parser/should_compile/T16619.stderr b/testsuite/tests/parser/should_compile/T16619.stderr new file mode 100644 index 0000000000..b5dfb89623 --- /dev/null +++ b/testsuite/tests/parser/should_compile/T16619.stderr @@ -0,0 +1,3 @@ + +T16619.hs:2:12: warning: + -Wmissing-space-after-bang is deprecated: bang patterns can no longer be written with a space diff --git a/testsuite/tests/parser/should_compile/all.T b/testsuite/tests/parser/should_compile/all.T index 3d44e22510..8b919f1b38 100644 --- a/testsuite/tests/parser/should_compile/all.T +++ b/testsuite/tests/parser/should_compile/all.T @@ -145,3 +145,7 @@ test('T16339', normal, compile, ['']) test('T16619', req_th, multimod_compile, ['T16619', '-v0']) test('T504', normal, compile, ['']) test('T515', literate, compile, ['-Wall']) +test('T1087', normal, compile, ['']) +test('proposal-229a', normal, compile, ['']) +test('proposal-229b', normal, compile, ['']) +test('proposal-229d', normal, compile, ['']) diff --git a/testsuite/tests/parser/should_compile/proposal-229a.hs b/testsuite/tests/parser/should_compile/proposal-229a.hs new file mode 100644 index 0000000000..c773cee3a2 --- /dev/null +++ b/testsuite/tests/parser/should_compile/proposal-229a.hs @@ -0,0 +1,8 @@ +{-# LANGUAGE BangPatterns #-} + +module Proposal229a where + +data T a b = a :! b + +(!) :: x -> T a b -> (x, a, b) +~u ! !(!m :! !n) = (u, m, n) diff --git a/testsuite/tests/parser/should_compile/proposal-229b.hs b/testsuite/tests/parser/should_compile/proposal-229b.hs new file mode 100644 index 0000000000..9182623e54 --- /dev/null +++ b/testsuite/tests/parser/should_compile/proposal-229b.hs @@ -0,0 +1,10 @@ +module Proposal229b ((~), (@)) where + +(~) :: a -> b -> (a, b) +x ~ y = (x, y) + +(@) :: a -> b -> (a, b) +x @ y = (x, y) + +r :: ((Bool, Bool), Bool) +r = True ~ False @ True diff --git a/testsuite/tests/parser/should_compile/proposal-229d.hs b/testsuite/tests/parser/should_compile/proposal-229d.hs new file mode 100644 index 0000000000..24a57ca872 --- /dev/null +++ b/testsuite/tests/parser/should_compile/proposal-229d.hs @@ -0,0 +1,6 @@ +{-# LANGUAGE BangPatterns #-} + +module Proposal229d ((!)) where + +(!) :: a -> b -> (a, b) +x ! y = (x,y) -- parsed as an operator even with BangPatterns enabled diff --git a/testsuite/tests/parser/should_fail/T14588.stderr b/testsuite/tests/parser/should_fail/T14588.stderr index cb64103814..2efd9561e8 100644 --- a/testsuite/tests/parser/should_fail/T14588.stderr +++ b/testsuite/tests/parser/should_fail/T14588.stderr @@ -1,4 +1,4 @@ T14588.hs:3:19: error: Illegal bang-pattern (use BangPatterns): - ! x + !x diff --git a/testsuite/tests/parser/should_fail/T16270.stderr b/testsuite/tests/parser/should_fail/T16270.stderr index f4e90e40fc..a74bdeb8f0 100644 --- a/testsuite/tests/parser/should_fail/T16270.stderr +++ b/testsuite/tests/parser/should_fail/T16270.stderr @@ -1,4 +1,7 @@ +T16270.hs:2:12: warning: + -Werror=missing-space-after-bang is deprecated: bang patterns can no longer be written with a space + T16270.hs:7:1: warning: [-Wtabs (in -Wdefault)] Tab character found here, and in five further locations. Please use spaces instead. @@ -46,10 +49,9 @@ T16270.hs:23:10: error: Perhaps you intended to use GADTs or a similar language extension to enable syntax: data T where -T16270.hs:25:12: error: [-Wmissing-space-after-bang (in -Wdefault), -Werror=missing-space-after-bang] - Did you forget to enable BangPatterns? - If you mean to bind (!) then perhaps you want - to add a space after the bang for clarity. +T16270.hs:25:12: error: + Illegal bang-pattern (use BangPatterns): + !i T16270.hs:27:9: error: Multi-way if-expressions need MultiWayIf turned on @@ -57,13 +59,13 @@ T16270.hs:27:9: error: T16270.hs:29:9: error: Multi-way if-expressions need MultiWayIf turned on -T16270.hs:32:6: Illegal lambda-case (use LambdaCase) +T16270.hs:32:6: error: Illegal lambda-case (use LambdaCase) -T16270.hs:35:5: +T16270.hs:35:5: error: Use NumericUnderscores to allow underscores in integer literals -T16270.hs:37:5: - primitive string literal must contain only characters <= '/xFF' +T16270.hs:37:5: error: + primitive string literal must contain only characters <= '\xFF' T16270.hs:43:1: error: parse error (possibly incorrect indentation or mismatched brackets) diff --git a/testsuite/tests/parser/should_fail/T17162.hs b/testsuite/tests/parser/should_fail/T17162.hs new file mode 100644 index 0000000000..6419da7544 --- /dev/null +++ b/testsuite/tests/parser/should_fail/T17162.hs @@ -0,0 +1,13 @@ +-- {-# LANGUAGE NoBangPatterns #-} + +module T17162 where + +charIsRepresentable :: TextEncoding -> Char -> IO Bool +charIsRepresentable !enc c = + withCString enc [c] + (\cstr -> do str <- peekCString enc cstr + case str of + [ch] | ch == c -> pure True + _ -> pure False) + `catch` + \(_ :: IOException) -> pure False diff --git a/testsuite/tests/parser/should_fail/T17162.stderr b/testsuite/tests/parser/should_fail/T17162.stderr new file mode 100644 index 0000000000..d621e08ccc --- /dev/null +++ b/testsuite/tests/parser/should_fail/T17162.stderr @@ -0,0 +1,4 @@ + +T17162.hs:6:21: error: + Illegal bang-pattern (use BangPatterns): + !enc diff --git a/testsuite/tests/parser/should_fail/T3811b.stderr b/testsuite/tests/parser/should_fail/T3811b.stderr index f4e44c603c..65de1d5a75 100644 --- a/testsuite/tests/parser/should_fail/T3811b.stderr +++ b/testsuite/tests/parser/should_fail/T3811b.stderr @@ -1,4 +1,4 @@ T3811b.hs:4:14: error: Cannot parse data constructor in a data/newtype declaration: - ! B + !B diff --git a/testsuite/tests/parser/should_fail/T3811c.stderr b/testsuite/tests/parser/should_fail/T3811c.stderr index 431318e268..52f081bbe6 100644 --- a/testsuite/tests/parser/should_fail/T3811c.stderr +++ b/testsuite/tests/parser/should_fail/T3811c.stderr @@ -1,5 +1,6 @@ -T3811c.hs:6:11: error: - Strictness annotation applied to a compound type. - Did you mean to add parentheses? - !(Show D) +T3811c.hs:6:10: error: + Illegal class instance: ‘!Show D’ + Class instances must be of the form + context => C ty_1 ... ty_n + where ‘C’ is a class diff --git a/testsuite/tests/parser/should_fail/T3811f.stderr b/testsuite/tests/parser/should_fail/T3811f.stderr index 2d31fa86cf..783a89e284 100644 --- a/testsuite/tests/parser/should_fail/T3811f.stderr +++ b/testsuite/tests/parser/should_fail/T3811f.stderr @@ -1,5 +1,3 @@ -T3811f.hs:4:8: error: - Strictness annotation applied to a compound type. - Did you mean to add parentheses? - !(Foo a) +T3811f.hs:4:7: error: + Malformed head of type or class declaration: !Foo a diff --git a/testsuite/tests/parser/should_fail/all.T b/testsuite/tests/parser/should_fail/all.T index 2fc7f3d326..c4a7a4f67b 100644 --- a/testsuite/tests/parser/should_fail/all.T +++ b/testsuite/tests/parser/should_fail/all.T @@ -161,3 +161,5 @@ test('patFail006', normal, compile_fail, ['']) test('patFail007', normal, compile_fail, ['']) test('patFail008', normal, compile_fail, ['']) test('patFail009', normal, compile_fail, ['']) +test('T17162', normal, compile_fail, ['']) +test('proposal-229c', normal, compile_fail, ['']) diff --git a/testsuite/tests/parser/should_fail/proposal-229c.hs b/testsuite/tests/parser/should_fail/proposal-229c.hs new file mode 100644 index 0000000000..344311b2a1 --- /dev/null +++ b/testsuite/tests/parser/should_fail/proposal-229c.hs @@ -0,0 +1,6 @@ +{-# LANGUAGE NoBangPatterns #-} + +module Proposal229c (f) where + +-- should recommend to enable BangPatterns instead of parsing as an infix operator +f !x = x diff --git a/testsuite/tests/parser/should_fail/proposal-229c.stderr b/testsuite/tests/parser/should_fail/proposal-229c.stderr new file mode 100644 index 0000000000..965801a3c3 --- /dev/null +++ b/testsuite/tests/parser/should_fail/proposal-229c.stderr @@ -0,0 +1,4 @@ + +proposal-229c.hs:6:3: error: + Illegal bang-pattern (use BangPatterns): + !x diff --git a/testsuite/tests/parser/should_fail/strictnessDataCon_A.stderr b/testsuite/tests/parser/should_fail/strictnessDataCon_A.stderr index c02d2ee974..27e6c709a5 100644 --- a/testsuite/tests/parser/should_fail/strictnessDataCon_A.stderr +++ b/testsuite/tests/parser/should_fail/strictnessDataCon_A.stderr @@ -1,3 +1,3 @@ strictnessDataCon_A.hs:1:27: error: - Strictness annotation cannot appear in this position. + Operator applied to too few arguments: ! diff --git a/testsuite/tests/rename/should_fail/T12879.stderr b/testsuite/tests/rename/should_fail/T12879.stderr index 1b3559c255..0c6b7f36f5 100644 --- a/testsuite/tests/rename/should_fail/T12879.stderr +++ b/testsuite/tests/rename/should_fail/T12879.stderr @@ -1,4 +1,4 @@ T12879.hs:4:7: error: - Pattern syntax in expression context: x@x + @-pattern in expression context: x@x Type application syntax requires a space before '@' diff --git a/testsuite/tests/rename/should_fail/rnfail016.stderr b/testsuite/tests/rename/should_fail/rnfail016.stderr index 47436132f2..6ed450ce0b 100644 --- a/testsuite/tests/rename/should_fail/rnfail016.stderr +++ b/testsuite/tests/rename/should_fail/rnfail016.stderr @@ -1,4 +1,4 @@ rnfail016.hs:6:7: error: - Pattern syntax in expression context: x@x - Did you mean to enable TypeApplications? + @-pattern in expression context: x@x + Type application syntax requires a space before '@' diff --git a/testsuite/tests/rename/should_fail/rnfail016a.stderr b/testsuite/tests/rename/should_fail/rnfail016a.stderr index 3a59ee7478..544cf58cac 100644 --- a/testsuite/tests/rename/should_fail/rnfail016a.stderr +++ b/testsuite/tests/rename/should_fail/rnfail016a.stderr @@ -1,2 +1,2 @@ -rnfail016a.hs:6:7: error: Pattern syntax in expression context: ~x +rnfail016a.hs:6:7: error: parse error on input ‘~’ diff --git a/testsuite/tests/rename/should_fail/rnfail051.stderr b/testsuite/tests/rename/should_fail/rnfail051.stderr index 9c45a6168b..c1f4f43a2f 100644 --- a/testsuite/tests/rename/should_fail/rnfail051.stderr +++ b/testsuite/tests/rename/should_fail/rnfail051.stderr @@ -1,3 +1,3 @@ rnfail051.hs:7:17: error: - Pattern syntax in expression context: _ -> putStrLn "_" + View pattern in expression context: _ -> putStrLn "_" diff --git a/testsuite/tests/th/T12411.stderr b/testsuite/tests/th/T12411.stderr index 1f344323bd..22f7de0190 100644 --- a/testsuite/tests/th/T12411.stderr +++ b/testsuite/tests/th/T12411.stderr @@ -1,4 +1,6 @@ T12411.hs:4:1: error: - Pattern syntax in expression context: pure@Q - Did you mean to enable TypeApplications? + Illegal visible type application ‘@Q’ + Perhaps you intended to use TypeApplications + +T12411.hs:4:7: error: Not in scope: type constructor or class ‘Q’ diff --git a/testsuite/tests/typecheck/should_fail/T14761b.stderr b/testsuite/tests/typecheck/should_fail/T14761b.stderr index 08a319cde3..af557c4725 100644 --- a/testsuite/tests/typecheck/should_fail/T14761b.stderr +++ b/testsuite/tests/typecheck/should_fail/T14761b.stderr @@ -1,5 +1,2 @@ -T14761b.hs:5:21: error: - Strictness annotation applied to a compound type. - Did you mean to add parentheses? - !(Maybe Int) +T14761b.hs:5:19: error: Operator applied to too few arguments: ! diff --git a/testsuite/tests/typecheck/should_fail/T15527.stderr b/testsuite/tests/typecheck/should_fail/T15527.stderr index dd03a0a0ca..8908b17218 100644 --- a/testsuite/tests/typecheck/should_fail/T15527.stderr +++ b/testsuite/tests/typecheck/should_fail/T15527.stderr @@ -1,4 +1,4 @@ T15527.hs:4:6: error: - Pattern syntax in expression context: (.)@Int - Did you mean to enable TypeApplications? + Illegal visible type application ‘@Int’ + Perhaps you intended to use TypeApplications diff --git a/testsuite/tests/typecheck/should_fail/T7210.stderr b/testsuite/tests/typecheck/should_fail/T7210.stderr index 4d7cb38a4d..d0ca04a84e 100644 --- a/testsuite/tests/typecheck/should_fail/T7210.stderr +++ b/testsuite/tests/typecheck/should_fail/T7210.stderr @@ -1,5 +1,7 @@ -T7210.hs:5:20: error: - Strictness annotation applied to a compound type. - Did you mean to add parentheses? - !(IntMap Int) +T7210.hs:5:19: error: + • Unexpected strictness annotation: !IntMap + strictness annotation cannot appear nested inside a type + • In the type ‘!IntMap Int’ + In the definition of data constructor ‘C’ + In the data declaration for ‘T’ |