summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorVladislav Zavialov <vlad.z.4096@gmail.com>2019-02-05 20:01:36 -0500
committerVladislav Zavialov <vlad.z.4096@gmail.com>2019-02-06 12:47:34 +0300
commitdf1f5e41da9496c219c942668a84534752be1a95 (patch)
tree490b22ee610b9ff9f8c0896eb2a54732665f213e
parente88e083d62389d5c8d082a25395a3d933ab2f03b (diff)
downloadhaskell-wip/optsemi-unsafe-coerce.tar.gz
Fix optSemi type in Parser.ywip/optsemi-unsafe-coerce
The definition of 'optSemi' claimed it had type ([Located a],Bool) Note that its production actually returns ([Located Token],Bool): : ';' { ([$1],True) } -- $1 :: Located Token Due to an infelicity in the implementation of 'happy -c', it effectively resulted in 'unsafeCoerce :: Token -> a'. See https://github.com/simonmar/happy/pull/134 If any consumer of 'optSemi' tried to instantiate 'a' to something not representationally equal to 'Token', they would experience a segfault. In addition to that, this definition made it impossible to compile Parser.y without the -c flag (as it's reliant on this bug to cast 'Token' to 'forall a. a').
-rw-r--r--compiler/parser/Parser.y3
1 files changed, 1 insertions, 2 deletions
diff --git a/compiler/parser/Parser.y b/compiler/parser/Parser.y
index ce5c523e6f..2d1e8f3c9b 100644
--- a/compiler/parser/Parser.y
+++ b/compiler/parser/Parser.y
@@ -1,4 +1,3 @@
-
-- -*-haskell-*-
-- ---------------------------------------------------------------------------
-- (c) The University of Glasgow 1997-2003
@@ -2580,7 +2579,7 @@ exp10 :: { LHsExpr GhcPs }
| scc_annot exp {% ams (sLL $1 $> $ HsSCC noExt (snd $ fst $ unLoc $1) (snd $ unLoc $1) $2)
(fst $ fst $ unLoc $1) }
-optSemi :: { ([Located a],Bool) }
+optSemi :: { ([Located Token],Bool) }
: ';' { ([$1],True) }
| {- empty -} { ([],False) }