summaryrefslogtreecommitdiffstats
path: root/typing
diff options
context:
space:
mode:
authorJacques Garrigue <garrigue at math.nagoya-u.ac.jp>2014-11-10 09:43:30 +0000
committerJacques Garrigue <garrigue at math.nagoya-u.ac.jp>2014-11-10 09:43:30 +0000
commit18ed39fb367731c0f3d0f2c60bb4204e67b91019 (patch)
tree3b84c25c78ed2a29495ccf06ed673cfc63804211 /typing
parent5adbb67a458f6f63deb1c1000f887ff87371c706 (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.ml7
-rw-r--r--typing/subst.ml7
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