diff src/compiler.sml @ 1738:1a35e75b6967

Catch duplicate top-level module names; fix dropping of constraints during incremental elaboration; document treatment of record types as type class instance types
author Adam Chlipala <adam@chlipala.net>
date Thu, 03 May 2012 09:56:41 -0400
parents ab24a7cb2a64
children c414850f206f
line wrap: on
line diff
--- a/src/compiler.sml	Wed May 02 08:56:19 2012 -0400
+++ b/src/compiler.sml	Thu May 03 09:56:41 2012 -0400
@@ -943,8 +943,11 @@
                                      first = ErrorMsg.dummyPos,
                                      last = ErrorMsg.dummyPos}
 
+                          val urt = OS.FileSys.modTime ur
+                          val urst = (OS.FileSys.modTime urs) handle _ => urt
+
                           val ds = #func parseUr ur
-                          val d = (Source.DStr (mname, sgnO, if !Elaborate.incremental then SOME (OS.FileSys.modTime ur) else NONE,
+                          val d = (Source.DStr (mname, sgnO, if !Elaborate.incremental then SOME (if Time.> (urt, urst) then urt else urst) else NONE,
                                                 (Source.StrConst ds, loc)), loc)
 
                           val fname = OS.Path.mkCanonical fname
@@ -1078,6 +1081,15 @@
                                    NONE => ds
                                  | SOME v => ds @ [(Source.DOnError v, loc)]
                   in
+                      ignore (List.foldl (fn (d, used) =>
+                                             case #1 d of
+                                                 Source.DStr (x, _, _, _) =>
+                                                 if SS.member (used, x) then
+                                                     (ErrorMsg.errorAt (#2 d) ("Duplicate top-level module name " ^ x);
+                                                      used)
+                                                 else
+                                                     SS.add (used, x)
+                                               | _ => used) SS.empty ds);
                       ds
                   end handle Empty => ds
               end,