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
Showing
- compiler/main/DynFlags.hs 4 additions, 1 deletioncompiler/main/DynFlags.hs
- compiler/typecheck/TcErrors.hs 1 addition, 1 deletioncompiler/typecheck/TcErrors.hs
- docs/users_guide/using-warnings.rst 39 additions, 1 deletiondocs/users_guide/using-warnings.rst
- testsuite/tests/gadt/T3651.stderr 10 additions, 17 deletionstestsuite/tests/gadt/T3651.stderr
- testsuite/tests/gadt/T7293.stderr 5 additions, 1 deletiontestsuite/tests/gadt/T7293.stderr
- testsuite/tests/gadt/T7294.stderr 1 addition, 1 deletiontestsuite/tests/gadt/T7294.stderr
- testsuite/tests/gadt/T7558.stderr 6 additions, 7 deletionstestsuite/tests/gadt/T7558.stderr
- testsuite/tests/gadt/all.T 1 addition, 1 deletiontestsuite/tests/gadt/all.T
- testsuite/tests/ghci/scripts/Defer02.stderr 1 addition, 1 deletiontestsuite/tests/ghci/scripts/Defer02.stderr
- testsuite/tests/typecheck/should_fail/FrozenErrorTests.stderr 0 additions, 9 deletions...suite/tests/typecheck/should_fail/FrozenErrorTests.stderr
- testsuite/tests/typecheck/should_fail/all.T 1 addition, 1 deletiontestsuite/tests/typecheck/should_fail/all.T
- testsuite/tests/typecheck/should_fail/tcfail167.stderr 5 additions, 1 deletiontestsuite/tests/typecheck/should_fail/tcfail167.stderr
- testsuite/tests/typecheck/should_run/Typeable1.stderr 1 addition, 1 deletiontestsuite/tests/typecheck/should_run/Typeable1.stderr
- testsuite/tests/typecheck/should_run/all.T 1 addition, 1 deletiontestsuite/tests/typecheck/should_run/all.T
Loading
Please register or sign in to comment