summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJacques Garrigue <garrigue at math.nagoya-u.ac.jp>2010-03-18 12:22:44 +0000
committerJacques Garrigue <garrigue at math.nagoya-u.ac.jp>2010-03-18 12:22:44 +0000
commit6c3ea41b32eb04e44775840a5d6fee03f3bf460a (patch)
tree4c812e620fd221d4d98223149be7a001d9eda7e1
parentee65acbceb4ce82489e25a450de737581aad7213 (diff)
downloadocaml-6c3ea41b32eb04e44775840a5d6fee03f3bf460a.tar.gz
eliminate values with same name in signatures
git-svn-id: http://caml.inria.fr/svn/ocaml/branches/sigsubst@10202 f963ae5c-01c2-4b8c-9fe0-0dff7051ff02
-rw-r--r--typing/typemod.ml15
1 files changed, 13 insertions, 2 deletions
diff --git a/typing/typemod.ml b/typing/typemod.ml
index 0a9a5395b2..c2e40ccd97 100644
--- a/typing/typemod.ml
+++ b/typing/typemod.ml
@@ -321,6 +321,16 @@ let check_sig_item type_names module_names modtype_names loc = function
check "module type" loc modtype_names (Ident.name id)
| _ -> ()
+let rec remove_values ids = function
+ [] -> []
+ | Tsig_value (id, _) :: rem when List.exists (Ident.equal id) ids -> rem
+ | f :: rem -> f :: remove_values ids rem
+
+let rec get_values = function
+ [] -> []
+ | Tsig_value (id, _) :: rem -> id :: get_values rem
+ | f :: rem -> get_values rem
+
(* Check and translate a module type expression *)
let transl_modtype_longident loc env lid =
@@ -365,7 +375,8 @@ and transl_signature env sg =
let desc = Typedecl.transl_value_decl env sdesc in
let (id, newenv) = Env.enter_value name desc env in
let rem = transl_sig newenv srem in
- Tsig_value(id, desc) :: rem
+ if List.exists (Ident.equal id) (get_values rem) then rem
+ else Tsig_value(id, desc) :: rem
| Psig_type sdecls ->
List.iter
(fun (name, decl) -> check "type" item.psig_loc type_names name)
@@ -411,7 +422,7 @@ and transl_signature env sg =
sg;
let newenv = Env.add_signature sg env in
let rem = transl_sig newenv srem in
- sg @ rem
+ remove_values (get_values rem) sg @ rem
| Psig_class cl ->
List.iter
(fun {pci_name = name} ->