diff options
author | Jacques Garrigue <garrigue at math.nagoya-u.ac.jp> | 2014-11-10 09:43:30 +0000 |
---|---|---|
committer | Jacques Garrigue <garrigue at math.nagoya-u.ac.jp> | 2014-11-10 09:43:30 +0000 |
commit | 18ed39fb367731c0f3d0f2c60bb4204e67b91019 (patch) | |
tree | 3b84c25c78ed2a29495ccf06ed673cfc63804211 /typing | |
parent | 5adbb67a458f6f63deb1c1000f887ff87371c706 (diff) |
Fix PR#6650: Cty_constr not handled correctly by Subst
git-svn-id: http://caml.inria.fr/svn/ocaml/trunk@15574 f963ae5c-01c2-4b8c-9fe0-0dff7051ff02
Diffstat (limited to 'typing')
-rw-r--r-- | typing/env.ml | 7 | ||||
-rw-r--r-- | typing/subst.ml | 7 |
2 files changed, 10 insertions, 4 deletions
diff --git a/typing/env.ml b/typing/env.ml index 4e6bba0c5..c0632a7b2 100644 --- a/typing/env.ml +++ b/typing/env.ml @@ -1147,12 +1147,15 @@ let rec prefix_idents root pos sub = function (Subst.add_modtype id (Mty_ident p) sub) rem in (p::pl, final_sub) | Sig_class(id, decl, _) :: rem -> + (* pretend this is a type, cf. PR#6650 *) let p = Pdot(root, Ident.name id, pos) in - let (pl, final_sub) = prefix_idents root (pos + 1) sub rem in + let (pl, final_sub) = + prefix_idents root (pos + 1) (Subst.add_type id p sub) rem in (p::pl, final_sub) | Sig_class_type(id, decl, _) :: rem -> let p = Pdot(root, Ident.name id, nopos) in - let (pl, final_sub) = prefix_idents root pos sub rem in + let (pl, final_sub) = + prefix_idents root pos (Subst.add_type id p sub) rem in (p::pl, final_sub) let subst_signature sub sg = diff --git a/typing/subst.ml b/typing/subst.ml index b6a0edbc5..160de5428 100644 --- a/typing/subst.ml +++ b/typing/subst.ml @@ -333,8 +333,11 @@ let rec rename_bound_idents s idents = function let id' = Ident.rename id in rename_bound_idents (add_modtype id (Mty_ident(Pident id')) s) (id' :: idents) sg - | (Sig_value(id, _) | Sig_typext(id, _, _) | - Sig_class(id, _, _) | Sig_class_type(id, _, _)) :: sg -> + | (Sig_class(id, _, _) | Sig_class_type(id, _, _)) :: sg -> + (* cheat and pretend they are types cf. PR#6650 *) + let id' = Ident.rename id in + rename_bound_idents (add_type id (Pident id') s) (id' :: idents) sg + | (Sig_value(id, _) | Sig_typext(id, _, _)) :: sg -> let id' = Ident.rename id in rename_bound_idents s (id' :: idents) sg |