aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--kernel/environ.ml4
-rw-r--r--kernel/environ.mli3
-rw-r--r--kernel/mod_typing.ml12
-rw-r--r--kernel/modops.ml8
-rw-r--r--kernel/modops.mli2
-rw-r--r--kernel/safe_typing.ml2
6 files changed, 29 insertions, 2 deletions
diff --git a/kernel/environ.ml b/kernel/environ.ml
index e4b1af8fe..4e930a09e 100644
--- a/kernel/environ.ml
+++ b/kernel/environ.ml
@@ -49,6 +49,10 @@ let universes env = env.env_universes
let named_context env = env.env_named_context
let rel_context env = env.env_rel_context
+let empty_context env =
+ env.env_rel_context = empty_rel_context
+ && env.env_named_context = empty_named_context
+
(* Rel context *)
let lookup_rel n env =
Sign.lookup_rel n env.env_rel_context
diff --git a/kernel/environ.mli b/kernel/environ.mli
index 2b2be6b6b..baf1a71e1 100644
--- a/kernel/environ.mli
+++ b/kernel/environ.mli
@@ -35,6 +35,9 @@ val universes : env -> Univ.universes
val rel_context : env -> rel_context
val named_context : env -> named_context
+(* is the local context empty *)
+val empty_context : env -> bool
+
(***********************************************************************)
(*s Context of de Bruijn variables (rel_context) *)
val push_rel : rel_declaration -> env -> env
diff --git a/kernel/mod_typing.ml b/kernel/mod_typing.ml
index 785e8ebdd..7417b4261 100644
--- a/kernel/mod_typing.ml
+++ b/kernel/mod_typing.ml
@@ -136,10 +136,18 @@ and translate_entry_list env msid is_definition sig_e =
match e with
| SPEconst ce ->
let cb = translate_constant env ce in
- add_constant kn cb env, (l, SEBconst cb), (l, SPBconst cb)
+ begin match cb.const_hyps with
+ | (_::_) -> error_local_context (Some l)
+ | [] ->
+ add_constant kn cb env, (l, SEBconst cb), (l, SPBconst cb)
+ end
| SPEmind mie ->
let mib = translate_mind env mie in
- add_mind kn mib env, (l, SEBmind mib), (l, SPBmind mib)
+ begin match mib.mind_hyps with
+ | (_::_) -> error_local_context (Some l)
+ | [] ->
+ add_mind kn mib env, (l, SEBmind mib), (l, SPBmind mib)
+ end
| SPEmodule me ->
let mb = translate_module env is_definition me in
let mspec =
diff --git a/kernel/modops.ml b/kernel/modops.ml
index cd8cbe1ee..ec25459a9 100644
--- a/kernel/modops.ml
+++ b/kernel/modops.ml
@@ -66,6 +66,14 @@ let error_not_a_constant l =
let error_with_incorrect l =
error ("Incorrect constraint for label \""^(string_of_label l)^"\"")
+let error_local_context lo =
+ match lo with
+ None ->
+ error ("The local context is not empty.")
+ | (Some l) ->
+ error ("The local context of the component "^
+ (string_of_label l)^" is not empty")
+
let rec scrape_modtype env = function
| MTBident kn -> scrape_modtype env (lookup_modtype kn env)
| mtb -> mtb
diff --git a/kernel/modops.mli b/kernel/modops.mli
index e865159c5..aaff57223 100644
--- a/kernel/modops.mli
+++ b/kernel/modops.mli
@@ -90,3 +90,5 @@ val error_not_a_module : string -> 'a
val error_not_a_constant : label -> 'a
val error_with_incorrect : label -> 'a
+
+val error_local_context : label option -> 'a
diff --git a/kernel/safe_typing.ml b/kernel/safe_typing.ml
index 52fe3a135..e200e7bf3 100644
--- a/kernel/safe_typing.ml
+++ b/kernel/safe_typing.ml
@@ -272,6 +272,7 @@ let end_module l senv =
| STRUCT(params,restype) -> (params,restype)
in
if l <> modinfo.label then error_incompatible_labels l modinfo.label;
+ if not (empty_context senv.env) then error_local_context None;
let functorize_type =
List.fold_right
(fun (arg_id,arg_b) mtb -> MTBfunsig (arg_id,arg_b,mtb))
@@ -366,6 +367,7 @@ let end_modtype l senv =
| SIG params -> params
in
if l <> modinfo.label then error_incompatible_labels l modinfo.label;
+ if not (empty_context senv.env) then error_local_context None;
let res_tb = MTBsig (modinfo.msid, List.rev senv.revsign) in
let mtb =
List.fold_right