changeset 1991:7db8356caef5

Tweaked parameter renaming for functors, so now demos and the original bug-triggering application work
author Adam Chlipala <adam@chlipala.net>
date Thu, 20 Feb 2014 15:50:33 -0500
parents 7bd2ecf96bb0
children 7075acda4456
files src/elaborate.sml src/expl_rename.sml
diffstat 2 files changed, 14 insertions(+), 10 deletions(-) [+]
line wrap: on
line diff
--- a/src/elaborate.sml	Thu Feb 20 10:48:17 2014 -0500
+++ b/src/elaborate.sml	Thu Feb 20 15:50:33 2014 -0500
@@ -4455,16 +4455,6 @@
                         subSgn env' loc actual ran';
                         (ran', gs)
                     end
-
-            (* Later compiler phases are simplified by alpha-varying
-             * the functor formal argument here, if the same name
-             * will be defined independently in the functor body. *)
-            fun ensureUnused m =
-                case E.projectStr env' {sgn = actual, str = (L'.StrVar 0, loc), field = m} of
-                    NONE => m
-                  | SOME _ => ensureUnused ("?" ^ m)
-
-            val m = ensureUnused m
         in
             ((L'.StrFun (m, n, dom', formal, str'), loc),
              (L'.SgnFun (m, n, dom', formal), loc),
--- a/src/expl_rename.sml	Thu Feb 20 10:48:17 2014 -0500
+++ b/src/expl_rename.sml	Thu Feb 20 15:50:33 2014 -0500
@@ -422,6 +422,20 @@
             val (st, n) = St.bind (st, FormalId)
                      
             val (ds, st) = ListUtil.foldlMapConcat dupDecl st ds
+
+            (* Revenge of the functor parameter renamer!
+             * See comment in elaborate.sml for the start of the saga.
+             * We need to alpha-rename the argument to allow sufficient shadowing in the body. *)
+
+            fun mungeName m =
+                if List.exists (fn (DStr (x, _, _, _), _) => x = m
+                                 | _ => false) ds then
+                    mungeName ("?" ^ m)
+                else
+                    m
+
+            val FormalName = mungeName FormalName
+
             val ds = (DStr (FormalName, n, (SgnConst [], loc), (StrVar FormalId, loc)), loc) :: ds
         in
             (St.next st, (StrConst ds, loc))