Do not discard insoluble constraints in simplifyInfer
authorSimon Peyton Jones <simonpj@microsoft.com>
Sat, 14 Jul 2012 12:18:34 +0000 (13:18 +0100)
committerSimon Peyton Jones <simonpj@microsoft.com>
Sat, 14 Jul 2012 12:18:34 +0000 (13:18 +0100)
Before -fdefer-type-errors there we no insolubles
(because we'd have failed before then), but with -fdefer-type-errors
there can be.  The code is acutally a bit simpler: we just call
emitConstraints, and eliminate the bogus-looking emitWC from TcRnMonad.

There's a bit more tidying up to do, concerning the places we use
keepWanted, but I need to talk to Dimitrios about that.

Meanwhile this fixes Trac #7023

compiler/typecheck/TcRnMonad.lhs
compiler/typecheck/TcSimplify.lhs

index f685998..1b60061 100644 (file)
@@ -1031,11 +1031,6 @@ emitImplication ct
   = do { lie_var <- getConstraintVar ;
          updTcRef lie_var (`addImplics` unitBag ct) }
 
-emitWC :: WantedConstraints -> TcM ()
-emitWC wc
-  = do { emitFlats (keepWanted (wc_flat wc))
-       ; emitImplications (wc_impl wc) }
-
 emitImplications :: Bag Implication -> TcM ()
 emitImplications ct
   = do { lie_var <- getConstraintVar ;
index 2c4d318..4417408 100644 (file)
@@ -416,9 +416,10 @@ simplifyInfer _top_lvl apply_mr name_taus (untch,wanteds)
              
 
        ; if isEmptyVarSet qtvs && isEmptyBag bound
-         then ASSERT( isEmptyBag (wc_insol wanted_transformed) )
-              do { traceTc "} simplifyInfer/no quantification" empty                   
-                 ; emitWC wanted_transformed
+         then do { traceTc "} simplifyInfer/no quantification" empty                   
+                 ; emitConstraints wanted_transformed
+                    -- Includes insolubles (if -fdefer-type-errors)
+                    -- as well as flats and implications
                  ; return ([], [], mr_bites, TcEvBinds ev_binds_var) }
          else do