summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPierre Weis <Pierre.Weis@inria.fr>2013-06-03 11:12:31 +0000
committerPierre Weis <Pierre.Weis@inria.fr>2013-06-03 11:12:31 +0000
commit38cac2d84760b46a8a4797c8f4375aade5a36d55 (patch)
treed3d28bf3a78951599ef0e642df92292695e4cef4
parent97bc1fa9e292667a5a30888eeffcddb102c8881f (diff)
Move back to revision r13685.
git-svn-id: http://caml.inria.fr/svn/ocaml/trunk@13733 f963ae5c-01c2-4b8c-9fe0-0dff7051ff02
-rw-r--r--typing/typecore.ml264
1 files changed, 81 insertions, 183 deletions
diff --git a/typing/typecore.ml b/typing/typecore.ml
index 76108ce87..09f81378c 100644
--- a/typing/typecore.ml
+++ b/typing/typecore.ml
@@ -533,7 +533,7 @@ let rec expand_path env p =
match decl with
Some {type_manifest = Some ty} ->
begin match repr ty with
- {desc=Tconstr(p,_,_)} -> expand_path env p
+ {desc=Tconstr(p,_,_)} -> expand_path env p
| _ -> assert false
end
| _ -> p
@@ -562,8 +562,8 @@ end) = struct
let spellcheck ppf env p lid =
Typetexp.spellcheck_simple ppf fold
(fun d ->
- if compare_type_path env p (get_type_path env d)
- then get_name d else "") env lid
+ if compare_type_path env p (get_type_path env d)
+ then get_name d else "") env lid
let lookup_from_type env tpath lid =
let descrs = get_descrs (Env.find_type_descrs tpath env) in
@@ -572,7 +572,7 @@ end) = struct
Longident.Lident s -> begin
try
List.find (fun nd -> get_name nd = s) descrs
- with Not_found ->
+ with Not_found ->
raise (Error (lid.loc, env, Wrong_name (type_kind, tpath, lid.txt)))
end
| _ -> raise Not_found
@@ -604,24 +604,24 @@ end) = struct
let scope = match scope with None -> lbls | Some l -> l in
let lbl = match opath with
None ->
- begin match lbls with
+ begin match lbls with
[] -> unbound_name_error env lid
- | (lbl, use) :: rest ->
- use ();
+ | (lbl, use) :: rest ->
+ use ();
let paths = ambiguous_types env lbl rest in
- if paths <> [] then
- warn lid.loc
- (Warnings.Ambiguous_name
- ([Longident.last lid.txt], paths, false));
- lbl
- end
+ if paths <> [] then
+ warn lid.loc
+ (Warnings.Ambiguous_name ([Longident.last lid.txt],
+ paths, false));
+ lbl
+ end
| Some(tpath0, tpath, pr) ->
- let warn_pr () =
- let kind = if type_kind = "record" then "field" else "constructor" in
+ let warn_pr () =
+ let kind = if type_kind = "record" then "field" else "constructor" in
warn lid.loc
(Warnings.Not_principal
- ("this type-based " ^ kind ^ " disambiguation"))
- in
+ ("this type-based " ^ kind ^ " disambiguation"))
+ in
try
let lbl, use = disambiguate_by_type env tpath scope in
use ();
@@ -648,12 +648,12 @@ end) = struct
(Warnings.Name_out_of_scope (s, [Longident.last lid.txt], false));
if not pr then warn_pr ();
lbl
- with Not_found ->
+ with Not_found ->
if lbls = [] then unbound_name_error env lid else
let tp = (tpath0, expand_path env tpath) in
- let tpl =
- List.map
- (fun (lbl, _) ->
+ let tpl =
+ List.map
+ (fun (lbl, _) ->
let tp0 = get_type_path env lbl in
let tp = expand_path env tp0 in
(tp0, tp))
@@ -941,10 +941,10 @@ let rec type_pat ~constrs ~labels ~no_existentials ~mode ~env sp expected_ty =
pat_env = !env }
| Ppat_construct(lid, sarg, explicit_arity) ->
let opath =
- try
+ try
let (p0, p, _) = extract_concrete_variant !env expected_ty in
Some (p0, p, true)
- with Not_found -> None
+ with Not_found -> None
in
let constrs =
match lid.txt, constrs with
@@ -953,7 +953,7 @@ let rec type_pat ~constrs ~labels ~no_existentials ~mode ~env sp expected_ty =
| _ -> Typetexp.find_all_constructors !env lid.loc lid.txt
in
let check_lk tpath constr =
- if constr.cstr_generalized then
+ if constr.cstr_generalized then
raise (Error (lid.loc, !env,
Unqualified_gadt_pattern (tpath, constr.cstr_name)))
in
@@ -1014,7 +1014,7 @@ let rec type_pat ~constrs ~labels ~no_existentials ~mode ~env sp expected_ty =
try
let (p0, p,_) = extract_concrete_record !env expected_ty in
Some (p0, p, true), expected_ty
- with Not_found -> None, newvar ()
+ with Not_found -> None, newvar ()
in
let type_label_pat (label_lid, label, sarg) =
begin_def ();
@@ -1024,7 +1024,7 @@ let rec type_pat ~constrs ~labels ~no_existentials ~mode ~env sp expected_ty =
unify_pat_types loc !env ty_res record_ty
with Unify trace ->
raise(Error(label_lid.loc, !env,
- Label_mismatch(label_lid.txt, trace)))
+ Label_mismatch(label_lid.txt, trace)))
end;
let arg = type_pat sarg ty_arg in
if vars <> [] then begin
@@ -1371,7 +1371,6 @@ external format_to_string :
let type_format loc fmt =
let ty_arrow gty ty = newty (Tarrow ("", instance_def gty, ty, Cok)) in
- let ty_tuple tys = newty (Ttuple tys) in
let bad_conversion fmt i c =
raise (Error (loc, Env.empty, Bad_conversion (fmt, i, c))) in
@@ -1382,12 +1381,6 @@ let type_format loc fmt =
let len = String.length fmt in
- let rec scan_decimal_string scan i j =
- if j >= len then incomplete_format fmt else
- match fmt.[j] with
- | '0' .. '9' -> scan_decimal_string scan i (j + 1)
- | _ -> scan i j in
-
let ty_input = newvar ()
and ty_result = newvar ()
and ty_aresult = newvar ()
@@ -1403,50 +1396,24 @@ let type_format loc fmt =
match fmt.[i] with
| '%' -> scan_opts i (i + 1)
| _ -> scan_format (i + 1)
-
and scan_opts i j =
if j >= len then incomplete_format fmt else
match fmt.[j] with
| '_' -> scan_rest true i (j + 1)
| _ -> scan_rest false i j
-
and scan_rest skip i j =
-
let rec scan_flags i j =
- (* A flag is:
- alternate_form
- zero_padded
- left_adjusted
- blank_positive
- plus_positive *)
if j >= len then incomplete_format fmt else
match fmt.[j] with
- | '#' (* alternate form for numerical conversions
- o -> 0o, x -> 0x, X -> 0X,
- e, E, f, F, g, G, -> a decimal point in the result,
- even if no digits follow it... *)
- | '0' (* zero padded value for numerical conversions diouxXeEfFgG.
- If 0 and - are given 0 is ignored. For other conversions
- undefined behaviour. *)
- | '-' (* left adjusted value: pad on the right with blanks.
- A - overrides a 0. *)
- | ' ' (* a space should be left before a positive number for
- signed numerical conversions *)
- | '+' (* a sign (+ or -) should be prepend to a number for signed
- conversions. A + overrides a space if both are given. *) ->
- scan_flags i (j + 1)
- | _ -> scan_field_width i j
-
- and scan_field_width i j =
- (* An optional decimal digit string with nonzero first digit,
- or * (or *m$).
- A negative field width is taken as a - flag followed by a
- positive width.
- If a result is wider than the field width the field is extended
- to contain the result. *)
- scan_field_width_or_precision_value scan_precision i j
-
- and scan_field_width_or_precision_value scan i j =
+ | '#' | '0' | '-' | ' ' | '+' -> scan_flags i (j + 1)
+ | _ -> scan_width i j
+ and scan_width i j = scan_width_or_prec_value scan_precision i j
+ and scan_decimal_string scan i j =
+ if j >= len then incomplete_format fmt else
+ match fmt.[j] with
+ | '0' .. '9' -> scan_decimal_string scan i (j + 1)
+ | _ -> scan i j
+ and scan_width_or_prec_value scan i j =
if j >= len then incomplete_format fmt else
match fmt.[j] with
| '*' ->
@@ -1454,25 +1421,11 @@ let type_format loc fmt =
ty_uresult, ty_arrow Predef.type_int ty_result
| '-' | '+' -> scan_decimal_string scan i (j + 1)
| _ -> scan_decimal_string scan i j
-
and scan_precision i j =
- (* A . followed by an optional decimal digit string.
- If the precision is just . or is negative it is 0.
- It gives
- - the minimum number of digit for diouxX,
- - the number of digits after the radix for eEfF,
- - the maximum number of significant digits for gG,
- - the maximum number of characters for sS,
- *)
if j >= len then incomplete_format fmt else
match fmt.[j] with
- | '.' -> scan_field_width_or_precision_value scan_conversion i (j + 1)
+ | '.' -> scan_width_or_prec_value scan_conversion i (j + 1)
| _ -> scan_conversion i j
-
- (* The length modifier:
- hh, h, l, ll, L, q, j, z, t.
- *)
-
and scan_indication j =
if j >= len then j - 1 else
match fmt.[j] with
@@ -1490,7 +1443,6 @@ let type_format loc fmt =
| _c -> k
end
| _c -> j - 1
-
and scan_range j =
let rec scan_closing j =
if j >= len then incomplete_format fmt else
@@ -1517,39 +1469,6 @@ let type_format loc fmt =
scan_first_neg j
- and scan_elem_indication j =
- let rec scan_closing j =
- if j >= len then incomplete_format fmt else
- match fmt.[j] with
- | '@' ->
- let j = j + 1 in
- if j >= len then incomplete_format fmt else
- begin match fmt.[j] with
- | ')' -> j + 1
- | c -> bad_conversion fmt j c
- end
- | '%' ->
- let j = j + 1 in
- if j >= len then incomplete_format fmt else
- begin match fmt.[j] with
- | '@' -> scan_closing (j + 1)
- | c -> bad_conversion fmt j c
- end
- | c -> scan_closing (j + 1) in
- let scan_first j =
- if j >= len then incomplete_format fmt else
- match fmt.[j] with
- | '@' ->
- let j = j + 1 in
- if j >= len then incomplete_format fmt else
- begin match fmt.[j] with
- | '(' -> scan_closing (j + 1)
- | c -> bad_conversion fmt j c
- end
- | c -> j in
-
- scan_first j
-
and conversion j ty_arg =
let ty_uresult, ty_result = scan_format (j + 1) in
ty_uresult,
@@ -1560,51 +1479,15 @@ let type_format loc fmt =
let ty_a = ty_arrow ty_input (ty_arrow ty_e ty_aresult) in
ty_uresult, ty_arrow ty_a ty_result
- and conversion_a2 j ty_e ty_f ty_arg =
- let ty_uresult, ty_result = conversion j ty_arg in
- let ty_a = ty_arrow ty_input (ty_arrow ty_e ty_aresult) in
- let ty_b = ty_arrow ty_input (ty_arrow ty_f ty_aresult) in
- ty_uresult, ty_arrow ty_a (ty_arrow ty_b ty_result)
-
and conversion_r j ty_e ty_arg =
let ty_uresult, ty_result = conversion j ty_arg in
let ty_r = ty_arrow ty_input ty_e in
ty_arrow ty_r ty_uresult, ty_result
- and conversion_r2 j ty_e ty_f ty_arg =
- let ty_uresult, ty_result = conversion j ty_arg in
- let ty_a = ty_arrow ty_input ty_e in
- let ty_b = ty_arrow ty_input ty_f in
- ty_arrow ty_a (ty_arrow ty_b ty_uresult), ty_result
-
and scan_conversion i j =
if j >= len then incomplete_format fmt else
match fmt.[j] with
| '%' | '@' | '!' | ',' -> scan_format (j + 1)
- | 'd' | 'i' (* *)
- | 'o' | 'u' | 'x' | 'X' (* *)
- | 'N' ->
- conversion j Predef.type_int
- | 'l' | 'n' | 'L' as c ->
- let j = j + 1 in
- if j >= len then conversion (j - 1) Predef.type_int else begin
- match fmt.[j] with
- | 'd' | 'i' | 'o' | 'u' | 'x' | 'X' ->
- let ty_arg =
- match c with
- | 'l' -> Predef.type_int32
- | 'n' -> Predef.type_nativeint
- | _ -> Predef.type_int64 in
- conversion j ty_arg
- | c -> conversion (j - 1) Predef.type_int
- end
- | 'e' | 'E' (* *)
- | 'f' | 'F' (* *)
- | 'g' | 'G' (* *)
- (* In C99 | 'a' | 'A' is used for
- [-]0xh.hhhp+- style for floating point numbers *)
- -> conversion j Predef.type_float
- | 'c' | 'C' -> conversion j Predef.type_char
| 's' | 'S' ->
let j = scan_indication (j + 1) in
conversion j Predef.type_string
@@ -1612,30 +1495,45 @@ let type_format loc fmt =
let j = scan_range (j + 1) in
let j = scan_indication (j + 1) in
conversion j Predef.type_string
+ | 'c' | 'C' -> conversion j Predef.type_char
+ | 'd' | 'i' | 'o' | 'u' | 'x' | 'X' | 'N' ->
+ conversion j Predef.type_int
+ | 'f' | 'e' | 'E' | 'g' | 'G' | 'F' -> conversion j Predef.type_float
| 'B' | 'b' -> conversion j Predef.type_bool
| 'a' | 'r' as conv ->
let conversion =
if conv = 'a' then conversion_a else conversion_r in
let ty_e = newvar () in
- conversion j ty_e ty_e
- | 'A' | 'R' as conv ->
- let j = scan_elem_indication (j + 1) in
- let conversion =
- if conv = 'A' then conversion_a else conversion_r in
- if j >= len then incomplete_format fmt else begin
- let ty_e = newvar () in
+ let j = j + 1 in
+ if j >= len then conversion (j - 1) ty_e ty_e else begin
match fmt.[j] with
- | 'a' | 'A' -> conversion j ty_e (Predef.type_array ty_e)
+(* | 'a' | 'A' -> conversion j ty_e (Predef.type_array ty_e)
| 'l' | 'L' -> conversion j ty_e (Predef.type_list ty_e)
- | 'o' | 'O' -> conversion j ty_e (Predef.type_option ty_e)
- | 'c' | 'C' ->
- let ty_f = newvar () in
- let conversion2 =
- if conv = 'A' then conversion_a2 else conversion_r2 in
- conversion2 j ty_e ty_f (ty_tuple [ty_e; ty_f])
- | c -> bad_conversion fmt j c
- end
+ | 'o' | 'O' -> conversion j ty_e (Predef.type_option ty_e)*)
+ | _ -> conversion (j - 1) ty_e ty_e end
+(* | 'r' ->
+ let ty_e = newvar () in
+ let j = j + 1 in
+ if j >= len then conversion_r (j - 1) ty_e ty_e else begin
+ match fmt.[j] with
+ | 'a' | 'A' -> conversion_r j ty_e (Pref.type_array ty_e)
+ | 'l' | 'L' -> conversion_r j ty_e (Pref.type_list ty_e)
+ | 'o' | 'O' -> conversion_r j ty_e (Pref.type_option ty_e)
+ | _ -> conversion_r (j - 1) ty_e ty_e end *)
| 't' -> conversion j (ty_arrow ty_input ty_aresult)
+ | 'l' | 'n' | 'L' as c ->
+ let j = j + 1 in
+ if j >= len then conversion (j - 1) Predef.type_int else begin
+ match fmt.[j] with
+ | 'd' | 'i' | 'o' | 'u' | 'x' | 'X' ->
+ let ty_arg =
+ match c with
+ | 'l' -> Predef.type_int32
+ | 'n' -> Predef.type_nativeint
+ | _ -> Predef.type_int64 in
+ conversion j ty_arg
+ | c -> conversion (j - 1) Predef.type_int
+ end
| '{' | '(' as c ->
let j = j + 1 in
if j >= len then incomplete_format fmt else
@@ -1657,7 +1555,7 @@ let type_format loc fmt =
newty
(Tconstr
(Predef.path_format6,
- [ ty_args; ty_input; ty_aresult;
+ [ ty_args; ty_input; ty_aresult;
ty_ureader; ty_uresult; ty_result; ],
ref Mnil)) in
@@ -1797,7 +1695,7 @@ let create_package_type loc env (p, l) =
(* Helpers for type_cases *)
let contains_variant_either ty =
- let rec loop ty =
+ let rec loop ty =
let ty = repr ty in
if ty.level >= lowest_level then begin
mark_type_node ty;
@@ -1867,7 +1765,7 @@ let check_absent_variant env =
unify_pat env {pat with pat_type = newty (Tvariant row')}
(correct_levels pat.pat_type)
| _ -> ())
-
+
let dummy_expr = {pexp_desc = Pexp_tuple []; pexp_loc = Location.none}
@@ -2201,15 +2099,15 @@ and type_expect_ ?in_function env sexp ty_expected =
in
let ty_record, opath =
let get_path ty =
- try
- let (p0, p,_) = extract_concrete_record env ty in
- (* XXX level may be wrong *)
+ try
+ let (p0, p,_) = extract_concrete_record env ty in
+ (* XXX level may be wrong *)
Some (p0, p, ty.level = generic_level || not !Clflags.principal)
with Not_found -> None
in
match get_path ty_expected with
None ->
- let op =
+ let op =
match opt_exp with
None -> None
| Some exp -> get_path exp.exp_type
@@ -2223,7 +2121,7 @@ and type_expect_ ?in_function env sexp ty_expected =
(type_label_exp true env loc ty_record)
opath lid_sexp_list in
unify_exp_types loc env ty_record (instance env ty_expected);
-
+
(* type_label_a_list returns a list of labels sorted by lbl_pos *)
(* note: check_duplicates would better be implemented in
type_label_a_list directly *)
@@ -2827,7 +2725,7 @@ and type_label_access env loc srecord lid =
let label = Label.disambiguate lid env opath labels in
(record, label, opath)
-and type_label_exp create env loc ty_expected
+and type_label_exp create env loc ty_expected
(lid, label, sarg) =
(* Here also ty_expected may be at generic_level *)
begin_def ();
@@ -3333,7 +3231,7 @@ and type_cases ?in_function env ty_arg ty_res partial_flag loc caselist =
if has_gadts then begin
end_def ();
(* Ensure that existential types do not escape *)
- unify_exp_types loc env (instance env ty_res) (newvar ());
+ unify_exp_types loc env (instance env ty_res) (newvar ()) ;
end;
cases, partial
@@ -3615,8 +3513,8 @@ let report_error env ppf = function
fprintf ppf "The record field %a is not mutable" longident lid
| Wrong_name (kind, p, lid) ->
fprintf ppf "The %s type %a has no %s %a" kind path p
- (if kind = "record" then "field" else "constructor")
- longident lid;
+ (if kind = "record" then "field" else "constructor")
+ longident lid;
if kind = "record" then Label.spellcheck ppf env p lid
else Constructor.spellcheck ppf env p lid
| Name_type_mismatch (kind, lid, tp, tpl) ->
@@ -3632,11 +3530,11 @@ let report_error env ppf = function
fprintf ppf "but a %s was expected belonging to the %s type"
name kind)
| Incomplete_format s ->
- fprintf ppf "Premature end of format string \'%S\'" s
+ fprintf ppf "Premature end of format string ``%S''" s
| Bad_conversion (fmt, i, c) ->
fprintf ppf
"Bad conversion %%%c, at char number %d \
- in format string \'%S\'" c i fmt
+ in format string ``%s''" c i fmt
| Undefined_method (ty, me) ->
reset_and_mark_loops ty;
fprintf ppf