Skip to content

Commit d51506c

Browse files
NadiaYvetteandreasabel
authored andcommitted
add testcases for -XImpredicativeTypes failures
With -XImpredicativeTypes, the following occurs: basic_typeclass.i.hs:877:28: error: [GHC-36495] • tagToEnum# must appear applied to one value argument • In the first argument of ‘(&&)’, namely ‘(GHC.Exts.tagToEnum# (offset >=# 0#))’ In the expression: (GHC.Exts.tagToEnum# (offset >=# 0#)) && let check = alexIndexInt16OffAddr alex_check offset in (GHC.Exts.tagToEnum# (check ==# ord_c)) In the expression: if (GHC.Exts.tagToEnum# (offset >=# 0#)) && let check = alexIndexInt16OffAddr alex_check offset in (GHC.Exts.tagToEnum# (check ==# ord_c)) then alexIndexInt16OffAddr alex_table offset else alexIndexInt16OffAddr alex_deflt s | 877 | new_s = if GTE(offset,ILIT(0)) | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
1 parent 55e0297 commit d51506c

File tree

3 files changed

+130
-3
lines changed

3 files changed

+130
-3
lines changed

alex.cabal

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -80,6 +80,7 @@ extra-source-files:
8080
tests/gscan_typeclass.x
8181
tests/posn_typeclass.x
8282
tests/monad_typeclass.x
83+
tests/monadic_expr.x
8384
tests/monad_typeclass_bytestring.x
8485
tests/monadUserState_typeclass.x
8586
tests/monadUserState_typeclass_bytestring.x

tests/Makefile

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -86,6 +86,7 @@ ifeq "$(GHC_SHIPS_WITH_TEXT)" "yes"
8686
TEXT_DEP = -package text
8787

8888
TEXT_TESTS = \
89+
monadic_expr.x \
8990
strict_text_typeclass.x \
9091
posn_typeclass_strict_text.x \
9192
tokens_monadUserState_strict_text.x
@@ -105,12 +106,15 @@ TEST_ALEX_OPTS=
105106
%.g.hs : %.x
106107
$(ALEX) $(TEST_ALEX_OPTS) -g $< -o $@
107108

109+
%.i.hs : %.x
110+
$(ALEX) $(TEST_ALEX_OPTS) -g $< -o $@
111+
108112
%.d.hs : %.x
109113
$(ALEX) $(TEST_ALEX_OPTS) --debug $< -o $@
110114

111-
CLEAN_FILES += *.n.hs *.g.hs *.d.hs *.info *.hi *.o *.bin *.exe
115+
CLEAN_FILES += *.n.hs *.g.hs *.i.hs *.d.hs *.info *.hi *.o *.bin *.exe
112116

113-
TESTS_HS = $(shell echo $(TESTS) $(TEXT_TESTS) | sed -e 's/\([^\. ]*\)\.\(l\)\{0,1\}x/\1.n.hs \1.g.hs/g')
117+
TESTS_HS = $(shell echo $(TESTS) $(TEXT_TESTS) | sed -e 's/\([^\. ]*\)\.\(l\)\{0,1\}x/\1.n.hs \1.g.hs \1.i.hs/g')
114118
TESTS_HS_DEBUG = $(shell echo $(TESTS) $(TEXT_TESTS) | sed -e 's/\([^\. ]*\)\.\(l\)\{0,1\}x/\1.d.hs/g')
115119
TESTS_HS_ALL = $(TESTS_HS) $(TESTS_HS_DEBUG)
116120

@@ -122,7 +126,7 @@ ALL_TESTS = $(BASIC_TESTS) $(DEBUG_TESTS)
122126
./$<
123127

124128
%$(HS_PROG_EXT) : %.hs
125-
$(HC) $(HC_OPTS) -package array -package bytestring $(TEXT_DEP) $($*_LD_OPTS) $< -o $@
129+
$(HC) $(if $(findstring .i.,$@),-XImpredicativeTypes,) $(HC_OPTS) -package array -package bytestring $(TEXT_DEP) $($*_LD_OPTS) $< -o $@
126130

127131
all :: $(ALL_TESTS)
128132

tests/monadic_expr.x

Lines changed: 122 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,122 @@
1+
{
2+
module Main (main) where
3+
import {- "containers" -} Data.Set (Set)
4+
import {- "containers" -} qualified Data.Set as Set
5+
import {- "text" -} Data.Text (Text)
6+
import {- "text" -} qualified Data.Text as Text
7+
import {- "text" -} qualified Data.Text.Read as Text
8+
import {- "base" -} Control.Arrow hiding (arr)
9+
import {- "base" -} Control.Monad (forM_, when)
10+
import {- "base" -} Control.Monad.Fail (MonadFail)
11+
import {- "base" -} qualified Control.Monad.Fail as Fail (MonadFail (..))
12+
import {- "base" -} Numeric.Natural
13+
import {- "base" -} System.Exit
14+
}
15+
16+
%wrapper "monadUserState-strict-text"
17+
%token "Token integer"
18+
%typeclass "Integral integer, Read integer, Show integer"
19+
20+
-- ugh
21+
$digit = 0-9
22+
$unidigit = 1-9
23+
@number = [0] | $unidigit $digit*
24+
25+
tokens :-
26+
$white+ { skip }
27+
@number { \(_, _, _, s) len -> case Text.decimal (Text.take len s) of
28+
Left e -> Fail.fail e
29+
Right (n, txt)
30+
| Text.null txt -> pure $ TokenInt n
31+
| otherwise -> Fail.fail "got incomplete prefix " }
32+
[a-z]+ { \(_, _, _, s) len -> do
33+
let name = Text.take len s
34+
alexSeenVar name
35+
pure $ TokenVar name }
36+
[\+] { mk0ary TokenAdd }
37+
[\-] { mk0ary TokenSub }
38+
[\*] { mk0ary TokenMul }
39+
[\/] { mk0ary TokenDiv }
40+
[\^] { mk0ary TokenPow }
41+
[\(] { mk0ary TokenLPar }
42+
[\)] { mk0ary TokenRPar }
43+
44+
{
45+
mk0ary :: (Read integer, Integral integer) => Token integer -> AlexInput -> Int -> Alex (Token integer)
46+
mk0ary tok _ _ = pure tok
47+
48+
data AlexUserState
49+
= AlexUserState {
50+
ausVars :: Set Text
51+
} deriving (Eq, Read, Show)
52+
53+
alexSeenVar :: Text -> Alex ()
54+
alexSeenVar txt = do
55+
AlexUserState { ausVars = set } <- alexGetUserState
56+
alexSetUserState $ AlexUserState { ausVars = txt `Set.insert` set }
57+
58+
alexInitUserState :: AlexUserState
59+
alexInitUserState = AlexUserState { ausVars = Set.empty }
60+
61+
data Token integer
62+
= TokenInt integer
63+
| TokenVar Text
64+
| TokenLPar
65+
| TokenRPar
66+
| TokenPow
67+
| TokenDiv
68+
| TokenMul
69+
| TokenSub
70+
| TokenAdd
71+
| EOF
72+
deriving (Eq, Read, Show)
73+
74+
alexEOF :: (Read integer, Integral integer) => Alex (Token integer)
75+
alexEOF = pure EOF
76+
77+
instance MonadFail Alex where
78+
fail s = Alex . const $ Left s
79+
80+
evalAlex :: Text -> Alex t -> Either String (AlexUserState, t)
81+
evalAlex txt alex = right (first getUserState) $ f state where
82+
f = unAlex alex
83+
getUserState AlexState { alex_ust = userState } = userState
84+
state = AlexState
85+
{ alex_bytes = []
86+
, alex_pos = alexStartPos
87+
, alex_inp = txt
88+
, alex_chr = '\n'
89+
, alex_ust = alexInitUserState
90+
, alex_scd = 0 }
91+
92+
scanAll :: (Eq integer, Integral integer, Read integer, Show integer) => Alex [Token integer]
93+
scanAll = alexMonadScan >>= \result -> case result of
94+
EOF -> pure []
95+
tok -> (tok :) <$> scanAll
96+
97+
tests :: [(Text, Set Text, [Token Natural])]
98+
tests = [ (Text.pack "x*y/(x^3+y^3)"
99+
, Set.fromList [x, y]
100+
, [TokenVar x, TokenMul, TokenVar y, TokenDiv, TokenLPar, TokenVar x, TokenPow, TokenInt 3, TokenAdd, TokenVar y, TokenPow, TokenInt 3, TokenRPar])] where
101+
x = Text.pack "x"
102+
y = Text.pack "y"
103+
104+
main :: IO ()
105+
main = do
106+
forM_ tests $ \(txt, vars, toks) -> do
107+
case evalAlex txt scanAll of
108+
Right (AlexUserState { ausVars = tokVars }, tokList)
109+
| tokVars == vars && toks == tokList -> pure ()
110+
| otherwise -> do
111+
when (toks /= tokList) $ do
112+
putStrLn $ "got " <> show tokList
113+
putStrLn $ "wanted " <> show toks
114+
when (tokVars /= vars) $ do
115+
putStrLn $ "got " <> show tokVars
116+
putStrLn $ "wanted " <> show vars
117+
exitFailure
118+
Left errorString -> do
119+
putStrLn $ "got error " <> errorString
120+
exitFailure
121+
exitSuccess
122+
}

0 commit comments

Comments
 (0)