X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;ds=sidebyside;f=compiler%2Fspecialise%2FRules.lhs;h=2798ca13eb6e9cfe7c61a321acb452b228304957;hb=8d4bb83f1c3c6abb12e3ae1204034149349f047d;hp=6fc35a515b03d99eb8001d37a9ba4dcb93fa3ec4;hpb=29723ae3cdf941a9647d2cd67e5aa15bab8f4e22;p=ghc-hetmet.git diff --git a/compiler/specialise/Rules.lhs b/compiler/specialise/Rules.lhs index 6fc35a5..2798ca1 100644 --- a/compiler/specialise/Rules.lhs +++ b/compiler/specialise/Rules.lhs @@ -348,19 +348,25 @@ matchN in_scope tmpl_vars tmpl_es target_es Just e -> e other -> unbound tmpl_var' - unbound var = pprPanic "Template variable unbound in rewrite rule" (ppr var) + unbound var = pprPanic "Template variable unbound in rewrite rule" + (ppr var $$ ppr tmpl_vars $$ ppr tmpl_vars' $$ ppr tmpl_es $$ ppr target_es) \end{code} Note [Template binders] ~~~~~~~~~~~~~~~~~~~~~~~ Consider the following match: Template: forall x. f x - Taret: f (x+1) -This should succeed, because the template variable 'x' has nothing to do with -the 'x' in the target. + Target: f (x+1) +This should succeed, because the template variable 'x' has +nothing to do with the 'x' in the target. -To achive this, we use rnBndrL to rename the template variables if necessary; -the renamed ones are the tmpl_vars' +On reflection, this case probably does just work, but this might not + Template: forall x. f (\x.x) + Target: f (\y.y) +Here we want to clone when we find the \x, but to know that x must be in scope + +To achive this, we use rnBndrL to rename the template variables if +necessary; the renamed ones are the tmpl_vars' ---------------------------------------------