aboutsummaryrefslogtreecommitdiffhomepage
path: root/src
diff options
context:
space:
mode:
authorGravatar Adam Chlipala <adam@chlipala.net>2012-05-03 09:56:41 -0400
committerGravatar Adam Chlipala <adam@chlipala.net>2012-05-03 09:56:41 -0400
commit1ca9408089542b282078cc1b7f3c8aa71659f00c (patch)
tree2956d1f36b61e86f6846f488271dfd550f9d1ca9 /src
parent1fd7e4392db0bace167853850188c464b00a8126 (diff)
Catch duplicate top-level module names; fix dropping of constraints during incremental elaboration; document treatment of record types as type class instance types
Diffstat (limited to 'src')
-rw-r--r--src/compiler.sml14
-rw-r--r--src/elaborate.sml2
2 files changed, 14 insertions, 2 deletions
diff --git a/src/compiler.sml b/src/compiler.sml
index 575d95c7..45d87b6a 100644
--- a/src/compiler.sml
+++ b/src/compiler.sml
@@ -943,8 +943,11 @@ val parse = {
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 @@ val parse = {
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,
diff --git a/src/elaborate.sml b/src/elaborate.sml
index 41e9e9ab..f098b580 100644
--- a/src/elaborate.sml
+++ b/src/elaborate.sml
@@ -3934,7 +3934,7 @@ and elabDecl (dAll as (d, loc), (env, denv, gs)) =
val env' = E.declBinds env d
val denv' = dopenConstraints (loc, env', denv) {str = x, strs = []}
in
- ([d], (env', denv', []))
+ ([d], (env', denv', gs))
end
| NONE =>
let