[commit: ghc] master: Improve the insolubility check when quantifying (e365d49)

git at git.haskell.org git at git.haskell.org
Tue Sep 10 18:57:20 CEST 2013


Repository : ssh://git@git.haskell.org/ghc

On branch  : master
Link       : http://ghc.haskell.org/trac/ghc/changeset/e365d4963f1061878269502f256b4a56ca273a78/ghc

>---------------------------------------------------------------

commit e365d4963f1061878269502f256b4a56ca273a78
Author: Simon Peyton Jones <simonpj at microsoft.com>
Date:   Tue Sep 10 11:42:03 2013 +0100

    Improve the insolubility check when quantifying
    
    See Note [Quantification with errors]
    Fixes Trac #8262


>---------------------------------------------------------------

e365d4963f1061878269502f256b4a56ca273a78
 compiler/typecheck/TcSimplify.lhs |   14 ++++++++++----
 1 file changed, 10 insertions(+), 4 deletions(-)

diff --git a/compiler/typecheck/TcSimplify.lhs b/compiler/typecheck/TcSimplify.lhs
index b39bc85..0ffda04 100644
--- a/compiler/typecheck/TcSimplify.lhs
+++ b/compiler/typecheck/TcSimplify.lhs
@@ -247,8 +247,8 @@ simplifyInfer _top_lvl apply_mr name_taus wanteds
               -- constraint.
 
        ; ev_binds_var <- newTcEvBinds
-       ; wanted_transformed <- solveWantedsTcMWithEvBinds ev_binds_var wanteds $
-                               solve_wanteds_and_drop
+       ; wanted_transformed_incl_derivs 
+               <- solveWantedsTcMWithEvBinds ev_binds_var wanteds solve_wanteds
                                -- Post: wanted_transformed are zonked
 
               -- Step 4) Candidates for quantification are an approximation of wanted_transformed
@@ -263,9 +263,11 @@ simplifyInfer _top_lvl apply_mr name_taus wanteds
 
        ; tc_lcl_env <- TcRnMonad.getLclEnv
        ; let untch = tcl_untch tc_lcl_env
+             wanted_transformed = dropDerivedWC wanted_transformed_incl_derivs
        ; quant_pred_candidates   -- Fully zonked
-           <- if insolubleWC wanted_transformed 
+           <- if insolubleWC wanted_transformed_incl_derivs
               then return []   -- See Note [Quantification with errors]
+                               -- NB: must include derived errors
               else do { gbl_tvs <- tcGetGlobalTyVars
                       ; let quant_cand = approximateWC wanted_transformed
                             meta_tvs   = filter isMetaTyVar (varSetElems (tyVarsOfCts quant_cand)) 
@@ -392,6 +394,10 @@ type we have found.  For two reasons
   a) Minimise downstream errors
   b) Avoid spurious errors from this function
 
+But NB that we must include *derived* errors in the check. Example:   
+    (a::*) ~ Int#
+We get an insoluble derived error *~#, and we don't want to discard
+it before doing the isInsolubleWC test!  (Trac #8262)
 
 Note [Default while Inferring]
 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
@@ -607,7 +613,7 @@ solveWantedsTcM wanted
 
 solve_wanteds_and_drop :: WantedConstraints -> TcS (WantedConstraints)
 -- Since solve_wanteds returns the residual WantedConstraints,
--- it should alway be called within a runTcS or something similar,
+-- it should always be called within a runTcS or something similar,
 solve_wanteds_and_drop wanted = do { wc <- solve_wanteds wanted 
                                    ; return (dropDerivedWC wc) }
 




More information about the ghc-commits mailing list