comparison src/elaborate.sml @ 1968:2c075e875a47

Fix a subtle renaming problem in elaborating functor applications
author Adam Chlipala <adam@chlipala.net>
date Fri, 14 Feb 2014 15:11:22 -0500
parents 072656016dfa
children 210fb3dfc483
comparison
equal deleted inserted replaced
1967:fca98a6cbe23 1968:2c075e875a47
4479 | L'.SgnFun (m, n, dom, ran) => 4479 | L'.SgnFun (m, n, dom, ran) =>
4480 (subSgn env loc sgn2 dom; 4480 (subSgn env loc sgn2 dom;
4481 case #1 (hnormSgn env ran) of 4481 case #1 (hnormSgn env ran) of
4482 L'.SgnError => (strerror, sgnerror, []) 4482 L'.SgnError => (strerror, sgnerror, [])
4483 | L'.SgnConst sgis => 4483 | L'.SgnConst sgis =>
4484 ((L'.StrApp (str1', str2'), loc), 4484 let
4485 (L'.SgnConst ((L'.SgiStr (m, n, selfifyAt env {str = str2', sgn = sgn2}), loc) :: sgis), loc), 4485 (* This code handles a tricky case that led to a very nasty bug.
4486 gs1 @ gs2) 4486 * An invariant about signatures of elaborated modules is that no
4487 * identifier that could appear directly in a program is defined
4488 * twice. We add "?" in front of identifiers where necessary to
4489 * maintain the invariant, but the code below, to extend a functor
4490 * body with a binding for the functor argument, wasn't written
4491 * with the invariant in mind. Luckily for us, references to
4492 * an identifier later within a signature work by globally
4493 * unique index, so we just need to change the string name in the
4494 * new declaration. *)
4495 val m =
4496 if List.exists (fn (L'.SgiStr (x, _, _), _) => x = m
4497 | _ => false) sgis then
4498 "?" ^ m
4499 else
4500 m
4501 in
4502 ((L'.StrApp (str1', str2'), loc),
4503 (L'.SgnConst ((L'.SgiStr (m, n, selfifyAt env {str = str2', sgn = sgn2}), loc) :: sgis), loc),
4504 gs1 @ gs2)
4505 end
4487 | _ => raise Fail "Unable to hnormSgn in functor application") 4506 | _ => raise Fail "Unable to hnormSgn in functor application")
4488 | _ => (strError env (NotFunctor sgn1); 4507 | _ => (strError env (NotFunctor sgn1);
4489 (strerror, sgnerror, [])) 4508 (strerror, sgnerror, []))
4490 end 4509 end
4491 4510