Commit 8162eab2 authored by Ryan Scott's avatar Ryan Scott Committed by Marge Bot

Remove the GHCi debugger's panicking isUnliftedType check

The GHCi debugger has never been that robust in the face of
higher-rank types, or even types that are _interally_ higher-rank,
such as the types of many class methods (e.g., `fmap`). In GHC 8.2,
however, things became even worse, as the debugger would start to
_panic_ when a user tries passing the name of a higher-rank thing
to `:print`. This all ties back to a strange `isUnliftedType` check
in `Debugger` that was mysteriously added 11 years ago
(in commit 4d71f5ee) with no
explanation whatsoever.

After some experimentation, no one is quite sure what this
`isUnliftedType` check is actually accomplishing. The test suite
still passes if it's removed, and I am unable to observe any
differences in debugger before even with data types that _do_ have
fields of unlifted types (e.g., `data T = MkT Int#`). Given that
this is actively causing problems (see #14828), the prudent thing
to do seems to be just removing this `isUnliftedType` check, and
waiting to see if anyone shouts about it. This patch accomplishes
just that.

Note that this patch fix the underlying issues behind #14828, as the
debugger will still print unhelpful info if you try this:

λ> f :: (forall a. a -> a) -> b -> b; f g x = g x
λ> :print f
f = (_t1::t1)

But fixing this will require much more work, so let's start with the
simple stuff for now.
parent 10a97120
Pipeline #3537 failed with stages
in 173 minutes and 26 seconds
......@@ -77,8 +77,7 @@ pprintClosureCommand bindThings force str = do
let id' = id `setIdType` substTy subst (idType id)
term_ <- GHC.obtainTermFromId maxBound force id'
term <- tidyTermTyVars term_
term' <- if bindThings &&
(not (isUnliftedType (termType term)))
term' <- if bindThings
then bindSuspensions term
else return term
-- Before leaving, we compare the type obtained to see if it's more specific
......@@ -15,4 +15,8 @@
:p mappend
:m + Data.List
:p foldl'
\ No newline at end of file
:p foldl'
:set -XRankNTypes
f :: (forall a. a -> a) -> b -> b; f g x = g x
:p f
foldl :: Foldable t => (b -> a -> b) -> b -> t a -> b
foldl = (_t1::t1)
fmap :: Functor f => (a -> b) -> f a -> f b
fmap = (_t2::t1)
return :: Monad m => a -> m a
return = (_t3::t1)
pure :: Applicative f => a -> f a
pure = (_t4::t1)
mempty = (_t5::Monoid a => a)
mappend = (_t6::Monoid a => a -> a -> a)
foldl' = (_t7::t1)
f = (_t8::t1)
......@@ -292,5 +292,5 @@ test('T15941', normal, ghci_script, ['T15941.script'])
test('T16030', normal, ghci_script, ['T16030.script'])
test('T11606', normal, ghci_script, ['T11606.script'])
test('T16089', normal, ghci_script, ['T16089.script'])
test('T14828', expect_broken(14828), ghci_script, ['T14828.script'])
test('T14828', normal, ghci_script, ['T14828.script'])
test('T16376', normal, ghci_script, ['T16376.script'])
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment