Account for IfUnpackCo in freeNamesIfDecl
authorSimon Peyton Jones <simonpj@microsoft.com>
Fri, 19 May 2017 11:00:26 +0000 (12:00 +0100)
committerSimon Peyton Jones <simonpj@microsoft.com>
Fri, 19 May 2017 11:23:53 +0000 (12:23 +0100)
We were simply failing to recognise all the free variables of an
IfaceDecl, notably the ones in the coercion of an IfUnpackCo.
Result: the dependency analysis got messed up, so that fingerprint
calculation went wrong.  Trac #13695 showed it up.

A test case is tricky but the fix is a solid one.

compiler/iface/IfaceSyn.hs

index d5ca24e..338397d 100644 (file)
@@ -1372,12 +1372,18 @@ freeNamesIfConDecl :: IfaceConDecl -> NameSet
 freeNamesIfConDecl (IfCon { ifConExTvs   = ex_tvs, ifConCtxt = ctxt
                           , ifConArgTys  = arg_tys
                           , ifConFields  = flds
-                          , ifConEqSpec  = eq_spec })
+                          , ifConEqSpec  = eq_spec
+                          , ifConStricts = bangs })
   = freeNamesIfTyVarBndrs ex_tvs &&&
     freeNamesIfContext ctxt &&&
     fnList freeNamesIfType arg_tys &&&
     mkNameSet (map flSelector flds) &&&
-    fnList freeNamesIfType (map snd eq_spec) -- equality constraints
+    fnList freeNamesIfType (map snd eq_spec) &&& -- equality constraints
+    fnList freeNamesIfBang bangs
+
+freeNamesIfBang :: IfaceBang -> NameSet
+freeNamesIfBang (IfUnpackCo co) = freeNamesIfCoercion co
+freeNamesIfBang _               = emptyNameSet
 
 freeNamesIfKind :: IfaceType -> NameSet
 freeNamesIfKind = freeNamesIfType