[commit: ghc] type-nats-simple: Hook-in built-in interactions with inerts. (9c458ab)
git at git.haskell.org
git at git.haskell.org
Sun Sep 8 02:11:27 CEST 2013
Repository : ssh://git@git.haskell.org/ghc
On branch : type-nats-simple
Link : http://ghc.haskell.org/trac/ghc/changeset/9c458ab0496347836ab7090558ee1dce7ec2c517/ghc
>---------------------------------------------------------------
commit 9c458ab0496347836ab7090558ee1dce7ec2c517
Author: Iavor S. Diatchki <iavor.diatchki at gmail.com>
Date: Sat Sep 7 17:10:11 2013 -0700
Hook-in built-in interactions with inerts.
After the solver extracts its relevant constraints
(i.e., function applications where the head match),
we check for any additional functional equation constraints for the
same built-in function. Then, we call out to the custom
interaction, to collect some extra derived constraints.
>---------------------------------------------------------------
9c458ab0496347836ab7090558ee1dce7ec2c517
compiler/typecheck/TcInteract.lhs | 26 ++++++++++++++++++++++++++
1 file changed, 26 insertions(+)
diff --git a/compiler/typecheck/TcInteract.lhs b/compiler/typecheck/TcInteract.lhs
index 462c59c..9b970c9 100644
--- a/compiler/typecheck/TcInteract.lhs
+++ b/compiler/typecheck/TcInteract.lhs
@@ -565,6 +565,7 @@ interactWithInertsStage wi
= do { traceTcS "interactWithInerts" $ text "workitem = " <+> ppr wi
; rels <- extractRelevantInerts wi
; traceTcS "relevant inerts are:" $ ppr rels
+ ; builtInInteractions
; foldlBagM interact_next (ContinueWith wi) rels }
where interact_next Stop atomic_inert
@@ -593,6 +594,31 @@ interactWithInertsStage wi
-> do { insertInertItemTcS atomic_inert
; return (ContinueWith wi) }
}
+
+ -- See if we can compute some new derived work for built-ins.
+ builtInInteractions
+ | CFunEqCan { cc_fun = tc, cc_tyargs = args, cc_rhs = xi } <- wi
+ , Just ops <- isBuiltInSynFamTyCon_maybe tc =
+ do is <- getInertsFunEqTyCon tc
+ traceTcS "builtInCandidates: " $ ppr is
+ let interact = sfInteractInert ops args xi
+ impMbs <- sequence
+ [ do mb <- newDerived (mkTcEqPred lhs rhs)
+ case mb of
+ Just x -> return $ Just $ mkNonCanonical d x
+ Nothing -> return Nothing
+ | CFunEqCan { cc_tyargs = iargs
+ , cc_rhs = ixi
+ , cc_loc = d } <- is
+ , Pair lhs rhs <- interact iargs ixi
+ ]
+ let imps = catMaybes impMbs
+ unless (null imps) $ updWorkListTcS (extendWorkListEqs imps)
+ | otherwise = return ()
+
+
+
+
\end{code}
\begin{code}
More information about the ghc-commits
mailing list