summaryrefslogtreecommitdiff
path: root/compiler
diff options
context:
space:
mode:
Diffstat (limited to 'compiler')
-rw-r--r--compiler/ghci/RtClosureInspect.hs25
-rw-r--r--compiler/typecheck/TcErrors.lhs13
-rw-r--r--compiler/typecheck/TcType.lhs12
3 files changed, 24 insertions, 26 deletions
diff --git a/compiler/ghci/RtClosureInspect.hs b/compiler/ghci/RtClosureInspect.hs
index b281695985..5d74dc92c2 100644
--- a/compiler/ghci/RtClosureInspect.hs
+++ b/compiler/ghci/RtClosureInspect.hs
@@ -571,17 +571,24 @@ liftTcM = id
newVar :: Kind -> TR TcType
newVar = liftTcM . newFlexiTyVarTy
-type RttiInstantiation = [(TyVar, TcTyVar)]
- -- Assoicates the debugger-world type variables (which are skolems)
- -- to typechecker-world meta type variables (which are mutable,
- -- and may be refined)
+type RttiInstantiation = [(TcTyVar, TyVar)]
+ -- Associates the typechecker-world meta type variables
+ -- (which are mutable and may be refined), to their
+ -- debugger-world RuntimeUnkSkol counterparts.
+ -- If the TcTyVar has not been refined by the runtime type
+ -- elaboration, then we want to turn it back into the
+ -- original RuntimeUnkSkol
-- | Returns the instantiated type scheme ty', and the
--- mapping from old to new (instantiated) type variables
+-- mapping from new (instantiated) -to- old (skolem) type variables
+-- We want this mapping just for old RuntimeUnkSkols, to avoid
+-- gratuitously changing their unique on every trip
instScheme :: QuantifiedType -> TR (TcType, RttiInstantiation)
instScheme (tvs, ty)
= liftTcM $ do { (tvs', _, subst) <- tcInstTyVars tvs
- ; return (substTy subst ty, tvs `zip` tvs') }
+ ; let rtti_inst = [(tv',tv) | (tv',tv) <- tvs' `zip` tvs
+ , isRuntimeUnkSkol tv]
+ ; return (substTy subst ty, rtti_inst) }
applyRevSubst :: RttiInstantiation -> TR ()
-- Apply the *reverse* substitution in-place to any un-filled-in
@@ -589,7 +596,7 @@ applyRevSubst :: RttiInstantiation -> TR ()
-- unless it has been refined by new information from the heap
applyRevSubst pairs = liftTcM (mapM_ do_pair pairs)
where
- do_pair (rtti_tv, tc_tv)
+ do_pair (tc_tv, rtti_tv)
= do { tc_ty <- zonkTcTyVar tc_tv
; case tcGetTyVar_maybe tc_ty of
Just tv | isMetaTyVar tv -> writeMetaTyVar tv (mkTyVarTy rtti_tv)
@@ -1131,6 +1138,10 @@ zonkRttiType = zonkType (mkZonkTcTyVar zonk_unbound_meta)
zonk_unbound_meta tv
= ASSERT( isTcTyVar tv )
do { tv' <- skolemiseUnboundMetaTyVar RuntimeUnkSkol tv
+ -- This is where RuntimeUnkSkols are born:
+ -- otherwise-unconstrained unification variables are
+ -- turned into RuntimeUnkSkols as they leave the
+ -- typechecker's monad
; return (mkTyVarTy tv') }
--------------------------------------------------------------------------------
diff --git a/compiler/typecheck/TcErrors.lhs b/compiler/typecheck/TcErrors.lhs
index c8f624f6ea..28fc91bcd2 100644
--- a/compiler/typecheck/TcErrors.lhs
+++ b/compiler/typecheck/TcErrors.lhs
@@ -640,17 +640,8 @@ warnDefaulting wanteds default_ty
Note [Runtime skolems]
~~~~~~~~~~~~~~~~~~~~~~
We want to give a reasonably helpful error message for ambiguity
-arising from *runtime* skolems in the debugger. Mostly these
-are created by in RtClosureInspec.zonkRTTIType. However at a
-breakpoint we return Ids from the CoreExpr, whose types may have
-free type variables bound by some enclosing 'forall'. These are
-UnkSkols, created ty TcType.zonkQuantifiedTyVar.
-
-These UnkSkols should never show up as ambiguous type variables in
-normal typechecking, so we hackily emit the debugger-related message
-both for RuntimeUnkSkols and UnkSkols. Hence the two cases in
-TcType.isRuntimeUnkSkol. Yuk. The rest of the debugger is such
-a mess that I don't feel motivated to clean up this bit.
+arising from *runtime* skolems in the debugger. These
+are created by in RtClosureInspect.zonkRTTIType.
%************************************************************************
diff --git a/compiler/typecheck/TcType.lhs b/compiler/typecheck/TcType.lhs
index 74100920bb..47bb554e86 100644
--- a/compiler/typecheck/TcType.lhs
+++ b/compiler/typecheck/TcType.lhs
@@ -673,14 +673,10 @@ isIndirect _ = False
isRuntimeUnkSkol :: TyVar -> Bool
-- Called only in TcErrors; see Note [Runtime skolems] there
-isRuntimeUnkSkol x
- | isTcTyVar x
- , SkolemTv info <- tcTyVarDetails x
- = case info of
- UnkSkol -> True
- RuntimeUnkSkol -> True
- _ -> False
- | otherwise = False
+isRuntimeUnkSkol x | isTcTyVar x
+ , SkolemTv RuntimeUnkSkol <- tcTyVarDetails x
+ = True
+ | otherwise = False
isUnkSkol :: TyVar -> Bool
isUnkSkol x | isTcTyVar x