| Anonymous | Login | Signup for a new account | 2013-05-22 04:54 CEST | ![]() |
| Main | My View | View Issues | Change Log | Roadmap |
| View Issue Details [ Jump to Notes ] | [ Issue History ] [ Print ] | ||||||||||
| ID | Project | Category | View Status | Date Submitted | Last Update | ||||||
| 0005888 | OCaml | OCaml typing | public | 2013-01-13 18:46 | 2013-02-07 04:31 | ||||||
| Reporter | edwin | ||||||||||
| Assigned To | garrigue | ||||||||||
| Priority | normal | Severity | tweak | Reproducibility | have not tried | ||||||
| Status | acknowledged | Resolution | open | ||||||||
| Platform | Linux | OS | Debian GNU/Linux | OS Version | wheezy | ||||||
| Product Version | 4.00.1 | ||||||||||
| Target Version | Fixed in Version | ||||||||||
| Summary | 0005888: Better type errors for polymorphic variants and module signatures | ||||||||||
| Description | ML discussion: https://sympa.inria.fr/sympa/arc/caml-list/2013-01/msg00023.html [^] I'm fine with how the language works, but the type error generated by the compiler could be improved, currently it only tells me that the values do not match. Attached is an example patch that implements some improved type error messages. With polymorphic types it may not be immediately obvious what is wrong, so it'd be good if the compiler would be more explicit about the error. It already gives helpful hints when polymorphic types lack a tag or the tags' type do not match. Unfortunately when module signatures are checked it doesn't even give those errors. | ||||||||||
| Steps To Reproduce | module Bad3 : sig val copy: [< `A of a | `B of a ] -> [< `A of a | `C of a] -> unit end = struct let generic (a: [< `A of a | `B of a]) (b: [< `A of a | `C of a]) = () let specific a b = false let copy a b = match a, b with | `A x, `A y -> if not (specific (`A x) (`A y)) then generic a b | _, _ -> generic a b end Error: Signature mismatch: ... Values do not match: val copy : [< `A of a | `B of a > `A ] -> [< `A of a | `C of a > `A ] -> unit is not included in val copy : [< `A of a | `B of a ] -> [< `A of a | `C of a ] -> unit | ||||||||||
| Additional Information | Would be good to have more detailed errors for: - module signature vs implementation: inspect arrows,tuples, etc. and report exactly what causes the type error (like it is already done when signatures are not invovled) - mandatory vs optional tags in polymorphic variants: [< `A] vs [> `A] - tuples with different lengths - different order of function parameter labels Would also good to have (I didn't implement it): - origin/trace of type inference (i.e. wildcard match case, etc.) - remove "impossible" tags (i.e. `A of string&int or `A of <empty-poly-variant-type>) when expanding types in error messages - warn when intersection of polymorphic variants is empty, i.e. [< `A of [< `B] & [< `C]) or [< `A of string&int], etc. I've attached 3 patches, and also a combined diff of the 3 patches. There are probably easier/more elegant ways to implement it, consider them a draft. Also I've only updated testsuite/tests/typing-misc, some of the others might have to be updated in light of the new error messages. Also please improve the documentation using the very good explanations/examples by Leo White and Jacques Garrigue, in particular the part about why [> `A] is inferred for matches with wildcard branches: http://caml.inria.fr/pub/docs/manual-ocaml-4.00/manual006.html#toc36 [^] http://caml.inria.fr/pub/docs/manual-ocaml-4.00/types.html#polymorphic-variant-type [^] https://sympa.inria.fr/sympa/arc/caml-list/2013-01/msg00019.html [^] https://sympa.inria.fr/sympa/arc/caml-list/2013-01/msg00019.html [^] Note: the manual006.html#toc36 should probably have a link to types.html#polymorphic-variant-type. | ||||||||||
| Tags | No tags attached. | ||||||||||
| Attached Files | diff --git a/testsuite/tests/typing-misc/polyvars.ml b/testsuite/tests/typing-misc/polyvars.ml
index f31e9af..e2656e2 100644
--- a/testsuite/tests/typing-misc/polyvars.ml
+++ b/testsuite/tests/typing-misc/polyvars.ml
@@ -2,3 +2,34 @@ type ab = [ `A | `B ];;
let f (x : [`A]) = match x with #ab -> 1;;
let f x = ignore (match x with #ab -> 1); ignore (x : [`A]);;
let f x = ignore (match x with `A|`B -> 1); ignore (x : [`A]);;
+
+module Ok : sig val f : [< `A] -> unit end = struct
+ let f x = match x with | `A -> () | `B -> ()
+end
+
+module TagIncompat : sig val foo: [< `A | `B | `C] -> unit end = struct
+ let foo = function | `A -> () | `B -> ()
+end;;
+
+module WildcardMatch : sig val foo: [< `A of int | `B of string] -> unit end = struct
+ let bar (x: [< `A of int | `B of string]) = ()
+ let foo = function | `A _ -> () | x -> bar x
+end;;
+
+module Typo : sig val f : [< `Bar of int] -> int end = struct
+ let f = function | `Bat x -> x | _ -> 4
+end;;
+
+module LabelOrder : sig
+ val f : foo:[< `A of int | `B of string] -> bar:int -> unit
+end = struct
+ let f ~bar ~foo = match foo with
+ | `A a -> print_int a
+ | `B b -> print_string b
+end;;
+
+module TupleCount : sig
+ val f : [< `A ] * [< `A ] * [< `A ] -> unit
+end = struct
+ let f = function | `A, `B -> ()
+end;;
diff --git a/testsuite/tests/typing-misc/polyvars.ml.principal.reference b/testsuite/tests/typing-misc/polyvars.ml.principal.reference
index fabbb90..7c64a21 100644
--- a/testsuite/tests/typing-misc/polyvars.ml.principal.reference
+++ b/testsuite/tests/typing-misc/polyvars.ml.principal.reference
@@ -18,4 +18,78 @@ Error: This pattern matches values of type [? `B ]
Error: This pattern matches values of type [? `B ]
but a pattern was expected which matches values of type [ `A ]
Types for tag `B are incompatible
+# Characters 171-224:
+ .................................................................struct
+ let foo = function | `A -> () | `B -> ()
+ end..
+Error: Signature mismatch:
+ Modules do not match:
+ sig val foo : [< `A | `B ] -> unit end
+ is not included in
+ sig val foo : [< `A | `B | `C ] -> unit end
+ Values do not match:
+ val foo : [< `A | `B ] -> unit
+ is not included in
+ val foo : [< `A | `B | `C ] -> unit
+ Type component [ ] does not match [< `C ]
+ The first variant type does not allow tag(s) `C
+# Characters 80-186:
+ ...............................................................................struct
+ let bar (x: [< `A of int | `B of string]) = ()
+ let foo = function | `A _ -> () | x -> bar x
+ end..
+Error: Signature mismatch:
+ ...
+ Values do not match:
+ val foo : [< `A of int | `B of string > `A ] -> unit
+ is not included in
+ val foo : [< `A of int | `B of string ] -> unit
+ Type component [ `A of int ] does not match [< `A of int ]
+ Types for tag `A are incompatible: the tag is mandatory in the first type only
+# Characters 56-108:
+ .......................................................struct
+ let f = function | `Bat x -> x | _ -> 4
+ end..
+Error: Signature mismatch:
+ Modules do not match:
+ sig val f : [> `Bat of int ] -> int end
+ is not included in
+ sig val f : [< `Bar of int ] -> int end
+ Values do not match:
+ val f : [> `Bat of int ] -> int
+ is not included in
+ val f : [< `Bar of int ] -> int
+ Type component [> `Bat of int ] does not match [< `Bar of int ]
+ The first variant type is missing mandatory tag(s) `Bat
+# Characters 93-189:
+ ......struct
+ let f ~bar ~foo = match foo with
+ | `A a -> print_int a
+ | `B b -> print_string b
+ end..
+Error: Signature mismatch:
+ ...
+ Values do not match:
+ val f : bar:'a -> foo:[< `A of int | `B of string ] -> unit
+ is not included in
+ val f : foo:[< `A of int | `B of string ] -> bar:int -> unit
+ Type component bar:'a -> foo:[< `A of int | `B of string ] -> unit
+ does not match foo:[< `A of int | `B of string ] -> bar:int -> unit
+ Label (order) doesn't match: bar <> foo
+# Characters 77-121:
+ ......struct
+ let f = function | `A, `B -> ()
+ end..
+Error: Signature mismatch:
+ Modules do not match:
+ sig val f : [< `A ] * [< `B ] -> unit end
+ is not included in
+ sig val f : [< `A ] * [< `A ] * [< `A ] -> unit end
+ Values do not match:
+ val f : [< `A ] * [< `B ] -> unit
+ is not included in
+ val f : [< `A ] * [< `A ] * [< `A ] -> unit
+ Type component [< `A ] * [< `B ] does not match
+ [< `A ] * [< `A ] * [< `A ]
+ Tuples have different lengths: 2 <> 3
#
diff --git a/testsuite/tests/typing-misc/polyvars.ml.reference b/testsuite/tests/typing-misc/polyvars.ml.reference
index 4117b70..bf22912 100644
--- a/testsuite/tests/typing-misc/polyvars.ml.reference
+++ b/testsuite/tests/typing-misc/polyvars.ml.reference
@@ -18,4 +18,78 @@ Error: This pattern matches values of type [? `B ]
Error: This pattern matches values of type [? `B ]
but a pattern was expected which matches values of type [ `A ]
The second variant type does not allow tag(s) `B
+# Characters 171-224:
+ .................................................................struct
+ let foo = function | `A -> () | `B -> ()
+ end..
+Error: Signature mismatch:
+ Modules do not match:
+ sig val foo : [< `A | `B ] -> unit end
+ is not included in
+ sig val foo : [< `A | `B | `C ] -> unit end
+ Values do not match:
+ val foo : [< `A | `B ] -> unit
+ is not included in
+ val foo : [< `A | `B | `C ] -> unit
+ Type component [ ] does not match [< `C ]
+ The first variant type does not allow tag(s) `C
+# Characters 80-186:
+ ...............................................................................struct
+ let bar (x: [< `A of int | `B of string]) = ()
+ let foo = function | `A _ -> () | x -> bar x
+ end..
+Error: Signature mismatch:
+ ...
+ Values do not match:
+ val foo : [< `A of int | `B of string > `A ] -> unit
+ is not included in
+ val foo : [< `A of int | `B of string ] -> unit
+ Type component [ `A of int ] does not match [< `A of int ]
+ Types for tag `A are incompatible: the tag is mandatory in the first type only
+# Characters 56-108:
+ .......................................................struct
+ let f = function | `Bat x -> x | _ -> 4
+ end..
+Error: Signature mismatch:
+ Modules do not match:
+ sig val f : [> `Bat of int ] -> int end
+ is not included in
+ sig val f : [< `Bar of int ] -> int end
+ Values do not match:
+ val f : [> `Bat of int ] -> int
+ is not included in
+ val f : [< `Bar of int ] -> int
+ Type component [> `Bat of int ] does not match [< `Bar of int ]
+ The first variant type is missing mandatory tag(s) `Bat
+# Characters 93-189:
+ ......struct
+ let f ~bar ~foo = match foo with
+ | `A a -> print_int a
+ | `B b -> print_string b
+ end..
+Error: Signature mismatch:
+ ...
+ Values do not match:
+ val f : bar:'a -> foo:[< `A of int | `B of string ] -> unit
+ is not included in
+ val f : foo:[< `A of int | `B of string ] -> bar:int -> unit
+ Type component bar:'a -> foo:[< `A of int | `B of string ] -> unit
+ does not match foo:[< `A of int | `B of string ] -> bar:int -> unit
+ Label (order) doesn't match: bar <> foo
+# Characters 77-121:
+ ......struct
+ let f = function | `A, `B -> ()
+ end..
+Error: Signature mismatch:
+ Modules do not match:
+ sig val f : [< `A ] * [< `B ] -> unit end
+ is not included in
+ sig val f : [< `A ] * [< `A ] * [< `A ] -> unit end
+ Values do not match:
+ val f : [< `A ] * [< `B ] -> unit
+ is not included in
+ val f : [< `A ] * [< `A ] * [< `A ] -> unit
+ Type component [< `A ] * [< `B ] does not match
+ [< `A ] * [< `A ] * [< `A ]
+ Tuples have different lengths: 2 <> 3
#
diff --git a/toplevel/genprintval.ml b/toplevel/genprintval.ml
index 4472155..06f648e 100644
--- a/toplevel/genprintval.ml
+++ b/toplevel/genprintval.ml
@@ -128,9 +128,11 @@ module Make(O : OBJ)(EVP : EVALPATH with type valu = O.t) = struct
let rec find = function
| [] -> raise Not_found
| (name, sch, printer) :: remainder ->
- if Ctype.moregeneral env false sch ty
- then printer
- else find remainder
+ try
+ Ctype.moregeneral env false sch ty;
+ printer
+ with Ctype.Unify _ ->
+ find remainder
in find !printers
(* Print a constructor or label, giving it the same prefix as the type
diff --git a/typing/ctype.ml b/typing/ctype.ml
index 7dbbb94..c13e5b1 100644
--- a/typing/ctype.ml
+++ b/typing/ctype.ml
@@ -2780,7 +2780,7 @@ and moregen_row inst_nongen type_pairs env row1 row2 =
else r1, r2
in
if r1 <> [] || row1.row_closed && (not row2.row_closed || r2 <> [])
- then raise (Unify []);
+ then raise (Unify [ mkvariant r1 row1.row_closed, mkvariant r2 row2.row_closed ]);
begin match rm1.desc, rm2.desc with
Tunivar _, Tunivar _ ->
unify_univar rm1 rm2 !univar_pairs
@@ -2804,7 +2804,7 @@ and moregen_row inst_nongen type_pairs env row1 row2 =
(fun (l,f1,f2) ->
let f1 = row_field_repr f1 and f2 = row_field_repr f2 in
if f1 == f2 then () else
- match f1, f2 with
+ try match f1, f2 with
Rpresent(Some t1), Rpresent(Some t2) ->
moregen inst_nongen type_pairs env t1 t2
| Rpresent None, Rpresent None -> ()
@@ -2829,7 +2829,9 @@ and moregen_row inst_nongen type_pairs env row1 row2 =
| Reither(_, _, _, e1), Rabsent when may_inst ->
set_row_field e1 f2
| Rabsent, Rabsent -> ()
- | _ -> raise (Unify []))
+ | _ -> raise (Unify [])
+ with Unify _ ->
+ raise (Unify [ mkvariant [l,f1] row1.row_closed, mkvariant [l,f2] row2.row_closed ]))
pairs
(* Must empty univar_pairs first *)
@@ -2859,11 +2861,11 @@ let moregeneral env inst_nongen pat_sch subj_sch =
(* Duplicate generic variables *)
let patt = instance env pat_sch in
let res =
- try moregen inst_nongen (TypePairs.create 13) env patt subj; true with
- Unify _ -> false
+ try moregen inst_nongen (TypePairs.create 13) env patt subj; [] with
+ Unify l -> l
in
current_level := old_level;
- res
+ if res <> [] then raise (Unify res);;
(* Alternative approach: "rigidify" a type scheme,
diff --git a/typing/ctype.mli b/typing/ctype.mli
index e52fec4..cf7d572 100644
--- a/typing/ctype.mli
+++ b/typing/ctype.mli
@@ -172,8 +172,9 @@ val deep_occur: type_expr -> type_expr -> bool
val filter_self_method:
Env.t -> string -> private_flag -> (Ident.t * type_expr) Meths.t ref ->
type_expr -> Ident.t * type_expr
-val moregeneral: Env.t -> bool -> type_expr -> type_expr -> bool
- (* Check if the first type scheme is more general than the second. *)
+val moregeneral: Env.t -> bool -> type_expr -> type_expr -> unit
+ (* Check if the first type scheme is more general than the second, raise
+ * Unify otherwise. *)
val rigidify: type_expr -> type_expr list
(* "Rigidify" a type and return its type variable *)
diff --git a/typing/includecore.ml b/typing/includecore.ml
index 3a2d9df..d1c4736 100644
--- a/typing/includecore.ml
+++ b/typing/includecore.ml
@@ -19,18 +19,14 @@ open Typedtree
(* Inclusion between value descriptions *)
-exception Dont_match
-
let value_descriptions env vd1 vd2 =
- if Ctype.moregeneral env true vd1.val_type vd2.val_type then begin
+ Ctype.moregeneral env true vd1.val_type vd2.val_type;
match (vd1.val_kind, vd2.val_kind) with
(Val_prim p1, Val_prim p2) ->
- if p1 = p2 then Tcoerce_none else raise Dont_match
+ if p1 = p2 then Tcoerce_none else raise (Ctype.Unify [])
| (Val_prim p, _) -> Tcoerce_primitive p
- | (_, Val_prim p) -> raise Dont_match
+ | (_, Val_prim p) -> raise (Ctype.Unify [])
| (_, _) -> Tcoerce_none
- end else
- raise Dont_match
(* Inclusion between "private" annotations *)
diff --git a/typing/includecore.mli b/typing/includecore.mli
index 0836241..3d3f47b 100644
--- a/typing/includecore.mli
+++ b/typing/includecore.mli
@@ -15,8 +15,6 @@
open Typedtree
open Types
-exception Dont_match
-
type type_mismatch =
Arity
| Privacy
diff --git a/typing/includemod.ml b/typing/includemod.ml
index 5a1d4b9..764c52b 100644
--- a/typing/includemod.ml
+++ b/typing/includemod.ml
@@ -20,6 +20,7 @@ open Types
type symptom =
Missing_field of Ident.t
| Value_descriptions of Ident.t * value_description * value_description
+ * (type_expr * type_expr) list
| Type_declarations of Ident.t * type_declaration
* type_declaration * Includecore.type_mismatch list
| Exception_declarations of
@@ -53,8 +54,8 @@ let value_descriptions env cxt subst id vd1 vd2 =
let vd2 = Subst.value_description subst vd2 in
try
Includecore.value_descriptions env vd1 vd2
- with Includecore.Dont_match ->
- raise(Error[cxt, Value_descriptions(id, vd1, vd2)])
+ with Ctype.Unify l ->
+ raise(Error[cxt, Value_descriptions(id, vd1, vd2, l)])
(* Inclusion between type declarations *)
@@ -350,10 +351,15 @@ let show_locs ppf (loc1, loc2) =
let include_err ppf = function
| Missing_field id ->
fprintf ppf "The field `%a' is required but not provided" ident id
- | Value_descriptions(id, d1, d2) ->
+ | Value_descriptions(id, d1, d2, l) ->
fprintf ppf
"@[<hv 2>Values do not match:@ %a@;<1 -2>is not included in@ %a@]"
(value_description id) d1 (value_description id) d2;
+ let t1, t2 = List.hd (List.rev l) in
+ fprintf ppf "@\n";
+ report_unification_error ppf [t1,t1;t2,t2] (fun ppf ->
+ fprintf ppf "Type component"
+ ) (fun ppf -> fprintf ppf "does not match");
show_locs ppf (d1.val_loc, d2.val_loc);
| Type_declarations(id, d1, d2, errs) ->
fprintf ppf "@[<v>@[<hv>%s:@;<1 2>%a@ %s@;<1 2>%a@]%a%a@]"
diff --git a/typing/includemod.mli b/typing/includemod.mli
index 5f2c414..7348deb 100644
--- a/typing/includemod.mli
+++ b/typing/includemod.mli
@@ -25,6 +25,7 @@ val type_declarations:
type symptom =
Missing_field of Ident.t
| Value_descriptions of Ident.t * value_description * value_description
+ * (type_expr * type_expr) list
| Type_declarations of Ident.t * type_declaration
* type_declaration * Includecore.type_mismatch list
| Exception_declarations of
diff --git a/typing/printtyp.ml b/typing/printtyp.ml
index 69ca127..9c4153f 100644
--- a/typing/printtyp.ml
+++ b/typing/printtyp.ml
@@ -991,6 +991,8 @@ let has_explanation unif t3 t4 =
Tfield _, (Tnil|Tconstr _) | (Tnil|Tconstr _), Tfield _
| _, Tvar _ | Tvar _, _
| Tvariant _, Tvariant _ -> true
+ | Tarrow (l1,_,_,_), Tarrow (l2,_,_,_) -> l1 <> l2
+ | Ttuple l1, Ttuple l2 -> (List.length l1) <> (List.length l2)
| Tfield (l,_,_,{desc=Tnil}), Tfield (l',_,_,{desc=Tnil}) -> l = l'
| _ -> false
@@ -1056,10 +1058,30 @@ let explanation unif t3 t4 ppf =
fprintf ppf
"@,@[The second variant type does not allow tag(s)@ @[<hov>%a@]@]"
print_tags fields
- | [l1,_], true, [l2,_], true when l1 = l2 ->
- fprintf ppf "@,Types for tag `%s are incompatible" l1
+ | [l1,r1], true, [l2,r2], true when l1 = l2 ->
+ fprintf ppf "@,Types for tag `%s are incompatible" l1;
+ begin match r1, r2 with
+ | Rpresent _, Reither _ ->
+ fprintf ppf ": the tag is mandatory in the first type only"
+ | _ -> ()
+ end
+ | l1, p1, l2, p2 when (not p1) || (not p2) ->
+ let p1 = List.filter (function | (_,Rpresent _) -> true | _ -> false) l1
+ and p2 = List.filter (function | (_,Rpresent _) -> true | _ -> false) l2 in
+ if p1 <> [] then
+ fprintf ppf "@,@[The first variant type is missing \
+ mandatory tag(s)@ @[<hov>%a@]@]" print_tags p1;
+ if p2 <> [] then
+ fprintf ppf "@,@[The second variant type is missing \
+ mandatory tag(s)@ @[<hov>%a@]@]" print_tags p2;
| _ -> ()
end
+ | Tarrow (l1,_,_,_), Tarrow(l2,_,_,_) when l1 <> l2 ->
+ fprintf ppf "@,@[Label (order) doesn't match: %s <> %s@]" l1 l2;
+ | Ttuple l1, Ttuple l2 ->
+ let n1 = List.length l1 and n2 = List.length l2 in
+ if n1 <> n2 then
+ fprintf ppf "@,@[Tuples have different lengths: %d <> %d@]" n1 n2
| _ -> ()
let explanation unif mis ppf =
From 716a6bb5fc351cba0bb44752d73ca094482fd692 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?T=C3=B6r=C3=B6k=20Edwin?= <edwin@etorok.net>
Date: Sun, 13 Jan 2013 18:25:19 +0200
Subject: [PATCH 1/3] Propagate details about type unification error for
module signatures
This allow to print more details when for example two function
declarations have incompatible polymorphic variant types.
---
testsuite/tests/typing-misc/polyvars.ml | 13 +++++++++
.../typing-misc/polyvars.ml.principal.reference | 28 ++++++++++++++++++++
testsuite/tests/typing-misc/polyvars.ml.reference | 28 ++++++++++++++++++++
toplevel/genprintval.ml | 8 +++---
typing/ctype.ml | 14 +++++-----
typing/ctype.mli | 5 ++--
typing/includecore.ml | 10 +++----
typing/includecore.mli | 2 --
typing/includemod.ml | 12 ++++++---
typing/includemod.mli | 1 +
10 files changed, 98 insertions(+), 23 deletions(-)
diff --git a/testsuite/tests/typing-misc/polyvars.ml b/testsuite/tests/typing-misc/polyvars.ml
index f31e9af..b4b5862 100644
--- a/testsuite/tests/typing-misc/polyvars.ml
+++ b/testsuite/tests/typing-misc/polyvars.ml
@@ -2,3 +2,16 @@ type ab = [ `A | `B ];;
let f (x : [`A]) = match x with #ab -> 1;;
let f x = ignore (match x with #ab -> 1); ignore (x : [`A]);;
let f x = ignore (match x with `A|`B -> 1); ignore (x : [`A]);;
+
+module Ok : sig val f : [< `A] -> unit end = struct
+ let f x = match x with | `A -> () | `B -> ()
+end
+
+module TagIncompat : sig val foo: [< `A | `B | `C] -> unit end = struct
+ let foo = function | `A -> () | `B -> ()
+end;;
+
+module WildcardMatch : sig val foo: [< `A of int | `B of string] -> unit end = struct
+ let bar (x: [< `A of int | `B of string]) = ()
+ let foo = function | `A _ -> () | x -> bar x
+end;;
diff --git a/testsuite/tests/typing-misc/polyvars.ml.principal.reference b/testsuite/tests/typing-misc/polyvars.ml.principal.reference
index fabbb90..cace899 100644
--- a/testsuite/tests/typing-misc/polyvars.ml.principal.reference
+++ b/testsuite/tests/typing-misc/polyvars.ml.principal.reference
@@ -18,4 +18,32 @@ Error: This pattern matches values of type [? `B ]
Error: This pattern matches values of type [? `B ]
but a pattern was expected which matches values of type [ `A ]
Types for tag `B are incompatible
+# Characters 171-224:
+ .................................................................struct
+ let foo = function | `A -> () | `B -> ()
+ end..
+Error: Signature mismatch:
+ Modules do not match:
+ sig val foo : [< `A | `B ] -> unit end
+ is not included in
+ sig val foo : [< `A | `B | `C ] -> unit end
+ Values do not match:
+ val foo : [< `A | `B ] -> unit
+ is not included in
+ val foo : [< `A | `B | `C ] -> unit
+ Type component [ ] does not match [< `C ]
+ The first variant type does not allow tag(s) `C
+# Characters 80-186:
+ ...............................................................................struct
+ let bar (x: [< `A of int | `B of string]) = ()
+ let foo = function | `A _ -> () | x -> bar x
+ end..
+Error: Signature mismatch:
+ ...
+ Values do not match:
+ val foo : [< `A of int | `B of string > `A ] -> unit
+ is not included in
+ val foo : [< `A of int | `B of string ] -> unit
+ Type component [ `A of int ] does not match [< `A of int ]
+ Types for tag `A are incompatible
#
diff --git a/testsuite/tests/typing-misc/polyvars.ml.reference b/testsuite/tests/typing-misc/polyvars.ml.reference
index 4117b70..89c8554 100644
--- a/testsuite/tests/typing-misc/polyvars.ml.reference
+++ b/testsuite/tests/typing-misc/polyvars.ml.reference
@@ -18,4 +18,32 @@ Error: This pattern matches values of type [? `B ]
Error: This pattern matches values of type [? `B ]
but a pattern was expected which matches values of type [ `A ]
The second variant type does not allow tag(s) `B
+# Characters 171-224:
+ .................................................................struct
+ let foo = function | `A -> () | `B -> ()
+ end..
+Error: Signature mismatch:
+ Modules do not match:
+ sig val foo : [< `A | `B ] -> unit end
+ is not included in
+ sig val foo : [< `A | `B | `C ] -> unit end
+ Values do not match:
+ val foo : [< `A | `B ] -> unit
+ is not included in
+ val foo : [< `A | `B | `C ] -> unit
+ Type component [ ] does not match [< `C ]
+ The first variant type does not allow tag(s) `C
+# Characters 80-186:
+ ...............................................................................struct
+ let bar (x: [< `A of int | `B of string]) = ()
+ let foo = function | `A _ -> () | x -> bar x
+ end..
+Error: Signature mismatch:
+ ...
+ Values do not match:
+ val foo : [< `A of int | `B of string > `A ] -> unit
+ is not included in
+ val foo : [< `A of int | `B of string ] -> unit
+ Type component [ `A of int ] does not match [< `A of int ]
+ Types for tag `A are incompatible
#
diff --git a/toplevel/genprintval.ml b/toplevel/genprintval.ml
index 4472155..06f648e 100644
--- a/toplevel/genprintval.ml
+++ b/toplevel/genprintval.ml
@@ -128,9 +128,11 @@ module Make(O : OBJ)(EVP : EVALPATH with type valu = O.t) = struct
let rec find = function
| [] -> raise Not_found
| (name, sch, printer) :: remainder ->
- if Ctype.moregeneral env false sch ty
- then printer
- else find remainder
+ try
+ Ctype.moregeneral env false sch ty;
+ printer
+ with Ctype.Unify _ ->
+ find remainder
in find !printers
(* Print a constructor or label, giving it the same prefix as the type
diff --git a/typing/ctype.ml b/typing/ctype.ml
index 7dbbb94..c13e5b1 100644
--- a/typing/ctype.ml
+++ b/typing/ctype.ml
@@ -2780,7 +2780,7 @@ and moregen_row inst_nongen type_pairs env row1 row2 =
else r1, r2
in
if r1 <> [] || row1.row_closed && (not row2.row_closed || r2 <> [])
- then raise (Unify []);
+ then raise (Unify [ mkvariant r1 row1.row_closed, mkvariant r2 row2.row_closed ]);
begin match rm1.desc, rm2.desc with
Tunivar _, Tunivar _ ->
unify_univar rm1 rm2 !univar_pairs
@@ -2804,7 +2804,7 @@ and moregen_row inst_nongen type_pairs env row1 row2 =
(fun (l,f1,f2) ->
let f1 = row_field_repr f1 and f2 = row_field_repr f2 in
if f1 == f2 then () else
- match f1, f2 with
+ try match f1, f2 with
Rpresent(Some t1), Rpresent(Some t2) ->
moregen inst_nongen type_pairs env t1 t2
| Rpresent None, Rpresent None -> ()
@@ -2829,7 +2829,9 @@ and moregen_row inst_nongen type_pairs env row1 row2 =
| Reither(_, _, _, e1), Rabsent when may_inst ->
set_row_field e1 f2
| Rabsent, Rabsent -> ()
- | _ -> raise (Unify []))
+ | _ -> raise (Unify [])
+ with Unify _ ->
+ raise (Unify [ mkvariant [l,f1] row1.row_closed, mkvariant [l,f2] row2.row_closed ]))
pairs
(* Must empty univar_pairs first *)
@@ -2859,11 +2861,11 @@ let moregeneral env inst_nongen pat_sch subj_sch =
(* Duplicate generic variables *)
let patt = instance env pat_sch in
let res =
- try moregen inst_nongen (TypePairs.create 13) env patt subj; true with
- Unify _ -> false
+ try moregen inst_nongen (TypePairs.create 13) env patt subj; [] with
+ Unify l -> l
in
current_level := old_level;
- res
+ if res <> [] then raise (Unify res);;
(* Alternative approach: "rigidify" a type scheme,
diff --git a/typing/ctype.mli b/typing/ctype.mli
index e52fec4..cf7d572 100644
--- a/typing/ctype.mli
+++ b/typing/ctype.mli
@@ -172,8 +172,9 @@ val deep_occur: type_expr -> type_expr -> bool
val filter_self_method:
Env.t -> string -> private_flag -> (Ident.t * type_expr) Meths.t ref ->
type_expr -> Ident.t * type_expr
-val moregeneral: Env.t -> bool -> type_expr -> type_expr -> bool
- (* Check if the first type scheme is more general than the second. *)
+val moregeneral: Env.t -> bool -> type_expr -> type_expr -> unit
+ (* Check if the first type scheme is more general than the second, raise
+ * Unify otherwise. *)
val rigidify: type_expr -> type_expr list
(* "Rigidify" a type and return its type variable *)
diff --git a/typing/includecore.ml b/typing/includecore.ml
index 3a2d9df..d1c4736 100644
--- a/typing/includecore.ml
+++ b/typing/includecore.ml
@@ -19,18 +19,14 @@ open Typedtree
(* Inclusion between value descriptions *)
-exception Dont_match
-
let value_descriptions env vd1 vd2 =
- if Ctype.moregeneral env true vd1.val_type vd2.val_type then begin
+ Ctype.moregeneral env true vd1.val_type vd2.val_type;
match (vd1.val_kind, vd2.val_kind) with
(Val_prim p1, Val_prim p2) ->
- if p1 = p2 then Tcoerce_none else raise Dont_match
+ if p1 = p2 then Tcoerce_none else raise (Ctype.Unify [])
| (Val_prim p, _) -> Tcoerce_primitive p
- | (_, Val_prim p) -> raise Dont_match
+ | (_, Val_prim p) -> raise (Ctype.Unify [])
| (_, _) -> Tcoerce_none
- end else
- raise Dont_match
(* Inclusion between "private" annotations *)
diff --git a/typing/includecore.mli b/typing/includecore.mli
index 0836241..3d3f47b 100644
--- a/typing/includecore.mli
+++ b/typing/includecore.mli
@@ -15,8 +15,6 @@
open Typedtree
open Types
-exception Dont_match
-
type type_mismatch =
Arity
| Privacy
diff --git a/typing/includemod.ml b/typing/includemod.ml
index 5a1d4b9..764c52b 100644
--- a/typing/includemod.ml
+++ b/typing/includemod.ml
@@ -20,6 +20,7 @@ open Types
type symptom =
Missing_field of Ident.t
| Value_descriptions of Ident.t * value_description * value_description
+ * (type_expr * type_expr) list
| Type_declarations of Ident.t * type_declaration
* type_declaration * Includecore.type_mismatch list
| Exception_declarations of
@@ -53,8 +54,8 @@ let value_descriptions env cxt subst id vd1 vd2 =
let vd2 = Subst.value_description subst vd2 in
try
Includecore.value_descriptions env vd1 vd2
- with Includecore.Dont_match ->
- raise(Error[cxt, Value_descriptions(id, vd1, vd2)])
+ with Ctype.Unify l ->
+ raise(Error[cxt, Value_descriptions(id, vd1, vd2, l)])
(* Inclusion between type declarations *)
@@ -350,10 +351,15 @@ let show_locs ppf (loc1, loc2) =
let include_err ppf = function
| Missing_field id ->
fprintf ppf "The field `%a' is required but not provided" ident id
- | Value_descriptions(id, d1, d2) ->
+ | Value_descriptions(id, d1, d2, l) ->
fprintf ppf
"@[<hv 2>Values do not match:@ %a@;<1 -2>is not included in@ %a@]"
(value_description id) d1 (value_description id) d2;
+ let t1, t2 = List.hd (List.rev l) in
+ fprintf ppf "@\n";
+ report_unification_error ppf [t1,t1;t2,t2] (fun ppf ->
+ fprintf ppf "Type component"
+ ) (fun ppf -> fprintf ppf "does not match");
show_locs ppf (d1.val_loc, d2.val_loc);
| Type_declarations(id, d1, d2, errs) ->
fprintf ppf "@[<v>@[<hv>%s:@;<1 2>%a@ %s@;<1 2>%a@]%a%a@]"
diff --git a/typing/includemod.mli b/typing/includemod.mli
index 5f2c414..7348deb 100644
--- a/typing/includemod.mli
+++ b/typing/includemod.mli
@@ -25,6 +25,7 @@ val type_declarations:
type symptom =
Missing_field of Ident.t
| Value_descriptions of Ident.t * value_description * value_description
+ * (type_expr * type_expr) list
| Type_declarations of Ident.t * type_declaration
* type_declaration * Includecore.type_mismatch list
| Exception_declarations of
--
1.7.10.4
From 08f5e6aa0f90b89519566c569215bea25aa44016 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?T=C3=B6r=C3=B6k=20Edwin?= <edwin@etorok.net>
Date: Sun, 13 Jan 2013 18:46:56 +0200
Subject: [PATCH 2/3] Better type error reporting for polymorphic variants
with mandatory tags
---
boot/ocamlc | Bin 1350668 -> 1352393 bytes
boot/ocamldep | Bin 334875 -> 335009 bytes
boot/ocamllex | Bin 175754 -> 175946 bytes
testsuite/tests/typing-misc/polyvars.ml | 4 ++++
.../typing-misc/polyvars.ml.principal.reference | 17 ++++++++++++++++-
testsuite/tests/typing-misc/polyvars.ml.reference | 17 ++++++++++++++++-
typing/printtyp.ml | 18 ++++++++++++++++--
7 files changed, 52 insertions(+), 4 deletions(-)
diff --git a/boot/ocamlc b/boot/ocamlc
index bbf2d1f90f3d7f4964e4d38b72f13b17f0a5b411..ab057093c64985af94e65cce81a95bbb833b8976 100755
GIT binary patch
delta 36577
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	eC<WIKRAc#9qU2T{j2
z@VuRJ-%zIr?^9xlI-YhSinhI}W(Z}RCPXj334bv8O*eLj9sA_~M9jM%`_gCrVFao5
zV)bd^Lt3|3%@lV+jECivo9eU6VvhA<`kQJt?JGe){n%!-xDzIM7NbBB)|v@R)J=4x
z1k6t@fed?CHf%1x1>d-r^4?MhU@z3Zj<WA9wS&0Nsb0cTRCzyhe3W)9RX2#ALbIK5
z0=saT+Fbm%yr2_CzvIi)KH>pP5~8s_>bqQx5i5W^F7eC^sSaY0e8HbUhnA}uv|+j0
zfRf%;dnO%n+RdFp9R|*O3p@egrutmIu^`6C^S0VV`~pTgQcj|)Z=<7r32hYkV`<<D
zwS({#6|GQnXx<8VzN;%Bz&Ey!oE__pq1r1EJ9(v=QTymEMShDGUxn?7eJjyi$FSm2
zbHw8)7RSxhca_?xb)}O5z>;egAkQn<Ve=H_#4QZJ!<1!;6iwS!!JmE)9k#$a>*6Z4
zQ^S)^N_S@X!!0?nD1ArGHBQ|UeVW$20}K4oVRiW(=<_G8TLMqggLM90#mf!jrD3J&
zlay4dwlxE*)k#>dLRmcgoU@_1aE<zOq&@y*t%sQyl)D}tsqcD>i)+`z6lbr8ag>e1
z)NCK4H@Zb##Xg$vxItA?qOsXkecl@a&ih|H@q*}9!^J4pOp=eo6|tUT@1QK$fObE=
z0ZkL9@ZJi(JFrpp3-Oe<2}-YzIG)K*+^D|6GAd%Slds(-G+wWba9NG*H0Fv;>QKR|
zNL{zYRuF-=k5dsml(+?5`@kkl)hBO3q5ZeO3(wvHKS~p4<K@!YTh-=5Hf3+cFqE}b
zok2&osttrYDg8Zk%G&Rt>Q}d_F%s8^%`k^@-&51Yo_6WNT~xwoF9+>yqkSCoZX50E
zpt&~M&q438(f$rPz(((N(EDt3po0#w(ZLRSzl}cNphIkQsDnOeqr)6DkMs}JZUcuq
zjm0x#w$_InoIMERBOILPm5h&caM!v=IXL%7cCM_BhZQ>bwvwc}svnIsag;bTGL9BM
z=naZvY!OH-gCeua)FurdxuukGx0EuT=9H<qg%g};-oRvG9(C{*4nEPrn>u*DgYyiX
z(@%16p7JyPn1l26GsY)7IB#PzKE=W7+IZJmk2?{rw*KbeuC|_Va93MX9o*H{lSJie
zqWBcL%R5+2A1GH9ahhT|$P@{#d}08L>Ul5v6>G35P^zt=7XImhhprvzXJIWhKMm$Q
zV6I1C2gxhtNE)<5?MB;nz!erM_A>eU4)lx}PKWFIp&Bp!9XYL46b<?iBle3Qs^1E;
z%rQIFd_jB;h1L%y(6qfM@Aw`J_4p1*kYYc=ct2aAj56#H3>%1x8)rUJxB8_yV8w0z
zJgxq>ItY`!hy&^z;YD-q0kuRB=c1+C$w_A4gX*Ud;!CLZVT=W>KS!5~{anR#>2sbz
z%~NQ}F)d-`>@QWHSfucdTCBPBm^xIV*~c&uk3Nk_q3{oL%#Z3KACB=NE~q&|vDy2A
zx+j2%SzJJiqn6iHMR*N&A@Tgcdl3qCyr#yR)32%B{g{qfNsdQoQJ&W!uS(Yji*a-v
z-Cy{pi7ZnigoQ*ttpGEtI(}`A_=Y7>EN$^?uL^HcZ%NA$7E`gL%@InNSti8>w0OR!
zZdLv*t6XzIKwBPxDNd%Q<wlCj6uu}&OKWSLFl(u-tz8q}R;=ZhH%i+fu2711v`;7w
zbZ%gJ>uTLaVI}nrX}!f&Xtl!_9@d7mPU1TbBF1PjV(DKL-0F+bzK#%AEA|Ow?RYJQ
zdc<o>u=Ra9UP}{7%{uk9?Ose`Dw4I;Knoga*938`tz7DH5Igr;BQ1)~55yKvS&G&V
zY4lVrN2DiGw4SuMDWonnk2cj#3N)}OxF=l4HIY+kS{HFW*CK(=ufZ06-{x9Bky4r?
z!IqZVAL2%*fCK5;=d>Xm(c3b#QIIOJl@_YU(=e=2ty5wi<aou*7F>#x87&Uwjc=tT
z3&LizsI^ueA#5>o+i5fL!ni^W&S9p|Y@wi-*V{u@I@BJrKQIfUk@ghsoSiwPH8M+Y
z*A!8hMROn4;sV^o*)HG181Z#5$-JJaeJ-Me!&zEE1mwx>s-*(t7r|c2?)59?;;veT
zfCLrYv{0nD4T^m@GC^XOW=p8|gn5*jb9-t-B4OsI`)K8KDo3-=k9Xg#9TeY((WDsB
z=Gwm6)8IsD{a{HSz!(0G`N)_3wC6Fa%ezNgB$U&&do<It1E$!8vhTts{(=5lALNJ|
zpbf&TUyG-{!?hp{>n=r^8wO~b1aT+pJesE8r;SCr)Awl=H2OYh_rO5yRoXHTIi?TN
z-k=eKv>3DXU@cO>-alGC&g_4`79(IPm$*(#rg<B&)L!_2_9W(Wh`^%YZM1&ZA=)3P
zS@uvZ)zVCc9>SfK!aQw=AnsEZEQa*ghieLw$Pb|((2?ONZsG{b*z}Rwe&JKDR*wCR
zuGXVq5dU@>Z2C5=WJ^bBPkOlJ70S=Y5YY8utpVyV@?kW<EEA1&6zxJ|#%hET!eh1l
zBEHMCf4sH~X#NCkYNS}9P@h>!EQyb4qr`*Y{i~j0&U;LoF9@Ge;uMV!d<IO>Ql&$z
zQM8zs#!o@Jo|yn8uAQQNDt>OM&wS-^?Ttv`3rc?qX7wc%eu&Y0-&5M_m>X71)7n$n
zKaJY7W}22nBc^E`Xjl(S@?RXUVcVuaTP{f7IKJ)(RXnY=k&Zg(w~WS7$}?Jwbj*o6
zZpV4wmV*Wl7Ho=@4()_RGZ#Ojz3vsivs^;)uoyp$o250PcC)l5xDm{kDQBU!C*g5%
zU(W3NoQ9ir%jw!2jVS3kv~ub5TBAr|xmod&mMr4DLSKo`DJ2azVyIb>)}3`%q@`)%
zDTPivhQ8BsCgwVQmugs1r(z%O$eUURK|F2sR@@U_;>S@yAmF9*bp!AT-{7uc?Gnef
zt$x0tMEjNxJ&N9f8#`lbbLmp8i71@qxTCb<ZLNWL&L$jxTf=pW|5`R@o#LHm=}rn&
zbZMn_823zAR%?X&S)obg*mM-%(LTj#M#Vd@$ph~|NU>DwDg43_$uzN4``q&@lowaL
z?pjE=OnIxdG#a)V9$@imZK&tB8zdZIFe!SCO^Tv%YqS~SH59U1ixvN{T>-6)3o114
zs3)qp?7W})|4X}oD}d-Mi8NxZ_P%i4<gO7ZhPg5cl(iY+Ox}n-Q;W`S)G|d}+rC+&
z=CDoLaDh@bX${Qdn_(zogvy>Eh0dSBe$+No+Z!Q9s@#Fih1<0sc&%Re0epj3wGNLg
z^)L8Z>P6l%EoS8_WtsrHD=yat;Rxewxi(b{Sp1S`_6}{5D67<<6BZ=ehgu_1u~^_l
z=|gQsB(?s~cGTFE`&fG%y&`|N76O>FTT8rwndQ5+L6I<!(0&b@ZJL?*sisF5+(X$X
zv*WZqUUr3+Y;{~ORUTCm&Dj;&D0UEM4{2kNeZXO@QV?~OW;~B$y}n;)_fqRGxcoA7
zm;+yEJ$+a|gpOgztW71yv}~MkR36hZg(xaNj_%U#xQ0o<aVU4+VO(f^@wnDjh&DkQ
z$vX+ikZkt&PMaZ!F{tl3DamqP=H>6T$0KO>_b4Z2BTO~+oKG>Ap3>&~#aNa4{R&I(
zUj+{or&91<to+KVw8v>_75YoB3p~i;sN<s6UQB@0Goi!d7quV6MAg2Ndj693HSN3v
z*2jO*w$koj;N}vZ!rAAxU$suO;8zf|%NWd(Y070SohDyK#5Vj98gq?OX&9WO>Aj*2
z77Sj1yF0Vo^;6CK-?S0|*Om3F+Dx&jYE2DFuWA$Mm8%f0<u&cc$cAai#WTk=1peKL
zn<1RLIpP_%*xX(pBML34MAQo+(-BM25qcA|M}&?6XF2VP)K7}HskCE)8f)(K=!!@y
zJbKVP?$c*Q3hm92impd==7#3=X%__kS&jYw5XTa9pmn-_4UNA#sONZv+o|HJjxVT%
z^x^n4OnyjDhIwRX1lx<5&?&YCtxn!awT583-$lphJ&`CcM&BiLrsR716kt?OUnyjn
z*|B<Bq>ycnPtbEjp$lznpkMN2p_)Fb7%V2!frk2E@eaEqWhLof3!bhZ%2e1?4+Y#Q
zcQ@33lNL?=8|g7P21#s;(d<r|*+?%CdQiBLo`}1^97zd{_3kvSvHqjj+p;iB#~=3i
zJ(fDmIVrj+;(}{-Q$16-n+lquYJI7ssa_=Hn(58-I)d0wwO_IsmZtw9w5K7>p^2_(
zdc65cbNyZcF{fMTy*=$AVJ*sQ85yF!EpgD?p9Zzm(?OlnQeQ0&fG>#*M$^QHG1+c*
zM<7U})Ab*rkz5SI)H+>{!6%;d3p6@I57P8j`YdsvW#zGy&>HoBflB)67{%M@eS{ax
z@ojXOr#Mq@(|Ze6#|=`!ZF(EJ+D?Dc(xXUu2NmqJw%0c`ywwc&tb=9cHLczMSq5Pc
z6?D)spQOrMNL1DVRdA%6)<MSxR0q8gBJ|s#*ZV2`c741<mL32z=95L+Z`T(gc2Gw)
z53``79><%)l&Plzl-uC64fIY{WP2Or*<g+h*4f}I8-#6;+S$sGYXNg=XMGT#rc`9<
zGlik%fNUL?bssbn@6dBaVHo9iLu2NdtGnrYBE{h<{c(?mfw8aOAK<HzENpw2?KrGZ
zTJ}KQ4m|J0fmKgEC<qTx<z4zRbfKBOble+mPkVan+4Z<>d1Z&rW2x;az<~%&@k#)i
zrAHsV3zDYatz%}<M~@dqG8eo|*GKOJR){CCGWYa_nxP*km=#j>A3d3x_0u0mi=uV0
zLt9Gg?t#umnfve2r-;JClzp#Wf?L;>_rgZUaCb<dvitNV;#k$*AvtxQ-pSe_5yn&Q
zK%GQvxmsp+eW3oX(>^!@*)vGTGG!tR>UJ&KY&lf#z@x&L;d&u^`MfV-&*CV(IiAx;
zL9|kH&?x<^Pt1qi^NcoOn;uo%S5sEbo}dfVbpl=jS@<Yw+1@lC)$={#3m9%cQDap;
z8p8-}>GuW7ouaovEoV;A+XHO3LHgtDMIP51APUc!Hi$E4KdyHYf$Vw$%71~zOx4E#
zRM?>XlNMHD1K(5n9MFoM(l^?m4LvbU|3P?+h7>?~lWA&!K3<%H_T>v2#|!j$>&nUB
zRQHl*6X6LO^R%8QO+~9tfV{U;{?mG#br<|8TKBX*NStQ5Z8PB+{c}Mmpi9&BLDJKX
znHSK2LVW<5du5?sB9_W@;ddW)gNH^&nbT(IJw@RebJw$aVuYsv8APgj9M@OH+4^z|
zkFfF5e_?ulXtq9sc0Q{|3GFC%4$Nix96iSB%_1dM1aTvMjy~9f;^mk1A>s_o3~-W4
zFTSjwL)_GPdVA^bj!0QlwE(tsWS;&K+Hgz}yu!1zu}IIP4Mk`yalYO~oMlfz%n|eT
z29eZtz8+uK>ijTicBt+uYBp8w)kEgKS7Fi8oa+3s@?M~Cm7cF2mnpqa9ZjVNNbdmY
ziV0>^U~b2^#BBfMrTp`7jOSn1o7`9%vj5?|2_B;OLSLzw{!d*Nq!%5QuA)s^sLvH0
zbr!yf{?_+R7;Ax9@Fu%IR<onlQ;YQ{g}G*4iH@s5FVXlF`dk{f0uHtBvpB<?7_EEF
zsFnJ0kuG!O_3>Eep6MP8nn|VlBta-Li&w*O3G+>J4R=_)0kT$46kkD?k|Gjl-dcT>
zSnMFR*Xj4t#kG0^I*@Dx%?0apC4xq;1HN+uY;ggt+z6W`(l_bLNZX`0C|=kd`?JZ0
zLg#_e2L97>Gy1_o%H6Do#6>E-`$<HCWvXvr&Qb@qyLL0g%EAt&zDRoWhMx03fCkQN
z(Z3ZJtMrl_jHS{odQd94kpQ+3N6}j`Q?UIvj$l@Ag$2C@r%|alla}6`a^QP<KVccI
zd=LH9$*`QRyr<^^%h{%9Iu?2QJy=-TR^1slY3>&&<<K^Ll(gaozwGVoJ!l;O4SQdY
zk$9-FhZw|VV&miNc0Em6bt6OK`+7MtRKBlg10;T+=Sc6|AflrAQt1uUs#Z!M7;h$&
z>58@NF4vDDn{NlY<7yhRL*IkTf5{(OBU90b`q8@8XS#e|Z;Mj6Qy+rulA{3PT6U^Q
z^uR9Ypp;hcf&(d~J-hVOLY|HA4hCB(J2tno`0;#W=8Vqc?s70ps+P`;=k#v8%kwV8
zvBkSMm%%&MZW+i+kA9>#ge*lLSt70e$Wqk!kM%Th9p*jn;3UDijkR_!I{1N)F<58O
zS07`J^{&-{X~b^W&U$<Pb7(ixT;HwVD{fTn_4UL(`s?_1v2U;5Tigt5!&}3`7JCL|
z(wx0|wzw7cxL0pxUfiqy#=1Vc4_#xMon*URMAm-2do_1Oi}zzpD5dTD(U|Ykwf$&^
z56m&2>f1#()d4-No?A!m^<5D7#}m#n8egHCQu&ScPCIBB(}08e9B~IG`4e#deDNUW
zKOa)|XHd#c8Uj#v7c%g$%x`pDK;U8dN6P0E$7n8qbO<rL$Ge;MbA~-NWO$z{Im3Fo
z#u-*P8TL`;A!OKJLx%a33zD#r#sf%&PKE=tnln_?kYPNPbB5t`lr!AtWWakvhmqlM
z4H>d29VEPu)Ehu*>SXwm<^uJ6#Th6&85>F~4x@2fri*^@8+*Qd`LK=~F{Ru=4+CIy
zA0iyF8}2C0c~noNi(l$9;H0N~rBAWCi0l9PC}$BDL=|7cakryuU+H<~<gejL>VAh3
zyMV@K&D$JySBf|SM_EdXj_Aqa_n2Gb^p-E^D0J$G{-ksgc{m-0r=xHlFCNu1gdb@8
zQMiErxFi!KOx;e=_G54mr|HTunB<Qt#dpOut6|6WO|WaL=eMlXhe|)W+3dKrm3njW
z3~Xa1mH`(ltqE%0X^f;TPv{-$okim6r&H%{WG+0R&z1gr1GV{or+1LfyK!dzcY2N>
zRo%eLzt`sq^)3Lf&hlrMPH=s3H2nvxMC^&3x$OtNEzf>2%S(r{6Hn=d;zjh_srd4<
zwu4V}<0VDy0`+iDu+>y~3X|(B3ZK&RFbP9VbWylu=KrLxi~x(!f6=jip+W!ES4+R5
zV9x6$eT4^~Bsi~QBM4(GI_YJ5skZjK)f@Mp*Hf(_GLq5<;R=9OrC$()D-^z<w-<l2
zXN1)EXN>m0Q_;_8ic%VK5pys|aZ#V?tjQ|7W9(jhNpEX$!Uw%C>T$)rKE>UjOIQyU
zn0ddz14Fa|Z!n$u{-I;6trKiQwJ+;CAot<RP+bA#UC|FqJXrHYI+?;BKw$%a(+8ub
z>wd#HD_mv4SBlrHEs$uMcTMjg{^87Lk6+XK(e7(l;%5D!D<1JW8ojTlHBA?SeRvL*
z@tKxno)>~qxQq%Czt5Zy5mW>cBZ4v1H8MB@cT#sn21lZPsh(is9qf7|APBp1{;>;o
z*9JUn@OE$t0;l00yJy$!bKXcQI)eRyQcsX~UlP5+A$I-0LQMzwf|-ac@&)7STC)@6
z<-<tcbg?EnRPGC=A>mmDr4;f9R|D+w2j>FhN<rM5)oi0Km4eGTE)c}Fj+q|_=0@OK
ztmSGjxgK*C9I04xu7TYvuc@eK7UgNd?O1Ea=|P_;M4FhV)DdrOqz;yAmZ|6$tR9co
z2|j5F?6SQv?$P+D;2;RRD=OFx;`r(Yi-1wxV8Kle<VJckH5vjVWlkt~vaSbXZx=|%
zzQbJ~U>7<jIE9mdSz^GwMDKO#eX(9}lAS%7X2%9&@LUobJS+Gp`)hn|7aM!_OgTXL
zh1f*;J}$Ub^lN+sl|b9#gUxASJlg$wd~htxb4>kUwioXjxLK_|K}8zrD9qASh{Q(0
z!D5z5lU@!+o0A&_@tF(Rq{hK90?s1BDZy+AYi2hIw&6|eDb0eXMOC96eR0YAi8M44
zE)d7H2;#dA8uhCPq?prN1mguUsL_lWd~qsPk1}_+4Bjh<hDMV@dJ>pe`zN(EYyZSr
zeblKY;;<8*pm`_*HY`M$m92uffL37EX%oZ*wXWH|ZE&T4O|;6}f+XBD&EcWYvI28%
z`{1=$F{Igh7w!6Ep1YxcaE64B-?teW#EDU<Sv4YfNfPVXNzCgLf{kRvCO;YU`NUXM
z4!cX#qcFI<UL0DGhtPPy2LUS(c+jp-5i^3RxB!+mBZ#GKB6a(FFgMTushHYO<2xJC
z=7zrqe-!YZ-=dkp3MttkHlm{Eg1GlGE7(bBOqp}wIWEr%&X-agda4Qf5J76<;7#rH
zfjPkpyaj~x1!5XBi5J4CVooqsY_3`BJMH=4^Fj-go)7Bv>b68)RtRs<@qKI-DxI>I
z219i-s*w<Dky_cL)-{mY*rc{KkZ!X{?P?&kw@DppAl+`0I@UnSv`L+6Aa%A$Sv8Pw
zhk@(Wr3TU+HmPe3q;58;dkv&JZBmaKNI5pCXAPvgY*McpNWE=RpBhMa+oZlVkaBHO
zzZyvQ*rfh7kOtVKdut%wXOjljKpJF|23I4wW^=zydY~G~HJc$eX=n|k2QAX=!)hSq
zA?^-lfgi7e+2``$5QXW0Tj+2Kzl{$65GAhw7-3^0?czq&z!MurYy+cfAdRs}V{0Hi
zVw1+zKpJn8Ce%QB)Fw@=Msmf@w@H&~AU$T2CRZb&&Q|Z6Vv`=Pf%G?<^h6D$sW$1!
z8c0vsq-iyf3T)ETHISaMNz<#5+<Fz-q#4ynuJC`iNzc|mnrV|}RU^3!pR-A`Yaq?B
zNzYd!xn;dzlU}TWG}k7*R0HW{n>4QmQjtxXUybBS_z#=(N;Q%zMzKwLwFc5_Hfcc(
zB(h1b*FgHGO<Gt3X^~BOqXyEOHfeDUq!OF7qz2MkHfd=Mq-8c~c@3nuZPJPwNGom9
zsv1b|*rd`LNULqqni@#|vPo;Jk=#aEXOrHofwbNxZK#2?(I#!GM&bz>kBOUY(w1r@
zw=B~pZLNXyo=w_T18KWWdcPXUHJcA?Qdte8a+|cH1`^i%@NCgLtC3s@cWHFtJ0I2y
zuM5G3A0YuRXVbVi{P2w^>oXW`;*aejc30!W$yf<{Y|`FpBsbS5HfdiCr2RJO(`qD_
z;lFLtff`5^HtApuq|a>9p=u;ojKenR^BPEB*rYFOAbn+%zOF`cCH%%F9jSqI)Fypf
z1L>GeI$i^*(k7j#f%Kg@WPLDQ5x%Fn9|Y6!8s_#7g2_HiH!D91#zp?`p|mM~671%|
zYnr(Sg4v?@AB|!@3l5`s2XUl-^<eO6I)5<O$=vW+aFc*nHOCwVPw^*bLcZbi;P43H
z4AuD>>#MUS=KZGlza{WhBz&IYXz+cZse4Ao%abk$yhgRA(U?BobXIOg91Et^f!OI6
zg88Cx4mIWU{NqtPfK%sS9PPUp{9I+8{9``L&DEEJQ@p}?Gx2KB=Mk$=op7)j^$%m6
z+#?(e(u?8XDw-BX?Ov=<mCe1346LZl0>K!9b2#%W$=D+bznUeA(K`}L{Ifx0P`#5V
zoPYd5zkvwcop}mz(i~zKLqze4Myu)=FH+YiqmjXzm@FZt7uHl>ps7(tx*^^Y9YJQ4
zv7fd?;cbi9^?3hrMO|Z-<Z)9`a<nmkW=9(x1ewaCjW|)!so$0W4%q*V^Yg3GMobc)
z193^bbRL7i=Ii3Th|q4$A?a=o8W}Q@>47bHIrauWsrC)(c2I9z#j8tKLiiUhmqWM+
z(=x{BWQ1HHQ3jV2Lj^HLno;kT=va<UY{jk0Um)d_aknIiuZHuyjNL<ht2onJ&%ozI
zrpFr1rKWBwS{4hXc;k%bV!F<U1<*#E;it>D;gn%SoY8<<#~F=i1wTEDKl~vftK8N|
z9cOH#(s-lE{aIkgdrR(((`*OFGT%zv#lhLVvCwxoxO?NYtAn$^k07x1vEbb(t-g_#
z&>dv9Zr&!~?SfPUH|w1`HCTre(#1Lyzqq~;)wIVgh2`8*SWmYw%6-TeGB4JLL5O$h
z^l3w(nb=FOb`1d6Z*V@6X!w2jZdgf*L9{ppdPtZd_|0Ld#(Z8?S2ZzYpNLb^Nilko
znUG;@5(0gl66Qn{XS9x{%R7THW}vkZB?!5c*v4ot_Jh#;BEb`Fj0WO8D6)?y$y!DC
zr}8$&AaMYc`<%a-*|n|V7sPvY`vUxZfZNqXbNp>aW`upYd=m2VYyF2h7(en&@t`;r
zS^16jCml*cM@Vc@rs?+Eqy@VDj{BC5Muzyblk8MSwDP!2BPdRXiLb}kv%6**&9zyq
zcKo<8W}uEI@VUsfnFcO@UBX+f&)S*I+MNtsWVhbyT-@1cfa9z3&PJN}vd;JITZ;2^
z>uZwM-S;B9E;KsJaPG&y=19;o+vtN=pp3TS>qs*an<1AGgR8IIx)^Dau+YrE%ecl@
zV8`EWBm&I6+ZYK@b+?h~SqOzE;7f8wCJpRsbh7Z)lz+DoXFaxMQo4DnuhB(7mehVm
zZ}6Ma&%o`8g_JhH$OpP;07OQE?zzv9g~rTrEGj(_flaO<0$Vu0j>Ue8=@Xc39Mv9V
zGzXjPLB@Eiw6Rvfh}l2L7}Agv@~1wkGvN(7mq}-Q^1;9hJcH5F3(cv6jq*sq_756z
zgt$mA?lK|Ty6h2c<_$M|Vm)TZy@>bp8Y6Ibv{+H$2qR>Xb8958bIJGANUn6r18OAe
zBOT@s)JV>D$wO--=euOq=Ko4w;*uxTNUm_nlWQc0UGn2KlG8^yl0Q)+InO0OStGf~
zCBIN3x!fhstC3taiVcl2A9n1}PvxUAMofR$GMLp58_A$nJnR^79V&U$d5p3iLChU(
z<XA@4kk&nHnf><BMsF*oF)pg&>$OQ^j2JFsjM3hTZsKMw8Dpe@uz!q^BeB&qXA!C7
z6#n5{yRpXWT=G~W4&dxqr_|dxD-IwYF@lKBe#AIjpEL4aWA%n(&ug1p`Z%Z1F`P4z
zUL0q%Mb7eZ7GF>k>FPKm!{XAhnud5(b?rZsDv{1(GaNr2Qv)uu#?*9lypd^DGW({w
z_nu(n{!bY^g1cpOwe^0W0e1JlpI}5;Jg|NAuo1Ezb84dB^%wnasv2vx)uKm@G%E*g
zS-EX>FXc`&lAQ`9PPCNXd!msEMa-FK6a&QN8@T}E^NltDB{o)-@35Nj7ps@~F^)!0
z!Z-~zPI4@F7OKMT<L3Te<&x*rNKSmr2!Toa$BfKE)+k^5`5z{TpZ0&m7yKXb&-@?p
zJdvx3|8$%O|NNLyUwFgRCmT~m@lBm?HR9EY$5BhXuW;>e#!9ioj-;|DjOG77bHjqE
zMsHDEqVvT>^Y~Lnp9tYCGwm5;kw;icd!9A+2bQ5q?5C%RG~>|#_HSnzk%G8fr*Bt9
z#(LfcRkqI_56!|X(K>rvsq>{*+*gM2t}+KbXDkx%O6H~6##|oX3!gW-;S~m*-ft-2
zp6z(N`qDBPbIYr9ji*K2wKy>rpM4qj8m>aOYmC>}wEAKL>ptPXP$T|441W>Ey!sM`
zT4Al3R%C1!#C7hNJKvZ<)Ba(c5H^}aUO~<3Z({i%eRl*NaoAVhg}`&B&9v)PV-JqH
z=e}lSig;!8LY9zFpC{;Rk;@OrIqpZ`;e~T-rHBQ_Ox%x{v%ts`-?LPV@7gXf{y^L{
zGLoZNTW(Gs>6zOy4D)_yuGj0v{0KU=05ANUS!6tqjq)jPz^Vh=k%y-P@9Q-GIot|7
z@TSoShvk>vH1Y&!Xg~=@(=zJ)7Hqzp(wD%YXiJQE3cQ8E_d`2=ryYOjM*K&1{Kw{^
zw~QRT6=0rRYSa;gwRB~fQ3$<FU2cR0aSuuyE#dPeD~zur0(&6`w{#^w|JukCL(k)z
z-}q+Gx>BQ!xKFoUNw;4Y|Gv~{Vl~O9)_f$%8c+99{%ZKse^b$FV}N)7^Re6Ts$|)}
z(7e}Q@%Y6Ghl94pXikfZ@yU#5*BD*ueTG82piusC;jA=P^&vXC22Ss=d1Z}}E=Zp{
zI>IIXwMJavO9%bxFO~Ue@>-*x__a<MlLOIp!NO8LSBjTH+?2Ob`C22{ti28sM-hkB
z2Xk@!+Vx#yhH#X2y=xp6zBOq*T0}esTeuJzjqk=*Y%oH_D;^9|?TtoTZzY&1wJ10h
zhd67y;I{Vpg`(fO*TU_0f(kYo8-?#EeUpI`aJ~55YtdNRj^BiOh(DnEC-JR<XEz)1
zHx8Tj(yq<MT$Q~^5g0I&Q#51?)OeaIw!jCn`Rt`-Ti^qK<d}5a#Sd@6;K$YS)1@sK
zX!sEy?>6D{nZY^AH;ryI(S(T{Fbzezp#fTL8tF9gD}GmCt8p*x<ri+njPC-S+-jt@
zV$0<pD~g8`t7ydWv!y)1pMi5S%c?2!JtMC1#p+Rb7C=rya9J>0k#fWE!VBKR1pgAH
zZi7YsV&-qdtPqRXg6+n50gKqv?;Cm26{Kb>z~x?iNM8I6?a&$bwWohz>_rdDDKlmo
zzu#IQRh&fCZB2#CV5@79t0!{xDn~zBOZnx{=UOVV!MbwesKNc4=XqQ&dz@Uf!<cGZ
zMKpgQfTx3Y6_Y<Sx*6C0Cwl6Km|%|n5TiQ&KkA1@=r-0dkK(SP{=78{a91-t`rFc8
zV>Vy@#ik*%sjhGSs_@MMjo)dsF?h~=bM(5MMy4VBZ!~0+tQKI|DDNvH&Flg9DT;8c
z{LL*KALoB;%&}}Jio(0)L^F1`f$ML3Y3?55D*$lDzk1tid@AfUb3ZXk{5U+W`pjq(
z5%8cmZmXXJYH%hphK9F_^ir=cu;9UagVv|G`P&kL&n)`Fz`Iu-lD{#&@^CJEPvhQ*
zka_(Z<8x8;2d$&JGv6Ak1j#Hu2InE-LNxBb;U5m1z{2QMB`>6kJyG~VYW|7;udHK%
zYU;=`Aprs=<js48k0^lv2_XS=?NR)cgdmDvw!u$Z4-k^@k$h-ATCvu3SJ!_<TpW?A
zLE3uSYJFSVX4|ztZL1z@OYOEwcWXUZElL$CRK!-?JE3$rF6X>t-km#l?%cU^-^}CQ
z8zxU60p4i_Hi+_pqgn#FbD8--0EcUT@^Au#0x``YK&`Nn9B2ctm>Un^B>QM5JYL|{
zO8Ki&FiYSgMM`hMgXDH6Qw|9h0;a1#d4gOzJON5*OpQL=2Iq>NKj|OU?9uR6a`FeJ
z4VqVVF)9IK0y}On|3(4~-AskIkYO6gvC{Y>19=zNK=v)L<0R`AGo5_X!)y}7$VhLw
zU@F<)3y%*uY555bPdX`46hIE6N7EpJs&s&n1ziARfgB471rFY3dIfQ^U}|$Q)muOC
zg30Ioj1k=W9`pfy5pnf1vtnqT75dmqhl?r{MXn%cp(?%t;M5?FuA&)4gy7@BOp6)G
zIWoGsEl4z;O7&r))b9Y?^nn98EmEP6ZrKk$C4FG^KI>z0V)_AruDa0(a<bzNFh%7~
z<vO~GE(Xv^$`mb9i$1zqMDhlhJUP`TI>OOa5E&Tkbwr8^xfrniuj_}gU=mb!Vbc)*
zn_fM4m(dgVT_!OY%rutt++~b{M9^)>g+v}31miM}tQ=(ekdD;egMDcmd2o+80Cxv|
zVV-1kFr*P1Lmz14Nz|{*EKI?4Cp}^*l4LZaiM(k%Rs_3IkOP3mw2o3ZYAl+`z^}0K
zNA!@krr`Bt+I=QdLjNOA|As-H`>-vRlSB8JD&Q%4D9F>%A?Bp~VV;sfERa%#hHQ}i
z515jKhq+4$B2bG+_#Y$3H)(LWKnW`iGDbBW#C{m75#c59)q=1QrIPOuHjzsRE9iTw
z-!rYWkum|!L+KE}f)@fyJpw#dppub>8Ilx|6^gl_)=~RN*WHMHgj^w^I8UUeEDWcL
zc|8;_h2~L0tb{JJg;*sDGE9zMV3Gp$Li`^A${<U^ah^aU3+{=@>)|*DWs)lZLt3JY
zz-yspTLk`vhSP}gKuk7}9}m5bSZ`|4!pM$D97|3_Vg;bBj>5CVbl*s&D<&-xoJ1ar
z!s_9wC3NXZu#((~!tJ67KrM<KodN-donx>TO(fA0YywP+1W$&=3796(njQ)Ei2eY$
z3E;89#0H*~VhHM+M7lACuvCn-5I&3(Nf?WZ!SN1kN-X$L;W1<}iy?;}i&H80u{a4$
zAv-ucnMgT28$e5F`D+$W32M^R|20I@;8!zXo~BdK*g!=Lo`gtY3{I4!!kDPw>DaR1
z9WKrUU!iU}E)(Q|V$yiCidZ~-q&q!%KNdd;>AA<oVTd6!1eEbODhzc7vXd~2lJj9i
zBeO@3R>g2pO`Qr?E?mZdMS<gD7;{KSY<5V<S&;RHLlGecSzy~E_*toOQnt_I&bGTO
zW_z~1rXm{(4!e4x(J+7ByrO*7Z{L$gVO7*Phq2r~XNtul&L`Ccc!o+>SzKhCuCqH7
z3Z30*hYyR-?Xh{FQ0J|7+ssz6uF7H|^#xdym+?EE#%@*U+|b6QNOzl^z(R`It<=?3
zWdgE7=czWkZB`|eN8c0YOxz?+v)4F%Pp6nY8xsm~Afb>QYD8;Ed<Uz^J+!((&kN!A
zee|{ly@D4?kYwPG6cmjl@66$aG9-D=%?lYMjVt7Z7)gtZcp;0TBgr!zY!cSy^RN?@
zCFVCID|ul&lB_02I@km_FrDsTGZf?J@j@kvNGeIOJ<SW#Q1}D@q$5!~&{82$MS%H+
z-7O{Wb+Pf1zZa$|-L93qFcd*{jqkhIpH%NG<c07S^>|TM$*MY=!s2q&xtunqH_Pe*
zaXDRHg~RN%RFg~B**&2t`pCeF8*G;V+TSEqH`!De7DPDgxXJbkW2T^x4HjOQi$c~r
z)S5aFm90_}*n6A(NR;H5-(cW{uy?2ew!|p>NQfcLW3yN4cwrO@$7Ic2wlI3*GG3U7
zB4z<g<50vLa{ex>LyLD0vKgq3Xa?D&=nv+kJ8a%+mz5W0qsTO}bdX&xuoshW2iXL2
zX^>q9s#t!H4ILwyShP!#q6KNcg#?|XE{wA*g`4-0AbYM~53>Idp~8i95>6ttpqdwc
zgphUtFZ>uG70B-sh{P=5g{M%+ouY<RlgnXiNL>JO;f0@uEGglI=R!=yyzsM-1@QTK
zU}89zyAEQ`?3=iG>IHfOuh-?T^4dUs+-7%;*=ayBal4+^tB0Y^S^$X1<xLzHFV`FL
zjRm}3ORGFKi?_z*^cWC?2}m|`hhW*gxtTL(y+&!OXF6)U7MIlq)vfw`Uay?#Twy@r
zN$r$&`b@Xm<%XuRaim}i=Tvn8WnQl-a$4*@tIgrE8jv_Ph^j7fdc1C*#cM#)E2Lu!
zN4*Y3Te-*CeA-XOd~=Pn%<QfLV$x3X)K+dHgtxq~m74=EKYF%u8^D12wsBQ4&9vXl
zVt0+xYd1S8tY!lmv!494jVppf>$L6MI5d_#zMaz`BU!(l)3YxO_ikF{@R}>^bQq_}
zh3%YSZ9nZ+Qvxf_W4E~6P$OAQX=e<Bg1k$qq<#mvDwYG%qd|fhRB<hKvj_N%st8Id
z2niC3^alk`0aic)3=x$$B}749x6NiC<T*~wv{6JAg}UlMGGjIe+MnZEk!;0>#-5`W
zXaAZjy?SNe?6+5wbq(B7ZSRDR^i26s@7&5z{g*u(R{Q<x`E;GsIID8%J%w_g_X}NA
z>=Du7qkld_L_4`mnfCbc{uL2n`}!9xT>jMUb#|iP$*Jb{?P?Xb7u?CnJ#s#N;o`1O
z{eJClGZq|CPDgj9aLS?9(nro_oPYk!)PsJ%ifT%g&6%UIa&NaZeNkI#FFa}T3EIi)
zJGs2<%Sq?2?KfS+Gv42yJa^AfvEM&>hH~Z|8Pj@rPiMZRIq!>=m)SU?Xyj(fmZNI*
z8q<}M7vK7NW?uBvoy6D3<z`=s>`A(RF*P;1Jmq5TF<U5*8sQCOn-lg}{if%aU6USM
zT$?p?+W$}TZ6lW~^PO5bsp|fD+vMF>@!2iLt3<ksdo|PV{jPS<KQVmZmA^i5X3^nO
zFbq?Tqt0GanbUFSD1WSRa%M}#OO0}?@sq&!ySNKT_HuVx^|%W3j5xQ+D)_Q(E;-x8
zZP8la-M_7tzd)Q{wQw7*{mBDjFED$-D%ZJl#vNO>`Q_MD%jt81=@D_6hsnC#+zFX!
z&zpbyDmlEjdC|_8D=$}VBqqYm(B8Z?RDYtZe84kZk@Mmk309yJ)MM|ex}4mrD^BO0
zXrEL0k59VOS<P{BoN%Qwd;E>XmF*9VSDWW}tS7g9M>Ko5UuKszZ!0O})O*u@Sbnyz
z^e+;iLp6vhan9a--8Ys+9apZoXnLT?nn3#)S$H`u&(weD``59)Gn!LfTb?i&h@+W%
zS9auF+-qOIG<U%o?z~qLn3X`L?&Z>D+Up<hyuMb=zwtz(c4OH!52@SBEs@=;-+%5~
z!vvrI%n#{{%qu#`g}vMiS)JdmTHHEMy2kjky0p9RI!SHeR>&%UuI@9pWPbL@2kjTj
Z;y3Igue5Lqf$C}UX$zNxeB?*C{V#$gOu_&F
delta 35597
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
diff --git a/boot/ocamldep b/boot/ocamldep
index 89aaaca2add1ce2edc48397a11036acdd02bfd9c..375a5f40db6f1bf310cdf2d6376ce003a76d5376 100755
GIT binary patch
delta 1507
zcmZ8hYiv|S7`=0EuU*}3xx1{i>jK+$YlAFwB~qb_Y{5nm)>lkG&=@d=)EX$U22In%
zCW;b8#X1QSdBhNW(CvcYnp_`A`KOplNHj(hH1bq}#y=!Ld0oz_Ga@_5*>BEwzwgYs
zJ2Q9N7xA56#v|#*?D`javuoBp^Yohi4c}}Y=&82G$8Gp+1a1Kq0nI>I&ub7PdY(ok
zXU)w(t)7PvC+K+-qNnE#h*3RHA;tjKvVW>&4U8u!#KaVU1;)f=&5e<y=Ee+7v)&j=
zXl_i^Yi^9yX>QELvHrM#aX3*IP?Uxk3FgUJM;_O_O7mM0@7ME5`WY8tEf-}kO_0+R
zIZfs%kWlLm*{Sl2gYQPw%ZF@F{;_4Q+&dVNBlm>FO){hIk{5Gv+52!@<sWlA^^PYZ
z<-2$7bL|Ub^7QVeM9ak>5L$5tBIh>HF4IHlw#9gAvPfFnD)=7oYUE7~yGLaI&?910
zjt*snC(jS1MXO8}(_*>oD5k_$a%C|+^X#P?b!S};0_vN0HhOe&ul%$)Z($EAOqP`g
zEBNmf{CowE%gk^}%#?-URO3TeZq(XT!FR|_!^s4_@Fbg6`EJ9gwEXN(VxpM!0C*m_
z9pIP-v;Y|rjK8l20S_ZNd*6QbM9Du<5`|XL?PrgO1Fo8SR4iAyW8$sm`Tr|S1VO;X
zDQ=ow<XB$s+sDORTeW^5LQxjb1qV;r;*Euq!Y`b(!z)CmdVIdKODs?w?M|H^%R9eB
z#FPGCOPv16QHt`P{TiYX#QWsopX*d@RD{&lE@!(u^I%*(@vO6;hW0yw4!}~Ir#p26
z?_KzJr;M>tXoT_9@Da`VuQ>qU{2+Sn91DUa0P8qDMjhpOl9{8QSCAv;O<_NCL;-yp
z0BFVjTj&lH^IwXnmEBIJ#q@AJ7x)DA2;<)#qwfZ4U$>JR;H{!QZxufuNu1)>a3Vhh
zegm3ub`}A@0@JbM1t5gooCGui?LZMY4VYUThK{-64Vcqf6Tm&99}ezO%Ch|K=bW~A
zwQK*etg11~>T0vBT*)te<n-2rXJ7xss(jf=hUZ*QZ0svLeqXuDTkVzptlrSSe^uXi
z=eB-cJd^uOy<hLX?ydj!rP*Cqepo$c%c<Dto1LfpY{HG&UbOoArO&7Pr~DY((=(%L
Y*;DG#r2B?F*sP8u-ITD^rKH<%4UDl<+W-In
delta 1502
zcmaJ>TS$~a6#i#_7uQ^M*S6YiH}_vxOIme{uzQMHDi}yFg(0DtrfwQ&MK`hwbb+93
z9;PUQG6L6psMUTm$jFc&u%NIT*wu=9kjMwMayn<70o#WLzMb=(|C}>t&Y81U?$|DN
z+cdAoU$e8m%3o34Sld)t<KJ0XQNP2#t8sTjz+c<YwCkq1|4izNXeGSn!mkG~15gNv
z1H=m1%a-*JZ*wxx1fkMkw+Pt{yH&_ZuqOgcg3l8?MsSzl@))P!@+eFL{mlSO!y!1N
z(;QaVg(6-U%n@8BW)oZ{H&bw#AO@Gf15l3~?T|+aj&TZvJPY<h#W!_hG@cz+OjQFp
zCV|eFR5rj){pY-)JuRoL?DJfMjZOw^p@G(Jqro#lPqrmHN+vib!af~#lnsEbw6D#Z
z)d*ju7L>}v2tEir8uZczy}wXru!M}#K+s24P!{x(P4q7O9-(i8Zt{`xpf|(y``@^m
zfn$7m0~rr93DA=ERk<v}<3|KH{rNYd7Qxrh$L(&ik$!J?d-g<p>x|(2)OW+lj&_kE
z_RXxOu%RVt8r{;6#^Q&Fg)Zz^n}L;0!GvL@0a5|bl<*pz<Q(4=a;(RLW33%}YX>RL
zBsKcT8`5iJJ@3iOl-1L0T%2>f`<iJw6X@8`J7U)dK9J=GE1rp+#f49#=!AQi=<Z=d
zY$?fOzHGIX<mgYb)e$o(*L#cA11|RZ8ZpQ8Kpd>&I(p{i95!GjCRSIYUSdo0;4-g?
zoh8+(tDA8u<PAQ7M=bDsKn?&G-UtVAdS_0JO?6G)v`_d+ep_(#Q2|(uUhr8k&Ur3C
zo_Cq^f^f<3(V`O5-3QLdaVjtX>JWM0cmROG<UtzPV)^1&LY?ZHkD|=e2=Zkxhb=tG
zGW_pJR$iyBY{nr*TO3-fK_a~9gTFYx2zU-~!aK_bJOg;(o#X*HAP%~02P^_y0lWps
zfsKVYa+o!Y3Gf22gP0F4?4YJ7x+9=wt%`4eG@`~8WjmC6<t@GJy4o10#iafJPm{e0
zsZK4%_kXJsJf!M86lJNh+~1b<^lMdO>Z6KkkK^jv^~~)s9=CM<EX{A(aDK<&y}f11
vg<z)M<uF<emi@}&A7|GcHZ_g$rbC5EFW8{dc*=0LoK?7tZj#Q9xQyCguES`d
diff --git a/boot/ocamllex b/boot/ocamllex
index 084339c622eb58d5b9c4dc8112500fbc8c5deb05..1d75a78cd1a28f9fe684410f67d1b5a03a12b3b3 100755
GIT binary patch
delta 885
zcmZ8fO-NK>6n)>ra-1d`^<^{8<a2x`!8qBE82womBo(z%a3>Pc#uOB5Bf4m(M9D?p
zB9fp@^V1&&ih|1wXCbst0}))bYhjM*>z?6$3*QIloqO&(-@WI-8~+(xSqp}oMDy^_
zU~}KV!`{9xb>Ci&^_LpOQ^U^$Bgp7rG%$`xeUv#QwZjYzPZ^_J>HzaGsq2};Qr9t8
zNNqD$GT_DiTEiGCHZTZ{lMEPih`4ASBqmyiL1_4Opr~jaDk543J0V(!vv_}TfKFH?
z1`I_YFn~TZe9)HY64A$*Z%bV*@2~`3EX7@ffJP{2glxlrsJl9^?AfQ2uPWTNc@?J7
z&mn4k8>gAcI4xZbsKb<WFHqsKMS~BlsZkY~J^$|OA@lDJZN0CLHWoZj$-E|J)F$H+
zIccZ$4!_l1ZW^zB`UC4y?rRTjFBRz5N)1h?TU4I%=_E(mPCM!h#WIfSrt2A7El^L!
zN&VS9IQ-l{&%+Y^*?K7A+@w#LEA9R4&|Nsc`}Dd`Z~L@G$*iqXbT4Zs?(ZF(HR025
zXd)YnA`5<Iy%isrWv4;wPZr%7%M8$db!V!L+ou>frx}fmBm|$|`<{ni5*pWEJm1L8
oZRFH7FFd^btmX0Ek4G1$H!Jhww>Ia_=FEs`c8$1qKbklG1MeK2c>n+a
delta 724
zcmX?gkE`o0mx8jQenx(7s(xZxQD$*+hJJo>Vs4IpNl|HDwti+_amhxWWBsa@><nNa
z1tb-Lm<x#AftVMFxuI<3>BVh~%BD&{E<aRA0Z0o#+44YI5XzPV(n3JY0p-h1wqK`T
z4>BAi$^#XZgz`a_fGm@M^7){AaVQ^Vn+TK-vr!nzhuI1;8-_vVfy6<4kUAjWj)4U#
z05Zr8$`*x4g1rG!EC%I+ECumFjsO|PH(7hV{N#5wJe$iV_6SaPJE$=E+)shc*A{PJ
zWm5b#xnrf0r2nt~{~19_fmjEKL2M=<PMUmprLtKOP!=W%6l6Gp#=i#SvjfFpYCyW5
z|C+quwA5s?RVIvICTFkGX0)6<eU&m}_~hL{vT^eLRq~9FC;wlitSj>e)$k}FA7ly4
z2QWiH&dHwazuMYyI+~7;Xnc;ps3t0)@ogucUM<fUHu?2xdBrj`xh-h?W0SSlNHcP6
zj$gyiIQiN+8No0A{{IIhF>N3Q`SVco;<eisuVu9TFR<lvr1QkU89CSXRm3pNT&1`D
S!x|<DCZ>=T)4A3&IRF5@WR+k5
diff --git a/testsuite/tests/typing-misc/polyvars.ml b/testsuite/tests/typing-misc/polyvars.ml
index b4b5862..bd9ded9 100644
--- a/testsuite/tests/typing-misc/polyvars.ml
+++ b/testsuite/tests/typing-misc/polyvars.ml
@@ -15,3 +15,7 @@ module WildcardMatch : sig val foo: [< `A of int | `B of string] -> unit end = s
let bar (x: [< `A of int | `B of string]) = ()
let foo = function | `A _ -> () | x -> bar x
end;;
+
+module Typo : sig val f : [< `Bar of int] -> int end = struct
+ let f = function | `Bat x -> x | _ -> 4
+end;;
diff --git a/testsuite/tests/typing-misc/polyvars.ml.principal.reference b/testsuite/tests/typing-misc/polyvars.ml.principal.reference
index cace899..b3b0e99 100644
--- a/testsuite/tests/typing-misc/polyvars.ml.principal.reference
+++ b/testsuite/tests/typing-misc/polyvars.ml.principal.reference
@@ -45,5 +45,20 @@ Error: Signature mismatch:
is not included in
val foo : [< `A of int | `B of string ] -> unit
Type component [ `A of int ] does not match [< `A of int ]
- Types for tag `A are incompatible
+ Types for tag `A are incompatible: the tag is mandatory in the first type only
+# Characters 56-108:
+ .......................................................struct
+ let f = function | `Bat x -> x | _ -> 4
+ end..
+Error: Signature mismatch:
+ Modules do not match:
+ sig val f : [> `Bat of int ] -> int end
+ is not included in
+ sig val f : [< `Bar of int ] -> int end
+ Values do not match:
+ val f : [> `Bat of int ] -> int
+ is not included in
+ val f : [< `Bar of int ] -> int
+ Type component [> `Bat of int ] does not match [< `Bar of int ]
+ The first variant type is missing mandatory tag(s) `Bat
#
diff --git a/testsuite/tests/typing-misc/polyvars.ml.reference b/testsuite/tests/typing-misc/polyvars.ml.reference
index 89c8554..f00d04e 100644
--- a/testsuite/tests/typing-misc/polyvars.ml.reference
+++ b/testsuite/tests/typing-misc/polyvars.ml.reference
@@ -45,5 +45,20 @@ Error: Signature mismatch:
is not included in
val foo : [< `A of int | `B of string ] -> unit
Type component [ `A of int ] does not match [< `A of int ]
- Types for tag `A are incompatible
+ Types for tag `A are incompatible: the tag is mandatory in the first type only
+# Characters 56-108:
+ .......................................................struct
+ let f = function | `Bat x -> x | _ -> 4
+ end..
+Error: Signature mismatch:
+ Modules do not match:
+ sig val f : [> `Bat of int ] -> int end
+ is not included in
+ sig val f : [< `Bar of int ] -> int end
+ Values do not match:
+ val f : [> `Bat of int ] -> int
+ is not included in
+ val f : [< `Bar of int ] -> int
+ Type component [> `Bat of int ] does not match [< `Bar of int ]
+ The first variant type is missing mandatory tag(s) `Bat
#
diff --git a/typing/printtyp.ml b/typing/printtyp.ml
index 69ca127..af289ca 100644
--- a/typing/printtyp.ml
+++ b/typing/printtyp.ml
@@ -1056,8 +1056,22 @@ let explanation unif t3 t4 ppf =
fprintf ppf
"@,@[The second variant type does not allow tag(s)@ @[<hov>%a@]@]"
print_tags fields
- | [l1,_], true, [l2,_], true when l1 = l2 ->
- fprintf ppf "@,Types for tag `%s are incompatible" l1
+ | [l1,r1], true, [l2,r2], true when l1 = l2 ->
+ fprintf ppf "@,Types for tag `%s are incompatible" l1;
+ begin match r1, r2 with
+ | Rpresent _, Reither _ ->
+ fprintf ppf ": the tag is mandatory in the first type only"
+ | _ -> ()
+ end
+ | l1, p1, l2, p2 when (not p1) || (not p2) ->
+ let p1 = List.filter (function | (_,Rpresent _) -> true | _ -> false) l1
+ and p2 = List.filter (function | (_,Rpresent _) -> true | _ -> false) l2 in
+ if p1 <> [] then
+ fprintf ppf "@,@[The first variant type is missing \
+ mandatory tag(s)@ @[<hov>%a@]@]" print_tags p1;
+ if p2 <> [] then
+ fprintf ppf "@,@[The second variant type is missing \
+ mandatory tag(s)@ @[<hov>%a@]@]" print_tags p2;
| _ -> ()
end
| _ -> ()
--
1.7.10.4
From a49cf2da5573a0c2d9b5e0b95ac93e4bf310db6c Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?T=C3=B6r=C3=B6k=20Edwin?= <edwin@etorok.net>
Date: Sun, 13 Jan 2013 19:05:19 +0200
Subject: [PATCH 3/3] Improve type error messages when dealing with labels and
tuples.
---
testsuite/tests/typing-misc/polyvars.ml | 14 +++++++++
.../typing-misc/polyvars.ml.principal.reference | 31 ++++++++++++++++++++
testsuite/tests/typing-misc/polyvars.ml.reference | 31 ++++++++++++++++++++
typing/printtyp.ml | 8 +++++
4 files changed, 84 insertions(+)
diff --git a/testsuite/tests/typing-misc/polyvars.ml b/testsuite/tests/typing-misc/polyvars.ml
index bd9ded9..e2656e2 100644
--- a/testsuite/tests/typing-misc/polyvars.ml
+++ b/testsuite/tests/typing-misc/polyvars.ml
@@ -19,3 +19,17 @@ end;;
module Typo : sig val f : [< `Bar of int] -> int end = struct
let f = function | `Bat x -> x | _ -> 4
end;;
+
+module LabelOrder : sig
+ val f : foo:[< `A of int | `B of string] -> bar:int -> unit
+end = struct
+ let f ~bar ~foo = match foo with
+ | `A a -> print_int a
+ | `B b -> print_string b
+end;;
+
+module TupleCount : sig
+ val f : [< `A ] * [< `A ] * [< `A ] -> unit
+end = struct
+ let f = function | `A, `B -> ()
+end;;
diff --git a/testsuite/tests/typing-misc/polyvars.ml.principal.reference b/testsuite/tests/typing-misc/polyvars.ml.principal.reference
index b3b0e99..7c64a21 100644
--- a/testsuite/tests/typing-misc/polyvars.ml.principal.reference
+++ b/testsuite/tests/typing-misc/polyvars.ml.principal.reference
@@ -61,4 +61,35 @@ Error: Signature mismatch:
val f : [< `Bar of int ] -> int
Type component [> `Bat of int ] does not match [< `Bar of int ]
The first variant type is missing mandatory tag(s) `Bat
+# Characters 93-189:
+ ......struct
+ let f ~bar ~foo = match foo with
+ | `A a -> print_int a
+ | `B b -> print_string b
+ end..
+Error: Signature mismatch:
+ ...
+ Values do not match:
+ val f : bar:'a -> foo:[< `A of int | `B of string ] -> unit
+ is not included in
+ val f : foo:[< `A of int | `B of string ] -> bar:int -> unit
+ Type component bar:'a -> foo:[< `A of int | `B of string ] -> unit
+ does not match foo:[< `A of int | `B of string ] -> bar:int -> unit
+ Label (order) doesn't match: bar <> foo
+# Characters 77-121:
+ ......struct
+ let f = function | `A, `B -> ()
+ end..
+Error: Signature mismatch:
+ Modules do not match:
+ sig val f : [< `A ] * [< `B ] -> unit end
+ is not included in
+ sig val f : [< `A ] * [< `A ] * [< `A ] -> unit end
+ Values do not match:
+ val f : [< `A ] * [< `B ] -> unit
+ is not included in
+ val f : [< `A ] * [< `A ] * [< `A ] -> unit
+ Type component [< `A ] * [< `B ] does not match
+ [< `A ] * [< `A ] * [< `A ]
+ Tuples have different lengths: 2 <> 3
#
diff --git a/testsuite/tests/typing-misc/polyvars.ml.reference b/testsuite/tests/typing-misc/polyvars.ml.reference
index f00d04e..bf22912 100644
--- a/testsuite/tests/typing-misc/polyvars.ml.reference
+++ b/testsuite/tests/typing-misc/polyvars.ml.reference
@@ -61,4 +61,35 @@ Error: Signature mismatch:
val f : [< `Bar of int ] -> int
Type component [> `Bat of int ] does not match [< `Bar of int ]
The first variant type is missing mandatory tag(s) `Bat
+# Characters 93-189:
+ ......struct
+ let f ~bar ~foo = match foo with
+ | `A a -> print_int a
+ | `B b -> print_string b
+ end..
+Error: Signature mismatch:
+ ...
+ Values do not match:
+ val f : bar:'a -> foo:[< `A of int | `B of string ] -> unit
+ is not included in
+ val f : foo:[< `A of int | `B of string ] -> bar:int -> unit
+ Type component bar:'a -> foo:[< `A of int | `B of string ] -> unit
+ does not match foo:[< `A of int | `B of string ] -> bar:int -> unit
+ Label (order) doesn't match: bar <> foo
+# Characters 77-121:
+ ......struct
+ let f = function | `A, `B -> ()
+ end..
+Error: Signature mismatch:
+ Modules do not match:
+ sig val f : [< `A ] * [< `B ] -> unit end
+ is not included in
+ sig val f : [< `A ] * [< `A ] * [< `A ] -> unit end
+ Values do not match:
+ val f : [< `A ] * [< `B ] -> unit
+ is not included in
+ val f : [< `A ] * [< `A ] * [< `A ] -> unit
+ Type component [< `A ] * [< `B ] does not match
+ [< `A ] * [< `A ] * [< `A ]
+ Tuples have different lengths: 2 <> 3
#
diff --git a/typing/printtyp.ml b/typing/printtyp.ml
index af289ca..9c4153f 100644
--- a/typing/printtyp.ml
+++ b/typing/printtyp.ml
@@ -991,6 +991,8 @@ let has_explanation unif t3 t4 =
Tfield _, (Tnil|Tconstr _) | (Tnil|Tconstr _), Tfield _
| _, Tvar _ | Tvar _, _
| Tvariant _, Tvariant _ -> true
+ | Tarrow (l1,_,_,_), Tarrow (l2,_,_,_) -> l1 <> l2
+ | Ttuple l1, Ttuple l2 -> (List.length l1) <> (List.length l2)
| Tfield (l,_,_,{desc=Tnil}), Tfield (l',_,_,{desc=Tnil}) -> l = l'
| _ -> false
@@ -1074,6 +1076,12 @@ let explanation unif t3 t4 ppf =
mandatory tag(s)@ @[<hov>%a@]@]" print_tags p2;
| _ -> ()
end
+ | Tarrow (l1,_,_,_), Tarrow(l2,_,_,_) when l1 <> l2 ->
+ fprintf ppf "@,@[Label (order) doesn't match: %s <> %s@]" l1 l2;
+ | Ttuple l1, Ttuple l2 ->
+ let n1 = List.length l1 and n2 = List.length l2 in
+ if n1 <> n2 then
+ fprintf ppf "@,@[Tuples have different lengths: %d <> %d@]" n1 n2
| _ -> ()
let explanation unif mis ppf =
--
1.7.10.4
From 46edd61c97bccd1089fbf8af06fd02b153fc6b0f Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?T=C3=B6r=C3=B6k=20Edwin?= <edwin@etorok.net>
Date: Sun, 13 Jan 2013 19:54:46 +0200
Subject: [PATCH 4/4] Fix order of types in message
---
testsuite/tests/typing-misc/polyvars.ml.principal.reference | 2 +-
testsuite/tests/typing-misc/polyvars.ml.reference | 2 +-
typing/printtyp.ml | 8 ++++----
3 files changed, 6 insertions(+), 6 deletions(-)
diff --git a/testsuite/tests/typing-misc/polyvars.ml.principal.reference b/testsuite/tests/typing-misc/polyvars.ml.principal.reference
index 7c64a21..63217a1 100644
--- a/testsuite/tests/typing-misc/polyvars.ml.principal.reference
+++ b/testsuite/tests/typing-misc/polyvars.ml.principal.reference
@@ -60,7 +60,7 @@ Error: Signature mismatch:
is not included in
val f : [< `Bar of int ] -> int
Type component [> `Bat of int ] does not match [< `Bar of int ]
- The first variant type is missing mandatory tag(s) `Bat
+ The second variant type is missing mandatory tag(s) `Bat
# Characters 93-189:
......struct
let f ~bar ~foo = match foo with
diff --git a/testsuite/tests/typing-misc/polyvars.ml.reference b/testsuite/tests/typing-misc/polyvars.ml.reference
index bf22912..d23bd78 100644
--- a/testsuite/tests/typing-misc/polyvars.ml.reference
+++ b/testsuite/tests/typing-misc/polyvars.ml.reference
@@ -60,7 +60,7 @@ Error: Signature mismatch:
is not included in
val f : [< `Bar of int ] -> int
Type component [> `Bat of int ] does not match [< `Bar of int ]
- The first variant type is missing mandatory tag(s) `Bat
+ The second variant type is missing mandatory tag(s) `Bat
# Characters 93-189:
......struct
let f ~bar ~foo = match foo with
diff --git a/typing/printtyp.ml b/typing/printtyp.ml
index 9c4153f..15ef0d0 100644
--- a/typing/printtyp.ml
+++ b/typing/printtyp.ml
@@ -1068,12 +1068,12 @@ let explanation unif t3 t4 ppf =
| l1, p1, l2, p2 when (not p1) || (not p2) ->
let p1 = List.filter (function | (_,Rpresent _) -> true | _ -> false) l1
and p2 = List.filter (function | (_,Rpresent _) -> true | _ -> false) l2 in
- if p1 <> [] then
- fprintf ppf "@,@[The first variant type is missing \
- mandatory tag(s)@ @[<hov>%a@]@]" print_tags p1;
if p2 <> [] then
- fprintf ppf "@,@[The second variant type is missing \
+ fprintf ppf "@,@[The first variant type is missing \
mandatory tag(s)@ @[<hov>%a@]@]" print_tags p2;
+ if p1 <> [] then
+ fprintf ppf "@,@[The second variant type is missing \
+ mandatory tag(s)@ @[<hov>%a@]@]" print_tags p1;
| _ -> ()
end
| Tarrow (l1,_,_,_), Tarrow(l2,_,_,_) when l1 <> l2 ->
--
1.7.10.4
| ||||||||||
Relationships |
||||||
|
||||||
Notes |
|
|
(0008817) garrigue (manager) 2013-02-04 11:20 |
These are interestinf improvements. However, after a few hours trying to merge this properly, I've come to the conclusion that the current trace-based approach is very hard to adapt to different kinds of errors. It is easy to make something that kind of works, but they are just too many different cases to handle. I'm now seriously thinking about completely changing this in the spirit of what is done for module types, which should allow better error messages for all situations. |
|
(0008822) hongboz (developer) 2013-02-07 04:31 |
Hi Jacques, I attached a type got in toplevel (tmp1.ml) which I hope the toplevel can suppress printing such types(default option). The type signature inferred can be simplified by type annotations, but sometimes I hope that if the compiler find a very big type, it can be a little smart that it does not print it to scare users. (There are very good reasons for using polymorphic variants in my project). Thanks! |
Issue History |
|||
| Date Modified | Username | Field | Change |
| 2013-01-13 18:46 | edwin | New Issue | |
| 2013-01-13 18:46 | edwin | File Added: better-type-errors-unified.patch | |
| 2013-01-13 18:46 | edwin | File Added: 0001-Propagate-details-about-type-unification-error-for-m.patch | |
| 2013-01-13 18:47 | edwin | File Added: 0002-Better-type-error-reporting-for-polymorphic-variants.patch | |
| 2013-01-13 18:47 | edwin | File Added: 0003-Improve-type-error-messages-when-dealing-with-labels.patch | |
| 2013-01-13 18:56 | edwin | File Added: 0004-Fix-order-of-types-in-message.patch | |
| 2013-01-13 22:41 | meyer | Relationship added | related to 0005889 |
| 2013-02-04 11:20 | garrigue | Note Added: 0008817 | |
| 2013-02-04 11:20 | garrigue | Assigned To | => garrigue |
| 2013-02-04 11:20 | garrigue | Status | new => acknowledged |
| 2013-02-07 04:30 | hongboz | File Added: temp1.ml | |
| 2013-02-07 04:31 | hongboz | Note Added: 0008822 | |
| Copyright © 2000 - 2011 MantisBT Group |



