merge changes of version/4.02 from r15121 to r15155

git-svn-id: http://caml.inria.fr/svn/ocaml/trunk@15168 f963ae5c-01c2-4b8c-9fe0-0dff7051ff02
master
Damien Doligez 2014-08-29 17:14:00 +00:00
parent 499a573b7f
commit a18bc7950b
26 changed files with 227 additions and 124 deletions

View File

@ -189,11 +189,11 @@ typing/env.cmx : utils/warnings.cmx typing/types.cmx utils/tbl.cmx \
typing/cmi_format.cmx utils/clflags.cmx typing/btype.cmx \
parsing/asttypes.cmi typing/env.cmi
typing/envaux.cmo : typing/types.cmi typing/subst.cmi typing/printtyp.cmi \
typing/path.cmi typing/mtype.cmi utils/misc.cmi typing/ident.cmi \
typing/env.cmi parsing/asttypes.cmi typing/envaux.cmi
typing/path.cmi utils/misc.cmi typing/ident.cmi typing/env.cmi \
parsing/asttypes.cmi typing/envaux.cmi
typing/envaux.cmx : typing/types.cmx typing/subst.cmx typing/printtyp.cmx \
typing/path.cmx typing/mtype.cmx utils/misc.cmx typing/ident.cmx \
typing/env.cmx parsing/asttypes.cmi typing/envaux.cmi
typing/path.cmx utils/misc.cmx typing/ident.cmx typing/env.cmx \
parsing/asttypes.cmi typing/envaux.cmi
typing/ident.cmo : typing/ident.cmi
typing/ident.cmx : typing/ident.cmi
typing/includeclass.cmo : typing/types.cmi typing/printtyp.cmi \

139
Changes
View File

