Don't treat datacon id's as local variables.
authorMatthijs Kooijman <matthijs@stdin.nl>
Wed, 16 Jun 2010 10:47:44 +0000 (12:47 +0200)
committerMatthijs Kooijman <matthijs@stdin.nl>
Wed, 16 Jun 2010 10:47:44 +0000 (12:47 +0200)
This ensures that datacon id's get simplified like they should.
Previously, this wasn't really needed, since a datacon id would become a
constant that could be used in conditional assignments directly. Now,
however, there might be more complex ADT's (like the Maybe type), where
one of the constructors is without arguments (e.g., Nothing), but
assigning the enumeration value directly won't work (it should go into
the constructor field).

clash/CLasH/Normalize/NormalizeTools.hs

index cdb7ee01352a85fca6cf080de9019259c359d632..eff8b67db39798b020e8523d8f28524cc8efaa4f 100644 (file)
@@ -216,7 +216,10 @@ isRepr' tything = case CoreTools.getType tything of
 is_local_var :: CoreSyn.CoreExpr -> TranslatorSession Bool
 is_local_var (CoreSyn.Var v) = do
   bndrs <- getGlobalBinders
-  return $ v `notElem` bndrs
+  -- A datacon id is not a global binder, but not a local variable
+  -- either.
+  let is_dc = Id.isDataConWorkId v
+  return $ not is_dc && v `notElem` bndrs
 is_local_var _ = return False
 
 -- Is the given binder defined by the user?