Fix egregious bug in implication constraints
authorsimonpj@microsoft.com <unknown>
Tue, 9 Jan 2007 13:47:19 +0000 (13:47 +0000)
committersimonpj@microsoft.com <unknown>
Tue, 9 Jan 2007 13:47:19 +0000 (13:47 +0000)
Build an implication constraint if there is a non-trivial
refinement, even if there are no other 'given' constraints.

Test = gadt/set.hs

compiler/typecheck/TcSimplify.lhs

index 708b8e4..7b9f1f1 100644 (file)
@@ -849,10 +849,11 @@ bindIrredsR loc qtvs co_vars reft givens irreds
                -- The givens can include methods
                -- See Note [Pruning the givens in an implication constraint]
 
-          -- If there are no 'givens', then it's safe to 
+          -- If there are no 'givens' *and* the refinement is empty
+          -- (the refinement is like more givens), then it's safe to 
           -- partition the 'wanteds' by their qtvs, thereby trimming irreds
           -- See Note [Freeness and implications]
-       ; irreds' <- if null givens'
+       ; irreds' <- if null givens' && isEmptyRefinement reft
                     then do
                        { let qtv_set = mkVarSet qtvs
                              (frees, real_irreds) = partition (isFreeWrtTyVars qtv_set) irreds