summary |
shortlog |
log |
commit | commitdiff |
tree
raw |
patch |
inline | side by side (from parent 1:
a3a15a6)
Provoked by a suggestion of Simon's, this patch makes a half-hearted attempt
to gather constraints in program order, so that we tend to report an error
at its first occurrence, rather than its last. Examples:
mdofail001, tcfail015
It's "half-hearted" because generally-speaking the typechecker does not
guaranteed to keep constraints in order; it treats them as a set. Nevertheless
this very small change seems to improve matters, so it seems a good one.
unitLIE inst = unitBag inst
mkLIE insts = listToBag insts
plusLIE lie1 lie2 = lie1 `unionBags` lie2
unitLIE inst = unitBag inst
mkLIE insts = listToBag insts
plusLIE lie1 lie2 = lie1 `unionBags` lie2
-consLIE inst lie = inst `consBag` lie
plusLIEs lies = unionManyBags lies
lieToList = bagToList
listToLIE = listToBag
plusLIEs lies = unionManyBags lies
lieToList = bagToList
listToLIE = listToBag
+
+consLIE inst lie = lie `snocBag` inst
+-- Putting the new Inst at the *end* of the bag is a half-hearted attempt
+-- to ensure that we tend to report the *leftmost* type-constraint error
+-- E.g. f :: [a]
+-- f = [1,2,3]
+-- we'd like to complain about the '1', not the '3'.
+--
+-- "Half-hearted" because the rest of the type checker makes no great
+-- claims for retaining order in the constraint set. Still, this
+-- seems to improve matters slightly. Exampes: mdofail001, tcfail015
-- The sought Id can be one of the givens, via a superclass chain
-- and then we definitely don't want to generate an x=x binding!
-- The sought Id can be one of the givens, via a superclass chain
-- and then we definitely don't want to generate an x=x binding!
--- | getSrcLoc id `precedesSrcLoc` srcSpanStart span
--- -> go avails (addBind binds w_span id (nlHsVar w_id)) irreds ws
-
| otherwise
-> go avails (addBind binds w (nlHsVar id)) irreds ws
| otherwise
-> go avails (addBind binds w (nlHsVar id)) irreds ws