@ -18,7 +18,7 @@ Ocaml 4.02.0:
Language features:
- Attributes and extension nodes
(Alain Frisch)
- PR#5095: Generative functors
- Generative functors (PR#5905)
(Jacques Garrigue)
- Module aliases
(Jacques Garrigue)
@ -53,7 +53,7 @@ Type system:
* Module aliases are now typed in a specific way, which remembers their
identity. In particular this changes the signature inferred by
"module type of"
(Jacques Garrigue)
(Jacques Garrigue, feedback from Leo White, Mark Shinwell and Nick Chapman)
- PR#6331: Slight change in the criterion to distinguish private
abbreviations and private row types: create a private abbreviation for
closed objects and fixed polymorphic variants.
@ -82,29 +82,26 @@ Compilers:
- PR#6042: Optimization of integer division and modulus by constant divisors
(Xavier Leroy and Phil Denys)
- Add "-open" command line flag for opening a single module before typing
(Leo White, Mark Shinwell and Nick Chapman)
* "-o" now sets module name to the output file name up to the first "."
(it also applies when "-o" is not given, i.e. the module name is then
the input file name up to the first ".")
(Leo White and Mark Shinwell)
(Leo White, Mark Shinwell and Nick Chapman)
* PR#5779: better sharing of structured constants
(Alain Frisch)
- PR#6182: better message for virtual objects and class types
(Leo P. White, Stephen Dolan)
- PR#5817: new flag to keep locations in cmi files
(Alain Frisch)
- PR#5854: issue warning 3 when referring to a value marked with
the [@@ocaml.deprecated] attribute
(Alain Frisch, suggestion by Pierre-Marie Pédrot)
* PR#6203: Constant exception constructors no longer allocate
(Alain Frisch)
- PR#6311: Improve signature mismatch error messages
(Alain Frisch, suggestion by Daniel Bünzli)
- PR#6345: Better compilation of optional arguments with default values
(Alain Frisch, review by Jacques Garrigue)
- PR#6260: Unnecessary boxing in let
(Vladimir Brankov)
- PR#6017: a new format implementation based on GADTs
(Benoît Vaugon and Gabriel Scherer)
* PR#6203: Constant exception constructors no longer allocate
(Alain Frisch)
- PR#6260: avoid unnecessary boxing in let
(Vladimir Brankov)
- PR#6345: Better compilation of optional arguments with default values
(Alain Frisch, review by Jacques Garrigue)
- PR#6389: ocamlopt -opaque option for incremental native compilation
(Pierre Chambart, Gabriel Scherer)
@ -128,7 +125,7 @@ Runtime system:
- Fixed a major performance problem on large heaps (~1GB) by making heap
increments proportional to heap size by default
(Damien Doligez)
- PR#4765: Structural equality should treat exception specifically
- PR#4765: Structural equality treats exception specifically
(Alain Frisch)
- PR#5009: efficient comparison/indexing of exceptions
(Alain Frisch, request by Markus Mottl)
@ -141,10 +138,8 @@ Runtime system:
(Xavier Leroy)
Standard library:
* Add new modules: Bytes and BytesLabels.
* Add new modules Bytes and BytesLabels for mutable byte sequences.
(Damien Doligez)
- PR#6355: Improve documentation regarding finalisers and multithreading
(Daniel Bünzli, Mark Shinwell)
- PR#4986: add List.sort_uniq and Set.of_list
(Alain Frisch)
- PR#5935: a faster version of "raise" which does not maintain the backtrace
@ -155,7 +150,9 @@ Standard library:
(John Whitington)
- PR#6180: efficient creation of uninitialized float arrays
(Alain Frisch, request by Markus Mottl)
- Trigger warning 3 for all values marked as deprected in the documentation.
- PR#6355: Improve documentation regarding finalisers and multithreading
(Daniel Bünzli, Mark Shinwell)
- Trigger warning 3 for all values marked as deprecated in the documentation.
(Damien Doligez)
OCamldoc:
@ -170,53 +167,30 @@ OCamldoc:
(Maxence Guesdon, report by Anil Madhavapeddy)
Bug fixes:
- PR#6507: crash on AArch64 resulting from incorrect setting of
[caml_bottom_of_stack]. (Richard Jones, Mark Shinwell)
- PR#2719: wrong scheduling of bound checks within a
try...with Invalid_argument -> _ ... (Xavier Leroy)
- PR#4771: Clarify documentation of Dynlink.allow_only
(Damien Doligez, report by David Allsopp)
- PR#6232: Don't use [mktemp] on platforms where [mkstemp] is available
(Stéphane Glondu, Mark Shinwell)
- PR#6439: Don't use the deprecated [getpagesize] function
(John Whitington, Mark Shinwell)
- PR#4719: Sys.executable_name wrong if executable name contains dots (Windows)
(Alain Frisch, report by Bart Jacobs)
- PR#4855: 'camlp4 -I +dir' accepted, dir is relative to 'camlp4 -where'
(Jun Furuse and Hongbo Zhang, report by Dmitry Grebeniuk)
- PR#5201: ocamlbuild: add --norc to the bash invocation to help performances
(user 'daweil')
- PR#5406 ocamlbuild: "tag 'package' does not expect a parameter"
(Gabriel Scherer)
- PR#5598: follow-up fix related to PR#6165
(Damien Doligez)
- PR#5598, PR#6165: Alterations to handling of \013 in source files
breaking other tools
(David Allsopp and Damien Doligez)
- PR#5820: Fix camlp4 lexer roll back problem
(Hongbo Zhang)
- PR#5851: warn when -r is disabled because no _tags file is present
(Gabriel Scherer)
- PR#5946: CAMLprim taking (void) as argument
(Benoît Vaugon)
- PR#6038: on x86-32, enforce 16-byte stack alignment for compatibility
with recent GCC and Clang. Win32/MSVC keeps 4-byte stack alignment.
(Xavier Leroy)
- PR#6062: Fix a regression bug caused by commit 13047
- PR#6062: Fix a 4.01 camlp4 DELETE_RULE regression caused by commit 13047
(Hongbo Zhang, report by Christophe Troestler)
- PR#6109: Typos in ocamlbuild error messages
(Gabriel Kerneis)
- PR#6116: more efficient implementation of Digest.to_hex
(ygrek)
- PR#6142: add cmt file support to ocamlobjinfo
(Anil Madhavapeddy)
- PR#6165: Alterations to handling of \013 in source files breaking other tools
(David Allsopp)
- PR#6173: Typing error message is worse than before
(Jacques Garrigue and John Whitington)
- PR#6174: OCaml compiler loops on an example using GADTs (-rectypes case)
(Jacques Garrigue and Grégoire Henry, report by Chantal Keller)
- PR#6175: add open! support to camlp4
- PR#6175: open! was not suppored by camlp4
(Hongbo Zhang)
- PR#6183: enhanced documentation for 'Unix.shutdown_connection'
(Anil Madhavapeddy, report by Jun Furuse)
- PR#6184: ocamlbuild: `ocamlfind ocamldep` does not support -predicate
(Jacques-Pascal Deplaix)
- PR#6194: Incorrect unused warning with first-class modules in patterns
@ -226,6 +200,8 @@ Bug fixes:
(Xavier Leroy)
- PR#6216: inlining of GADT matches generates invalid assembly
(Xavier Leroy and Alain Frisch, report by Mark Shinwell)
- PR#6232: Don't use [mktemp] on platforms where [mkstemp] is available
(Stéphane Glondu, Mark Shinwell)
- PR#6233: out-of-bounds exceptions lose their locations on ARM, PowerPC
(Jacques-Henri Jourdan and Xavier Leroy,
report and testing by Stéphane Glondu)
@ -242,8 +218,6 @@ Bug fixes:
(Xavier Leroy, report by Pierre-Marie Pédrot)
- PR#6262: equality of first-class modules take module aliases into account
(Alain Frisch and Leo White)
- PR#6267: more information printed by "bt" command of ocamldebug
(Josh Watzman)
- PR#6268: -DMODEL_$(MODEL) not passed when building asmrun/arm.p.o
(Peter Michael Green)
- PR#6273: fix Sys.file_exists on large files (Win32)
@ -280,31 +254,43 @@ Bug fixes:
(Jacques Garrigue, report by Gabriel Scherer and Benoît Vaugon)
- PR#6408: Optional arguments given as ~?arg instead of ?arg in message
(Michael O'Connor)
- PR#6418: reimplement parametrized Format tags/indentation with GADTs
(Benoît Vaugon)
- PR#6411: missing libgcc_s_sjlj-1.dll in mingw (add -static-libgcc)
(Jun Furuse and Alain Frisch, Jonathan Protzenko and Adrien Nader)
- PR#6436: Typos in @deprecated text in stdlib/arrayLabels.mli
(John Whitington)
- PR#6439: Don't use the deprecated [getpagesize] function
(John Whitington, Mark Shinwell)
- PR#6441: undetected tail-call in some mutually-recursive functions
(many arguments, and mutual block mixes functions and non-functions)
(Stefan Holdermans, review by Xavier Leroy)
- PR#6443: ocaml segfault when List.fold_left is traced then executed
(Jacques Garrigue, report by Reventlov)
(Jacques Garrigue, report by user 'Reventlov')
- PR#6451: some bugs in untypeast.ml
(Jun Furuse, review by Alain Frisch)
- PR#6460: runtime assertion failure with large [| e1;...eN |]
float array expressions
(Leo White)
- PR#6463: -dtypedtree fails on class fields
(Leo White)
- PR#6469: invalid -dsource printing of "external _pipe = ...", "Pervasives.(!)"
(Gabriel Scherer and Damien Doligez, user 'ngunn')
- PR#6482: ocamlbuild fails when _tags file in unhygienic directory
(Gabriel Scherer)
- PR#6502: ocamlbuild spurious warning on "use_menhir" tag
(Xavier Leroy)
- PR#6505: Missed Type-error leads to a segfault upon record access
(Jacques Garrigue, report by Christoph Höger)
(Jacques Garrigue, Jeremy Yallop, report by Christoph Höger)
- PR#6507: crash on AArch64 resulting from incorrect setting of
[caml_bottom_of_stack]. (Richard Jones, Mark Shinwell)
- PR#6509: add -linkall flag to ocamlcommon.cma
(Frédéric Bour)
- PR#6513: Fatal error Ctype.Unify(_) in functor type
(Jacques Garrigue, report by Dario Teixeira)
- fix -dsource printing of "external _pipe = ..."
(Gabriel Scherer)
- PR#6523: failure upon character bigarray access, and unnecessary change
in comparison ordering (Jeremy Yallop, Mark Shinwell)
- bound-checking bug in caml_string_{get,set}{16,32,64}
(Pierre Chambart and Gabriel Scherer, report by Nicolas Trangez)
- sometimes wrong stack alignment at out-of-bounds array access
(Gabriel Scherer and Xavier Leroy, report by Pierre Chambart)
- make ocamldebug -I auto-detection work with ocamlbuild
(Josh Watzman)
Features wishes:
- PR#4243: make the Makefiles parallelizable
@ -312,10 +298,18 @@ Features wishes:
- PR#4323: have "of_string" in Num and Big_int work with binary and
hex representations
(Zoe Paraskevopoulou, review by Gabriel Scherer)
- PR#4771: Clarify documentation of Dynlink.allow_only
(Damien Doligez, report by David Allsopp)
- PR#4855: 'camlp4 -I +dir' accepted, dir is relative to 'camlp4 -where'
(Jun Furuse and Hongbo Zhang, report by Dmitry Grebeniuk)
- PR#5201: ocamlbuild: add --norc to the bash invocation to help performances
(user 'daweil')
- PR#5650: Camlp4FoldGenerator doesn't handle well "abstract" types
(Hongbo Zhang)
- PR#5808: allow simple patterns, not just identifiers, in "let p : t = ..."
(Alain Frisch)
- PR#5851: warn when -r is disabled because no _tags file is present
(Gabriel Scherer)
- PR#5899: a programmer-friendly access to backtrace information
(Jacques-Henri Jourdan and Gabriel Scherer)
- PR#6000 comment 9644: add a warning for non-principal coercions to format
@ -328,25 +322,46 @@ Features wishes:
(David Sheets)
- PR#6087: ocamlbuild, improve _tags parsing of escaped newlines
(Gabriel Scherer, request by Daniel Bünzli)
- PR#6109: Typos in ocamlbuild error messages
(Gabriel Kerneis)
- PR#6116: more efficient implementation of Digest.to_hex
(ygrek)
- PR#6142: add cmt file support to ocamlobjinfo
(Anil Madhavapeddy)
- PR#6166: document -ocamldoc option of ocamlbuild
(Xavier Clerc)
- PR#6182: better message for virtual objects and class types
(Leo White, Stephen Dolan)
- PR#6183: enhanced documentation for 'Unix.shutdown_connection'
(Anil Madhavapeddy, report by Jun Furuse)
- PR#6187: ocamlbuild: warn when using -plugin-tag(s) without myocamlbuild.ml
(Jacques-Pascal Deplaix)
- PR#6246: allow wilcard _ as for-loop index
- PR#6246: allow wildcard _ as for-loop index
(Alain Frisch, request by ygrek)
- PR#6267: more information printed by "bt" command of ocamldebug
(Josh Watzman)
- PR#6270: remove need for -I directives to ocamldebug in common case
(Josh Watzman, review by Xavier Clerc and Alain Frisch)
- PR#6311: Improve signature mismatch error messages
(Alain Frisch, suggestion by Daniel Bünzli)
- PR#6358: obey DESTDIR in install targets
(Gabriel Scherer, request by François Berenger)
- PR#6388, PR#6424: more parsetree correctness checks for -ppx users
(Alain Frisch, request by Peter Zotov and Jun Furuse)
- PR#6406: Expose OCaml version in C headers
(Peter Zotov and Romain Calascibetta)
- PR#5899: a programmer-friendly access to backtrace information
(Jacques-Henri Jourdan and Gabriel Scherer)
- PR#6446: improve "unused declaration" warnings wrt. name shadowing
(Alain Frisch)
- PR#6495: ocamlbuild tags 'safe_string', 'unsafe_string'
(Anil Madhavapeddy)
- PR#6497: pass context information to -ppx preprocessors
(Peter Zotov, Alain Frisch)
- ocamllex: user-definable refill action
(Frédéric Bour, review by Gabriel Scherer and Luc Maranget)
- shorten syntax for functor signatures: "functor (M1:S1) (M2:S2) .. -> .."
(Thomas Gazagnaire and Jeremy Yallop, review by Gabriel Scherer)
- make ocamldebug -I auto-detection work with ocamlbuild
(Josh Watzman)
OCaml 4.01.0:
-------------
@ -767,8 +782,6 @@ Feature wishes:
(Anil Madhavapeddy)
- PR#6060: ocamlbuild tags 'principal', 'strict_sequence' and 'short_paths'
(Anil Madhavapeddy)
- PR#6495: ocamlbuild tags 'safe_string', 'unsafe_string'
(Anil Madhavapeddy)
- ocamlbuild tag 'no_alias_deps'
(Daniel Bünzli)

View File

@ -1,4 +1,4 @@
4.03.0+dev2-2014-08-22
4.03.0+dev3-2014-08-29
# The version string is the first line of this file.
# It must be in the format described in stdlib/sys.mli

View File

@ -169,6 +169,7 @@ let read_OCAMLPARAM ppf position =
| "rectypes" -> set "rectypes" [ recursive_types ] v
| "safe-string" -> clear "safe-string" [ unsafe_string ] v
| "strict-sequence" -> set "strict-sequence" [ strict_sequence ] v
| "strict-formats" -> set "strict-formats" [ strict_formats ] v
| "thread" -> set "thread" [ use_threads ] v
| "unsafe" -> set "unsafe" [ fast ] v
| "verbose" -> set "verbose" [ verbose ] v

View File

@ -115,6 +115,7 @@ module Options = Main_args.Make_bytecomp_options (struct
let _safe_string = unset unsafe_string
let _short_paths = unset real_paths
let _strict_sequence = set strict_sequence
let _strict_formats = set strict_formats
let _thread = set use_threads
let _vmthread = set use_vmthreads
let _unsafe = set fast

View File

@ -453,6 +453,15 @@ let mk_opaque f =
\ (reduces necessary recompilation on module change)"
;;
let mk_strict_formats f =
"-strict-formats", Arg.Unit f,
" Reject invalid formats accepted by legacy implementations\n\
\ (Warning: Invalid formats may behave differently from\n\
\ previous OCaml versions, and will become always-rejected\n\
\ in future OCaml versions. You should use this flag\n\
\ to detect and fix invalid formats.)"
;;
let mk__ f =
"-", Arg.String f,
"<file> Treat <file> as a file name (even if it starts with `-')"
@ -474,6 +483,7 @@ module type Common_options = sig
val _safe_string : unit -> unit
val _short_paths : unit -> unit
val _strict_sequence : unit -> unit
val _strict_formats : unit -> unit
val _unsafe : unit -> unit
val _unsafe_string : unit -> unit
val _version : unit -> unit
@ -651,6 +661,7 @@ struct
mk_safe_string F._safe_string;
mk_short_paths F._short_paths;
mk_strict_sequence F._strict_sequence;
mk_strict_formats F._strict_formats;
mk_thread F._thread;
mk_unsafe F._unsafe;
mk_unsafe_string F._unsafe_string;
@ -701,6 +712,7 @@ struct
mk_short_paths F._short_paths;
mk_stdin F._stdin;
mk_strict_sequence F._strict_sequence;
mk_strict_formats F._strict_formats;
mk_unsafe F._unsafe;
mk_unsafe_string F._unsafe_string;
mk_version F._version;
@ -767,6 +779,7 @@ struct
mk_shared F._shared;
mk_short_paths F._short_paths;
mk_strict_sequence F._strict_sequence;
mk_strict_formats F._strict_formats;
mk_thread F._thread;
mk_unsafe F._unsafe;
mk_unsafe_string F._unsafe_string;
@ -830,6 +843,7 @@ module Make_opttop_options (F : Opttop_options) = struct
mk_short_paths F._short_paths;
mk_stdin F._stdin;
mk_strict_sequence F._strict_sequence;
mk_strict_formats F._strict_formats;
mk_unsafe F._unsafe;
mk_unsafe_string F._unsafe_string;
mk_version F._version;

View File

@ -26,6 +26,7 @@ module type Common_options = sig
val _safe_string : unit -> unit
val _short_paths : unit -> unit
val _strict_sequence : unit -> unit
val _strict_formats : unit -> unit
val _unsafe : unit -> unit
val _unsafe_string : unit -> unit
val _version : unit -> unit

View File

@ -114,6 +114,7 @@ module Options = Main_args.Make_optcomp_options (struct
let _safe_string = clear unsafe_string
let _short_paths = clear real_paths
let _strict_sequence = set strict_sequence
let _strict_formats = set strict_formats
let _shared () = shared := true; dlcode := true
let _S = set keep_asm_file
let _thread = set use_threads

View File

@ -49,19 +49,30 @@ let event ?pretend x = Display.event !-internal_display ?pretend x
let display x = Display.display !-internal_display x
let do_at_end = Queue.create ()
let already_asked = Hashtbl.create 10
let at_end_always thunk = Queue.add thunk do_at_end
let at_end thunk = at_end_always (function
let at_end_always ~name thunk =
if not (Hashtbl.mem already_asked name) then begin
Hashtbl.add already_asked name ();
Queue.add thunk do_at_end;
end
let at_end ~name thunk = at_end_always ~name (function
| `Quiet -> ()
| `Success | `Error -> thunk `Error)
let at_failure thunk = at_end_always (function
let at_failure ~name thunk = at_end_always ~name (function
| `Success | `Quiet -> ()
| `Error -> thunk `Error)
let finish ?how () =
Queue.iter (fun thunk ->
thunk (match how with None -> `Quiet | Some how -> how)
) do_at_end;
while not (Queue.is_empty do_at_end) do
let actions = Queue.copy do_at_end in
Queue.clear do_at_end;
(* calling a thunk may add new actions again, hence the loop *)
Queue.iter (fun thunk ->
thunk (match how with None -> `Quiet | Some how -> how)
) actions;
done;
match !internal_display with
| None -> ()
| Some d -> Display.finish ?how d

View File

@ -34,6 +34,11 @@ val update : unit -> unit
val mode : string -> bool
(** Wrap logging event so that only fire at the end of the compilation
process, possibly depending on the termination status. *)
val at_end : ([> `Error | `Quiet ] -> unit) -> unit
val at_failure : ([> `Error ] -> unit) -> unit
process, possibly depending on the termination status.
The name is used to avoid printing the same hint/warning twice,
even if [at_end] is called several times. Use different names for
distinct events.
*)
val at_end : name:string -> ([> `Error | `Quiet ] -> unit) -> unit
val at_failure : name:string -> ([> `Error ] -> unit) -> unit

View File

@ -116,25 +116,30 @@ let prepare_compile build ml =
match mandatory, res with
| _, Good _ -> ()
| `mandatory, Bad exn ->
if not !Options.ignore_auto then raise exn
else dprintf 3
if not !Options.ignore_auto then raise exn;
dprintf 3
"Warning: Failed to build the module %s requested by ocamldep."
name;
Log.at_failure (fun `Error ->
eprintf "Hint:@ Recursive@ traversal@ of@ subdirectories@ \
was@ not@ enabled@ for@ this@ build,@ as@ the@ working@ \
directory does@ not@ look@ like@ an@ ocamlbuild@ project@ \
(no@ '_tags'@ or@ 'myocamlbuild.ml'@ file).@ \
If@ you@ have@ modules@ in@ subdirectories,@ you@ should@ add@ \
the@ option@ \"-r\"@ or@ create@ an@ empty@ '_tags'@ file.@\n\
@\n\
To@ enable@ recursive@ traversal@ for@ some@ subdirectories@ \
only,@ you@ can@ use@ the@ following@ '_tags'@ file:@\n\
@[<v 4>@,\
true: -traverse@,\
<dir1> or <dir2>: traverse@,\
@]"
);
if not (!Options.recursive || Options.ocamlbuild_project_heuristic ())
then Log.at_failure ~name:"a module failed to build,
while recursive traversal was disabled by fragile heuristic;
hint that having a _tags or myocamlbuild.ml would maybe solve
the build error"
(fun `Error ->
eprintf "Hint:@ Recursive@ traversal@ of@ subdirectories@ \
was@ not@ enabled@ for@ this@ build,@ as@ the@ working@ \
directory does@ not@ look@ like@ an@ ocamlbuild@ project@ \
(no@ '_tags'@ or@ 'myocamlbuild.ml'@ file).@ \
If@ you@ have@ modules@ in@ subdirectories,@ you@ should@ add@ \
the@ option@ \"-r\"@ or@ create@ an@ empty@ '_tags'@ file.@\n\
@\n\
To@ enable@ recursive@ traversal@ for@ some@ subdirectories@ \
only,@ you@ can@ use@ the@ following@ '_tags'@ file:@\n\
@[<v 4>@,\
true: -traverse@,\
<dir1> or <dir2>: traverse@,\
@]"
);
| `just_try, Bad _ -> ()
end modules results

View File

@ -598,18 +598,22 @@ let () =
(fun param -> S [A "-for-pack"; A param]);
pflag ["ocaml"; "native"; "compile"] "inline"
(fun param -> S [A "-inline"; A param]);
pflag ["ocaml"; "compile"] "pp"
(fun param -> S [A "-pp"; A param]);
pflag ["ocaml"; "ocamldep"] "pp"
(fun param -> S [A "-pp"; A param]);
pflag ["ocaml"; "doc"] "pp"
(fun param -> S [A "-pp"; A param]);
pflag ["ocaml"; "infer_interface"] "pp"
(fun param -> S [A "-pp"; A param]);
List.iter (fun pp ->
pflag ["ocaml"; "compile"] pp
(fun param -> S [A ("-" ^ pp); A param]);
pflag ["ocaml"; "ocamldep"] pp
(fun param -> S [A ("-" ^ pp); A param]);
pflag ["ocaml"; "doc"] pp
(fun param -> S [A ("-" ^ pp); A param]);
pflag ["ocaml"; "infer_interface"] pp
(fun param -> S [A ("-" ^ pp); A param])
) ["pp"; "ppx"];
pflag ["ocaml";"compile";] "warn"
(fun param -> S [A "-w"; A param]);
pflag ["ocaml";"compile";] "warn_error"
(fun param -> S [A "-warn-error"; A param]);
pflag ["ocaml"; "compile"] "open"
(fun param -> S [A "-open"; A param]);
()
let camlp4_flags camlp4s =
@ -683,6 +687,14 @@ flag ["ocaml"; "link"; "program"; "custom"; "byte"] (A "-custom");;
flag ["ocaml"; "link"; "library"; "custom"; "byte"] (A "-custom");;
flag ["ocaml"; "compile"; "profile"; "native"] (A "-p");;
flag ["ocaml"; "compile"; "no_alias_deps";] (A "-no-alias-deps");;
flag ["ocaml"; "compile"; "strict_formats";] (A "-strict-formats");;
flag ["ocaml"; "native"; "compile"; "opaque";] (A "-opaque");;
flag ["ocaml"; "native"; "compile"; "no_float_const_prop";] (A "-no-float-const-prop");
flag ["ocaml"; "compile"; "keep_locs";] (A "-keep-locs");
flag ["ocaml"; "absname"; "compile"] (A "-absname");;
flag ["ocaml"; "absname"; "infer_interface"] (A "-absname");;
flag ["ocaml"; "byte"; "compile"; "compat_32";] (A "-compat-32");
(* threads, with or without findlib *)
flag ["ocaml"; "compile"; "thread"] (A "-thread");;

View File

@ -162,7 +162,7 @@ let () = test "OutputObj"
let () = test "StrictSequenceFlag"
~options:[`no_ocamlfind; `quiet]
~description:"-strict_sequence tag"
~description:"strict_sequence tag"
~tree:[T.f "hello.ml" ~content:"let () = 1; ()";
T.f "_tags" ~content:"true: strict_sequence\n"]
~failing_msg:"File \"hello.ml\", line 1, characters 9-10:
@ -170,6 +170,17 @@ Error: This expression has type int but an expression was expected of type
unit\nCommand exited with code 2."
~targets:("hello.byte",[]) ();;
let () = test "StrictFormatsFlag"
~options:[`no_ocamlfind; `quiet]
~description:"strict_format tag"
~tree:[T.f "hello.ml" ~content:"let _ = Printf.printf \"%.10s\"";
T.f "_tags" ~content:"true: strict_formats\n"]
~failing_msg:"File \"hello.ml\", line 1, characters 22-29:
Error: invalid format \"%.10s\": at character number 0, \
`precision' is incompatible with 's' in sub-format \"%.10s\"
Command exited with code 2."
~targets:("hello.byte",[]) ();;
let () = test "PrincipalFlag"
~options:[`no_ocamlfind; `quiet]
~description:"-principal tag"
@ -282,5 +293,14 @@ debug, rectypes
~matching:[M.f "main.byte"]
~targets:("main.byte",[]) ();;
let () = test "OpenTag"
~description:"Test the parametrized tag for the new -open feature"
~options:[`no_ocamlfind]
~tree:[
T.f "test.ml" ~content:"let _ = map rev [ []; [3;2] ]";
T.f "_tags" ~content: "<test.*>: open(List)";
]
~matching:[M.f "test.byte"]
~targets:("test.byte",[]) ();;
run ~root:"_test_internal";;

View File

@ -293,7 +293,7 @@ value caml_ba_get_N(value vb, value * vind, int nind)
{ double * p = ((double *) b->data) + offset * 2;
return copy_two_doubles(p[0], p[1]); }
case CAML_BA_CHAR:
return Val_int(((char *) b->data)[offset]);
return Val_int(((unsigned char *) b->data)[offset]);
}
}
@ -750,7 +750,7 @@ static int caml_ba_compare(value v1, value v2)
case CAML_BA_FLOAT64:
DO_FLOAT_COMPARISON(double);
case CAML_BA_CHAR:
DO_INTEGER_COMPARISON(char);
DO_INTEGER_COMPARISON(uint8);
case CAML_BA_SINT8:
DO_INTEGER_COMPARISON(int8);
case CAML_BA_UINT8:
@ -1169,7 +1169,7 @@ CAMLprim value caml_ba_fill(value vb, value vinit)
case CAML_BA_SINT8:
case CAML_BA_UINT8: {
int init = Int_val(vinit);
char * p;
unsigned char * p;
for (p = b->data; num_elts > 0; p++, num_elts--) *p = init;
break;
}

View File

@ -1,19 +1,5 @@
open CamlinternalFormatBasics
let legacy_behavior = true
(** When this flag is enabled, the format parser tries to behave as
the <4.02 implementations, in particular it ignores most benine
nonsensical format. When the flag is disabled, it will reject any
format that is not accepted by the specification.
A typical example would be "%+ d": specifying both '+' (if the
number is positive, pad with a '+' to get the same width as
negative numbres) and ' ' (if the number is positive, pad with
a space) does not make sense, but the legacy (< 4.02)
implementation was happy to just ignore the space.
*)
(******************************************************************************)
(* Tools to manipulate scanning set of chars (see %[...]) *)
@ -1769,7 +1755,7 @@ fun pad prec fmt ->
(* Parse a string representing a format and create a fmt_ebb. *)
(* Raise an Failure exception in case of invalid format. *)
let fmt_ebb_of_string str =
let fmt_ebb_of_string ?legacy_behavior str =
(* Parameters naming convention: *)
(* - lit_start: start of the literal sequence. *)
(* - str_ind: current index in the string. *)
@ -1786,6 +1772,22 @@ let fmt_ebb_of_string str =
(* - symb: char representing the conversion ('c', 's', 'd', ...). *)
(* - char_set: set of characters as bitmap (see scanf %[...]). *)
let legacy_behavior = match legacy_behavior with
| Some flag -> flag
| None -> true
(** When this flag is enabled, the format parser tries to behave as
the <4.02 implementations, in particular it ignores most benine
nonsensical format. When the flag is disabled, it will reject any
format that is not accepted by the specification.
A typical example would be "%+ d": specifying both '+' (if the
number is positive, pad with a '+' to get the same width as
negative numbres) and ' ' (if the number is positive, pad with
a space) does not make sense, but the legacy (< 4.02)
implementation was happy to just ignore the space.
*)
in
(* Raise a Failure with a friendly error message. *)
(* Used when the end of the format (or the current sub-format) was encoutered
unexpectedly. *)

View File

@ -55,7 +55,11 @@ val type_format :
('a, 'b, 'c, 'd, 'e, 'f) CamlinternalFormatBasics.fmtty ->
('a, 'b, 'c, 'd, 'e, 'f) CamlinternalFormatBasics.fmt
val fmt_ebb_of_string : string -> ('b, 'c, 'e, 'f) fmt_ebb
val fmt_ebb_of_string : ?legacy_behavior:bool -> string -> ('b, 'c, 'e, 'f) fmt_ebb
(* warning: the optional flag legacy_behavior is EXPERIMENTAL and will
be removed in the next version. You must not set it explicitly. It
is only used by the type-checker implementation.
*)
val format_of_string_fmtty :
string ->

View File

@ -81,3 +81,8 @@ let extension_id x =
let slot = extension_slot x in
(obj (field slot 1) : int)
with Not_found -> invalid_arg "Obj.extension_id"
let extension_slot x =
try
extension_slot x
with Not_found -> invalid_arg "Obj.extension_slot"

View File

@ -55,6 +55,7 @@ val unaligned_tag : int (* should never happen @since 3.11.0 *)
val extension_name : 'a -> string
val extension_id : 'a -> int
val extension_slot : 'a -> t
(** The following two functions are deprecated. Use module {!Marshal}
instead. *)

View File

@ -83,6 +83,7 @@ module Options = Main_args.Make_bytecomp_options (struct
let _safe_string = option "-safe-string"
let _short_paths = option "-short-paths"
let _strict_sequence = option "-strict-sequence"
let _strict_formats = option "-strict-formats"
let _thread () = option "-thread" ()
let _vmthread () = option "-vmthread" ()
let _unsafe = option "-unsafe"

View File

@ -86,6 +86,7 @@ module Options = Main_args.Make_optcomp_options (struct
let _safe_string = option "-safe-string"
let _short_paths = option "-short-paths"
let _strict_sequence = option "-strict-sequence"
let _strict_formats = option "-strict-formats"
let _shared = option "-shared"
let _thread = option "-thread"
let _unsafe = option "-unsafe"

View File

@ -81,6 +81,7 @@ module Options = Main_args.Make_opttop_options (struct
let _real_paths = set real_paths
let _rectypes = set recursive_types
let _strict_sequence = set strict_sequence
let _strict_formats = set strict_formats
let _S = set keep_asm_file
let _short_paths = clear real_paths
let _stdin () = file_argument ""

View File

@ -82,6 +82,7 @@ module Options = Main_args.Make_bytetop_options (struct
let _short_paths = clear real_paths
let _stdin () = file_argument ""
let _strict_sequence = set strict_sequence
let _strict_formats = set strict_formats
let _unsafe = set fast
let _unsafe_string = set unsafe_string
let _version () = print_version ()

View File

@ -28,7 +28,7 @@ let reset_cache () =
Env.reset_cache()
let extract_sig env mty =
match Mtype.scrape env mty with
match Env.scrape_alias env mty with
Mty_signature sg -> sg
| _ -> fatal_error "Envaux.extract_sig"

View File

@ -2975,7 +2975,8 @@ and type_format loc str env =
| End_of_format ->
mk_constr "End_of_format" []
in
let Fmt_EBB fmt = fmt_ebb_of_string str in
let legacy_behavior = not !Clflags.strict_formats in
let Fmt_EBB fmt = fmt_ebb_of_string ~legacy_behavior str in
mk_constr "Format" [ mk_fmt fmt; mk_string str ]
))
with Failure msg ->

View File

@ -50,6 +50,7 @@ and principal = ref false (* -principal *)
and real_paths = ref true (* -short-paths *)
and recursive_types = ref false (* -rectypes *)
and strict_sequence = ref false (* -strict-sequence *)
and strict_formats = ref false (* -strict-formats *)
and applicative_functors = ref true (* -no-app-funct *)
and make_runtime = ref false (* -make-runtime *)
and gprofile = ref false (* -p *)

View File

@ -47,6 +47,7 @@ val principal : bool ref
val real_paths : bool ref
val recursive_types : bool ref
val strict_sequence : bool ref
val strict_formats : bool ref
val applicative_functors : bool ref
val make_runtime : bool ref
val gprofile : bool ref