Turn "inaccessible code" error into a warning
authorTobias Dammers <tdammers@gmail.com>
Sun, 3 Jun 2018 03:23:22 +0000 (23:23 -0400)
committerBen Gamari <ben@smart-cactus.org>
Sun, 3 Jun 2018 03:23:39 +0000 (23:23 -0400)
commit08073e16cf672d8009309e4e55d4566af1ecaff4
tree21b5338a416c8b2e1265294aaa55619116dbfee3
parent4d8004483387c087f5132736863d895ae4869163
Turn "inaccessible code" error into a warning

With GADTs, it is possible to write programs such that the type
constraints make some code branches inaccessible.

Take, for example, the following program ::

    {-# LANGUAGE GADTs #-}

    data Foo a where
     Foo1 :: Foo Char
     Foo2 :: Foo Int

    data TyEquality a b where
            Refl :: TyEquality a a

    checkTEQ :: Foo t -> Foo u -> Maybe (TyEquality t u)
    checkTEQ x y = error "unimportant"

    step2 :: Bool
    step2 = case checkTEQ Foo1 Foo2 of
             Just Refl -> True -- Inaccessible code
             Nothing -> False

Clearly, the `Just Refl` case cannot ever be reached, because the `Foo1`
and `Foo2` constructors say `t ~ Char` and `u ~ Int`, while the `Refl`
constructor essentially mandates `t ~ u`, and thus `Char ~ Int`.

Previously, GHC would reject such programs entirely; however, in
practice this is too harsh. Accepting such code does little harm, since
attempting to use the "impossible" code will still produce errors down
the chain, while rejecting it means we cannot legally write or generate
such code at all.

Hence, we turn the error into a warning, and provide
`-Winaccessible-code` to control GHC's behavior upon encountering this
situation.

Test Plan: ./validate

Reviewers: bgamari

Reviewed By: bgamari

Subscribers: rwbarton, thomie, carter

GHC Trac Issues: #11066

Differential Revision: https://phabricator.haskell.org/D4744
14 files changed:
compiler/main/DynFlags.hs
compiler/typecheck/TcErrors.hs
docs/users_guide/using-warnings.rst
testsuite/tests/gadt/T3651.stderr
testsuite/tests/gadt/T7293.stderr
testsuite/tests/gadt/T7294.stderr
testsuite/tests/gadt/T7558.stderr
testsuite/tests/gadt/all.T
testsuite/tests/ghci/scripts/Defer02.stderr
testsuite/tests/typecheck/should_fail/FrozenErrorTests.stderr
testsuite/tests/typecheck/should_fail/all.T
testsuite/tests/typecheck/should_fail/tcfail167.stderr
testsuite/tests/typecheck/should_run/Typeable1.stderr
testsuite/tests/typecheck/should_run/all.T