Release of OCaml 5.2.0
We have the pleasure of celebrating Inge Lehmann's birthday by announcing the release of OCaml version 5.2.0.
Some of the highlights in OCaml 5.2.0 are:
- Reintroduced GC compaction
- Restored native backend for POWER 64 bits
- Thread sanitiser support
- New Dynarray module
- New
-H
flag for hidden include directories - Project-wide occurence metadata support for developer tools
- Raw identifiers
- Local open in type expressions
And a lot of incremental changes:
- Around 20 new functions in the standard library
- Many fixes and improvements in the runtime
- Many bug fixes
OCaml 5.2.0 is still a somewhat experimental release compared to the OCaml 4.14 branch. In particular:
- The Windows MSVC port is still unavailable.
- Ephemeron performances need to be investigated.
statmemprof
is being tested in the developer branch.- There are a number of known runtime concurrency or GC performance bugs (that trigger under rare circumstances).
Since the Windows MSVC port and statmemprof
are still missing, the maintenance
support for OCaml 4.14 will be extended until at least the end of the year.
Please report any unexpected behaviours on the OCaml issue tracker and post any questions or comments you might have on our discussion forums.
The full list of changes can be found in the changelog below.
Installation Instructions
The base compiler can be installed as an opam switch with the following commands:
opam update
opam switch create 5.2.0
The source code for the release candidate is also directly available on:
Fine-Tuned Compiler Configuration
If you want to tweak the configuration of the compiler, you can switch to the option variant with:
opam update
opam switch create <switch_name> ocaml-variants.5.2.0+options <option_list>
where <option_list>
is a space separated list of ocaml-option-*
packages. For instance, for a flambda
and no-flat-float-array
switch:
opam switch create 5.2.0+flambda+nffa ocaml-variants.5.0.0+options ocaml-option-flambda ocaml-option-no-flat-float-array
See full changelog
(Changes that can break existing programs are marked with a "*")
Restored and New Backends:
-
#12276, #12601: Native-code compilation for POWER (64 bits, little-endian) (Xavier Leroy, review by KC Sivaramakrishnan, Anil Madhavapeddy, and Stephen Dolan)
-
#12667: Extend the latter to POWER 64 bits, big-endian, ELFv2 ABI (A. Wilcox, review by Xavier Leroy)
Runtime System:
-
#12193: Reintroduce GC compaction for shared pools. Adds a parallel compactor for the shared pools (which contain major heap blocks sized less than 128 words). Explicit only for now, on calls to
Gc.compact
. (Sadiq Jaffer, Nick Barnes, review by Anil Madhavapeddy, Damien Doligez, David Allsopp, Miod Vallat, Artem Pianykh, Stephen Dolan, Mark Shinwell, and KC Sivaramakrishnan) -
#12114: Add ThreadSanitizer support (Fabrice Buoro and Olivier Nicole, based on an initial work by Anmol Sahoo, review by Damien Doligez, Sébastien Hinderer, Jacques-Henri Jourdan, Luc Maranget, Guillaume Munch-Maccagnoni, Gabriel Scherer)
-
#12850: Update
Gc.quick_stat
data at the end of major cycles and compaction. This PR adds an additionalcaml_collect_gc_stats_sample_stw
to the major heap cycling STW. This means thatGc.quick_stat
now actually reflects the state of the heap after a major cycle or compaction. (Sadiq Jaffer, review by Miod Vallat and Gabriel Scherer) -
#12859: Ensure
Gc.compact
does a full major before the compactor runs (Sadiq Jaffer, review by Leo White, Mark Shinwell, Gabriel Scherer, Josh Berdine, David Allsopp, and KC Sivaramakrishnan) -
#10111: Increase the detail of location information for debugging events to allow the end-line number and character offset to be reported. (David Allsopp, review by Nick Barnes, Enguerrand Decorne and Stephen Dolan)
-
#10403, #12202: Introduce
caml_ext_table_add_noexc
that does not raiseOut_of_memory
exceptions, and use it inside the blocking sections ofcaml_read_directory
. Also, check for overflows in EXT table sizes. (Xavier Leroy, report by Arseniy Alekseyev, review by Gabriel Scherer) -
#11332, #12702: Make sure
Bool_val(v)
has typebool
in C++ (Xavier Leroy, report by ygrek, review by Gabriel Scherer) -
#12772, #12787: Avoid using
_Bool
in public headers for the sake of C++ compatibility (Guillaume Munch-Maccagnoni, report by KC Sivaramakrishnan, review by Xavier Leroy and KC Sivaramakrishnan) -
#12223: Constify constructors and flags tables in C code. Now these tables will go in the read-only segment where they belong. (Antonin Décimo, review by Gabriel Scherer and Xavier Leroy)
-
#12234: Make instrumented time calculation more thread-safe on macOS. (Anil Madhavapeddy, review by Daniel Bünzli and Xavier Leroy)
-
#12235, #12468: Introduce and use the
CAMLnoret
macro as a lighter alternative toCAMLnoreturn_start
/CAMLnoreturn_end
. Implement it so as to conform with C11, C23, C++11, C++17. (Xavier Leroy and Dhruv Maroo, with help from Antonin Décimo, review by Gabriel Scherer and David Allsopp) -
#12275:
caml/stack.h
: More abstract macros to describe OCaml stacks and how to traverse them, supporting more stack layouts. (Xavier Leroy, review by KC Sivaramakrishnan and Fabrice Buoro) -
#12268: Deliver
Out_of_memory
exception if domain creation fails due to memory resource exhaustion. Previously, it was always aFailure
. (Anil Madhavapeddy, review by David Allsopp) -
#12300, #12314: Discard
out_channel
buffered data on permanent I/O error (Xavier Leroy, report by Török Edwin, review by Anil Madhavapeddy and Nicolás Ojeda Bär) -
#11386: Simplifications and fixes to Multicore systhreads implementation. (Guillaume Munch-Maccagnoni, review by Anil Madhavapeddy and KC Sivaramakrishnan)
-
#12875, #12879, #12882: Execute preemptive systhread switching as a delayed pending action. This ensures that one can reason within the FFI that no mutation happens on the same domain when allocating on the OCaml heap from C, consistently with OCaml 4. This also fixes further bugs with the Multicore systhreads implementation. (Guillaume Munch-Maccagnoni, bug reports and suggestion by Mark Shinwell, review by Nick Barnes and Stephen Dolan)
-
#12408:
Domain.spawn
no longer leaks its functional argument for the whole duration of the children's domain lifetime. (Guillaume Munch-Maccagnoni, review by Gabriel Scherer) -
#12409: Fix unsafety and deadlocks should an asynchronous exception arise at specific locations during domain creation and shutdown. (Guillaume Munch-Maccagnoni, review by Gabriel Scherer)
-
#11911, #12381: Restore
statmemprof
functionality in part, with some API changes inGc.Memprof
. (Nick Barnes, review by Jacques-Henri Jourdan and Guillaume Munch-Maccagnoni). -
#12430: Simplify dynamic bytecode loading in
Meta.reify_bytecode
(Stephen Dolan, review by Sébastien Hinderer, Vincent Laviron and Xavier Leroy) -
#12489: Fix an error-handling bug in
caml_alloc_sprintf
(Stephen Dolan, report by Chris Casinghino, review by Jeremy Yallop and Xavier Leroy) -
#11307: Finish adapting the implementation of asynchronous actions for Multicore: soundness, liveness, and performance issues. Do not crash if a signal handler is called from an unregistered C thread and other possible soundness issues. Prevent issues where joins on other domains could make the toplevel unresponsive to Ctrl-C. Avoid needless repeated polling in C code when callbacks cannot run immediately. (Guillaume Munch-Maccagnoni, review by Enguerrand Decorne, Xavier Leroy, and KC Sivaramakrishnan)
-
#12634: Simplify TSan backtrace bookkeeping upon raise (Olivier Nicole and Fabrice Buoro, review by Gabriel Scherer)
- (Breaking Change) #12686: Some primitives had the wrong types to be callable from the bytecode
interpreter. Either fix their types, mark them as
CAMLexport
instead ofCAMLprim
, or remove them entirely if no longer used. (Xavier Leroy, review by David Allsopp)
-
#12700, continuing #11763 and trying to address #12660: Use the correct types for primitives when generating the table of primitives used by
ocamlrun
. (Xavier Leroy, motivation, review and improvements by Antonin Décimo) -
#12345, #12710: Fix issues with finaliser orphaning at domain termination (KC Sivaramakrishnan, report by Gabriel Scherer, review by Gabriel Scherer, Sadiq Jaffer and Fabrice Buoro)
-
#12599: Refactor Dynlink startup to avoid parsing bytecode sections twice (Stephen Dolan, review by David Allsopp, Hugo Heuzard, Damien Doligez and Xavier Leroy)
-
#12678, #12898: Free channel buffers on close rather than on finalisation (Damien Doligez, review by Jan Midtgaard and Gabriel Scherer, report by Jan Midtgaard)
-
#12681: Fix TSan false positives due to volatile write handling (Olivier Nicole, Fabrice Buoro, and Anmol Sahoo, review by Luc Maranget, Gabriel Scherer, Hernan Ponce de Leon, and Xavier Leroy)
-
#12743: Use
pthread_sigmask
instead ofsigprocmask
. Updates usage ofsigprocmask
topthread_sigmask
inotherlibs/unix
. (Max Slater, review by Miod Vallat and Xavier Leroy) -
#12769: Unify MSVC and MinGW-w64 code paths, by always using WinAPI directly. (David Allsopp, Antonin Décimo, and Samuel Hym, review by Nicolas Ojeda Bar)
-
#11911, #12382, #12383: Restore
statmemprof
functionality in part (backtrace buffers, per-thread and per-domain data structures, GC/allocation interface). (Nick Barnes, review by Gabriel Scherer, Fabrice Buoro, Sadiq Jaffer, Guillaume Munch-Maccagnoni, and Jacques-Henri Jourdan). -
#12735: Store both ends of the stack chain in continuations (Leo White, review by Miod Vallat and KC Sivaramakrishnan)
-
#12746: Simplify and clean up TSan annotations (Olivier Nicole, review by Miod Vallat and Fabrice Buoro)
-
#12809: Add ThreadSanitizer support to FreeBSD/AMD64 (Miod Vallat, review by Gabriel Scherer)
-
#12810: Port ThreadSanitizer support to Linux and macOS on arm64 (Miod Vallat, review by Tim McGilchrist)
-
#12811: Define and use the CAMLthread_local macro for TLS variables. (Antonin Décimo and Samuel Hym, review by Miod Vallat and Xavier Leroy)
-
#12814: More detailed failure messages from
input_value
andMarshal.from_*
(Xavier Leroy, review by Stephen Dolan and Anil Madhavapeddy) -
#12815: Correctly format multiline locations in exception backtraces in the compiler driver's style. (David Allsopp, review by Gabriel Scherer)
-
#12773, #12830, #12834: Rewrite
caml_c_thread_(un)register
to fix various bugs. (Guillaume Munch-Maccagnoni, reported by Miod Vallat, suggested by Hari Hara Naveen S, reviewed by Fabrice Buoro, Gabriel Scherer, and Miod Vallat) -
#12876: Port ThreadSanitizer support to Linux on POWER (Miod Vallat, review by Tim McGilchrist)
-
#12886: Reinitialise I/O mutexes after fork (Max Slater, review by Guillaume Munch-Maccagnoni and Xavier Leroy)
-
#12907: Port ThreadSanitizer support to Linux on RiscV (Miod Vallat, review by Nicolás Ojeda Bär and Fabrice Buoro)
-
#12915: Port ThreadSanitizer support to Linux on s390x (Miod Vallat, review by Tim McGilchrist)
-
#12934: Fix data races between marking and sweeping functions (Olivier Nicole, suggested by Stephen Dolan, review by Gabriel Scherer, Miod Vallat, and Damien Doligez)
Language Features:
-
#12295, #12568: Give
while true
a polymorphic type, similarly toassert false
(Jeremy Yallop, review by Nicolás Ojeda Bär and Gabriel Scherer, suggestion by Rodolphe Lepigre and John Whitington) -
#12044: Add local module open syntax for types.
module A = struct type t = int type r = unit type s = string end type example = A.(t * r * s)
(Alistair O'Brien, review by Gabriel Scherer, Nicolás Ojeda Bär, and Florian Angeletti)
-
#11252, RFC 27: Support raw identifier syntax
\#foo
(Stephen Dolan, review by David Allsopp, Gabriel Scherer, and Olivier Nicole) -
#12315: Use type annotations from arguments in
let rec
(Stephen Dolan, review by Gabriel Scherer) -
#12375: Allow use of [@untagged] for all immediate types like
char
,bool
, andvariant
with only constant constructors. (Christophe Raffalli, review by Gabriel Scherer)
- (Breaking Change) #12502: The compiler now normalises the newline sequence
\r\n
to a single\n
character during lexing to guarantee that the semantics of newlines in string literals are not modified by Windows tools transforming\n
into\r\n
in source files. Warning 29 [eol-in-string] is not emitted anymore, as the normalisation gives more robust semantics to newlines in string literals. (Gabriel Scherer and Damien Doligez, review by Daniel Bünzli, David Allsopp, Andreas Rossberg, Xavier Leroy, report by Andreas Rossberg)
Standard Library:
-
#11563: Add the Dynarray module to the
stdlib
. Dynamic arrays are arrays whose length can be changed by adding or removing elements at the end, similar to 'vectors' in C++ or Rust. (Gabriel Scherer, Simon Cruanes, and Florian Angeletti, review by Daniel Bünzli, Guillaume Munch-Maccagnoni, Clément Allain, Damien Doligez, Wiktor Kuchta, and Pieter Goetschalckx) -
#12716: Add
Format.pp_print_nothing
function. (Léo Andrès, review by Gabriel Scherer and Nicolás Ojeda Bär)
-
(Breaking Change) #6732, #12423: Make
Buffer.add_substitute
surjective and fix its documentation. (Damien Doligez, review by Antonin Décimo) -
(Breaking Change) #10775, #12499: Half-precision, floating-point elements in Bigarray. (Anton Yabchinskiy, review by Xavier Leroy and Nicolás Ojeda Bär)
-
#11517, #12477: Expose
pp_infinity
in interface of the format module and check that margin is less thanpp_infinity
when setting or checking geometry. (Janith Petangoda, reported by Simmo Saan, reviewed by Florian Angeletti, Simmo Saan, Josh Berdine, and Gabriel Scherer) -
#12217: Add
Array.shuffle
. (Daniel Bünzli, review by Nicolás Ojeda Bär, David Allsopp, and Alain Frisch) -
#12212: Add cache-aligned constructor for atomics. The patch ensures that all allocations (of the right size) in the shared heap are aligned. (Bartosz Modelski with Gabriel Scherer, Guillaume Munch-Maccagnoni, Xavier Leroy, review by Alain Frisch, Anil Madhavapeddy, Gabriel Scherer, Guillaume Munch-Maccagnoni, KC Sivaramakrishnan, Stefan Muenzel, Xavier Leroy)
-
#12307: Add BLAKE2b hashing and an MD5 submodule to the Digest module. (Xavier Leroy, review by Olivier Nicole, Gabriel Scherer, Wiktor Kuchta, Daniel Bünzli, David Allsopp)
-
#12365: Add
In_channel.input_bigarray
,In_channel.really_input_bigarray
,Out_channel.output_bigarray
,Unix.read_bigarray
,Unix.write_bigarray
,Unix.single_write_bigarray
. (Nicolás Ojeda Bär, review by Jeremy Yallop, Xavier Leroy, Gabriel Scherer, David Allsopp) -
#12455: Add
Array.init_matrix
,Float.Array.make_matrix
,Float.Array.init_matrix
. (Glen Mével, review by Xavier Leroy, Gabriel Scherer, Jeremy Yallop, Nicolas Ojeda Bar)
- (Breaking Change) #12455:
Array.make_matrix dimx dimy f
now raisesInvalid_argument
whendimx = 0 && dimy < 0
. This was already specified but not enforced. (Glen Mével, report by Jeremy Yallop, review by Nicolas Ojeda Bar)
-
#12459: Add
Random.int_in_range
,Random.int32_in_range
,Random.int64_in_range
,Random.nativeint_in_range
, and their counterpart inRandom.State
. (Glen Mével and Xavier Leroy, review by Gabriel Scherer, Xavier Leroy, Florian Angeletti) -
#12459:
Random
: Restore compatibility between 32-bit integers (JavaScript) and 63-bit integers (64-bit OCaml). ForRandom.full_int
this was guaranteed in 4.14 but wrongly removed in 5.0. (Xavier Leroy, review by Glen Mével) -
#12511: Minor performance improvements and cleanups in the implementation of modules Int32, Int64, and Nativeint (Xavier Leroy, review by Gabriel Scherer and Daniel Bünzli)
-
#12558: Adapt GC alarms for Multicore and fix their documentation. (Guillaume Munch-Maccagnoni, review by KC Sivaramakrishnan and Gabriel Scherer)
-
#12625: Remove the Closure module from Obj (Vincent Laviron, review by Xavier Leroy)
-
#12758, #12998: Remove the
Marshal.Compression
flag to theMarshal.to_*
functions. The compilers are still able to use ZSTD compression for compilation artefacts. This is a forward port and clean-up of the emergency fix that was introduced in OCaml 5.1.1 by #12734. (Xavier Leroy, review by Damien Doligez) -
#12784: Fix computation of minor-heap allocation in
Gc.counters()
andGc.allocated_bytes()
. (Nick Barnes, review by Gabriel Scherer) -
#12770: Add
Fun.compose
. (Justin Frank, review by Nicolás Ojeda Bär, Daniel Bünzli, and Jeremy Yallop) -
#12845: Add
{In,Out}_channel.is_binary_mode
as the dual ofset_binary_mode
. This function was previously only available in the internal C API. (David Allsopp, review by Nicolás Ojeda Bär and Xavier Leroy)
Type System:
- #12313, #11799: Do not rebuild as-pattern types when a ground type annotation is given. This allows to work around problems with GADTs in as-patterns. (Jacques Garrigue, report by Leo White, review by Gabriel Scherer)
Code Generation and Optimisations:
-
#11239: On x86-64 and RISC-V, reduce alignment of OCaml stacks from 16 to 8. This reduces stack usage. It's only C stacks that require 16-alignment. (Xavier Leroy, review by Gabriel Scherer and Stephen Dolan)
-
#12311: On POWER, 32-bit FP numbers stored in memory (e.g., in Bigarrays) were not correctly rounded sometimes. (Xavier Leroy, review by Anil Madhavapeddy and Tim McGilchrist)
-
#12551, #12608, #12782, #12596: Overhaul of recursive value compilation. Non-function recursive bindings are now forbidden from Lambda onwards, and they're compiled using a new
Value_rec_compiler
module. (Vincent Laviron and Lunia Ayanides, review by Gabriel Scherer, Stefan Muenzel and Nathanaëlle Courant) -
#1809, #12181: Rewrite
compare x y op 0
tox op y
when values are integers (Xavier Clerc, Stefan Muenzel, review by Gabriel Scherer and Vincent Laviron) -
#12825: Disable common subexpression elimination for atomic loads... again. (Gabriel Scherer, review by KC Sivaramakrishnan, Xavier Leroy and Vincent Laviron, report by Vesa Karvonen)
Other Libraries:
- #12213:
Dynlink
library, improve legibility of error messages (Samuel Hym, review by Gabriel Scherer and Nicolás Ojeda Bär)
- (Breaking Change) #12686:
Runtime_events
library, C API: definecaml_runtime_events_{start,pause,resume}
as returningvoid
instead ofvalue
. (Xavier Leroy, review by David Allsopp)
Compiler User-Interface and Warnings:
- #11989, #12246, RFC 31: New flag,
-H
, to allow for transitive dependencies without including them in the initial environment. (Chris Casinghino, François Bobot, and Gabriel Scherer, review by Leo White and Stefan Muenzel, RFC by François Bobot)
- (Breaking Change) #10613, #12405: Simplify the values used for the system variable (
system:
inocamlopt -config
or theConfig.system
constant). In particular, s390x and ppc64 now report "linux" instead of "elf"; all variants of 32-bit ARM on Linux now report "linux"; OpenBSD now reports "openbsd" instead of "bsd" for 32-bit ARM; FreeBSD, NetBSD, and OpenBSD now report the same value for both x86_64 and x86_32; x86_32 systems matching BSD but not FreeBSD, NetBSD*, or OpenBSD* are no longer identified (as on x86_64); x86_32 Linux now reports "linux" instead of "linux_elf". (David Allsopp, request by Kate Deplaix, review by Sébastien Hinderer and Xavier Leroy)
-
#12247: Configure:
--disable-ocamldebug
can now be used instead of--disable-debugger
(which remains available for compatibility) (Gabriel Scherer, review by Damien Doligez and Sébastien Hinderer) -
#12199: Improve the error message for non-overriding
inherit!
(Florian Angeletti, review by Jules Aguillon) -
#12210: Uniform style for inline code in compiler messages (Florian Angeletti, review by Gabriel Scherer)
- (Breaking Change) #12278, #:12325: Remove the
OCAML_FLEXLINK
environment variable from the compiler drivers. This environment variable was previously used as part of the FlexDLL bootstrap procedure and existed solely for that purpose. Its removal greatly simplifies both the build system and testsuite machinery. (David Allsopp, review by Sébastien Hinderer)
-
#12347: Error messages: always report missing polyvariant tags (Florian Angeletti, report by Tianbo Hao, review by Gabriel Scherer)
-
#12224: Specialised error message when trying to apply non-functor module (e.g.,
module M = Int(Int)
) (Florian Angeletti, review by Gabriel Scherer) -
#12451: Warning 53 (misplaced attributes) now works for all attributes. (Chris Casinghino, review by Florian Angeletti)
-
#12622: Give hints about existential types appearing in error messages (Leo White, review by Gabriel Scherer and Florian Angeletti)
-
#12671: When a class type parameter or class parameter does not match, identify which parameter in the error message, instead of saying "A type parameter" or "A parameter." (Stefan Muenzel, review by Gabriel Scherer)
-
#12679: Add more detail to the error message and manual in case of invalid module type substitutions. (Stefan Muenzel, review by Gabriel Scherer and Florian Angeletti)
-
#12750: Display the command executed to extract primitives in
ocamlc -verbose
(David Allsopp, review by Nicolás Ojeda Bär) -
#12777: Add details about the actual and expected method types to the method mismatch error messages (Javier Chávarri, review by Gabriel Scherer and Florian Angeletti)
- (Breaking Change) #12942: Fix line ordering in some module inclusion error messages (Nick Roberts, review by Florian Angeletti, report by Carl Eastlund)
Manual and Documentation:
-
#12338: Clarification of the documentation of process related function in the Unix module regarding the first element of arguments and shell's PID (Christophe Raffalli, review by Florian Angeletti)
-
#12473: Document in
runtime/memory.c
our current understanding of accesses to the OCaml heap from the C runtime code -- the problem of hybrid programs mixing two memory models (Gabriel Scherer and Guillaume Munch-Maccagnoni, review by Olivier Nicole and Xavier Leroy) -
#12456: Document the incompatibility between effects, on one hand, and
caml_callback
and asynchronous callbacks (signal handlers, finalisers, memprof callbacks...), on the other (Guillaume Munch-Maccagnoni, review by KC Sivaramakrishnan) -
#12694: Document in
runtime/tsan.c
the TSan instrumentation choices and the consequences with regard to the memory model (Olivier Nicole, review by Miod Vallat, Gabriel Scherer, Guillaume Munch-Maccagnoni and Fabrice Buoro) -
#12802: Add manual chapter about ThreadSanitizer support (Olivier Nicole, review by Miod Vallat, Sebastien Hinderer, Fabrice Buoro, Gabriel Scherer and KC Sivaramakrishnan)
-
#12819: Clarify which runtime interactions are allowed in custom ops (Basile Clément, review by Guillaume Munch-Maccagnoni and Xavier Leroy)
-
#12840: Manual: update runtime tracing chapter for custom events (e.g., #12335) (Lucas Pluvinage, Sadiq Jaffer and Olivier Nicole, review by Gabriel Scherer, David Allsopp, Tim McGilchrist, and Thomas Leonard)
-
#13066: Update
OCAMLRUNPARAM
documentation for the stack size parameterl
(Florian Angeletti, review by Nicolás Ojeda Bär, Tim McGilchrist, and Miod Vallat) -
#13078: Update Format tutorial on structural boxes to mention alignment questions (Edwin Török, review by Florian Angeletti)
-
#13092: Document the existence of the
[@@poll error]
built-in attribute (Florian Angeletti, review by Gabriel Scherer)
Tools:
-
#12340:
testsuite
: collect known issues with current-short-paths
implementation for existential types (Florian Angeletti, Samuel Hym, review by Florian Angeletti and Thomas Refis) -
#12147:
ocamllex
: allow carriage returns at the end-of-line directives (SeungCheol Jung, review by Nicolás Ojeda Bär) -
#12260: Fix
invalid_argument
on some external or module aliases inocamlnat
(Fabian Hemmer, review by Vincent Laviron) -
#12185: New script language for
ocamltest
(Damien Doligez with Florian Angeletti, Sébastien Hinderer, Gabriel Scherer, review by Sébastien Hinderer and Gabriel Scherer) -
#12371:
ocamltest
: fix recursive expansion of variables (Antonin Décimo, Damien Doligez, review by Sébastien Hinderer, Damien Doligez, Gabriel Scherer, and Xavier Leroy)
- (Breaking Change) #12497, #12613: Make
ocamlc/ocamlopt
fail with an error when no input files are specified to build an executable (Antonin Décimo, review by Sébastien Hinderer)
-
#12576:
ocamldep
: various refactors (Antonin Décimo, review by Florian Angeletti, Gabriel Scherer, and Léo Andrès) -
#12615:
ocamldoc
: get rid of theodoc_literate
andodoc_todo
generators (Sébaistien Hinderer, review by Gabriel Scherer and Florian Angeletti) -
#12624: Use
$XDG_CONFIG_DIRS
in addition to$XDG_CONFIG_HOME
when searching forinit.ml
, and use this to extendinit.ml
support to the toplevel when running on Windows. (David Allsopp, report by Jonah Beckford, review by Nicolás Ojeda Bär and Antonin Décimo) -
#12688: Setting the
env
variableNO_COLOR
with an empty value no longer has effects. Previously, settingNO_COLOR
with any value, including the empty value, would disable colours (unlessOCAML_COLOR
is also set). After this change, the user must setNO_COLOR
with an non-empty value to disable colours. This reflects a specification clarification/change from the upstream website at https://no-color.org. (Favonia, review by Gabriel Scherer) -
#12744:
ocamltest
: run tests in recursive subdirs more eagerly (Nick Roberts, review by Nicolás Ojeda Bär) -
#12901, 12908:
ocamllex
: add overflow checks to prevent generating incorrect lexers; use unsigned numbers in the table encoding when possible (Vincent Laviron, report by Edwin Török, review by Xavier Leroy)
Internal/compiler-libs
Changes:
-
#12508 : Add compiler-side support for project-wide occurrences in Merlin by generating index tables of all identifier occurrences. This extra data in
.cmt
files is only added when the new flag-bin-annot-occurrences
is passed. (Ulysse Gérard, Nathanaëlle Courant, suggestions by Gabriel Scherer and Thomas Refis, review by Florian Angeletti, Gabriel Scherer, and Thomas Refis) -
#12236, #12386, #12391, #12496, #12673: Use syntax as sole determiner of arity. This changes function arity to be based solely on the source program's parsetree. Previously, the heuristic for arity had more subtle heuristics that involved type information about patterns. Function arity is important because it determines when a pattern match's effects run and is an input into the fast path for function application.
This change affects tooling; it changes the function constructs in parsetree and typedtree.
See https://github.com/ocaml/RFCs/pull/32 for the original RFC.
(Nick Roberts; review by Richard Eisenberg, Leo White, and Gabriel Scherer; RFC by Stephen Dolan)
-
#12639: Parsing: attach a location to the RHS of
Ptyp_alias
and improve the 'alias type mismatch' error message. (Jules Aguillon, review by Florian Angeletti) -
#12447: Remove 32-bit targets from
X86_proc.system
(Masanori Ogino, review by David Allsopp) -
#12216, #12248: Prevent reordering of atomic loads during instruction scheduling. This is for reference, as instruction scheduling is currently unused in OCaml 5. (Xavier Leroy, report by Luc Maranget and KC Sivaramakrishnan, review by Nicolás Ojeda Bär)
-
#12025: Split
Typecore.unify_pat_types
into two in order to avoid unnecessary references to the environment intype_pat
(Jacques Garrigue and Takafumi Saikawa, review by Gabriel Scherer) -
#12031: Use dedicated types to represent names of compilation units and predefined exceptions in CMO files. (Sébastien Hinderer, review by Florian Angeletti, Thomas Refis, Gabriel Scherer, Vincent Laviron, Pierre Chambart, Luke Maurer, Hugo Heuzard, Xavier Leroy, and Damien Doligez)
-
#12109: Pack parameters to unification in
unification_environment
(Takafumi Saikawa and Jacques Garrigue, review by Richard Eisenberg) -
#12331, #12361: Pack the unification data for pattern checking in Typecore (Takafumi Saikawa and Jacques Garrigue, review by Gabriel Scherer, Thomas Refis, and Florian Angeletti)
-
#12229: Remove global mutable state for typechecking patterns in Typecore in favor of local mutable state. (Nick Roberts, review by Takafumi Saikawa)
-
#12542: Minor bugfix to #12236: restore dropped call to
instance
(Nick Roberts, review by Jacques Garrigue) -
#12242: Move the computation of stack frame parameters to a separate
Stackframe
module, and save the parameters in the results of theLinearize
pass. (Xavier Leroy, review by KC Sivaramakrishnan and Mark Shinwell) -
#12442: Document jump summaries in the pattern-matching compiler (Gabriel Scherer and Thomas Refis, review by Florian Angeletti and Vincent Laviron)
-
#12446, #12792: Remove the hooks machinery around channel locking in
runtime/io.c
(Gabriel Scherer, review by Xavier Leroy) -
#12389, #12544, #12984, #12987: Centralise the handling of metadata for compilation units and artifacts in preparation to improve Unicode support for OCaml source files. (Florian Angeletti, review by Vincent Laviron and Gabriel Scherer)
-
#12532, #12553: Improve readability of the pattern-matching debug output (Gabriel Scherer, review by Thomas Refis)
-
#12537: Use C11/C++11 standard static assertion (Antonin Décimo, review by Sebastien Hinderer, Xavier Leroy, and KC Sivaramakrishnan)
-
#12169: Runtime: document and enforce naming conventions around STW sections (Gabriel Scherer, review by Enguerrand Decorne, Miod Vallat, B. Szilvasy and Nick Barnes, report by KC Sivaramakrishnan)
-
#12669 : Clean up some global state handling in schedgen (Stefan Muenzel, review by Miod Vallat and Gabriel Scherer)
-
#12640: Make the module separator used in symbol names configurable (Miod Vallat, review by Hugo Heuzard and Xavier Leroy)
-
#12691 : Clean up
Ctype.expand_abbrev_gen
and renameEnv.add_local_type
toadd_local_constraint
(Takafumi Saikawa and Jacques Garrigue, review by Florian Angeletti) -
#12786 : Clean up the algorithm of
Ctype.limited_generalize
(Takafumi Saikawa and Jacques Garrigue, review by Gabriel Scherer) -
#10691:
Ast_mapper
,Ast_iterator
: add functions directive_argument,toplevel_directive
, andtoplevel_phrase
(Guillaume Petiot, review by Gabriel Scherer and Kate Deplaix) -
#12764: Move all installable headers in
caml/
subdirectories. (Antonin Décimo, review by Gabriel Scherer and David Allsopp) -
#12914: Slightly change the s390x assembly dialect in order to build with Clang's integrated assembler (Miod Vallat, review by Gabriel Scherer)
-
#13001: Do not
read_back
entire shapes to get aliases' UIDs when building the usages index (Ulysse Gérard, review by Gabriel Scherer and Nathanaëlle Courant)
Build System:
-
#12198, #12321, #12586, #12616, #12706, #13048: Continue the merge of the sub-Makefiles into the root Makefile started with #11243, #11248, #11268, #11420 and #11675. (Sébastien Hinderer, review by David Allsopp and Florian Angeletti)
-
#12569, #12570: Remove
otherlibraries
as a prerequisite forruntop
; useruntop-with-otherlibs
to use a library fromotherlibs/
(Gabriel Scherer, review by Sébastien Hinderer, suggestion by David Allsopp) -
#12652: Make magic numbers easier to bump and duplicate (Sébastien Hinderer, review by Antonin Décimo, David Allsopp and Florian Angeletti)
- (Breaking Change) #12751:
--with-target-bindir
configure option implemented. This option refers to the location of the runtime binaries on the target system for a cross-compiler and is embedded in executables produced byocamlc
. It does not affect the bytecode executables installed as part of the build. The old mechanismmake TARGET_BINDIR=..
no longer works. (David Allsopp, review by Damien Doligez, Xavier Leroy, and Olivier Nicole)
- #12768, #13030: Detect MinGW-w64 coupling with GCC or LLVM, detect
clang-cl
, and fix C compiler feature detection on macOS. (Antonin Décimo, review by Miod Vallat and Sébastien Hinderer)
Bug Fixes:
-
#10652, #12720: Fix evaluation order in presence of optional arguments (Jacques Garrigue, report by Leo White, review by Vincent Laviron)
-
#12595, #12597: Fix a race in
caml_clear_gc_stats_sample
(Gabriel Scherer, review by B. Szilvasy, report by B. Szilvasy) -
#12580: Fix location of alias pattern variables (Chris Casinghino, review Gabriel Scherer, report by Milo Davis)
-
#12583: Add a closing event for when
EV_MAJOR_EPHE_MARK
is complete (Sudha Parimala, review by Gabriel Scherer) -
#12566:
caml_output_value_to_malloc
wrongly usescaml_stat_alloc
instead ofmalloc
since 4.06, breaking (in pooled mode) user code that usesfree
on the result. Symmetrically,caml_input_value_from_malloc
should usefree
. (Gabriel Scherer, review by Xavier Leroy and Enguerrand Decorne, report by Ido Yariv) -
#12490: Unix: protect the
popen_processes
hashtable with a mutex (Gabriel Scherer, report by Olivier Nicole, review by Xavier Leroy) -
#11931: Fix tricky typing bug with type substitutions (Stephen Dolan, review by Leo White and Jacques Garrigue)
-
#12037, #12171: Fix
get_extern_state
potential NULL dereference (Alexander Skvortsov, report by Török Edwin, design by Gabriel Scherer, Xavier Leroy) -
#12635: Fix
get_intern_state
potential NULL dereference (Antonin Décimo, review by KC Sivaramakrishnan) -
#12032, #12059: Bug fixes related to compilation of recursive definitions (Vincent Laviron, report by Victoire Noizet, review by Gabriel Scherer)
- (Breaking Change) #12145: Loopy constraints cause
ocamlc
to loop. Fixed by completely removing the call toupdate_type
inTypedecl.transl_type_decl
, as the expansion is already checked bycheck_regularity
. As a result, recursion is more polymorphic, which may cause some (essentially wrong) type declarations to have unbound type variables and some constraints unrelated to the concrete type to be ignored (see tests/typing-misc/constraints.ml). (Jacques Garrigue, report by Richard Eisenberg, review by Leo White)
-
#12207, #12222: Make closure computation linear in the number of recursive functions instead of quadratic (Vincent Laviron, report by François Pottier, review by Nathanaëlle Courant and Gabriel Scherer)
-
#11040, #12591: Fix a data race in
major_gc.c
(Gabriel Scherer, review by Guillaume Munch-Maccagnoni and KC Sivaramakrishnan, report by Sadiq Jaffer) -
#12238, #12403, #12698: Read input files in one go to avoid source reprinting issues (Gabriel Scherer, report by Mike Spivey and Vincent Laviron, review by Nicolás Ojeda Bär, Xavier Leroy and Jeremy Yallop)
-
#12334, #12368: Bad error message with mutually recursive abbreviations (Jacques Garrigue, report by Richard Eisenberg, review by Gabriel Scherer and Richard Eisenberg)
-
#12401:
seek_in
andseek_out
sometimes returned normally when given negative offsets, instead of failing. Now both functions should consistently raiseSys_error
in this case. (Nicolás Ojeda Bär, review by Gabriel Scherer) -
#12267: Fix stack alignment computation (Miod Vallat, report by Jan Midtgaard, review by Gabriel Scherer)
-
#12395, #12404: Fix thread-unsafety in the fallback implementation of
Unix.create_process
(the one used whenposix_spawnp
is unavailable) (Xavier Leroy, report by Chris Vine, review by Nicolás Ojeda Bär) -
#12949: Open shadowing mistriggers (Gabriel Scherer, review by Florian Angeletti, report by Andreas Rossberg)
-
#12526: Honor
ocaml.inline always
attribute on functions with optional arguments and default values in the Closure backend (Alain Frisch, review by Vincent Laviron) -
#12677, #12889: Make
Domain.DLS
thread-safe (Gabriel Scherer, review by Olivier Nicole and Damien Doligez, report by Vesa Karvonen) -
#12561: Fix crash when combining TSan and frame-pointers (Fabrice Buoro and Olivier Nicole, report by Jan Midtgaard, review by Miod Vallat and Gabriel Scherer)
-
#12482: Rework bounds checking code in the POWER backend (Miod Vallat and Xavier Leroy, report by Jan Midtgaard, review by KC Sivaramakrishnan)
-
#12528, #12703: Avoid pointer arithmetic overflow in
Tag_val
macro (very likely harmless, but can trigger alarms) (Xavier Leroy, report by Sam Goldman, review by Guillaume Munch-Maccagnoni) -
#12593: TSan should handle
Effect.Unhandled
correctly (Fabrice Buoro and Olivier Nicole, report by Jan Midtgaard and Miod Vallat, review by Gabriel Scherer) -
#12684: Fix locations filename in AST produced by the
-pp
option (Gabriel Scherer, review by Florian Angeletti) -
#12714: Check whether macros are defined before using them to ensure that the headers can always be used in code which turns on
-Wundef
(or equivalent). (Antonin Décimo, review by Miod Vallat, Gabriel Scherer, Xavier Leroy, and David Allsopp) -
#12726: Fix segmentation fault under Windows when executing a bytecode file if the runtime (
ocamlrun.exe
) cannot be found. (Vadim Zborovskii, Nicolás Ojeda Bär, report by Vadim Zborovskii, review by David Allsopp) -
#12727, #12730: Fix bug with value
let-rec
and labelled applications (Vincent Laviron, review by Gabriel Scherer)
- (Breaking Change) #12751: Always keep within the 128 character limit for shebang lines. Previous fix in #8622 handled building the compiler with a long prefix. This patch extends this to the bytecode executables emitted by that compiler. (David Allsopp, review by Damien Doligez, Xavier Leroy, and Olivier Nicole)
-
#12755: Fix data race on global pools arrays of
pool_freelist
(Fabrice Buoro and Olivier Nicole, review by Gabriel Scherer) -
#12796, #12801: Fix memory corruption in
caml_unix_alloc_sockaddr
(Thomas Leonard, review by Nicolás Ojeda Bär) -
#12737: Fix data races in
minor_gc.c
andcaml_natdynlink_open
(Olivier Nicole, review by Stefan Muenzel, Miod Vallat, Guillaume Munch-Maccagnoni, Gabriel Scherer, and Xavier Leroy) -
#12831: Fix call to
caml_call_realloc_stack
for s390x in PIC mode (Vincent Laviron, report by Jerry James, review by Miod Vallat)
- (Breaking Change) #12837: Show non-generalisable type parameters in type definitions
Changes type of type parameters in
outcometree.mli
. (Jacques Garrigue, review by Richard Eisenberg)
-
#12897: Fix locking bugs in
Runtime_events
(Gabriel Scherer and Thomas Leonard, review by Olivier Nicole, Vincent Laviron, and Damien Doligez, report by Thomas Leonard) -
#12851: Fix race between runtime events teardown and event emission (Olivier Nicole, review by Miod Vallat and Gabriel Scherer)
-
#12860: Fix an assertion that wasn't taking into account the possibility of an ephemeron pointing at static data (Mark Shinwell, review by Gabriel Scherer and KC Sivaramakrishnan)
-
#12861: Fix a possible crash in the
threads
library (Mark Shinwell, review by Gabriel Scherer and KC Sivaramakrishnan) -
#11040, #12894: Silence false data race observed between
caml_shared_try_alloc
and oldify. Introduces macros to call TSan annotations which help annotate a "happens before" relationship. (Hari Hara Naveen S and Olivier Nicole, review by Gabriel Scherer and Miod Vallat) -
#12958: Fix
tail-modulo-cons
compilation oftry-with
,&&
, and||
expressions. (Gabriel Scherer and Nicolás Ojeda Bär, report by Sylvain Boilard, review by Gabriel Scherer) -
#12919: Fix register corruption in
caml_callback2_asm
on s390x. (Miod Vallat, review by Gabriel Scherer) -
#12924, #12930: Rework package constraint checking to improve interaction with immediacy (Chris Casinghino and Florian Angeletti, review by Florian Angeletti and Richard Eisenberg)
-
#12969: Fix a data race in
caml_darken_cont
(Fabrice Buoro and Olivier Nicole, review by Gabriel Scherer and Miod Vallat) -
#12971, #12974: Fix an uncaught
Ctype.Escape
exception on some invalid programs forming recursive types. (Gabriel Scherer, review by Florian Angeletti, report by Neven Villani) -
#13019: Remove linking instructions for the Unix library from
threads.cma
. (This was done forthreads.cmxa
in OCaml 3.11.) Eliminates warnings from new LLD when usingthreads.cma
of duplicated libraries. (David Allsopp, review by Nicolás Ojeda Bär) -
#13058: Add TSan instrumentation to
caml_call_gc()
, since it may raise exceptions. (Fabrice Buoro, Olivier Nicole, Gabriel Scherer, and Miod Vallat) -
#13079: Save and restore frame pointer across Iextcall on ARM64 (Tim McGilchrist, review by KC Sivaramakrishnan and Miod Vallat)
-
#13094: Fix undefined behavior of left-shifting a negative number (Antonin Décimo, review by Miod Vallat and Nicolás Ojeda Bär)
-
#13130: Minor fixes to Pprintast for raw identifiers and local module open syntax for types (Chet Murthy, review by Gabriel Scherer)