diff options
author | Jacques Garrigue <garrigue at math.nagoya-u.ac.jp> | 2010-03-18 12:22:44 +0000 |
---|---|---|
committer | Jacques Garrigue <garrigue at math.nagoya-u.ac.jp> | 2010-03-18 12:22:44 +0000 |
commit | 6c3ea41b32eb04e44775840a5d6fee03f3bf460a (patch) | |
tree | 4c812e620fd221d4d98223149be7a001d9eda7e1 | |
parent | ee65acbceb4ce82489e25a450de737581aad7213 (diff) | |
download | ocaml-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.ml | 15 |
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} -> |