Commit a1636622 authored by simonpj's avatar simonpj
Browse files

[project @ 2005-03-07 17:46:24 by simonpj]

       Make sure that LiberateCase only binds Internal Names

	Merge to STABLE

The nested bindings generated by LiberateCase should be Internal as
well as not-exported.  Otherwise an External Name can float to top level,
where it might name-clash with another one.
parent 36d22a1c
......@@ -12,8 +12,9 @@ import CmdLineOpts ( DynFlags, DynFlag(..), opt_LiberateCaseThreshold )
import CoreLint ( showPass, endPass )
import CoreSyn
import CoreUnfold ( couldBeSmallEnoughToInline )
import Var ( Id, setIdNotExported )
import Id ( Id, setIdName, idName, setIdNotExported )
import VarEnv
import Name ( localiseName )
import Outputable
import Util ( notNull )
......@@ -190,14 +191,20 @@ libCaseBind env (Rec pairs)
-- processing the rhs with an *un-extended* environment, so
-- that the same process doesn't occur for ever!
-- Furthermore (subtle!) reset the export flags on the binders so
extended_env = addRecBinds env [ (setIdNotExported binder, libCase env_body rhs)
| (binder, rhs) <- pairs ]
-- Two subtle things:
-- (a) Reset the export flags on the binders so
-- that we don't get name clashes on exported things if the
-- local binding floats out to top level. This is most unlikely
-- to happen, since the whole point concerns free variables.
-- But resetting the export flag is right regardless.
extended_env = addRecBinds env [ (setIdNotExported binder, libCase env_body rhs)
| (binder, rhs) <- pairs ]
-- (b) Make the name an Internal one. External Names should never be
-- nested; if it were floated to the top level, we'd get a name
-- clash at code generation time.
adjust bndr = setIdNotExported (setIdName bndr (localiseName (idName bndr)))
rhs_small_enough rhs = couldBeSmallEnoughToInline lIBERATE_BOMB_SIZE rhs
lIBERATE_BOMB_SIZE = bombOutSize env
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment