[GHC] #11514: Impredicativity is still sneaking in
GHC
ghc-devs at haskell.org
Sun Jul 29 15:47:03 UTC 2018
#11514: Impredicativity is still sneaking in
-------------------------------------+-------------------------------------
Reporter: goldfire | Owner: goldfire
Type: bug | Status: new
Priority: normal | Milestone:
Component: Compiler | Version: 8.1
Resolution: | Keywords:
| ImpredicativeTypes
Operating System: Unknown/Multiple | Architecture:
| Unknown/Multiple
Type of failure: None/Unknown | Test Case:
Blocked By: | Blocking:
Related Tickets: | Differential Rev(s):
Wiki Page: |
-------------------------------------+-------------------------------------
Comment (by RyanGlScott):
Indeed, this //is// simply missing a check:
{{{#!diff
diff --git a/compiler/typecheck/TcUnify.hs b/compiler/typecheck/TcUnify.hs
index 2ed861c..9280042 100644
--- a/compiler/typecheck/TcUnify.hs
+++ b/compiler/typecheck/TcUnify.hs
@@ -2165,7 +2165,7 @@ metaTyVarUpdateOK dflags tv ty
preCheck :: DynFlags -> Bool -> TcTyVar -> TcType -> OccCheckResult ()
-- A quick check for
--- (a) a forall type (unless -XImpredivativeTypes)
+-- (a) a forall type (unless -XImpredicativeTypes)
-- (b) a type family
-- (c) an occurrence of the type variable (occurs check)
--
@@ -2192,7 +2192,10 @@ preCheck dflags ty_fam_ok tv ty
| bad_tc tc = OC_Bad
| otherwise = mapM fast_check tys >> ok
fast_check (LitTy {}) = ok
- fast_check (FunTy a r) = fast_check a >> fast_check r
+ fast_check (FunTy a r)
+ | not impredicative_ok
+ && isPredTy a = OC_Bad
+ | otherwise = fast_check a >> fast_check r
fast_check (AppTy fun arg) = fast_check fun >> fast_check arg
fast_check (CastTy ty co) = fast_check ty >> fast_check_co co
fast_check (CoercionTy co) = fast_check_co co
}}}
With that, the original program is rejected.
There's one hiccup though: once this patch is applied, the `print027` test
case begins to panic. Here is a minimized example of what happens:
{{{
$ inplace/bin/ghc-stage2 --interactive
GHCi, version 8.7.20180729: http://www.haskell.org/ghc/ :? for help
Loaded GHCi configuration from /home/rgscott/.ghci
λ> :print (+)
ghc-stage2: panic! (the 'impossible' happened)
(GHC version 8.7.20180729 for x86_64-unknown-linux):
isUnliftedType
t1_a1Cn[rt] :: TYPE t_a1Cm[rt]
Call stack:
CallStack (from HasCallStack):
callStackDoc, called at compiler/utils/Outputable.hs:1164:37 in
ghc:Outputable
pprPanic, called at compiler/types/Type.hs:2015:10 in ghc:Type
}}}
As far as I can tell, `:print` attempts to unify a unification variable
`t1` with `Num a => a -> a -> a`, which fails. But `:print` proceeds
onward anyways with the (not-unified) type `t1`, and falls over when it
passes `t1` to `isUnliftedType`, which doesn't expect a type variable.
This is worrying, but then again, `:print` has been known to trigger this
`isUnliftedType` panic in other ways for some time now (see #14828). In
light of this, I'm not sure if it's worth investing the effort to fix this
`:print` panic, or just accept this as a known regression.
--
Ticket URL: <http://ghc.haskell.org/trac/ghc/ticket/11514#comment:2>
GHC <http://www.haskell.org/ghc/>
The Glasgow Haskell Compiler
More information about the ghc-tickets
mailing list