summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJacques Garrigue <garrigue at math.nagoya-u.ac.jp>2002-02-01 02:49:48 +0000
committerJacques Garrigue <garrigue at math.nagoya-u.ac.jp>2002-02-01 02:49:48 +0000
commitbfc6db3edc23be93bedb0893fb10b3fe894d85c1 (patch)
treef8a58a5badeff1e7743cd67b8e3abcf071fd57d2
parent20f9b3e86b40a71c57fd9ab390ccbe250e8d9844 (diff)
PR#841
git-svn-id: http://caml.inria.fr/svn/ocaml/trunk@4333 f963ae5c-01c2-4b8c-9fe0-0dff7051ff02
-rw-r--r--typing/ctype.ml14
1 files changed, 12 insertions, 2 deletions
diff --git a/typing/ctype.ml b/typing/ctype.ml
index 693075d43..b43d5c260 100644
--- a/typing/ctype.ml
+++ b/typing/ctype.ml
@@ -1005,9 +1005,18 @@ let rec occur_rec env visited ty0 ty =
| _ ->
iter_type_expr (occur_rec env visited ty0) ty
+let type_changed = ref false (* trace possible changes to the studied type *)
+
let occur env ty0 ty =
- if not !Clflags.recursive_types then
- try occur_rec env [] ty0 ty with Occur -> raise (Unify [])
+ if not !Clflags.recursive_types then
+ let old = !type_changed in
+ try
+ while type_changed := false; occur_rec env [] ty0 ty; !type_changed
+ do () (* prerr_endline "changed" *) done;
+ type_changed := old
+ with exn ->
+ type_changed := old;
+ raise (match exn with Occur -> Unify [] | _ -> exn)
(*****************)
@@ -1079,6 +1088,7 @@ let rec unify env t1 t2 =
if t1 == t2 then () else
try
+ type_changed := true;
match (t1.desc, t2.desc) with
(Tvar, Tconstr _) when deep_occur t1 t2 ->
unify2 env t1 t2