Skip to content

Fix optSemi type in Parser.y

Vladislav Zavialov requested to merge wip/optsemi-unsafe-coerce into master

The definition of optSemi claimed it had type

([Located a],Bool)

Note that its production actually returns ([Located a],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).

Edited by Vladislav Zavialov

Merge request reports