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).
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?