Improve comments, triggered by Trac #15135
authorSimon Peyton Jones <simonpj@microsoft.com>
Thu, 25 Oct 2018 11:47:48 +0000 (12:47 +0100)
committerSimon Peyton Jones <simonpj@microsoft.com>
Thu, 25 Oct 2018 11:47:48 +0000 (12:47 +0100)
compiler/typecheck/ClsInst.hs
compiler/typecheck/TcInteract.hs

index cacceef..03adfde 100644 (file)
@@ -170,6 +170,27 @@ match_one so dfun_id mb_inst_tys
                                                            , iw_safe_over = so } } }
 
 
                                                            , iw_safe_over = so } } }
 
 
+{- Note [Shortcut solving: overlap]
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+Suppose we have
+  instance {-# OVERLAPPABLE #-} C a where ...
+and we are typechecking
+  f :: C a => a -> a
+  f = e  -- Gives rise to [W] C a
+
+We don't want to solve the wanted constraint with the overlappable
+instance; rather we want to use the supplied (C a)! That was the whole
+point of it being overlappable!  Trac #14434 wwas an example.
+
+Alas even if the instance has no overlap flag, thus
+  instance C a where ...
+there is nothing to stop it being overlapped. GHC provides no way to
+declare an instance as "final" so it can't be overlapped.  But really
+only final instances are OK for short-cut solving.  Sigh. Trac #15135
+was a puzzling example.
+-}
+
+
 {- ********************************************************************
 *                                                                     *
                    Class lookup for CTuples
 {- ********************************************************************
 *                                                                     *
                    Class lookup for CTuples
index 3914db6..32b4718 100644 (file)
@@ -921,18 +921,6 @@ unique match on the (Take n) instance.  That leads immediately to an
 infinite loop.  Hence the check that 'preds' have no type families
 (isTyFamFree).
 
 infinite loop.  Hence the check that 'preds' have no type families
 (isTyFamFree).
 
-Note [Shortcut solving: overlap]
-~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-Suppose we have
-  instance {-# OVERLAPPABLE #-} C a where ...
-and we are typechecking
-  f :: C a => a -> a
-  f = e  -- Gives rise to [W] C a
-
-We don't want to solve the wanted constraint with the overlappable
-instance; rather we want to use the supplied (C a)! That was the whole
-point of it being overlappable!  Trac #14434 wwas an example.
-
 Note [Shortcut solving: incoherence]
 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 This optimization relies on coherence of dictionaries to be correct. When we
 Note [Shortcut solving: incoherence]
 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 This optimization relies on coherence of dictionaries to be correct. When we
@@ -1002,7 +990,7 @@ The workhorse of the short-cut solver is
                             -> MaybeT TcS (EvBindMap, DictMap CtEvidence)
 Note that:
 
                             -> MaybeT TcS (EvBindMap, DictMap CtEvidence)
 Note that:
 
-* The CtEvidence is teh goal to be solved
+* The CtEvidence is the goal to be solved
 
 * The MaybeT anages early failure if we find a subgoal that
   cannot be solved from instances.
 
 * The MaybeT anages early failure if we find a subgoal that
   cannot be solved from instances.