summaryrefslogtreecommitdiff
path: root/compiler/GHC/Tc/Solver/Flatten.hs
diff options
context:
space:
mode:
authorRichard Eisenberg <rae@richarde.dev>2020-04-29 17:14:53 +0100
committerMarge Bot <ben+marge-bot@smart-cactus.org>2020-05-06 04:39:32 -0400
commit7ab6ab093c86227b6d33a5185ebbd11928ac9754 (patch)
tree9012ba8808f2e7d5271d2d8a225c2223f4ba6aa2 /compiler/GHC/Tc/Solver/Flatten.hs
parent40c71c2cf38b4e134d81b7184a4d5e02949ae70c (diff)
downloadhaskell-7ab6ab093c86227b6d33a5185ebbd11928ac9754.tar.gz
Refactor hole constraints.
Previously, holes (both expression holes / out of scope variables and partial-type-signature wildcards) were emitted as *constraints* via the CHoleCan constructor. While this worked fine for error reporting, there was a fair amount of faff in keeping these constraints in line. In particular, and unlike other constraints, we could never change a CHoleCan to become CNonCanonical. In addition: * the "predicate" of a CHoleCan constraint was really the type of the hole, which is not a predicate at all * type-level holes (partial type signature wildcards) carried evidence, which was never used * tcNormalise (used in the pattern-match checker) had to create a hole constraint just to extract it again; it was quite messy The new approach is to record holes directly in WantedConstraints. It flows much more nicely now. Along the way, I did some cleaning up of commentary in GHC.Tc.Errors.Hole, which I had a hard time understanding. This was instigated by a future patch that will refactor the way predicates are handled. The fact that CHoleCan's "predicate" wasn't really a predicate is incompatible with that future patch. No test case, because this is meant to be purely internal. It turns out that this change improves the performance of the pattern-match checker, likely because fewer constraints are sloshing about in tcNormalise. I have not investigated deeply, but an improvement is not a surprise here: ------------------------- Metric Decrease: PmSeriesG -------------------------
Diffstat (limited to 'compiler/GHC/Tc/Solver/Flatten.hs')
-rw-r--r--compiler/GHC/Tc/Solver/Flatten.hs16
1 files changed, 15 insertions, 1 deletions
diff --git a/compiler/GHC/Tc/Solver/Flatten.hs b/compiler/GHC/Tc/Solver/Flatten.hs
index 551e1de395..4dff585840 100644
--- a/compiler/GHC/Tc/Solver/Flatten.hs
+++ b/compiler/GHC/Tc/Solver/Flatten.hs
@@ -5,7 +5,7 @@
module GHC.Tc.Solver.Flatten(
FlattenMode(..),
flatten, flattenKind, flattenArgsNom,
- rewriteTyVar,
+ rewriteTyVar, flattenType,
unflattenWanteds
) where
@@ -825,6 +825,20 @@ flattenArgsNom ev tc tys
; traceTcS "flatten }" (vcat (map ppr tys'))
; return (tys', cos, kind_co) }
+-- | Flatten a type w.r.t. nominal equality. This is useful to rewrite
+-- a type w.r.t. any givens. It does not do type-family reduction. This
+-- will never emit new constraints. Call this when the inert set contains
+-- only givens.
+flattenType :: CtLoc -> TcType -> TcS TcType
+flattenType loc ty
+ -- More info about FM_SubstOnly in Note [Holes] in GHC.Tc.Types.Constraint
+ = do { (xi, _) <- runFlatten FM_SubstOnly loc Given NomEq $
+ flatten_one ty
+ -- use Given flavor so that it is rewritten
+ -- only w.r.t. Givens, never Wanteds/Deriveds
+ -- (Shouldn't matter, if only Givens are present
+ -- anyway)
+ ; return xi }
{- *********************************************************************
* *