# HG changeset patch # User Adam Chlipala # Date 1214179919 14400 # Node ID c5a503ad0d8c67a4bdc53a9bb41a69270ef7129f # Parent d72b89a1b15019492dcd258cb968b094e09e8fdb Signature duplicate entry checking for principal signatures diff -r d72b89a1b150 -r c5a503ad0d8c src/elaborate.sml --- a/src/elaborate.sml Sun Jun 22 19:44:01 2008 -0400 +++ b/src/elaborate.sml Sun Jun 22 20:11:59 2008 -0400 @@ -1578,6 +1578,40 @@ let val (ds', env') = ListUtil.foldlMapConcat elabDecl env ds val sgis = map sgiOfDecl ds' + + val (sgis, _, _, _, _) = + foldr (fn (sgall as (sgi, loc), (sgis, cons, vals, sgns, strs)) => + case sgi of + L'.SgiConAbs (x, _, _) => + (if SS.member (cons, x) then + sgnError env (DuplicateCon (loc, x)) + else + (); + (sgall :: sgis, SS.add (cons, x), vals, sgns, strs)) + | L'.SgiCon (x, _, _, _) => + (if SS.member (cons, x) then + sgnError env (DuplicateCon (loc, x)) + else + (); + (sgall :: sgis, SS.add (cons, x), vals, sgns, strs)) + | L'.SgiVal (x, _, _) => + if SS.member (vals, x) then + (sgis, cons, vals, sgns, strs) + else + (sgall :: sgis, cons, SS.add (vals, x), sgns, strs) + | L'.SgiSgn (x, _, _) => + (if SS.member (sgns, x) then + sgnError env (DuplicateSgn (loc, x)) + else + (); + (sgall :: sgis, cons, vals, SS.add (sgns, x), strs)) + | L'.SgiStr (x, _, _) => + (if SS.member (strs, x) then + sgnError env (DuplicateStr (loc, x)) + else + (); + (sgall :: sgis, cons, vals, sgns, SS.add (strs, x)))) + ([], SS.empty, SS.empty, SS.empty, SS.empty) sgis in ((L'.StrConst ds', loc), (L'.SgnConst sgis, loc)) end diff -r d72b89a1b150 -r c5a503ad0d8c tests/strdupe.lac --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tests/strdupe.lac Sun Jun 22 20:11:59 2008 -0400 @@ -0,0 +1,11 @@ +val x = 0 +val x = 1 + +type t = int +(*type t = int*) + +signature S = sig end +(*signature S = sig end*) + +structure S = struct end +(*structure S = struct end*)