OCaml 5.5.0 released

Florian Angeletti <[email protected]> Fri, 19 Jun 2026 23:36:26 +0200 (CEST)
Newsgroups gmane.comp.lang.caml.announce,gmane.comp.lang.caml.inria
Message-ID <[email protected]>
--=_d8422e55-5759-4e6e-b61f-b99e9da155d1
Content-Type: text/plain; charset=utf-8
Content-Transfer-Encoding: quoted-printable

Dear OCaml users,=20

We have the pleasure of celebrating the birthday of Blaise Pascal by announ=
cing the release of OCaml version 5.5.0.=20

Some of the highlights in OCaml 5.5.0 are:=20

### Module-dependent Functions=20

Modules can now be used as function arguments in a form of lightweight func=
tors.=20

For instance, we can define a function for printing a map generated by=20
the `Map.Make` functor:=20

let pp_map (module M: Map.S) pp_key pp_v ppf set =3D=20
if M.is_empty set then=20
Format.fprintf ppf "=C3=B8"=20
else=20
let pp_sep ppf () =3D Format.fprintf ppf ",@ " in=20
let pp_binding ppf (k,v) =3D=20
Format.fprintf ppf "@[%a@ =3D@ %a@]" pp_key k pp_v v=20
in=20
Format.fprintf ppf "@[{@ %a@ }@]"=20
(Format.pp_print_seq ~pp_sep pp_binding) (M.to_seq set)=20


We can then apply this function on a string map=20

module String_map =3D Map.Make(String)=20

with=20

let () =3D=20
let m =3D String_map.of_list ["Zero", "Zero"; "One", "Un"] in=20
let pp_str =3D Format.pp_print_string in=20
Format.printf "%a@."=20
(pp_map (module String_map) pp_str pp_str) m=20

Compared to first-class modules, the type of the function `pp_map`=20

type 'a printer =3D Format.formatter -> 'a -> unit=20
val pp_map: (module M: Map.S) -> M.key printer -> 'a printer -> 'a M.t prin=
ter=20

is dependent over the value of the module `S`, and thus the function can on=
ly=20
applied over a statically known module:=20

let f (): (module Map.S) =3D=20
if Random.bool () then=20
(module Map.Make(Int))=20
else=20
(module Map.Make(Float))=20
let fail =3D pp_map (f ())=20

Error: This expression has type=20
(module M : Map.S) ->=20
(Format.formatter -> M.key -> unit) ->=20
(Format.formatter -> 'a -> unit) -> Format.formatter -> 'a M.t -> unit=20
but an expression was expected of type (module Map.S) -> 'b=20
The module M would escape its scope=20
This function is module-dependent. The dependency is preserved=20
when the function is passed a static module argument (module M : S)=20
or (module M). Its argument here is not static, so the type-checker=20
tried instead to change the function type to be non-dependent.=20


### Relocatable Compiler=20

A compiler installation can now be moved or copied with no risk=20
of hard-to-debug errors due to mixing incompatible bytecode runtime interpr=
eters.=20

In practice, this means that creating a local switch when there is a=20
global switch with the same compiler version and configuration=20
available can be done by cloning the global switch rather than=20
recompiling the whole compiler.=20

This should considerably reduce the time required to create=20
new local opam switches out-of-the-box.=20

### Polymorphic Functions as Function Arguments=20

Higher-rank polymorphic functions can now be defined directly by=20
using an explicit type annotation in a function argument=20

let apply_map (map: 'a 'b. ('a -> 'b) -> 'a list -> 'b list) =3D=20
map string_of_int [1;2;3], map List.singleton ["x"; "y"]=20
let _ =3D apply_map List.map=20

Previously defining such a function required going through either a record =
or an object=20
with a polymorphic field or methods=20

type map =3D { map: 'a 'b. ('a -> 'b) -> 'a list -> 'b list }=20
let apply_map {map} =3D=20
map string_of_int [1;2;3], map List.singleton ["x"; "y"]=20

### Search and Replace Substring Functions=20

The `String` module has been extended with many functions=20
for searching and replacing substrings inside a string.=20

let _true =3D String.includes ~affix:"aba" "abbaba"=20
let sentence =3D String.replace_all ~sub:"=F0=9D=84=BD" ~by:"word" "A =F0=
=9D=84=BD is re=F0=9D=84=BDed"=20

The substring search is using the 2-way string matching algorithm=20
which has the advantage of requiring constant space memory overhead=20
independently of the needle size.=20

### Generalised Local Definitions=20

It is now always possible to define locally a type,=20
a class, a module type or any kind of item that can be defined=20
globally:=20

let mandelbrot n x =3D=20
let type t =3D Converge | Escape of int in=20
...=20
match orbit n x with=20
| Converge -> 0=20
| Exit_at n -> colorize n=20

### External Types=20

When interfacing with foreign function libraries, it is now possible=20
to define external type=20

type int_gmp =3D external "mpz_t"=20
type float_gmp =3D external "mpf_t"=20

Compared to an abstract type definition, the external type name=20
"mpz_t" (resp. `mpf_t`) makes the type distinguishable from any=20
non-abstract types or external types with a different name.=20

In particular, this makes FFI types better behaved when combined with=20
Generalised Abstract Data Types (GADTs). For instance, The typechecker=20
is able to prove that=20

let ok: (int_gmp,[` A] ) Type.eq -> _ =3D function _ -> .=20

is a total function because the external type `int_gmp` is not compatible=
=20
with a polymorphic variant type.=20

### Warning: Abstract types in the current module=20

The astute reader has probably noticed in the definition above that,=20
in OCaml 5.4.0, the typechecker does accept=20

type int_gmp=20
let ok: (int_gmp, [` A] ) Type.eq -> _ =3D function _ -> .=20

as total.=20

Indeed until OCaml 5.5.0, abstract types defined in the current module=20

type a=20
type b=20

were considered as unique and provably different=20

let f: 'x. (a,b) Type.eq -> 'x =3D function _ -> .=20

However, this special rule for local definition of abstract types was=20
very brittle. As soon as one moved outside of the current module, it=20
was no longer possible to prove that the types were different.=20

module M =3D struct=20
type a=20
type b=20
end=20
let fail: 'x. (M.a,M.b) Type.eq -> 'x =3D function _ -> .=20

Error: This match case could not be refuted.=20
Here is an example of a value that would reach it: Equal=20

This special typechecking rule has been removed in OCaml 5.5.0. If you were=
 relying on it,=20
for instance, because you used an abstract type as type-level label in a GA=
DTs, you=20
can change your abstract type definition to a possibly private abbreviation=
 of a polymorphic variant=20

type a =3D private [`A]=20
type b =3D [`B]=20

or a (possibly private) sum type=20

type a =3D A=20
type b =3D private B=20

If you were using an abstract type as both a type-level label and a FFI typ=
e, you=20
can now use an external type definition which will give you a provably dist=
inct type=20
even outside of the current module.=20

### GC improvements=20

Some of the ongoing work to improve the pacing of the garbage=20
collector has been integrated in OCaml 5.5.0, two of the important=20
changes in OCaml 5.5 GC are=20

- the addition of a sweep-only phase at the start of major GC=20
- the addition of an idle phase to smooth the behaviour of the GC=20
at the start.=20

### Many incremental changes=20

- The Windows implementation is no more reliant on Winpthreads=20
- Around 60 new standard library functions=20
- Around 90 various improvements=20
- A dozen of documentation updates=20
- Around 40 bug fixes=20

Please report any unexpected behaviours on the [OCaml issue=20
tracker](https://github.com/ocaml/ocaml/issues) and post any questions or=
=20
comments you might have on our discussion forums at=20

- [ https://discuss.ocaml.org/ | https://discuss.ocaml.org ]=20

The full list of changes can be found in the full changelog.=20

Happy hacking,=20
Florian Angeletti for the OCaml team.=20


Installation Instructions=20
-------------------------------=20

The base compiler can be installed as an opam switch with the following com=
mands:=20

opam update=20
opam switch create 5.5.0=20

The source code for the release is also directly available on:=20

- GitHub: https://github.com/ocaml/ocaml/releases/download/5.5.0/ocaml-5.5.=
0.tar.gz=20
- OCaml archives at Inria: https://caml.inria.fr/pub/distrib/ocaml-5.5/ocam=
l-5.5.0.tar.gz=20

### Fine-Tuned Compiler Configuration=20

If you want to tweak the configuration of the compiler, you can switch to t=
he option variant with:=20

opam update=20
opam switch create <switch_name> ocaml-variants.5.5.0+options <option_list>=
=20

where `<option_list>` is a space separated list of `ocaml-option-*` package=
s. For instance, for a `flambda` and `no-flat-float-array` switch:=20

opam switch create 5.5.0+flambda+nffa ocaml-variants.5.5.0+options ocaml-op=
tion-flambda ocaml-option-no-flat-float-array=20


Changes in OCaml 5.5.0=20
---------------------------------=20

### Language features:=20

* (*breaking change*) [#13681](https://github.com/ocaml/ocaml/issues/13681)=
, [#13682](https://github.com/ocaml/ocaml/issues/13682), [#13683](https://g=
ithub.com/ocaml/ocaml/issues/13683), [#13684](https://github.com/ocaml/ocam=
l/issues/13684), [#13275](https://github.com/ocaml/ocaml/issues/13275) :=20
Introduce a new type `(module M : S) -> t[M]` that corresponds to=20
module-dependent functions (also called: modular explicits).=20
val mapM: (module M : Monad) (f : 'a -> 'b M.t) : 'a list -> 'b list M.t=20
(Samuel Vivien review by Leo White, Gabriel Scherer, Florian Angeletti,=20
Jacques Garrigue and Stephen Dolan)=20

- [#14040](https://github.com/ocaml/ocaml/issues/14040): generalize the con=
structs `let module`, `let exception` and `let open`=20
to most other structure items, for example:=20
let type t =3D ... in ...=20
let type Effect.t +=3D Yield in ...=20
(Nicol=C3=A1s Ojeda B=C3=A4r, review by Valentin Gatien-Baron)=20

- [#13806](https://github.com/ocaml/ocaml/issues/13806): Enable the use of =
function parameters with polymorphic types.=20
let extract (getter : 'a . 'a t -> 'a) =3D ...=20
let runST (m : 's . ('s, 'a) ST.t) : 'a =3D ...=20
(Ulysse G=C3=A9rard, Leo White, review by Florian Angeletti, Samuel Vivien,=
 Gabriel=20
Scherer and Jacques Garrigue)=20


* (*breaking change*) [#13712](https://github.com/ocaml/ocaml/issues/13712)=
: Introduce a new kind `Type_external` and syntax=20
`type t =3D external "name"` to discriminate external types from other type=
s=20
and each other. This PR turns primitive types into external and removes the=
=20
past behavior of discriminating abstract types defined in the current modul=
e.=20
(Takafumi Saikawa, Jacques Garrigue, review by Richard Eisenberg)=20

* (*breaking change*) [#14009](https://github.com/ocaml/ocaml/issues/14009)=
: infix extension points/attributes appearing in local structure items,=20
eg `let module%foo[@bar] ... in ...` are attached to the AST node of the=20
corresponding structure item (similar to their global counterparts) and no=
=20
longer to the enclosing `let` expression. Extension points/attributes that=
=20
are to be attached to the enclosing `let` expression are to be written next=
 to=20
the `let` keyword, eg `let%foo[@bar] module ... in ...`. The same holds for=
=20
`let exception` and `let open`.=20
(Nicol=C3=A1s Ojeda B=C3=A4r, review by Gabriel Scherer)=20

- [#14029](https://github.com/ocaml/ocaml/issues/14029): Recognize `%identi=
ty` as nonexpansive=20
(Stephen Dolan and Olivier Nicole, review by Hugo Heuzard, Jacques Garrigue=
,=20
Jeremy Yallop, and Gabriel Scherer)=20

### Standard library:=20

- [#13372](https://github.com/ocaml/ocaml/issues/13372): New Format and Pri=
ntf printf-like functions that accept a=20
heterogeneous list as arguments.=20
Format.lprintf "@[%s@ %d@]@." [ "x =3D"; 1 ]=20
(Leonardo Santos, review by Florian Angeletti and Gabriel Scherer)=20

- [#14437](https://github.com/ocaml/ocaml/issues/14437): Add String.split_{=
first,last,all} and String.rsplit_all=20
split_first: sep:string -> string -> (string * string) option=20
split_all: sep:string -> drop:(string -> bool) -> string -> string list=20
(Daniel B=C3=BCnzli, review by Nicol=C3=A1s Ojeda B=C3=A4r and Florian Ange=
letti)=20

- [#14436](https://github.com/ocaml/ocaml/issues/14436): Add String.replace=
_{first,last,all}=20
replace_first: sub:string -> by:string -> ?start:int -> string -> string=20
(Daniel B=C3=BCnzli, review by Nicol=C3=A1s Ojeda B=C3=A4r, Ali Caglayan an=
d=20
Florian Angeletti)=20

- [#14439](https://github.com/ocaml/ocaml/issues/14439): Add String.include=
s, to complete the trio:=20
starts_with: prefix:string -> string -> bool=20
ends_with: suffix:string -> string -> bool=20
includes: affix:string -> string -> bool=20
(Daniel B=C3=BCnzli, review by Nicol=C3=A1s Ojeda B=C3=A4r and Olivier Nico=
le)=20

- [#14381](https://github.com/ocaml/ocaml/issues/14381): Add String.find_{f=
irst,last}_index, String.find_{first,last},=20
String.[r]find_all.=20
find_first_index: (char -> bool) -> ?start:int -> string -> int option=20
(Daniel B=C3=BCnzli, review by Nicol=C3=A1s Ojeda B=C3=A4r, Ali Caglayan an=
d=20
Florian Angeletti)=20

- [#14438](https://github.com/ocaml/ocaml/issues/14438): Add String.is_empt=
y=20
(Daniel B=C3=BCnzli, review by Nicol=C3=A1s Ojeda B=C3=A4r and Gabriel Sche=
rer)=20

- [#14440](https://github.com/ocaml/ocaml/issues/14440): Add String.of_char=
=20
(Daniel B=C3=BCnzli, review by Nicol=C3=A1s Ojeda B=C3=A4r and Gabriel Sche=
rer)=20

- [#14352](https://github.com/ocaml/ocaml/issues/14352): Add String.{drop,t=
ake,cut}_{first,last}.=20
take_first: int -> string -> string=20
cut_first: int -> string -> string * string=20
(Daniel B=C3=BCnzli, review by David Allsopp, Nicol=C3=A1s Ojeda B=C3=A4r a=
nd=20
Vincent Laviron)=20

- [#14362](https://github.com/ocaml/ocaml/issues/14362): Add String.{drop,t=
ake,cut}_{first,last}_while=20
drop_first_while: (char -> bool) -> string -> string=20
(Daniel B=C3=BCnzli, review by Nicol=C3=A1s Ojeda B=C3=A4r and David Allsop=
p)=20

- [#13916](https://github.com/ocaml/ocaml/issues/13916): Add Option.product=
 and Option.Syntax.=20
(Nicol=C3=A1s Ojeda B=C3=A4r, review by Daniel B=C3=BCnzli, Gabriel Scherer=
 and David=20
Allsopp)=20

- [#13995](https://github.com/ocaml/ocaml/issues/13995): Option.blend: ('a =
-> 'a -> 'a) -> 'a option -> 'a option -> 'a option=20
(Kate Deplaix, review by Daniel B=C3=BCnzli, Gabriel Scherer,=20
Nicol=C3=A1s Ojeda B=C3=A4r, Florian Angeletti and Josh Berdine)=20

- [#13920](https://github.com/ocaml/ocaml/issues/13920): add Option.{for_al=
l, exists}=20
(Gabriel Scherer, review by Kate Deplaix, Nicol=C3=A1s Ojeda B=C3=A4r, Rich=
ard Eisenberg=20
and Jeremy Yallop)=20

- [#14185](https://github.com/ocaml/ocaml/issues/14185): List.split_map: ('=
a -> 'b * 'c) -> 'a list -> 'b list * 'c list=20
(Jeremy Yallop, review by Daniel B=C3=BCnzli, Nicol=C3=A1s Ojeda B=C3=A4r a=
nd Damien Doligez)=20

- [#14043](https://github.com/ocaml/ocaml/issues/14043), [#14393](https://g=
ithub.com/ocaml/ocaml/issues/14393): Lazy.Mutexed: simple mutex-protected l=
azy thunks,=20
that may block the entire domain/thread on initialization races.=20
(Gabriel Scherer, suggestion by Kate Deplaix and Pierre Chambart,=20
review by KC Sivaramakrishnan, Florian Angeletti, Kate Deplaix=20
and Daniel B=C3=BCnzli)=20

- [#14118](https://github.com/ocaml/ocaml/issues/14118): Add {Set,Map}.S.is=
_singleton=20
(Kate Deplaix, review by Daniel B=C3=BCnzli, Vincent Laviron, Nicol=C3=A1s =
Ojeda B=C3=A4r=20
and Stephen Dolan)=20

- [#14060](https://github.com/ocaml/ocaml/issues/14060): Add Hashtbl.find_a=
nd_replace and Hashtbl.find_and_remove.=20
find_and_replace: ('k, 'a) Hashtbl.t -> 'k -> 'a -> 'a option=20
find_and_remove: ('k, 'a) Hashtbl.t -> 'k -> 'a option=20
(Sacha-=C3=89lie Ayoun, review by Nicol=C3=A1s Ojeda B=C3=A4r and Gabriel S=
cherer)=20

- [#14227](https://github.com/ocaml/ocaml/issues/14227): Add List.filter_ma=
pi.=20
(=C3=89mile Trotignon, review by Nicol=C3=A1s Ojeda B=C3=A4r, Jan Midtgaard=
 and=20
Damien Doligez)=20

- [#14432](https://github.com/ocaml/ocaml/issues/14432): Add floor division=
, ceil division, Euclidean division and remainder=20
to the Int, Int32, Int64 and Nativeint modules: `fdiv`, `cdiv`, `ediv`.=20
(Xavier Leroy, review by Ali Caglayan, Nicol=C3=A1s Ojeda B=C3=A4r, Gabriel=
 Scherer)=20

- [#14433](https://github.com/ocaml/ocaml/issues/14433): Add bit-counting f=
unctions `leading_zeros`, `leading_sign_bits`,=20
`trailing_zeros`, `bit_count`, `unsigned_bitsize`, `signed_bitsize`=20
to Int, Int32, Int64, and Nativeint=20
(Xavier Leroy, review by Ali Caglayan and David Allsopp)=20


- [#10177](https://github.com/ocaml/ocaml/issues/10177): Seq.(delay : (unit=
 -> 'a t) -> 'a t)=20
(Gabriel Scherer, review by Jeremy Yallop and Fran=C3=A7ois Pottier)=20

- [#13343](https://github.com/ocaml/ocaml/issues/13343): Add Array.stable_s=
ort_sub=20
(Fran=C3=A7ois Pottier, review by Gabriel Scherer, Corentin Leruth and Nico=
l=C3=A1s=20
Ojeda B=C3=A4r)=20

- [#14363](https://github.com/ocaml/ocaml/issues/14363): Preserve the backt=
race at exceptional domain termination. Domain.join=20
on an exceptionally terminated domain re-raises the exception with the=20
backtrace.=20
(KC Sivaramakrishnan, report by Nathan Taylor, review by Gabriel Scherer,=
=20
David Allsopp)=20

- [#13728](https://github.com/ocaml/ocaml/issues/13728): Add Sys.runtime_ex=
ecutable containing the full path (if available) to=20
the currently executing runtime.=20
(David Allsopp, review by Nicol=C3=A1s Ojeda B=C3=A4r and Daniel B=C3=BCnzl=
i)=20

- [#14086](https://github.com/ocaml/ocaml/issues/14086): Add Domain.count.=
=20
(Nicol=C3=A1s Ojeda B=C3=A4r, review by David Allsopp, Gabriel Scherer, Dan=
iel B=C3=BCnzli=20
and KC Sivaramakrishnan)=20

- [#12877](https://github.com/ocaml/ocaml/issues/12877): Dynarray.rev_iter,=
 Dynarray.rev_iteri=20
(Gabriel Scherer, review by L=C3=A9o Andr=C3=A8s, Jeremy Yallop and Nicol=
=C3=A1s Ojeda B=C3=A4r)=20

- [#14084](https://github.com/ocaml/ocaml/issues/14084): Future-proof Dynar=
ray implementation against a smarter compiler=20
(Basile Cl=C3=A9ment, review by Gabriel Scherer)=20

### Tools:=20

- [#13728](https://github.com/ocaml/ocaml/issues/13728), [#14014](https://g=
ithub.com/ocaml/ocaml/issues/14014), [#14243](https://github.com/ocaml/ocam=
l/issues/14243), [#14244](https://github.com/ocaml/ocaml/issues/14244), [#1=
4245](https://github.com/ocaml/ocaml/issues/14245) : The compiler is now re=
locatable: it=20
can be copied/moved to a different directory and everything still=20
works.=20
(David Allsopp, review by Nicol=C3=A1s Ojeda B=C3=A4r, Jonah Beckford, Dani=
el B=C3=BCnzli,=20
Antonin D=C3=A9cimo, Damien Doligez, Hugo Heuzard, Samuel Hym,=20
and Vincent Laviron)=20


- [#14055](https://github.com/ocaml/ocaml/issues/14055): Invert BUILD_PATH_=
PREFIX_MAP in directories loaded at startup=20
by the debugger.=20
(Pierre Boutillier, review by Gabriel Scherer and Daniel B=C3=BCnzli)=20

* (*breaking change*) [#13638](https://github.com/ocaml/ocaml/issues/13638)=
: ocamlmklib exits with code 4 if passed an unrecognised option, as it=20
does with an unrecognised file.=20
(David Allsopp, review by Antonin D=C3=A9cimo and S=C3=A9bastien Hinderer)=
=20

- [#13941](https://github.com/ocaml/ocaml/issues/13941), [#13961](https://g=
ithub.com/ocaml/ocaml/issues/13961): Fix `ocamltest` variable handing.=20
(Damien Doligez, report by Olivier Nicole, review by Gabriel Scherer)=20

- [#13962](https://github.com/ocaml/ocaml/issues/13962): Little ocamltest r=
efactors. Fix error handling in C code,=20
leaking file descriptors, code style.=20
(Antonin D=C3=A9cimo, review by Gabriel Scherer)=20

- [#14059](https://github.com/ocaml/ocaml/issues/14059): Fix flaky TSan tes=
ts=20
(Fabrice Buoro and Olivier Nicole, review by Gabriel Scherer)=20

- [#13966](https://github.com/ocaml/ocaml/issues/13966), [#13969](https://g=
ithub.com/ocaml/ocaml/issues/13969): Enable "generalized polymorphic #insta=
ll_printer"=20
in the debugger=20
(Pierre Boutillier and Gabriel Scherer, review by Florian Angeletti)=20

- [#14063](https://github.com/ocaml/ocaml/issues/14063) : Debugger fallback=
s to "looking for 'module_name'.ml in the=20
loadpath" when seeking source files. It improves hit rate for=20
sources of installed packages.=20
(Pierre Boutillier, review by Gabriel Scherer)=20

- [#14032](https://github.com/ocaml/ocaml/issues/14032), [#14034](https://g=
ithub.com/ocaml/ocaml/issues/14034): Update to and require FlexDLL 0.44.=20
(Jan Midtgaard, Antonin D=C3=A9cimo, review by David Allsopp)=20

- [#14239](https://github.com/ocaml/ocaml/issues/14239): Fix `#show_constru=
ctor` when printing non-GADT type parameters=20
(Takafumi Saikawa, Jacques Garrigue, review by Gabriel Scherer)=20

- [#14245](https://github.com/ocaml/ocaml/issues/14245): ocamlobjinfo now d=
isplays the runtime invoked by a bytecode=20
executable (either from the RNTM section or by analysing the shebang lines)=
=20
(David Allsopp, review by Damien Doligez and Samuel Hym)=20

### Runtime system:=20

- [#14365](https://github.com/ocaml/ocaml/issues/14365): Add an Idle phase =
to the GC for better performance on small=20
heaps and for a smooth start at program launch and after a forced major GC.=
=20
(Damien Doligez, review by Stephen Dolan and Nick Barnes)=20

- [#13416](https://github.com/ocaml/ocaml/issues/13416): Implement concurre=
ncy primitives using WinAPI instead of=20
winpthreads on Windows.=20
(Antonin D=C3=A9cimo, review by Samuel Hym, Gabriel Scherer, Miod Vallat,=
=20
B. Szilvasy, and Nicol=C3=A1s Ojeda B=C3=A4r)=20

- [#14367](https://github.com/ocaml/ocaml/issues/14367): Gc.Tweak mechanism=
 to allow named GC parameters=20
(Stephen Dolan and Nick Barnes, review by Gabriel Scherer, David Allsopp an=
d=20
Antonin D=C3=A9cimo)=20

- [#13574](https://github.com/ocaml/ocaml/issues/13574), [#13594](https://g=
ithub.com/ocaml/ocaml/issues/13594): Generational scanning of stack frames =
for ARM 64 bits, POWER,=20
and RISC-V. This reduces minor GC work in the presence of deep call stacks.=
=20
(Xavier Leroy, review by Miod Vallat, Gabriel Scherer and Olivier Nicole)=
=20

- [#14416](https://github.com/ocaml/ocaml/issues/14416): Spawned domains wi=
ll record backtraces if the parent domain has=20
enabled it.=20
(Nathan Taylor, review by Gabriel Scherer)=20

- [#14275](https://github.com/ocaml/ocaml/issues/14275): Add function caml_=
c_thread_register_in_domain, which makes it=20
possible to register "C threads" in another domain than 0 (which is=20
what caml_c_thread_register does). The function takes a domain unique=20
ID in which to register the thread. The domain must be running=20
when the function is called.=20
(Jack N=C3=B8rskov J=C3=B8rgensen, review by Gabriel Scherer,=20
Guillaume Munch-Maccagnoni)=20


- [#13616](https://github.com/ocaml/ocaml/issues/13616): Change free list r=
epresentation in shared heap=20
(Sadiq Jaffer, review by Damien Doligez)=20

- [#13580](https://github.com/ocaml/ocaml/issues/13580): Introduce sweep-on=
ly phase at start of major GC cycle,=20
to reduce latent-garbage delay and therefore improve GC performance.=20
(Stephen Dolan and Nick Barnes, review by KC Sivaramakrishnan)=20

- [#14053](https://github.com/ocaml/ocaml/issues/14053): Statmemprof: it is=
 now possible to replace a profile in the=20
current domain without stopping it in all domains.=20
Added the function [Gc.Memprof.is_sampling].=20
(Guillaume Munch-Maccagnoni, review by Gabriel Scherer)=20

- [#14168](https://github.com/ocaml/ocaml/issues/14168): restore the stack =
size statistic in `Gc.stat` and adds a new=20
`live_stacks_words` field tracking the total size in words of live stacks.=
=20
(Florian Angeletti, review by Gabriel Scherer)=20

- [#14189](https://github.com/ocaml/ocaml/issues/14189): Add runtime counte=
rs EV_C_MINOR_PROMOTED_WORDS and=20
EV_C_MINOR_ALLOCATED_WORDS. EV_C_MINOR_PROMOTED_WORDS reports words promote=
d=20
by minor GC and EV_C_MINOR_ALLOCATED_WORDS reports words allocated by minor=
=20
GC. Both have equivalent bytes counters. Also updated the documentation for=
=20
EV_C_MINOR_PROMOTED and EV_C_MINOR_ALLOCATED to qualify scope of the values=
=20
reported as being per-domain.=20
(Tim McGilchrist, review by Nick Barnes, Sadiq Jaffer and=20
Gabriel Scherer)=20

* (*breaking change*) [#14243](https://github.com/ocaml/ocaml/issues/14243)=
: Explicit relative paths in ld.conf (".", "..", "./<path...>",=20
"../<path...>") are interpreted as being relative to the directory ld.conf=
=20
was loaded from, and the default ld.conf now uses relative paths, rather th=
an=20
embedding the absolute path to the Standard Library. The brave may continue=
 to=20
put implicit paths in ld.conf. The interpretation of CAML_LD_LIBRARY_PATH i=
s=20
unaltered. Additionally, ld.conf is loaded from all of $OCAMLLIB/ld.conf,=
=20
$CAMLLIB/ld.conf and standard_library_default/ld.conf rather than just the=
=20
first one found. ld.conf files with CRLF line endings are now consistently=
=20
normalised on both Windows and Unix.=20
(David Allsopp, review by Jonah Beckford, Damien Doligez and Hugo Heuzard)=
=20

- [#14244](https://github.com/ocaml/ocaml/issues/14244): Added --with-relat=
ive-libdir which allows the runtime and the=20
compilers to locate the Standard Library relative to where the binaries=20
themselves are installed, removing the absolute path previously embedded in=
=20
caml_standard_library_default. Executables linked with `ocamlc -custom` now=
=20
always attempt to load bytecode from the executable itself, rather than fir=
st=20
trying `argv[0]`.=20
(David Allsopp, review by Jonah Beckford, Antonin D=C3=A9cimo, Damien Dolig=
ez,=20
Samuel Hym and Vincent Laviron)=20

- [#14245](https://github.com/ocaml/ocaml/issues/14245): Introduce Runtime =
IDs for use in filename mangling to allow different=20
configurations and different versions of the runtime system to coexist=20
harmoniously on a single system. The IDs are used, along with the host=20
triplet, to provide mangled names for the ocamlrun executable and its varia=
nts=20
and the DLL versions of both the bytecode and native runtimes, with symlink=
s=20
created for the original names. They are also used to mangle the names of s=
tub=20
libraries so that stub libraries compiled for a given configuration of the=
=20
runtime will only be sought by that runtime. The behaviour is disabled by=
=20
configuring with --disable-suffixing.=20
(David Allsopp, review by Damien Doligez and Samuel Hym)=20

- [#12269](https://github.com/ocaml/ocaml/issues/12269), [#12410](https://g=
ithub.com/ocaml/ocaml/issues/12410), [#13063](https://github.com/ocaml/ocam=
l/issues/13063): Fix unsafety, deadlocks, and/or leaks should=20
rare errors happen during domain creation and thread=20
creation/registration.=20
(Guillaume Munch-Maccagnoni, review by Gabriel Scherer, B. Szilvasy,=20
Miod Vallat)=20

- [#14337](https://github.com/ocaml/ocaml/issues/14337): Fix potential segf=
ault due to the C callback mechanism dropping=20
continuations without calling `caml_continuation_use`.=20
(Max Slater, review by Nick Barnes and Stephen Dolan)=20

- [#14461](https://github.com/ocaml/ocaml/issues/14461): Fix racy socketpai=
r on Windows. Address-in-use errors would sometimes=20
occur when concurrent threads or processes were trying to create socketpair=
s.=20
(Jessie Grosen, review by Antonin D=C3=A9cimo and Nicol=C3=A1s Ojeda B=C3=
=A4r)=20

- [#14820](https://github.com/ocaml/ocaml/issues/14820): caml_ba_alloc must=
 account for memory it allocated itself.=20
CAML_BA_SUBARRAY (introduced in 5.2) with data=3DNULL would result in the=
=20
Gc accounting for the allocation as 0 bytes, which can eventually lead=20
to OOM. This condition never occurs in the compiler itself, but occurs=20
in external C bindings that attempt to create a new bigarray in the=20
shape of an existing one. For backwards compatibility ignore CAML_BA_SUBARR=
AY=20
when data is NULL.=20
(Edwin T=C3=B6r=C3=B6k, review by Damien Doligez)=20

### Type system:=20

- [#13781](https://github.com/ocaml/ocaml/issues/13781): Set scope of inter=
nal type nodes during abbreviation expansion=20
rather than recursing during unification.=20
(Jacques Garrigue, review by Gabriel Scherer)=20

* (*breaking change*) [#14066](https://github.com/ocaml/ocaml/issues/14066)=
: catch invalid aliases introduced by signature constraints during=20
merging rather than in subtyping:=20
```ocaml=20
module X =3D struct end module F (_:sig end) =3D struct end=20
module type T =3D (sig module X0 : sig end module X1 =3D X0 end)=20
with module X0 :=3D F(X)=20
```=20
Before, it failed with a subtyping error. Now, it fails with a proper error=
,=20
explaining that `X1` would keep an invalid alias to `F(X)`=20
(Clement Blaudeau, review by Florian Angeletti)=20

* (*breaking change*) [#14100](https://github.com/ocaml/ocaml/issues/14100)=
: Do not ignore type-constraints and module-constraints when building=20
the approximated signature of recursive modules. Ignoring those constraints=
=20
resulted in incorrect (wrong set of fields, wrong shadowing between fields)=
=20
approximated signatures, failing to typecheck, as in:=20
```ocaml=20
module X0 : sig type t end=20
module rec X : ((sig module A : sig end end) with module A :=3D X0)=20
and Y : sig type t =3D X.A.t end (* Unbound type constructor X.A.t *)=20
```=20
Now, type and module constraints are properly merged during approximation ,=
=20
reusing the infrastructure for normal merging of constraints, but disabling=
=20
any wellformedness check.=20
(Clement Blaudeau and Ryan Tjoa, review by Florian Angeletti)=20

- [#14327](https://github.com/ocaml/ocaml/issues/14327): Allow retyping as-=
patterns that contain existentials=20
(completing [#14229](https://github.com/ocaml/ocaml/issues/14229))=20
(Jacques Garrigue and Takafumi Saikawa, reported by Olivier Nicole,=20
review by Gabriel Scherer)=20

- [#14434](https://github.com/ocaml/ocaml/issues/14434), [#14652](https://g=
ithub.com/ocaml/ocaml/issues/14652): Protect check_counter_example_pat agai=
nst polymorphic types,=20
restoring type soundness.=20
(Stephen Dolan and Jacques Garrigue, report and review by Alistair O'Brien)=
=20

### Compiler user-interface and warnings:=20

- [#14330](https://github.com/ocaml/ocaml/issues/14330): add suggestions wh=
en a signature mismatch is likely to be be caused by=20
spellchecking mistakes, for instance=20
```=20
module M: sig type albatross end =3D struct type albatros end=20
```=20
(Malo Monin, Florian Angeletti, review by Gabriel Scherer)=20

- [#12628](https://github.com/ocaml/ocaml/issues/12628): Improved error mes=
sage for unsafe values: print out the full path for=20
the value that is unsafe when they are detected during the compilation of=
=20
recursive modules.=20
(Shivam Acharya, review by Gabriel Scherer and Florian Angeletti)=20


- [#14076](https://github.com/ocaml/ocaml/issues/14076), 14111: error messa=
ges, add a short explanation for mismatched=20
universal variables and universal quantifications.=20
(Florian Angeletti, review by Gabriel Scherer)=20

- [#14126](https://github.com/ocaml/ocaml/issues/14126): Document the `-i-v=
ariance` option and `+-`, `-+` variance indicators=20
in the reference manual.=20
(Takafumi Saikawa, review by Florian Angeletti)=20

- [#14146](https://github.com/ocaml/ocaml/issues/14146): add an error messa=
ge for external declaration with=20
a non-syntactic arity=20
```=20
external fail: (int -> int as 'a) -> 'a =3D "%identity"=20
```=20
rather than failing with an internal error.=20
(Florian Angeletti, review by Gabriel Scherer)=20

- [#14147](https://github.com/ocaml/ocaml/issues/14147): print row types in=
 error messages when they are a type constructor,=20
e.g. `< foo : int; .. as $0>` when $0 is introduced by a GADT constructor=
=20
(Stefan Muenzel, review by Jacques Garrigue and Florian Angeletti)=20

- [#14190](https://github.com/ocaml/ocaml/issues/14190): `ocaml -e` now als=
o processes `-init` (previously it was ignored).=20
(Emile Trotignon, review by David Allsopp and @ygrek)=20

- [#14225](https://github.com/ocaml/ocaml/issues/14225): do not raise unuse=
d-constructor warning on private=20
constructor in type implementations, for example=20
`type safe =3D private Safe`, which are typically used to=20
create new fresh/generative types (here `safe`) to be used=20
as GADT indices.=20
(Gabriel Scherer, review by Nicol=C3=A1s Ojeda B=C3=A4r and Florian Angelet=
ti,=20
report by Kate Deplaix)=20

- [#14244](https://github.com/ocaml/ocaml/issues/14244): Add -set-runtime-d=
efault option to the compiler, allowing the default=20
value of the Standard Library location used by the runtime to be overridden=
.=20
(Antonin D=C3=A9cimo, review by David Allsopp, Jonah Beckford, Damien Dolig=
ez and=20
Samuel Hym)=20

- [#14245](https://github.com/ocaml/ocaml/issues/14245): New option -launch=
-method for ocamlc allows the method used by a=20
tendered bytecode executable to locate the interpreter to be given explicit=
ly.=20
In particular, it makes it easier to specify the use of the executable=20
launcher on Unix. New option -runtime-search extends the bytecode executabl=
e=20
header to be able to search for the runtime interpreter in the directory=20
containing the executable and in PATH rather than relying on a single=20
hard-coded path.=20
(David Allsopp, review by Damien Doligez and Samuel Hym)=20

- [#14315](https://github.com/ocaml/ocaml/issues/14315): enable -i-variance=
 also for classes and extension constructors,=20
and add description of -i-variance in manpages and the manual=20
(Takafumi Saikawa, review by Florian Angeletti and Jacques Garrigue)=20

- [#14373](https://github.com/ocaml/ocaml/issues/14373): remove the OCAML_B=
INANNOT_WITHENV environment variable, and=20
always strip typing environment in cmt files=20
(Florian Angeletti, review by David Allsopp)=20

### Other libraries:=20

- [#13700](https://github.com/ocaml/ocaml/issues/13700), [#14454](https://g=
ithub.com/ocaml/ocaml/issues/14454), [#14715](https://github.com/ocaml/ocam=
l/issues/14715): Use POSIX thread-safe getgrnam_r, getgrgid_r,=20
getpwnam_r, getpwuid_r, gmtime_r, localtime_r, getlogin_r, and fix mktime=
=20
error checking.=20
(Antonin D=C3=A9cimo, review by Florian Angeletti, David Allsopp, Stefan Mu=
enzel,=20
Gabriel Scherer, and Miod Vallat)=20

- [#14406](https://github.com/ocaml/ocaml/issues/14406): Better handling of=
 address length for unix sockets, improving Haiku=20
compatibility.=20
(Sylvain Kerjean, review by Antonin D=C3=A9cimo and Nicol=C3=A1s Ojeda B=C3=
=A4r)=20

* (*breaking change*) [#14046](https://github.com/ocaml/ocaml/issues/14046)=
: On Windows, `Unix.kill pid Sys.sigkill` causes the receiving process=20
to exit with code ERROR_PROCESS_ABORTED (1067) instead of 0.=20
(Nicol=C3=A1s Ojeda B=C3=A4r, review by Miod Vallat, Antonin D=C3=A9cimo an=
d David Allsopp)=20

- [#14020](https://github.com/ocaml/ocaml/issues/14020): Add Unix.unsetenv.=
=20
(Nicol=C3=A1s Ojeda B=C3=A4r, review by Antonin D=C3=A9cimo and David Allso=
pp)=20

- [#13447](https://github.com/ocaml/ocaml/issues/13447): Symmetrize shared =
`Sys` and `Unix` functions. Apply fixes=20
of [#12072](https://github.com/ocaml/ocaml/issues/12072), [#12184](https://=
github.com/ocaml/ocaml/issues/12184), [#12320](https://github.com/ocaml/oca=
ml/issues/12320), and [#13166](https://github.com/ocaml/ocaml/issues/13166)=
, from `Sys.rename` to=20
`Unix.rename`. Make `caml_sys_close` raise on error, allowing=20
`Filename.temp_file` retries if close fails. Flush buffers when=20
calling `caml_sys_system_command` on Windows. Error with EINVAL=20
instead of ENOENT if the command string is not a valid C string.=20
(Antonin D=C3=A9cimo, review by Gabriel Scherer and Nicol=C3=A1s Ojeda B=C3=
=A4r)=20

- [#14310](https://github.com/ocaml/ocaml/issues/14310): Deprecate union so=
ck_addr_union for struct sockaddr_storage=20
and socklen_param_type for socklen_t.=20
(Antonin D=C3=A9cimo, review by Nicol=C3=A1s Ojeda B=C3=A4r, David Allsopp =
and Samuel Hym)=20

- [#14391](https://github.com/ocaml/ocaml/issues/14391): unload native dynl=
inked objects when an error occurs and it is safe to=20
do so. (Fixes [#14323](https://github.com/ocaml/ocaml/issues/14323))=20
(Nicol=C3=A1s Ojeda B=C3=A4r, review by Vincent Laviron)=20

### Code generation and optimizations:=20

- [#14583](https://github.com/ocaml/ocaml/issues/14583): fix bug in linear =
scan spilling heuristic that in certain situations=20
could lead to miscompilations.=20
(Nicol=C3=A1s Ojeda B=C3=A4r, review by Vincent Laviron)=20

### Manual and documentation:=20

- [#14684](https://github.com/ocaml/ocaml/issues/14684), [#14782](https://g=
ithub.com/ocaml/ocaml/issues/14782), [#14838](https://github.com/ocaml/ocam=
l/issues/14838): Improve ocamlc's and ocamlopt's manual pages and fix=20
small issues in the manual=20
(Samuel Hym, review by Florian Angeletti, Antonin D=C3=A9cimo, Gabriel Sche=
rer and=20
Nicol=C3=A1s Ojeda B=C3=A4r)=20

- [#14397](https://github.com/ocaml/ocaml/issues/14397): Improve documentat=
ion of type-directed disambiguation of array=20
literals=20
(Alicia Michael, review by Olivier Nicole and Florian Angeletti)=20

- [#14293](https://github.com/ocaml/ocaml/issues/14293): Improve documentat=
ion of Runtime_events.Timestamp=20
(Rapha=C3=ABl Proust, review by Gabriel Scherer)=20

- [#13747](https://github.com/ocaml/ocaml/issues/13747): Document support f=
or native debugging with GDB and LLDB.=20
(Tim McGilchrist, review by Daniel B=C3=BCnzli, Samuel Hym, Olivier Nicole=
=20
and Antonin D=C3=A9cimo)=20

* (*breaking change*) [#13975](https://github.com/ocaml/ocaml/issues/13975)=
: documented the `[@remove_aliases]` built-in attribute for signatures=20
(introduced by [#1652](https://github.com/ocaml/ocaml/issues/1652) in 2018)=
. Small refactor of the code that fetches the=20
attribute.=20
(Clement Blaudeau, review by Gabriel Scherer)=20

- [#14002](https://github.com/ocaml/ocaml/issues/14002): Add anchors to ite=
ms and headings of the web version of the API=20
documentation for easier linking.=20
(Nicol=C3=A1s Ojeda B=C3=A4r, report by Louis Roch=C3=A9, review by Gabriel=
 Scherer and=20
Florian Angeletti)=20

- [#14023](https://github.com/ocaml/ocaml/issues/14023): Add documentation =
for the [row_more] function.=20
(Richard Eisenberg, review by Jacques Garrigue)=20

- [#14038](https://github.com/ocaml/ocaml/issues/14038): Fall back immediat=
ely to user-agent-defined fonts when web fonts=20
fail to load.=20
(toastal)=20

- [#14048](https://github.com/ocaml/ocaml/issues/14048): document modular e=
xplicits=20
(Gabriel Scherer, review by Samuel Vivien, Ali Caglayan,=20
Didier Remy and Fran=C3=A7ois Pottier)=20

- [#13994](https://github.com/ocaml/ocaml/issues/13994): document external =
types=20
(Gabriel Scherer, review by Jan Midtgaard, Jacques Garrigue=20
and Florian Angeletti)=20

- [#14077](https://github.com/ocaml/ocaml/issues/14077): Add missing `item-=
attribute` rule for `let-binding`s in documentation=20
for attributes.=20
(Shon Feder)=20

- [#14228](https://github.com/ocaml/ocaml/issues/14228): Trim leading space=
s from first lines of LaTeX `ocamldoccode`=20
environments.=20
(Yukai Chou, review by Nicol=C3=A1s Ojeda B=C3=A4r)=20

- [#14248](https://github.com/ocaml/ocaml/issues/14248): Added documentatio=
n about the way `Domain.join` triggers a=20
`Thread.join` on the domain's systhreads.=20
(Rapha=C3=ABl Proust, review by Gabriel Scherer)=20

- [#14392](https://github.com/ocaml/ocaml/issues/14392): Fix AsciiDoc files=
, add more markup, xrefs, documentation.=20
(Antonin D=C3=A9cimo, review by Gabriel Scherer and David Allsopp)=20

- [#13590](https://github.com/ocaml/ocaml/issues/13590): Document automatic=
 command-line expansion of `*` and `?` wildcards by=20
the runtime under Windows.=20
(Benjamin Sigonneau, review by Nicol=C3=A1s Ojeda B=C3=A4r)=20

### Internal/compiler-libs changes:=20

- [#13913](https://github.com/ocaml/ocaml/issues/13913): Use Blake128 as th=
e hash function for the compiler's CRCs=20
(Vincent Laviron, review by Xavier Leroy and Gabriel Scherer)=20

- [#13911](https://github.com/ocaml/ocaml/issues/13911), [#14117](https://g=
ithub.com/ocaml/ocaml/issues/14117), [#14127](https://github.com/ocaml/ocam=
l/issues/14127): Refactor the merging of signature constraints, by=20
splitting the monolithic merge function into separate, specialized function=
s=20
(for merging types, modules and module types) - sharing only the recursive=
=20
part for handling deep constraints.=20
(Clement Blaudeau, review by Florian Angeletti and Samuel Vivien, fix by Ry=
an=20
Tjoa)=20

- [#14120](https://github.com/ocaml/ocaml/issues/14120), [#14474](https://g=
ithub.com/ocaml/ocaml/issues/14474), [#14476](https://github.com/ocaml/ocam=
l/issues/14476): Associate Uids to items that don't have a concrete=20
definition; improves Merlin's renaming for functors.=20
(Ulysse G=C3=A9rard, review by Florian Angeletti and Gabriel Scherer)=20


- [#13839](https://github.com/ocaml/ocaml/issues/13839), [#14008](https://g=
ithub.com/ocaml/ocaml/issues/14008): Reimplement `let open`, `let module` a=
nd `let exception` in=20
terms of a single construct.=20
(Nicol=C3=A1s Ojeda B=C3=A4r, review by Gabriel Scherer, Samuel Vivien, Uly=
sse G=C3=A9rard=20
and Vincent Laviron, temporary regression reported by Antonio Monteiro)=20

- [#13980](https://github.com/ocaml/ocaml/issues/13980) Refactor `type-appr=
ox` and improve some errors' locations.=20
(Leo White, Ulysse G=C3=A9rard, review by Samuel Vivien and Florian Angelet=
ti)=20

- [#14024](https://github.com/ocaml/ocaml/issues/14024): Fix unterminated-s=
tring-initialization warnings from the C compiler.=20
(Antonin D=C3=A9cimo, review by David Allsopp and Miod Vallat)=20

- [#14094](https://github.com/ocaml/ocaml/issues/14094): toplevel, simplify=
 check on installed printer types=20
(Florian Angeletti, review by Gabriel Scherer)=20

- [#13656](https://github.com/ocaml/ocaml/issues/13656), [#14114](https://g=
ithub.com/ocaml/ocaml/issues/14114), [#14308](https://github.com/ocaml/ocam=
l/issues/14308): Use C99 stdint.h/inttypes.h fixed-width=20
integer types and macros to define OCaml integers.=20
(Antonin D=C3=A9cimo, review by Nick Barnes and David Allsopp)=20

- [#14148](https://github.com/ocaml/ocaml/issues/14148): Remove an unused f=
ield from package_type in typedtree=20
(Samuel Vivien, review by Gabriel Scherer)=20

- [#14141](https://github.com/ocaml/ocaml/issues/14141): Rename cstrs to co=
nstraints when it refers to constraints to avoid=20
confusing it with constructors.=20
(Stefan Muenzel, review by Nicol=C3=A1s Ojeda B=C3=A4r)=20

- [#14149](https://github.com/ocaml/ocaml/issues/14149): Distinguish `(modu=
le M : S)` from `(module M) : (module S)` in=20
patterns.=20
(Samuel Vivien, review by Gabriel Scherer)=20

- [#14161](https://github.com/ocaml/ocaml/issues/14161): refactor the STW-p=
articipants machinery to add an intermediate=20
category of 'parked' domain structures.=20
(Gabriel Scherer, review by Sivaramakrishnan)=20

- [#14198](https://github.com/ocaml/ocaml/issues/14198) Constraints on modu=
le unpacking are not ghost=20
(Thomas Refis, review by Nicol=C3=A1s Ojeda B=C3=A4r)=20

- [#14243](https://github.com/ocaml/ocaml/issues/14243): ocamlc now uses th=
e same code as the runtime to parse ld.conf (via a=20
C primitive), eliminating some highly obscure corner cases.=20
(David Allsopp, review by Jonah Beckford, Damien Doligez and Hugo Heuzard)=
=20

- [#14260](https://github.com/ocaml/ocaml/issues/14260): Refactor Lambda.st=
ructured_constant to avoid duplicate=20
representations for string constants=20
(Vincent Laviron, review by Nicol=C3=A1s Ojeda B=C3=A4r and Gabriel Scherer=
)=20

- [#14297](https://github.com/ocaml/ocaml/issues/14297), [#14299](https://g=
ithub.com/ocaml/ocaml/issues/14299): Avoid iterating on hash tables to prod=
uce types or terms=20
(Vincent Laviron, review by Nicol=C3=A1s Ojeda B=C3=A4r and Gabriel Scherer=
)=20

* (*breaking change*) [#14322](https://github.com/ocaml/ocaml/issues/14322)=
: Remove leftover hacks for handling pattern constraints=20
As a side effect, `let rec (_ as x) =3D ...` is now always rejected instead=
 of=20
being treated as equivalent to `let rec x =3D ...`=20
(Vincent Laviron, review by Alistair O'Brien and Florian Angeletti)=20

- [#14331](https://github.com/ocaml/ocaml/issues/14331): Enforce current_le=
vel <=3D generic_level, and explain create_scope=20
(Jacques Garrigue and Takafumi Saikawa, review by Gabriel Scherer)=20

* (*breaking change*) [#14388](https://github.com/ocaml/ocaml/issues/14388)=
: Remove support for `let rec (module M : S) =3D e1 in e2`.=20
(Alistair O'Brien, review by Vincent Laviron and Gabriel Scherer)=20

- [#14422](https://github.com/ocaml/ocaml/issues/14422): Refactoring an `if=
 match e with p1 -> true | p2 -> false then ...`=20
into a match in typetexp.=20
(Samuel Vivien, review by Gabriel Scherer)=20

- [#13224](https://github.com/ocaml/ocaml/issues/13224): Clarify barriers a=
nd spin macros with delayed expansion.=20
(Antonin D=C3=A9cimo, review by David Allsopp and Gabriel Scherer)=20

- [#14435](https://github.com/ocaml/ocaml/issues/14435), [#14455](https://g=
ithub.com/ocaml/ocaml/issues/14455), [#14550](https://github.com/ocaml/ocam=
l/issues/14550): Add the not-root builtin ocamltest action. This=20
allows to skip tests that fail if the current user is root (superuser).=20
(Kate Deplaix, review by Gabriel Scherer, Nicol=C3=A1s Ojeda B=C3=A4r, and=
=20
Antonin D=C3=A9cimo)=20

- [#14457](https://github.com/ocaml/ocaml/issues/14457): Handle qualified `=
M.{ x }` patterns in untypeast=20
(Basile Cl=C3=A9ment, review by Florian Angeletti)=20

### Build system:=20

- [#13705](https://github.com/ocaml/ocaml/issues/13705), [#14444](https://g=
ithub.com/ocaml/ocaml/issues/14444): Cache test results of custom Autoconf =
tests from aclocal.m4.=20
(Antonin D=C3=A9cimo, review by David Allsopp and Miod Vallat)=20

- [#13810](https://github.com/ocaml/ocaml/issues/13810): Support build of c=
ross compilers to native freestanding targets=20
(Samuel Hym, review by Antonin D=C3=A9cimo and Romain Calascibetta)=20

- [#14243](https://github.com/ocaml/ocaml/issues/14243): New configure opti=
on --with-additional-stublibsdir allows an=20
additional directory to be added to the start of ld.conf. Additionally, the=
=20
stublibs subdirectory is no longer created, nor added to ld.conf, when=20
building OCaml with --disable-shared.=20
(David Allsopp, review by Jonah Beckford, Damien Doligez and Hugo Heuzard)=
=20

- [#14244](https://github.com/ocaml/ocaml/issues/14244): When targeting nat=
ive Windows on Cygwin or MSYS2, preserve=20
backslashes in the supplied `--prefix` (in particular, backslashes instead =
of=20
slashes will then be displayed by `ocamlopt -config-var standard_library`).=
=20
If the supplied prefix contains a slash, then it is normalised, as=20
previously.=20
(David Allsopp, review by Jonah Beckford, Antonin D=C3=A9cimo, Damien Dolig=
ez and=20
Samuel Hym)=20

- [#14245](https://github.com/ocaml/ocaml/issues/14245): New --enable-runti=
me-search configure option controls the=20
-runtime-search option used to build the bytecode binaries in the compiler=
=20
distribution. --enable-runtime-search-target controls the default value of=
=20
-runtime-search used for bytecode executables produced by the compiler.=20
(David Allsopp, review by Damien Doligez and Samuel Hym)=20

- [#14484](https://github.com/ocaml/ocaml/issues/14484): Set `_WIN32_WINNT`=
 to require Windows 8/Server 2012 Windows header SDK=20
support.=20
(Antonin D=C3=A9cimo, review by David Allsopp)=20

### Bug fixes:=20

- [#14123](https://github.com/ocaml/ocaml/issues/14123): Fix integer-overfl=
ow problems in heap compaction.=20
(Nick Barnes, review by Antonin D=C3=A9cimo).=20

- [#14035](https://github.com/ocaml/ocaml/issues/14035): Fix the alignment =
of _Atomic long long unsigned int fields=20
before GCC 11.1 on i686. Silence GCC note on newer versions.=20
(Antonin D=C3=A9cimo, review by Sadiq Jaffer)=20

- [#14010](https://github.com/ocaml/ocaml/issues/14010): Fix miscompilation=
 / liveness errors for string operations=20
(Mark Shinwell, Xavier Clerc, review by Xavier Leroy and Gabriel Scherer)=
=20

- [#14036](https://github.com/ocaml/ocaml/issues/14036): Fix nontermination=
 of cycle printing in recursive modules with=20
`-short-paths`. Add error message for types considered abstract while=20
checking recursive modules.=20
(Brandon Stride, review by Florian Angeletti)=20

- [#14065](https://github.com/ocaml/ocaml/issues/14065): Fix function signa=
ture mismatch of `__tsan_func_exit` with GCC 15.=20
Check in the configure step if the TSan provided internal builtins are the=
=20
same as what we expect, introduce `caml_tsan_*` wrappers for the `__tsan_*`=
=20
functions we use.=20
(Hari Hara Naveen S, report by Hari Hara Naveen S,=20
review by Gabriel Scherer, Antonin D=C3=A9cimo, Olivier Nicole)=20

- [#14071](https://github.com/ocaml/ocaml/issues/14071): Fix exception name=
 in Dynlink.Error printer.=20
(Etienne Millon, review by Nicol=C3=A1s Ojeda B=C3=A4r)=20

- [#13853](https://github.com/ocaml/ocaml/issues/13853): Format breaks some=
 line too early when there=20
is a break hint at the end.=20
(Florian Angeletti, review by Gabriel Scherer)=20

- [#10570](https://github.com/ocaml/ocaml/issues/10570): Fix handling of ca=
ml_sys_argv when exposed directly as an=20
external=20
(Keryan Didier, review by Vincent Laviron and Gabriel Scherer)=20

- [#14155](https://github.com/ocaml/ocaml/issues/14155): Audit unexecuted p=
hrases in compiler expect tests and=20
fix all occurrences=20
(Stefan Muenzel, review by Gabriel Scherer)=20

- [#14163](https://github.com/ocaml/ocaml/issues/14163), [#14176](https://g=
ithub.com/ocaml/ocaml/issues/14176): add a filename location to the depreca=
tion alert for implicit=20
uses of libraries bundled with the compiler (unix,re,threads,dynlink)=20
(Florian Angeletti, report by Ali Caglayan, review by Gabriel Scherer)=20

- [#14210](https://github.com/ocaml/ocaml/issues/14210): fix TSan-reported =
data race in weak pointers runtime=20
(Gabriel Scherer and Damien Doligez, report by Olivier Nicole,=20
review by KC Sivaramakrishnan)=20

- [#14213](https://github.com/ocaml/ocaml/issues/14213): Fix shadow-stack-r=
elated crashes with TSan=20
(Olivier Nicole, report by Nathan Taylor, review by Gabriel Scherer and=20
Stefan Muenzel)=20

- [#13658](https://github.com/ocaml/ocaml/issues/13658), [#14181](https://g=
ithub.com/ocaml/ocaml/issues/14181): Fix handling of recursive function typ=
es that can result=20
in an unbounded number of labeled or optional arguments.=20
(Stefan Muenzel, report by Samuel Vivien, review by Florian Angeletti)=20

- [#14255](https://github.com/ocaml/ocaml/issues/14255): Fix TSan bug with =
C calls that take many arguments=20
(Olivier Nicole and Miod Vallat, report by Nathan Taylor, review by Gabriel=
=20
Scherer)=20

- [#14230](https://github.com/ocaml/ocaml/issues/14230) : ocamltest fails t=
o link test program with -custom in some cases=20
(Damien Doligez, review by David Allsopp)=20

- [#14279](https://github.com/ocaml/ocaml/issues/14279): -dsource, preserve=
 (mod) and other escaped infix keyword operators in=20
the printed source wherever possible.=20
(Florian Angeletti, review by Gabriel Scherer)=20

- [#14300](https://github.com/ocaml/ocaml/issues/14300), [#14304](https://g=
ithub.com/ocaml/ocaml/issues/14304): fix a race between memprof and the min=
or GC, detected by TSan=20
(Gabriel Scherer, review by Stephen Dolan and Nick Barnes,=20
report by Olivier Nicole)=20

- [#14332](https://github.com/ocaml/ocaml/issues/14332): Fix missing TSan i=
nstrumentation in subexpressions=20
(Vincent Laviron, review by Gabriel Scherer and Olivier Nicole)=20

- [#14370](https://github.com/ocaml/ocaml/issues/14370), [#14429](https://g=
ithub.com/ocaml/ocaml/issues/14429): Fix headers for C++ inclusion.=20
(Antonin D=C3=A9cimo, review by Gabriel Scherer)=20

- [#14417](https://github.com/ocaml/ocaml/issues/14417): Fix issue with nes=
ted packs on macOS.=20
(Vincent Laviron, report by Kate Deplaix, review by Gabriel Scherer)=20

- [#14423](https://github.com/ocaml/ocaml/issues/14423): Fix detection of S=
etThreadDescription on 32-bit builds, meaning that=20
Thread.set_current_thread_name now works on 32-bit MSVC and uses the correc=
t=20
mechanism on 32-bit mingw-w64.=20
(David Allsopp, review by Antonin D=C3=A9cimo)=20

- [#14431](https://github.com/ocaml/ocaml/issues/14431): Enable native back=
end for DragonFly BSD. This builds ocamlopt on=20
DragonFly.=20
(Michael Neumann, review by Gabriel Scherer and Kate Deplaix)=20

- [#14495](https://github.com/ocaml/ocaml/issues/14495): Fix infix-tag bug =
in the minor collector which could cause SEGVs=20
in multi-domain programs.=20
(Nick Barnes, review by Gabriel Scherer)=20

- [#14519](https://github.com/ocaml/ocaml/issues/14519): Fix segfault when =
using `Runtime_events` under certain=20
circumstances due to bad error checking when calling `mmap()`.=20
(Mark Elvers, review by Nicol=C3=A1s Ojeda B=C3=A4r)=20

- private, CVE-2026-28364, OSEC-2026-01: robustify intern.c=20
(Xavier Leroy and Nicol=C3=A1s Ojeda B=C3=A4r, review by Olivier Nicole, Mi=
ndy Preston,=20
Edwin T=C3=B6r=C3=B6k, and Gabriel Scherer)=20

- [#13693](https://github.com/ocaml/ocaml/issues/13693), [#14514](https://g=
ithub.com/ocaml/ocaml/issues/14514): s390x: fix heap corruption with libasm=
run_shared.so caused=20
by PLT lazy binding trampoline saving FPRs into OCaml's fiber stack.=20
Replace @PLT calls with GOT-indirect calls in the s390x code emitter.=20
(Zane Hambly, review by David Allsopp and Xavier Leroy)=20

- [#14557](https://github.com/ocaml/ocaml/issues/14557), [#12150](https://g=
ithub.com/ocaml/ocaml/issues/12150), [#14696](https://github.com/ocaml/ocam=
l/issues/14696): ensure that the self type of class cannot escape=20
through type constraints.=20
(Leo White, review by Florian Angeletti)=20

- [#14603](https://github.com/ocaml/ocaml/issues/14603), [#14604](https://g=
ithub.com/ocaml/ocaml/issues/14604): avoid Ctype.apply failures when mixing=
=20
polymorphic types and unboxed constructors.=20
(Gabriel Scherer and Stefan Muenzel, report by Brandon Stride,=20
review by Florian Angeletti)=20

- [#14626](https://github.com/ocaml/ocaml/issues/14626), [#14675](https://g=
ithub.com/ocaml/ocaml/issues/14675): take in account module-dependent funct=
ions when=20
determining if an optional argument is non-erasable.=20
(Alistair O'Brien and Florian Angeletti, review by Gabriel Scherer)=20

- [#14635](https://github.com/ocaml/ocaml/issues/14635): Fix a bug in `caml=
_floatarray_gather` that would cause=20
the result of `Float.Array.sub`, `Float.Array.append`, `Float.Array.concat`=
=20
(when empty) not to be equal to `[||]`.=20
(Marc Lasson, review by Gabriel Scherer)=20

- [#14644](https://github.com/ocaml/ocaml/issues/14644), [#14647](https://g=
ithub.com/ocaml/ocaml/issues/14647): Fix a bug related to unhandled effects=
 in bytecode.=20
(Vincent Laviron, report by Thibaut Mattio,=20
review by Nicol=C3=A1s Ojeda B=C3=A4r, Stephen Dolan and Olivier Nicole)=20

- [#14655](https://github.com/ocaml/ocaml/issues/14655), [#14691](https://g=
ithub.com/ocaml/ocaml/issues/14691): check for size overflow in caml_ba_res=
hape=20
(Stephen Dolan, review by Xavier Leroy)=20

- [#14667](https://github.com/ocaml/ocaml/issues/14667): enable application=
 related warnings for module-dependent functions=20
(Florian Angeletti, review by Gabriel Scherer)=20

- [#14690](https://github.com/ocaml/ocaml/issues/14690): Fix `Name_type_mis=
match` error message when the expected type is an=20
alias: print the expanded path on the right-hand side of the equality, not=
=20
the alias twice.=20
(Weixie Cui, review by Florian Angeletti)=20

- [#14349](https://github.com/ocaml/ocaml/issues/14349), [#14718](https://g=
ithub.com/ocaml/ocaml/issues/14718), [#14722](https://github.com/ocaml/ocam=
l/issues/14722): runtime, fix in the orphaning of ephemerons=20
(Gabriel Scherer, review by Olivier Nicole and Damien Doligez,=20
report by Jan Midtgaard)=20

- [#14702](https://github.com/ocaml/ocaml/issues/14702): Fix hidden directo=
ry files leaking into the visible load path table.=20
When a hidden directory contained a file whose basename was already present=
,=20
the file could be incorrectly added to the visible table.=20
(Hugo Heuzard, review by Florian Angeletti)=20

- [#14719](https://github.com/ocaml/ocaml/issues/14719), [#14721](https://g=
ithub.com/ocaml/ocaml/issues/14721): compute arity correctly for module-dep=
endent function=20
(Florian Angeletti, report by Jeremy Yallop, review by Stefan Muenzel)=20

- [#14760](https://github.com/ocaml/ocaml/issues/14760), [#14802](https://g=
ithub.com/ocaml/ocaml/issues/14802), [#14846](https://github.com/ocaml/ocam=
l/issues/14846): Correct the detection of argument defaults in=20
configure, fixing an incorrect error message when installing OCaml through=
=20
opam on OpenSUSE with the site-config package installed.=20
(David Allsopp, report and review by Edwin T=C3=B6r=C3=B6k)=20

- [#14797](https://github.com/ocaml/ocaml/issues/14797): avoid dropping att=
ributes attached to package types when pretty=20
printing in surface syntax.=20
(Chet Murthy, review by Nicol=C3=A1s Ojeda B=C3=A4r)=20

- [#14853](https://github.com/ocaml/ocaml/issues/14853), CVE-2026-41083, OS=
EC-2026-05: fix quoting of filenames=20
passed to Filename.quote_command on Windows.=20
(David Allsopp, report by Andrew Nesbitt, review by Florian Angeletti)=20


--=_d8422e55-5759-4e6e-b61f-b99e9da155d1
Content-Type: text/html; charset=utf-8
Content-Transfer-Encoding: quoted-printable

<html><body><div style=3D"font-family: arial, helvetica, sans-serif; font-s=
ize: 12pt; color: #000000"><div>Dear OCaml users,<br><br>We have the pleasu=
re of celebrating the birthday of Blaise Pascal by announcing the release o=
f OCaml version 5.5.0.<br><br>Some of the highlights in OCaml 5.5.0 are:<br=
><br>### Module-dependent Functions<br><br>Modules can now be used as funct=
ion arguments in a form of lightweight functors.<br><br>For instance, we ca=
n define a function for printing a map generated by<br>the `Map.Make` funct=
or:<br><br>&nbsp; &nbsp; let pp_map (module M: Map.S) pp_key pp_v ppf set =
=3D<br>&nbsp; &nbsp; &nbsp; if M.is_empty set then<br>&nbsp; &nbsp; &nbsp; =
&nbsp; Format.fprintf ppf "=C3=B8"<br>&nbsp; &nbsp; &nbsp; else<br>&nbsp; &=
nbsp; &nbsp; &nbsp; let pp_sep ppf () =3D Format.fprintf ppf ",@ " in<br>&n=
bsp; &nbsp; &nbsp; &nbsp; let pp_binding ppf (k,v) =3D<br>&nbsp; &nbsp; &nb=
sp; &nbsp; Format.fprintf ppf "@[%a@ =3D@ %a@]" pp_key k pp_v v<br>&nbsp; &=
nbsp; &nbsp; in<br>&nbsp; &nbsp; &nbsp; Format.fprintf ppf "@[{@ %a@ }@]"<b=
r>&nbsp; &nbsp; &nbsp;(Format.pp_print_seq ~pp_sep pp_binding) (M.to_seq se=
t)<br><br><br>We can then apply this function on a string map<br><br>&nbsp;=
 &nbsp; module String_map =3D Map.Make(String)<br><br>with<br><br>&nbsp; &n=
bsp; let () =3D<br>&nbsp; &nbsp; &nbsp; let m =3D String_map.of_list ["Zero=
", "Zero"; "One", "Un"] in<br>&nbsp; &nbsp; &nbsp; let pp_str =3D Format.pp=
_print_string in<br>&nbsp; &nbsp; &nbsp; Format.printf "%a@."<br>&nbsp; &nb=
sp; &nbsp; (pp_map (module String_map) pp_str pp_str) m<br><br>Compared to =
first-class modules, the type of the function `pp_map`<br><br>&nbsp; &nbsp;=
 type 'a printer =3D Format.formatter -&gt; 'a -&gt; unit<br>&nbsp; &nbsp; =
val pp_map: (module M: Map.S) -&gt; M.key printer -&gt; 'a printer -&gt; 'a=
 M.t printer<br><br>is dependent over the value of the module `S`, and thus=
 the function can only<br>applied over a statically known module:<br><br>&n=
bsp; &nbsp; let f (): (module Map.S) =3D<br>&nbsp; &nbsp; &nbsp; if Random.=
bool () then<br>&nbsp; &nbsp; &nbsp; &nbsp; (module Map.Make(Int))<br>&nbsp=
; &nbsp; &nbsp; else<br>&nbsp; &nbsp; &nbsp; &nbsp; (module Map.Make(Float)=
)<br>&nbsp; &nbsp; let fail =3D pp_map (f ())<br><br>&nbsp; &nbsp; &nbsp;Er=
ror: This expression has type<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; =
(module M : Map.S) -&gt;<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; (Form=
at.formatter -&gt; M.key -&gt; unit) -&gt;<br>&nbsp; &nbsp; &nbsp; &nbsp; &=
nbsp; &nbsp;(Format.formatter -&gt; 'a -&gt; unit) -&gt; Format.formatter -=
&gt; 'a M.t -&gt; unit<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;but an expressi=
on was expected of type (module Map.S) -&gt; 'b<br>&nbsp; &nbsp; &nbsp; &nb=
sp; &nbsp;The module M would escape its scope<br>&nbsp; &nbsp; This functio=
n is module-dependent. The dependency is preserved<br>&nbsp; &nbsp; when th=
e function is passed a static module argument (module M : S)<br>&nbsp; &nbs=
p; or (module M). Its argument here is not static, so the type-checker<br>&=
nbsp; &nbsp; tried instead to change the function type to be non-dependent.=
<br><br><br>### Relocatable Compiler<br><br>A compiler installation can now=
 be moved or copied with no risk<br>of hard-to-debug errors due to mixing i=
ncompatible bytecode runtime interpreters.<br><br>In practice, this means t=
hat creating a local switch when there is a<br>global switch with the same =
compiler version and configuration<br>available can be done by cloning the =
global switch rather than<br>recompiling the whole compiler.<br><br>This sh=
ould considerably reduce the time required to create<br>new local opam swit=
ches out-of-the-box.<br><br>### Polymorphic Functions as Function Arguments=
<br><br>Higher-rank polymorphic functions can now be defined directly by<br=
>using an explicit type annotation in a function argument<br><br>&nbsp; &nb=
sp; let apply_map (map: 'a 'b. ('a -&gt; 'b) -&gt; 'a list -&gt; 'b list) =
=3D<br>&nbsp; &nbsp; &nbsp; map string_of_int [1;2;3], map List.singleton [=
"x"; "y"]<br>&nbsp; &nbsp; let _ =3D apply_map List.map<br><br>Previously d=
efining such a function required going through either a record or an object=
<br>with a polymorphic field or methods<br><br>&nbsp; &nbsp; type map =3D {=
 map: 'a 'b. ('a -&gt; 'b) -&gt; 'a list -&gt; 'b list }<br>&nbsp; &nbsp; l=
et apply_map {map} =3D<br>&nbsp; &nbsp; &nbsp; map string_of_int [1;2;3], m=
ap List.singleton ["x"; "y"]<br><br>### Search and Replace Substring Functi=
ons<br><br>The `String` module has been extended with many functions<br>for=
 searching and replacing substrings inside a string.<br><br>&nbsp; &nbsp; l=
et _true =3D String.includes ~affix:"aba" "abbaba"<br>&nbsp; &nbsp; let sen=
tence =3D String.replace_all ~sub:"=F0=9D=84=BD" ~by:"word" "A =F0=9D=84=BD=
 is re=F0=9D=84=BDed"<br><br>The substring search is using the 2-way string=
 matching algorithm<br>which has the advantage of requiring constant space =
memory overhead<br>independently of the needle size.<br><br>### Generalised=
 Local Definitions<br><br>It is now always possible to define locally a typ=
e,<br>a class, a module type or any kind of item that can be defined<br>glo=
bally:<br><br>&nbsp; &nbsp; let mandelbrot n x =3D<br>&nbsp; &nbsp; &nbsp; =
let type t =3D Converge | Escape of int in<br>&nbsp; &nbsp; &nbsp; ...<br>&=
nbsp; &nbsp; &nbsp; match orbit n x with<br>&nbsp; &nbsp; &nbsp;| Converge =
-&gt; 0<br>&nbsp; &nbsp; &nbsp;| Exit_at n -&gt; colorize n<br><br>### Exte=
rnal Types<br><br>When interfacing with foreign function libraries, it is n=
ow possible<br>to define external type<br><br>&nbsp; &nbsp; type int_gmp =
=3D external "mpz_t"<br>&nbsp; &nbsp; type float_gmp =3D external "mpf_t"<b=
r><br>Compared to an abstract type definition, the external type name<br>"m=
pz_t" (resp. `mpf_t`) makes the type distinguishable from any<br>non-abstra=
ct types or external types with a different name.<br><br>In particular, thi=
s makes FFI types better behaved when combined with<br>Generalised Abstract=
 Data Types (GADTs). For instance, The typechecker<br>is able to prove that=
<br><br>&nbsp; &nbsp; &nbsp;let ok: (int_gmp,[` A] ) Type.eq -&gt; _ =3D fu=
nction _ -&gt; .<br><br>is a total function because the external type `int_=
gmp` is not compatible<br>with a polymorphic variant type.<br><br>### Warni=
ng: Abstract types in the current module<br><br>The astute reader has proba=
bly noticed in the definition above that,<br>in OCaml 5.4.0, the typechecke=
r does accept<br><br>&nbsp; &nbsp; &nbsp;type int_gmp<br>&nbsp; &nbsp; let =
ok: (int_gmp, [` A] ) Type.eq -&gt; _ =3D function _ -&gt; .<br><br>as tota=
l.<br><br>Indeed until OCaml 5.5.0, abstract types defined in the current m=
odule<br><br>&nbsp; &nbsp; type a<br>&nbsp; &nbsp; type b<br><br>were consi=
dered as unique and provably different<br><br>&nbsp; &nbsp; &nbsp;let f: 'x=
. (a,b) Type.eq -&gt; 'x =3D function _ -&gt; .<br><br>However, this specia=
l rule for local definition of abstract types was<br>very brittle. As soon =
as one moved outside of the current module, it<br>was no longer possible to=
 prove that the types were different.<br><br>&nbsp; &nbsp; &nbsp;module M =
=3D struct<br>&nbsp; &nbsp; &nbsp; &nbsp;type a<br>&nbsp; &nbsp; &nbsp; &nb=
sp;type b<br>&nbsp; &nbsp; &nbsp;end<br>&nbsp; &nbsp; let fail: 'x. (M.a,M.=
b) Type.eq -&gt; 'x =3D function _ -&gt; .<br><br>&nbsp; &nbsp; &nbsp;Error=
: This match case could not be refuted.<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbs=
p; &nbsp; &nbsp; Here is an example of a value that would reach it: Equal<b=
r><br>This special typechecking rule has been removed in OCaml 5.5.0. If yo=
u were relying on it,<br>for instance, because you used an abstract type as=
 type-level label in a GADTs, you<br>can change your abstract type definiti=
on to a possibly private abbreviation of a polymorphic variant<br><br>&nbsp=
; &nbsp; &nbsp;type a =3D private [`A]<br>&nbsp; &nbsp; &nbsp;type b =3D [`=
B]<br><br>or a (possibly private) sum type<br><br>&nbsp; &nbsp; &nbsp;type =
a =3D A<br>&nbsp; &nbsp; &nbsp;type b =3D private B<br><br>If you were usin=
g an abstract type as both a type-level label and a FFI type, you<br>can no=
w use an external type definition which will give you a provably distinct t=
ype<br>even outside of the current module.<br><br>### GC improvements<br><b=
r>Some of the ongoing work to improve the pacing of the garbage<br>collecto=
r has been integrated in OCaml 5.5.0, two of the important<br>changes in OC=
aml 5.5 GC are<br><br>- the addition of a sweep-only phase at the start of =
major GC<br>- the addition of an idle phase to smooth the behaviour of the =
GC<br>&nbsp; at the start.<br><br>### Many incremental changes<br><br>- The=
 Windows implementation is no more reliant on Winpthreads<br>- Around 60 ne=
w standard library functions<br>- Around 90 various improvements<br>- A doz=
en of documentation updates<br>- Around 40 bug fixes<br><br>Please report a=
ny unexpected behaviours on the [OCaml issue<br>tracker](https://github.com=
/ocaml/ocaml/issues) and post any questions or<br>comments you might have o=
n our discussion forums at </div><div><br data-mce-bogus=3D"1"></div><div>-=
 <a href=3D"https://discuss.ocaml.org">https://discuss.ocaml.org</a><br><br=
>The full list of changes can be found in the full changelog.<br><br>Happy =
hacking,<br>Florian Angeletti for the OCaml team.<br><br><br>Installation I=
nstructions<br></div><div>-------------------------------</div><div><br>The=
 base compiler can be installed as an opam switch with the following comman=
ds:<br><br>&nbsp; &nbsp; &nbsp;opam update<br>&nbsp; &nbsp; &nbsp;opam swit=
ch create 5.5.0<br><br>The source code for the release is also directly ava=
ilable on:<br><br>- GitHub: https://github.com/ocaml/ocaml/releases/downloa=
d/5.5.0/ocaml-5.5.0.tar.gz<br>- OCaml archives at Inria: https://caml.inria=
.fr/pub/distrib/ocaml-5.5/ocaml-5.5.0.tar.gz<br><br>### Fine-Tuned Compiler=
 Configuration<br><br>If you want to tweak the configuration of the compile=
r, you can switch to the option variant with:<br><br>&nbsp; &nbsp; opam upd=
ate<br>&nbsp; &nbsp; opam switch create &lt;switch_name&gt; ocaml-variants.=
5.5.0+options &lt;option_list&gt;<br><br>where `&lt;option_list&gt;` is a s=
pace separated list of `ocaml-option-*` packages. For instance, for a `flam=
bda` and `no-flat-float-array` switch:<br><br>&nbsp; &nbsp; opam switch cre=
ate 5.5.0+flambda+nffa ocaml-variants.5.5.0+options ocaml-option-flambda oc=
aml-option-no-flat-float-array<br><br><br>Changes in OCaml 5.5.0<br></div><=
div>---------------------------------</div><div>&nbsp;&nbsp;<br>### Languag=
e features:<br><br>* (*breaking change*) [#13681](https://github.com/ocaml/=
ocaml/issues/13681), [#13682](https://github.com/ocaml/ocaml/issues/13682),=
 [#13683](https://github.com/ocaml/ocaml/issues/13683), [#13684](https://gi=
thub.com/ocaml/ocaml/issues/13684), [#13275](https://github.com/ocaml/ocaml=
/issues/13275) :<br>&nbsp; Introduce a new type `(module M : S) -&gt; t[M]`=
 that corresponds to<br>&nbsp; module-dependent functions (also called: mod=
ular explicits).<br>&nbsp; &nbsp; val mapM: (module M : Monad) (f : 'a -&gt=
; 'b M.t) : 'a list -&gt; 'b list M.t<br>&nbsp; (Samuel Vivien review by Le=
o White, Gabriel Scherer, Florian Angeletti,<br>&nbsp; &nbsp; Jacques Garri=
gue and Stephen Dolan)<br><br>- [#14040](https://github.com/ocaml/ocaml/iss=
ues/14040): generalize the constructs `let module`, `let exception` and `le=
t open`<br>&nbsp; to most other structure items, for example:<br>&nbsp; &nb=
sp; let type t =3D ... in ...<br>&nbsp; &nbsp; let type Effect.t +=3D Yield=
 in ...<br>&nbsp; (Nicol=C3=A1s Ojeda B=C3=A4r, review by Valentin Gatien-B=
aron)<br><br>- [#13806](https://github.com/ocaml/ocaml/issues/13806): Enabl=
e the use of function parameters with polymorphic types.<br>&nbsp; &nbsp; l=
et extract (getter : 'a . 'a t -&gt; 'a) =3D ...<br>&nbsp; &nbsp; let runST=
 (m : 's . ('s, 'a) ST.t) : 'a =3D ...<br>&nbsp; (Ulysse G=C3=A9rard, Leo W=
hite, review by Florian Angeletti, Samuel Vivien, Gabriel<br>&nbsp; Scherer=
 and Jacques Garrigue)<br><br><br>* (*breaking change*) [#13712](https://gi=
thub.com/ocaml/ocaml/issues/13712): Introduce a new kind `Type_external` an=
d syntax<br>&nbsp; `type t =3D external "name"` to discriminate external ty=
pes from other types<br>&nbsp; and each other.&nbsp; This PR turns primitiv=
e types into external and removes the<br>&nbsp; past behavior of discrimina=
ting abstract types defined in the current module.<br>&nbsp; (Takafumi Saik=
awa, Jacques Garrigue, review by Richard Eisenberg)<br><br>* (*breaking cha=
nge*) [#14009](https://github.com/ocaml/ocaml/issues/14009): infix extensio=
n points/attributes appearing in local structure items,<br>&nbsp; eg `let m=
odule%foo[@bar] ... in ...` are attached to the AST node of the<br>&nbsp; c=
orresponding structure item (similar to their global counterparts) and no<b=
r>&nbsp; longer to the enclosing `let` expression.&nbsp; Extension points/a=
ttributes that<br>&nbsp; are to be attached to the enclosing `let` expressi=
on are to be written next to<br>&nbsp; the `let` keyword, eg `let%foo[@bar]=
 module ... in ...`. The same holds for<br>&nbsp; `let exception` and `let =
open`.<br>&nbsp; (Nicol=C3=A1s Ojeda B=C3=A4r, review by Gabriel Scherer)<b=
r><br>- [#14029](https://github.com/ocaml/ocaml/issues/14029): Recognize `%=
identity` as nonexpansive<br>&nbsp; (Stephen Dolan and Olivier Nicole, revi=
ew by Hugo Heuzard, Jacques Garrigue,<br>&nbsp; Jeremy Yallop,&nbsp; and Ga=
briel Scherer)<br><br>### Standard library:<br><br>- [#13372](https://githu=
b.com/ocaml/ocaml/issues/13372): New Format and Printf printf-like function=
s that accept a<br>&nbsp; &nbsp;heterogeneous list as arguments.<br>&nbsp; =
&nbsp; Format.lprintf "@[%s@ %d@]@." [ "x =3D"; 1 ]<br>&nbsp; (Leonardo San=
tos, review by Florian Angeletti and Gabriel Scherer)<br><br>- [#14437](htt=
ps://github.com/ocaml/ocaml/issues/14437): Add String.split_{first,last,all=
} and String.rsplit_all<br>&nbsp; &nbsp; split_first: sep:string -&gt; stri=
ng -&gt; (string * string) option<br>&nbsp; &nbsp; split_all: sep:string -&=
gt; drop:(string -&gt; bool) -&gt; string -&gt; string list<br>&nbsp; (Dani=
el B=C3=BCnzli, review by Nicol=C3=A1s Ojeda B=C3=A4r and Florian Angeletti=
)<br><br>- [#14436](https://github.com/ocaml/ocaml/issues/14436): Add Strin=
g.replace_{first,last,all}<br>&nbsp; &nbsp; replace_first: sub:string -&gt;=
 by:string -&gt; ?start:int -&gt; string -&gt; string<br>&nbsp; (Daniel B=
=C3=BCnzli, review by Nicol=C3=A1s Ojeda B=C3=A4r, Ali Caglayan and<br>&nbs=
p; &nbsp;Florian Angeletti)<br><br>- [#14439](https://github.com/ocaml/ocam=
l/issues/14439): Add String.includes, to complete the trio:<br>&nbsp; &nbsp=
; starts_with: prefix:string -&gt; string -&gt; bool<br>&nbsp; &nbsp; ends_=
with: suffix:string -&gt; string -&gt; bool<br>&nbsp; &nbsp; includes: affi=
x:string -&gt; string -&gt; bool<br>&nbsp; (Daniel B=C3=BCnzli, review by N=
icol=C3=A1s Ojeda B=C3=A4r and Olivier Nicole)<br><br>- [#14381](https://gi=
thub.com/ocaml/ocaml/issues/14381): Add String.find_{first,last}_index, Str=
ing.find_{first,last},<br>&nbsp; String.[r]find_all.<br>&nbsp; &nbsp; find_=
first_index: (char -&gt; bool) -&gt; ?start:int -&gt; string -&gt; int opti=
on<br>&nbsp; (Daniel B=C3=BCnzli, review by Nicol=C3=A1s Ojeda B=C3=A4r, Al=
i Caglayan and<br>&nbsp; &nbsp;Florian Angeletti)<br><br>- [#14438](https:/=
/github.com/ocaml/ocaml/issues/14438): Add String.is_empty<br>&nbsp; (Danie=
l B=C3=BCnzli, review by Nicol=C3=A1s Ojeda B=C3=A4r and Gabriel Scherer)<b=
r><br>- [#14440](https://github.com/ocaml/ocaml/issues/14440): Add String.o=
f_char<br>&nbsp; (Daniel B=C3=BCnzli, review by Nicol=C3=A1s Ojeda B=C3=A4r=
 and Gabriel Scherer)<br><br>- [#14352](https://github.com/ocaml/ocaml/issu=
es/14352): Add String.{drop,take,cut}_{first,last}.<br>&nbsp; &nbsp; take_f=
irst: int -&gt; string -&gt; string<br>&nbsp; &nbsp; cut_first: int -&gt; s=
tring -&gt; string * string<br>&nbsp; (Daniel B=C3=BCnzli, review by David =
Allsopp, Nicol=C3=A1s Ojeda B=C3=A4r and<br>&nbsp; Vincent Laviron)<br><br>=
- [#14362](https://github.com/ocaml/ocaml/issues/14362): Add String.{drop,t=
ake,cut}_{first,last}_while<br>&nbsp; &nbsp; drop_first_while: (char -&gt; =
bool) -&gt; string -&gt; string<br>&nbsp; (Daniel B=C3=BCnzli, review by Ni=
col=C3=A1s Ojeda B=C3=A4r and David Allsopp)<br><br>- [#13916](https://gith=
ub.com/ocaml/ocaml/issues/13916): Add Option.product and Option.Syntax.<br>=
&nbsp; (Nicol=C3=A1s Ojeda B=C3=A4r, review by Daniel B=C3=BCnzli, Gabriel =
Scherer and David<br>&nbsp; Allsopp)<br><br>- [#13995](https://github.com/o=
caml/ocaml/issues/13995): Option.blend: ('a -&gt; 'a -&gt; 'a) -&gt; 'a opt=
ion -&gt; 'a option -&gt; 'a option<br>&nbsp; (Kate Deplaix, review by Dani=
el B=C3=BCnzli, Gabriel Scherer,<br>&nbsp; &nbsp;Nicol=C3=A1s Ojeda B=C3=A4=
r, Florian Angeletti and Josh Berdine)<br><br>- [#13920](https://github.com=
/ocaml/ocaml/issues/13920): add Option.{for_all, exists}<br>&nbsp; (Gabriel=
 Scherer, review by Kate Deplaix, Nicol=C3=A1s Ojeda B=C3=A4r, Richard Eise=
nberg<br>&nbsp; and Jeremy Yallop)<br><br>- [#14185](https://github.com/oca=
ml/ocaml/issues/14185): List.split_map: ('a -&gt; 'b * 'c) -&gt; 'a list -&=
gt; 'b list * 'c list<br>&nbsp; (Jeremy Yallop, review by Daniel B=C3=BCnzl=
i, Nicol=C3=A1s Ojeda B=C3=A4r and Damien Doligez)<br><br>- [#14043](https:=
//github.com/ocaml/ocaml/issues/14043), [#14393](https://github.com/ocaml/o=
caml/issues/14393): Lazy.Mutexed: simple mutex-protected lazy thunks,<br>&n=
bsp; that may block the entire domain/thread on initialization races.<br>&n=
bsp; (Gabriel Scherer, suggestion by Kate Deplaix and Pierre Chambart,<br>&=
nbsp; review by KC Sivaramakrishnan, Florian Angeletti, Kate Deplaix<br>&nb=
sp; and Daniel B=C3=BCnzli)<br><br>- [#14118](https://github.com/ocaml/ocam=
l/issues/14118): Add {Set,Map}.S.is_singleton<br>&nbsp; (Kate Deplaix, revi=
ew by Daniel B=C3=BCnzli, Vincent Laviron, Nicol=C3=A1s Ojeda B=C3=A4r<br>&=
nbsp; &nbsp;and Stephen Dolan)<br><br>- [#14060](https://github.com/ocaml/o=
caml/issues/14060): Add Hashtbl.find_and_replace and Hashtbl.find_and_remov=
e.<br>&nbsp; &nbsp; find_and_replace: ('k, 'a) Hashtbl.t -&gt; 'k -&gt; 'a =
-&gt; 'a option<br>&nbsp; &nbsp; find_and_remove: ('k, 'a) Hashtbl.t -&gt; =
'k -&gt; 'a option<br>&nbsp; (Sacha-=C3=89lie Ayoun, review by Nicol=C3=A1s=
 Ojeda B=C3=A4r and Gabriel Scherer)<br><br>- [#14227](https://github.com/o=
caml/ocaml/issues/14227): Add List.filter_mapi.<br>&nbsp; (=C3=89mile Troti=
gnon, review by Nicol=C3=A1s Ojeda B=C3=A4r, Jan Midtgaard and<br>&nbsp; &n=
bsp;Damien Doligez)<br><br>- [#14432](https://github.com/ocaml/ocaml/issues=
/14432): Add floor division, ceil division, Euclidean division and remainde=
r<br>&nbsp; to the Int, Int32, Int64 and Nativeint modules: `fdiv`, `cdiv`,=
 `ediv`.<br>&nbsp; (Xavier Leroy, review by Ali Caglayan, Nicol=C3=A1s Ojed=
a B=C3=A4r, Gabriel Scherer)<br><br>- [#14433](https://github.com/ocaml/oca=
ml/issues/14433): Add bit-counting functions `leading_zeros`, `leading_sign=
_bits`,<br>&nbsp; `trailing_zeros`, `bit_count`, `unsigned_bitsize`, `signe=
d_bitsize`<br>&nbsp; to Int, Int32, Int64, and Nativeint<br>&nbsp; (Xavier =
Leroy, review by Ali Caglayan and David Allsopp)<br><br><br>- [#10177](http=
s://github.com/ocaml/ocaml/issues/10177): Seq.(delay : (unit -&gt; 'a t) -&=
gt; 'a t)<br>&nbsp; (Gabriel Scherer, review by Jeremy Yallop and Fran=C3=
=A7ois Pottier)<br><br>- [#13343](https://github.com/ocaml/ocaml/issues/133=
43): Add Array.stable_sort_sub<br>&nbsp; (Fran=C3=A7ois Pottier, review by =
Gabriel Scherer, Corentin Leruth and Nicol=C3=A1s<br>&nbsp; &nbsp;Ojeda B=
=C3=A4r)<br><br>- [#14363](https://github.com/ocaml/ocaml/issues/14363): Pr=
eserve the backtrace at exceptional domain termination. Domain.join<br>&nbs=
p; on an exceptionally terminated domain re-raises the exception with the<b=
r>&nbsp; backtrace.<br>&nbsp; (KC Sivaramakrishnan, report by Nathan Taylor=
, review by Gabriel Scherer,<br>&nbsp; David Allsopp)<br><br>- [#13728](htt=
ps://github.com/ocaml/ocaml/issues/13728): Add Sys.runtime_executable conta=
ining the full path (if available) to<br>&nbsp; the currently executing run=
time.<br>&nbsp; (David Allsopp, review by Nicol=C3=A1s Ojeda B=C3=A4r and D=
aniel B=C3=BCnzli)<br><br>- [#14086](https://github.com/ocaml/ocaml/issues/=
14086): Add Domain.count.<br>&nbsp; (Nicol=C3=A1s Ojeda B=C3=A4r, review by=
 David Allsopp, Gabriel Scherer, Daniel B=C3=BCnzli<br>&nbsp; and KC Sivara=
makrishnan)<br><br>- [#12877](https://github.com/ocaml/ocaml/issues/12877):=
 Dynarray.rev_iter, Dynarray.rev_iteri<br>&nbsp; (Gabriel Scherer, review b=
y L=C3=A9o Andr=C3=A8s, Jeremy Yallop and Nicol=C3=A1s Ojeda B=C3=A4r)<br><=
br>- [#14084](https://github.com/ocaml/ocaml/issues/14084): Future-proof Dy=
narray implementation against a smarter compiler<br>&nbsp; (Basile Cl=C3=A9=
ment, review by Gabriel Scherer)<br><br>### Tools:<br><br>- [#13728](https:=
//github.com/ocaml/ocaml/issues/13728), [#14014](https://github.com/ocaml/o=
caml/issues/14014), [#14243](https://github.com/ocaml/ocaml/issues/14243), =
[#14244](https://github.com/ocaml/ocaml/issues/14244), [#14245](https://git=
hub.com/ocaml/ocaml/issues/14245) : The compiler is now relocatable: it<br>=
&nbsp; can be copied/moved to a different directory and everything still<br=
>&nbsp; works.<br>&nbsp; (David Allsopp, review by Nicol=C3=A1s Ojeda B=C3=
=A4r, Jonah Beckford, Daniel B=C3=BCnzli,<br>&nbsp; &nbsp;Antonin D=C3=A9ci=
mo, Damien Doligez, Hugo Heuzard, Samuel Hym,<br>&nbsp; &nbsp;and Vincent L=
aviron)<br><br><br>- [#14055](https://github.com/ocaml/ocaml/issues/14055):=
 Invert BUILD_PATH_PREFIX_MAP in directories loaded at startup<br>&nbsp; by=
 the debugger.<br>&nbsp; (Pierre Boutillier, review by Gabriel Scherer and =
Daniel B=C3=BCnzli)<br><br>* (*breaking change*) [#13638](https://github.co=
m/ocaml/ocaml/issues/13638): ocamlmklib exits with code 4 if passed an unre=
cognised option, as it<br>&nbsp; does with an unrecognised file.<br>&nbsp; =
(David Allsopp, review by Antonin D=C3=A9cimo and S=C3=A9bastien Hinderer)<=
br><br>- [#13941](https://github.com/ocaml/ocaml/issues/13941), [#13961](ht=
tps://github.com/ocaml/ocaml/issues/13961): Fix `ocamltest` variable handin=
g.<br>&nbsp; (Damien Doligez, report by Olivier Nicole, review by Gabriel S=
cherer)<br><br>- [#13962](https://github.com/ocaml/ocaml/issues/13962): Lit=
tle ocamltest refactors. Fix error handling in C code,<br>&nbsp; leaking fi=
le descriptors, code style.<br>&nbsp; (Antonin D=C3=A9cimo, review by Gabri=
el Scherer)<br><br>- [#14059](https://github.com/ocaml/ocaml/issues/14059):=
 Fix flaky TSan tests<br>&nbsp; (Fabrice Buoro and Olivier Nicole, review b=
y Gabriel Scherer)<br><br>- [#13966](https://github.com/ocaml/ocaml/issues/=
13966), [#13969](https://github.com/ocaml/ocaml/issues/13969): Enable "gene=
ralized polymorphic #install_printer"<br>&nbsp; in the debugger<br>&nbsp; (=
Pierre Boutillier and Gabriel Scherer, review by Florian Angeletti)<br><br>=
- [#14063](https://github.com/ocaml/ocaml/issues/14063) : Debugger fallback=
s to "looking for 'module_name'.ml in the<br>&nbsp; loadpath" when seeking =
source files. It improves hit rate for<br>&nbsp; sources of installed packa=
ges.<br>&nbsp; (Pierre Boutillier, review by Gabriel Scherer)<br><br>- [#14=
032](https://github.com/ocaml/ocaml/issues/14032), [#14034](https://github.=
com/ocaml/ocaml/issues/14034): Update to and require FlexDLL 0.44.<br>&nbsp=
; (Jan Midtgaard, Antonin D=C3=A9cimo, review by David Allsopp)<br><br>- [#=
14239](https://github.com/ocaml/ocaml/issues/14239): Fix `#show_constructor=
` when printing non-GADT type parameters<br>&nbsp; (Takafumi Saikawa, Jacqu=
es Garrigue, review by Gabriel Scherer)<br><br>- [#14245](https://github.co=
m/ocaml/ocaml/issues/14245): ocamlobjinfo now displays the runtime invoked =
by a bytecode<br>&nbsp; executable (either from the RNTM section or by anal=
ysing the shebang lines)<br>&nbsp; (David Allsopp, review by Damien Doligez=
 and Samuel Hym)<br><br>### Runtime system:<br><br>- [#14365](https://githu=
b.com/ocaml/ocaml/issues/14365): Add an Idle phase to the GC for better per=
formance on small<br>&nbsp; heaps and for a smooth start at program launch =
and after a forced major GC.<br>&nbsp; (Damien Doligez, review by Stephen D=
olan and Nick Barnes)<br><br>- [#13416](https://github.com/ocaml/ocaml/issu=
es/13416): Implement concurrency primitives using WinAPI instead of<br>&nbs=
p; winpthreads on Windows.<br>&nbsp; (Antonin D=C3=A9cimo, review by Samuel=
 Hym, Gabriel Scherer, Miod Vallat,<br>&nbsp; B. Szilvasy, and Nicol=C3=A1s=
 Ojeda B=C3=A4r)<br><br>- [#14367](https://github.com/ocaml/ocaml/issues/14=
367): Gc.Tweak mechanism to allow named GC parameters<br>&nbsp; (Stephen Do=
lan and Nick Barnes, review by Gabriel Scherer, David Allsopp and<br>&nbsp;=
 Antonin D=C3=A9cimo)<br><br>- [#13574](https://github.com/ocaml/ocaml/issu=
es/13574), [#13594](https://github.com/ocaml/ocaml/issues/13594): Generatio=
nal scanning of stack frames for ARM 64 bits, POWER,<br>&nbsp; and RISC-V. =
This reduces minor GC work in the presence of deep call stacks.<br>&nbsp; (=
Xavier Leroy, review by Miod Vallat, Gabriel Scherer and Olivier Nicole)<br=
><br>- [#14416](https://github.com/ocaml/ocaml/issues/14416): Spawned domai=
ns will record backtraces if the parent domain has<br>&nbsp; enabled it.<br=
>&nbsp; (Nathan Taylor, review by Gabriel Scherer)<br><br>- [#14275](https:=
//github.com/ocaml/ocaml/issues/14275): Add function caml_c_thread_register=
_in_domain, which makes it<br>&nbsp; possible to register "C threads" in an=
other domain than 0 (which is<br>&nbsp; what caml_c_thread_register does). =
The function takes a domain unique<br>&nbsp; ID in which to register the th=
read. The domain must be running<br>&nbsp; when the function is called.<br>=
&nbsp; (Jack N=C3=B8rskov J=C3=B8rgensen, review by Gabriel Scherer,<br>&nb=
sp; &nbsp;Guillaume Munch-Maccagnoni)<br><br><br>- [#13616](https://github.=
com/ocaml/ocaml/issues/13616): Change free list representation in shared he=
ap<br>&nbsp; (Sadiq Jaffer, review by Damien Doligez)<br><br>- [#13580](htt=
ps://github.com/ocaml/ocaml/issues/13580): Introduce sweep-only phase at st=
art of major GC cycle,<br>&nbsp; to reduce latent-garbage delay and therefo=
re improve GC performance.<br>&nbsp; (Stephen Dolan and Nick Barnes, review=
 by KC Sivaramakrishnan)<br><br>- [#14053](https://github.com/ocaml/ocaml/i=
ssues/14053): Statmemprof: it is now possible to replace a profile in the<b=
r>&nbsp; current domain without stopping it in all domains.<br>&nbsp; Added=
 the function [Gc.Memprof.is_sampling].<br>&nbsp; (Guillaume Munch-Maccagno=
ni, review by Gabriel Scherer)<br><br>- [#14168](https://github.com/ocaml/o=
caml/issues/14168): restore the stack size statistic in `Gc.stat` and adds =
a new<br>&nbsp; `live_stacks_words` field tracking the total size in words =
of live stacks.<br>&nbsp; (Florian Angeletti, review by Gabriel Scherer)<br=
><br>- [#14189](https://github.com/ocaml/ocaml/issues/14189): Add runtime c=
ounters EV_C_MINOR_PROMOTED_WORDS and<br>&nbsp; EV_C_MINOR_ALLOCATED_WORDS.=
 EV_C_MINOR_PROMOTED_WORDS reports words promoted<br>&nbsp; by minor GC and=
 EV_C_MINOR_ALLOCATED_WORDS reports words allocated by minor<br>&nbsp; GC. =
Both have equivalent bytes counters. Also updated the documentation for<br>=
&nbsp; EV_C_MINOR_PROMOTED and EV_C_MINOR_ALLOCATED to qualify scope of the=
 values<br>&nbsp; reported as being per-domain.<br>&nbsp; (Tim McGilchrist,=
 review by Nick Barnes, Sadiq Jaffer and<br>&nbsp; Gabriel Scherer)<br><br>=
* (*breaking change*) [#14243](https://github.com/ocaml/ocaml/issues/14243)=
: Explicit relative paths in ld.conf (".", "..", "./&lt;path...&gt;",<br>&n=
bsp; "../&lt;path...&gt;") are interpreted as being relative to the directo=
ry ld.conf<br>&nbsp; was loaded from, and the default ld.conf now uses rela=
tive paths, rather than<br>&nbsp; embedding the absolute path to the Standa=
rd Library. The brave may continue to<br>&nbsp; put implicit paths in ld.co=
nf. The interpretation of CAML_LD_LIBRARY_PATH is<br>&nbsp; unaltered. Addi=
tionally, ld.conf is loaded from all of $OCAMLLIB/ld.conf,<br>&nbsp; $CAMLL=
IB/ld.conf and standard_library_default/ld.conf rather than just the<br>&nb=
sp; first one found. ld.conf files with CRLF line endings are now consisten=
tly<br>&nbsp; normalised on both Windows and Unix.<br>&nbsp; (David Allsopp=
, review by Jonah Beckford, Damien Doligez and Hugo Heuzard)<br><br>- [#142=
44](https://github.com/ocaml/ocaml/issues/14244): Added --with-relative-lib=
dir which allows the runtime and the<br>&nbsp; compilers to locate the Stan=
dard Library relative to where the binaries<br>&nbsp; themselves are instal=
led, removing the absolute path previously embedded in<br>&nbsp; caml_stand=
ard_library_default. Executables linked with `ocamlc -custom` now<br>&nbsp;=
 always attempt to load bytecode from the executable itself, rather than fi=
rst<br>&nbsp; trying `argv[0]`.<br>&nbsp; (David Allsopp, review by Jonah B=
eckford, Antonin D=C3=A9cimo, Damien Doligez,<br>&nbsp; &nbsp;Samuel Hym an=
d Vincent Laviron)<br><br>- [#14245](https://github.com/ocaml/ocaml/issues/=
14245): Introduce Runtime IDs for use in filename mangling to allow differe=
nt<br>&nbsp; configurations and different versions of the runtime system to=
 coexist<br>&nbsp; harmoniously on a single system. The IDs are used, along=
 with the host<br>&nbsp; triplet, to provide mangled names for the ocamlrun=
 executable and its variants<br>&nbsp; and the DLL versions of both the byt=
ecode and native runtimes, with symlinks<br>&nbsp; created for the original=
 names. They are also used to mangle the names of stub<br>&nbsp; libraries =
so that stub libraries compiled for a given configuration of the<br>&nbsp; =
runtime will only be sought by that runtime. The behaviour is disabled by<b=
r>&nbsp; configuring with --disable-suffixing.<br>&nbsp; (David Allsopp, re=
view by Damien Doligez and Samuel Hym)<br><br>- [#12269](https://github.com=
/ocaml/ocaml/issues/12269), [#12410](https://github.com/ocaml/ocaml/issues/=
12410), [#13063](https://github.com/ocaml/ocaml/issues/13063): Fix unsafety=
, deadlocks, and/or leaks should<br>&nbsp; rare errors happen during domain=
 creation and thread<br>&nbsp; creation/registration.<br>&nbsp; (Guillaume =
Munch-Maccagnoni, review by Gabriel Scherer, B. Szilvasy,<br>&nbsp; &nbsp;M=
iod Vallat)<br><br>- [#14337](https://github.com/ocaml/ocaml/issues/14337):=
 Fix potential segfault due to the C callback mechanism dropping<br>&nbsp; =
continuations without calling `caml_continuation_use`.<br>&nbsp; (Max Slate=
r, review by Nick Barnes and Stephen Dolan)<br><br>- [#14461](https://githu=
b.com/ocaml/ocaml/issues/14461): Fix racy socketpair on Windows. Address-in=
-use errors would sometimes<br>&nbsp; occur when concurrent threads or proc=
esses were trying to create socketpairs.<br>&nbsp; (Jessie Grosen, review b=
y Antonin D=C3=A9cimo and Nicol=C3=A1s Ojeda B=C3=A4r)<br><br>- [#14820](ht=
tps://github.com/ocaml/ocaml/issues/14820): caml_ba_alloc must account for =
memory it allocated itself.<br>&nbsp; CAML_BA_SUBARRAY (introduced in 5.2) =
with data=3DNULL would result in the<br>&nbsp; Gc accounting for the alloca=
tion as 0 bytes, which can eventually lead<br>&nbsp; to OOM. This condition=
 never occurs in the compiler itself, but occurs<br>&nbsp; in external C bi=
ndings that attempt to create a new bigarray in the<br>&nbsp; shape of an e=
xisting one. For backwards compatibility ignore CAML_BA_SUBARRAY<br>&nbsp; =
when data is NULL.<br>&nbsp; (Edwin T=C3=B6r=C3=B6k, review by Damien Dolig=
ez)<br><br>### Type system:<br><br>- [#13781](https://github.com/ocaml/ocam=
l/issues/13781): Set scope of internal type nodes during abbreviation expan=
sion<br>&nbsp; rather than recursing during unification.<br>&nbsp; (Jacques=
 Garrigue, review by Gabriel Scherer)<br><br>* (*breaking change*) [#14066]=
(https://github.com/ocaml/ocaml/issues/14066): catch invalid aliases introd=
uced by signature constraints during<br>&nbsp; merging rather than in subty=
ping:<br>&nbsp; ```ocaml<br>&nbsp; &nbsp; module X =3D struct end module F =
(_:sig end) =3D struct end<br>&nbsp; &nbsp; module type T =3D (sig module X=
0 : sig end module X1 =3D X0 end)<br>&nbsp; &nbsp; &nbsp; with module X0 :=
=3D F(X)<br>&nbsp; ```<br>&nbsp; Before, it failed with a subtyping error. =
Now, it fails with a proper error,<br>&nbsp; explaining that `X1` would kee=
p an invalid alias to `F(X)`<br>&nbsp; (Clement Blaudeau, review by Florian=
 Angeletti)<br><br>* (*breaking change*) [#14100](https://github.com/ocaml/=
ocaml/issues/14100): Do not ignore type-constraints and module-constraints =
when building<br>&nbsp; the approximated signature of recursive modules. Ig=
noring those constraints<br>&nbsp; resulted in incorrect (wrong set of fiel=
ds, wrong shadowing between fields)<br>&nbsp; approximated signatures, fail=
ing to typecheck, as in:<br>&nbsp; ```ocaml<br>&nbsp; module X0 : sig type =
t end<br>&nbsp; module rec X : ((sig module A : sig end end) with module A =
:=3D X0)<br>&nbsp; and Y : sig type t =3D X.A.t end (* Unbound type constru=
ctor X.A.t *)<br>&nbsp; ```<br>&nbsp; Now, type and module constraints are =
properly merged during approximation ,<br>&nbsp; reusing the infrastructure=
 for normal merging of constraints, but disabling<br>&nbsp; any wellformedn=
ess check.<br>&nbsp; (Clement Blaudeau and Ryan Tjoa, review by Florian Ang=
eletti)<br><br>- [#14327](https://github.com/ocaml/ocaml/issues/14327): All=
ow retyping as-patterns that contain existentials<br>&nbsp; (completing [#1=
4229](https://github.com/ocaml/ocaml/issues/14229))<br>&nbsp; (Jacques Garr=
igue and Takafumi Saikawa, reported by Olivier Nicole,<br>&nbsp; &nbsp;revi=
ew by Gabriel Scherer)<br><br>- [#14434](https://github.com/ocaml/ocaml/iss=
ues/14434), [#14652](https://github.com/ocaml/ocaml/issues/14652): Protect =
check_counter_example_pat against polymorphic types,<br>&nbsp; restoring ty=
pe soundness.<br>&nbsp; (Stephen Dolan and Jacques Garrigue, report and rev=
iew by Alistair O'Brien)<br><br>### Compiler user-interface and warnings:<b=
r><br>- [#14330](https://github.com/ocaml/ocaml/issues/14330): add suggesti=
ons when a signature mismatch is likely to be be caused by<br>&nbsp; spellc=
hecking mistakes, for instance<br>&nbsp; ```<br>&nbsp; &nbsp; &nbsp; module=
 M: sig type albatross end =3D struct type albatros end<br>&nbsp; ```<br>&n=
bsp; (Malo Monin, Florian Angeletti, review by Gabriel Scherer)<br><br>- [#=
12628](https://github.com/ocaml/ocaml/issues/12628): Improved error message=
 for unsafe values: print out the full path for<br>&nbsp; the value that is=
 unsafe when they are detected during the compilation of<br>&nbsp; recursiv=
e modules.<br>&nbsp; (Shivam Acharya, review by Gabriel Scherer and Florian=
 Angeletti)<br><br><br>- [#14076](https://github.com/ocaml/ocaml/issues/140=
76), 14111: error messages, add a short explanation for mismatched<br>&nbsp=
; universal variables and universal quantifications.<br>&nbsp; (Florian Ang=
eletti, review by Gabriel Scherer)<br><br>- [#14126](https://github.com/oca=
ml/ocaml/issues/14126): Document the `-i-variance` option and `+-`, `-+` va=
riance indicators<br>&nbsp; in the reference manual.<br>&nbsp; (Takafumi Sa=
ikawa, review by Florian Angeletti)<br><br>- [#14146](https://github.com/oc=
aml/ocaml/issues/14146): add an error message for external declaration with=
<br>&nbsp; a non-syntactic arity<br>&nbsp; ```<br>&nbsp; &nbsp;external fai=
l: (int -&gt; int as 'a) -&gt; 'a =3D "%identity"<br>&nbsp; ```<br>&nbsp; r=
ather than failing with an internal error.<br>&nbsp; (Florian Angeletti, re=
view by Gabriel Scherer)<br><br>- [#14147](https://github.com/ocaml/ocaml/i=
ssues/14147): print row types in error messages when they are a type constr=
uctor,<br>&nbsp; e.g. `&lt; foo : int; .. as $0&gt;` when $0 is introduced =
by a GADT constructor<br>&nbsp; (Stefan Muenzel, review by Jacques Garrigue=
 and Florian Angeletti)<br><br>- [#14190](https://github.com/ocaml/ocaml/is=
sues/14190): `ocaml -e` now also processes `-init` (previously it was ignor=
ed).<br>&nbsp; (Emile Trotignon, review by David Allsopp and @ygrek)<br><br=
>- [#14225](https://github.com/ocaml/ocaml/issues/14225): do not raise unus=
ed-constructor warning on private<br>&nbsp; constructor in type implementat=
ions, for example<br>&nbsp; `type safe =3D private Safe`, which are typical=
ly used to<br>&nbsp; create new fresh/generative types (here `safe`) to be =
used<br>&nbsp; as GADT indices.<br>&nbsp; (Gabriel Scherer, review by Nicol=
=C3=A1s Ojeda B=C3=A4r and Florian Angeletti,<br>&nbsp; &nbsp;report by Kat=
e Deplaix)<br><br>- [#14244](https://github.com/ocaml/ocaml/issues/14244): =
Add -set-runtime-default option to the compiler, allowing the default<br>&n=
bsp; value of the Standard Library location used by the runtime to be overr=
idden.<br>&nbsp; (Antonin D=C3=A9cimo, review by David Allsopp, Jonah Beckf=
ord, Damien Doligez and<br>&nbsp; &nbsp;Samuel Hym)<br><br>- [#14245](https=
://github.com/ocaml/ocaml/issues/14245): New option -launch-method for ocam=
lc allows the method used by a<br>&nbsp; tendered bytecode executable to lo=
cate the interpreter to be given explicitly.<br>&nbsp; In particular, it ma=
kes it easier to specify the use of the executable<br>&nbsp; launcher on Un=
ix. New option -runtime-search extends the bytecode executable<br>&nbsp; he=
ader to be able to search for the runtime interpreter in the directory<br>&=
nbsp; containing the executable and in PATH rather than relying on a single=
<br>&nbsp; hard-coded path.<br>&nbsp; (David Allsopp, review by Damien Doli=
gez and Samuel Hym)<br><br>- [#14315](https://github.com/ocaml/ocaml/issues=
/14315): enable -i-variance also for classes and extension constructors,<br=
>&nbsp; and add description of -i-variance in manpages and the manual<br>&n=
bsp; (Takafumi Saikawa, review by Florian Angeletti and Jacques Garrigue)<b=
r><br>- [#14373](https://github.com/ocaml/ocaml/issues/14373): remove the O=
CAML_BINANNOT_WITHENV environment variable, and<br>&nbsp; &nbsp;always stri=
p typing environment in cmt files<br>&nbsp; &nbsp;(Florian Angeletti, revie=
w by David Allsopp)<br><br>### Other libraries:<br><br>- [#13700](https://g=
ithub.com/ocaml/ocaml/issues/13700), [#14454](https://github.com/ocaml/ocam=
l/issues/14454), [#14715](https://github.com/ocaml/ocaml/issues/14715): Use=
 POSIX thread-safe getgrnam_r, getgrgid_r,<br>&nbsp; getpwnam_r, getpwuid_r=
, gmtime_r, localtime_r, getlogin_r, and fix mktime<br>&nbsp; error checkin=
g.<br>&nbsp; (Antonin D=C3=A9cimo, review by Florian Angeletti, David Allso=
pp, Stefan Muenzel,<br>&nbsp; &nbsp;Gabriel Scherer, and Miod Vallat)<br><b=
r>- [#14406](https://github.com/ocaml/ocaml/issues/14406): Better handling =
of address length for unix sockets, improving Haiku<br>&nbsp; compatibility=
.<br>&nbsp; (Sylvain Kerjean, review by Antonin D=C3=A9cimo and Nicol=C3=A1=
s Ojeda B=C3=A4r)<br><br>* (*breaking change*) [#14046](https://github.com/=
ocaml/ocaml/issues/14046): On Windows, `Unix.kill pid Sys.sigkill` causes t=
he receiving process<br>&nbsp; to exit with code ERROR_PROCESS_ABORTED (106=
7) instead of 0.<br>&nbsp; (Nicol=C3=A1s Ojeda B=C3=A4r, review by Miod Val=
lat, Antonin D=C3=A9cimo and David Allsopp)<br><br>- [#14020](https://githu=
b.com/ocaml/ocaml/issues/14020): Add Unix.unsetenv.<br>&nbsp; (Nicol=C3=A1s=
 Ojeda B=C3=A4r, review by Antonin D=C3=A9cimo and David Allsopp)<br><br>- =
[#13447](https://github.com/ocaml/ocaml/issues/13447): Symmetrize shared `S=
ys` and `Unix` functions. Apply fixes<br>&nbsp; of [#12072](https://github.=
com/ocaml/ocaml/issues/12072), [#12184](https://github.com/ocaml/ocaml/issu=
es/12184), [#12320](https://github.com/ocaml/ocaml/issues/12320), and [#131=
66](https://github.com/ocaml/ocaml/issues/13166), from `Sys.rename` to<br>&=
nbsp; `Unix.rename`.&nbsp; Make `caml_sys_close` raise on error, allowing<b=
r>&nbsp; `Filename.temp_file` retries if close fails. Flush buffers when<br=
>&nbsp; calling `caml_sys_system_command` on Windows. Error with EINVAL<br>=
&nbsp; instead of ENOENT if the command string is not a valid C string.<br>=
&nbsp; (Antonin D=C3=A9cimo, review by Gabriel Scherer and Nicol=C3=A1s Oje=
da B=C3=A4r)<br><br>- [#14310](https://github.com/ocaml/ocaml/issues/14310)=
: Deprecate union sock_addr_union for struct sockaddr_storage<br>&nbsp; and=
 socklen_param_type for socklen_t.<br>&nbsp; (Antonin D=C3=A9cimo, review b=
y Nicol=C3=A1s Ojeda B=C3=A4r, David Allsopp and Samuel Hym)<br><br>- [#143=
91](https://github.com/ocaml/ocaml/issues/14391): unload native dynlinked o=
bjects when an error occurs and it is safe to<br>&nbsp; do so. (Fixes [#143=
23](https://github.com/ocaml/ocaml/issues/14323))<br>&nbsp; (Nicol=C3=A1s O=
jeda B=C3=A4r, review by Vincent Laviron)<br><br>### Code generation and op=
timizations:<br><br>- [#14583](https://github.com/ocaml/ocaml/issues/14583)=
: fix bug in linear scan spilling heuristic that in certain situations<br>&=
nbsp; could lead to miscompilations.<br>&nbsp; (Nicol=C3=A1s Ojeda B=C3=A4r=
, review by Vincent Laviron)<br><br>### Manual and documentation:<br><br>- =
[#14684](https://github.com/ocaml/ocaml/issues/14684), [#14782](https://git=
hub.com/ocaml/ocaml/issues/14782), [#14838](https://github.com/ocaml/ocaml/=
issues/14838): Improve ocamlc's and ocamlopt's manual pages and fix<br>&nbs=
p; small issues in the manual<br>&nbsp; (Samuel Hym, review by Florian Ange=
letti, Antonin D=C3=A9cimo, Gabriel Scherer and<br>&nbsp; Nicol=C3=A1s Ojed=
a B=C3=A4r)<br><br>- [#14397](https://github.com/ocaml/ocaml/issues/14397):=
 Improve documentation of type-directed disambiguation of array<br>&nbsp; l=
iterals<br>&nbsp; (Alicia Michael, review by Olivier Nicole and Florian Ang=
eletti)<br><br>- [#14293](https://github.com/ocaml/ocaml/issues/14293): Imp=
rove documentation of Runtime_events.Timestamp<br>&nbsp; (Rapha=C3=ABl Prou=
st, review by Gabriel Scherer)<br><br>- [#13747](https://github.com/ocaml/o=
caml/issues/13747): Document support for native debugging with GDB and LLDB=
.<br>&nbsp; &nbsp;(Tim McGilchrist, review by Daniel B=C3=BCnzli, Samuel Hy=
m, Olivier Nicole<br>&nbsp; &nbsp;and Antonin D=C3=A9cimo)<br><br>* (*break=
ing change*) [#13975](https://github.com/ocaml/ocaml/issues/13975): documen=
ted the `[@remove_aliases]` built-in attribute for signatures<br>&nbsp; (in=
troduced by [#1652](https://github.com/ocaml/ocaml/issues/1652) in 2018). S=
mall refactor of the code that fetches the<br>&nbsp; attribute.<br>&nbsp; (=
Clement Blaudeau, review by Gabriel Scherer)<br><br>- [#14002](https://gith=
ub.com/ocaml/ocaml/issues/14002): Add anchors to items and headings of the =
web version of the API<br>&nbsp; documentation for easier linking.<br>&nbsp=
; (Nicol=C3=A1s Ojeda B=C3=A4r, report by Louis Roch=C3=A9, review by Gabri=
el Scherer and<br>&nbsp; Florian Angeletti)<br><br>- [#14023](https://githu=
b.com/ocaml/ocaml/issues/14023): Add documentation for the [row_more] funct=
ion.<br>&nbsp; (Richard Eisenberg, review by Jacques Garrigue)<br><br>- [#1=
4038](https://github.com/ocaml/ocaml/issues/14038): Fall back immediately t=
o user-agent-defined fonts when web fonts<br>&nbsp; fail to load.<br>&nbsp;=
 (toastal)<br><br>- [#14048](https://github.com/ocaml/ocaml/issues/14048): =
document modular explicits<br>&nbsp; (Gabriel Scherer, review by Samuel Viv=
ien, Ali Caglayan,<br>&nbsp; &nbsp;Didier Remy and Fran=C3=A7ois Pottier)<b=
r><br>- [#13994](https://github.com/ocaml/ocaml/issues/13994): document ext=
ernal types<br>&nbsp; (Gabriel Scherer, review by Jan Midtgaard, Jacques Ga=
rrigue<br>&nbsp; &nbsp;and Florian Angeletti)<br><br>- [#14077](https://git=
hub.com/ocaml/ocaml/issues/14077): Add missing `item-attribute` rule for `l=
et-binding`s in documentation<br>&nbsp; for attributes.<br>&nbsp; (Shon Fed=
er)<br><br>- [#14228](https://github.com/ocaml/ocaml/issues/14228): Trim le=
ading spaces from first lines of LaTeX `ocamldoccode`<br>&nbsp; environment=
s.<br>&nbsp; (Yukai Chou, review by Nicol=C3=A1s Ojeda B=C3=A4r)<br><br>- [=
#14248](https://github.com/ocaml/ocaml/issues/14248): Added documentation a=
bout the way `Domain.join` triggers a<br>&nbsp; `Thread.join` on the domain=
's systhreads.<br>&nbsp; (Rapha=C3=ABl Proust, review by Gabriel Scherer)<b=
r><br>- [#14392](https://github.com/ocaml/ocaml/issues/14392): Fix AsciiDoc=
 files, add more markup, xrefs, documentation.<br>&nbsp; (Antonin D=C3=A9ci=
mo, review by Gabriel Scherer and David Allsopp)<br><br>- [#13590](https://=
github.com/ocaml/ocaml/issues/13590): Document automatic command-line expan=
sion of `*` and `?` wildcards by<br>&nbsp; the runtime under Windows.<br>&n=
bsp; (Benjamin Sigonneau, review by Nicol=C3=A1s Ojeda B=C3=A4r)<br><br>###=
 Internal/compiler-libs changes:<br><br>- [#13913](https://github.com/ocaml=
/ocaml/issues/13913): Use Blake128 as the hash function for the compiler's =
CRCs<br>&nbsp; (Vincent Laviron, review by Xavier Leroy and Gabriel Scherer=
)<br><br>- [#13911](https://github.com/ocaml/ocaml/issues/13911), [#14117](=
https://github.com/ocaml/ocaml/issues/14117), [#14127](https://github.com/o=
caml/ocaml/issues/14127): Refactor the merging of signature constraints, by=
<br>&nbsp; splitting the monolithic merge function into separate, specializ=
ed functions<br>&nbsp; (for merging types, modules and module types) - shar=
ing only the recursive<br>&nbsp; part for handling deep constraints.<br>&nb=
sp; (Clement Blaudeau, review by Florian Angeletti and Samuel Vivien, fix b=
y Ryan<br>&nbsp; Tjoa)<br><br>- [#14120](https://github.com/ocaml/ocaml/iss=
ues/14120), [#14474](https://github.com/ocaml/ocaml/issues/14474), [#14476]=
(https://github.com/ocaml/ocaml/issues/14476): Associate Uids to items that=
 don't have a concrete<br>&nbsp; definition; improves Merlin's renaming for=
 functors.<br>&nbsp; (Ulysse G=C3=A9rard, review by Florian Angeletti and G=
abriel Scherer)<br><br><br>- [#13839](https://github.com/ocaml/ocaml/issues=
/13839), [#14008](https://github.com/ocaml/ocaml/issues/14008): Reimplement=
 `let open`, `let module` and `let exception` in<br>&nbsp; terms of a singl=
e construct.<br>&nbsp; (Nicol=C3=A1s Ojeda B=C3=A4r, review by Gabriel Sche=
rer, Samuel Vivien, Ulysse G=C3=A9rard<br>&nbsp; and Vincent Laviron, tempo=
rary regression reported by Antonio Monteiro)<br><br>- [#13980](https://git=
hub.com/ocaml/ocaml/issues/13980) Refactor `type-approx` and improve some e=
rrors' locations.<br>&nbsp; (Leo White, Ulysse G=C3=A9rard, review by Samue=
l Vivien and Florian Angeletti)<br><br>- [#14024](https://github.com/ocaml/=
ocaml/issues/14024): Fix unterminated-string-initialization warnings from t=
he C compiler.<br>&nbsp; (Antonin D=C3=A9cimo, review by David Allsopp and =
Miod Vallat)<br><br>- [#14094](https://github.com/ocaml/ocaml/issues/14094)=
: toplevel, simplify check on installed printer types<br>&nbsp; (Florian An=
geletti, review by Gabriel Scherer)<br><br>- [#13656](https://github.com/oc=
aml/ocaml/issues/13656), [#14114](https://github.com/ocaml/ocaml/issues/141=
14), [#14308](https://github.com/ocaml/ocaml/issues/14308): Use C99 stdint.=
h/inttypes.h fixed-width<br>&nbsp; integer types and macros to define OCaml=
 integers.<br>&nbsp; (Antonin D=C3=A9cimo, review by Nick Barnes and David =
Allsopp)<br><br>- [#14148](https://github.com/ocaml/ocaml/issues/14148): Re=
move an unused field from package_type in typedtree<br>&nbsp; (Samuel Vivie=
n, review by Gabriel Scherer)<br><br>- [#14141](https://github.com/ocaml/oc=
aml/issues/14141): Rename cstrs to constraints when it refers to constraint=
s to avoid<br>&nbsp; confusing it with constructors.<br>&nbsp; (Stefan Muen=
zel, review by Nicol=C3=A1s Ojeda B=C3=A4r)<br><br>- [#14149](https://githu=
b.com/ocaml/ocaml/issues/14149): Distinguish `(module M : S)` from `(module=
 M) : (module S)` in<br>&nbsp; patterns.<br>&nbsp; (Samuel Vivien, review b=
y Gabriel Scherer)<br><br>- [#14161](https://github.com/ocaml/ocaml/issues/=
14161): refactor the STW-participants machinery to add an intermediate<br>&=
nbsp; category of 'parked' domain structures.<br>&nbsp; (Gabriel Scherer, r=
eview by Sivaramakrishnan)<br><br>- [#14198](https://github.com/ocaml/ocaml=
/issues/14198) Constraints on module unpacking are not ghost<br>&nbsp; (Tho=
mas Refis, review by Nicol=C3=A1s Ojeda B=C3=A4r)<br><br>- [#14243](https:/=
/github.com/ocaml/ocaml/issues/14243): ocamlc now uses the same code as the=
 runtime to parse ld.conf (via a<br>&nbsp; C primitive), eliminating some h=
ighly obscure corner cases.<br>&nbsp; (David Allsopp, review by Jonah Beckf=
ord, Damien Doligez and Hugo Heuzard)<br><br>- [#14260](https://github.com/=
ocaml/ocaml/issues/14260): Refactor Lambda.structured_constant to avoid dup=
licate<br>&nbsp; representations for string constants<br>&nbsp; (Vincent La=
viron, review by Nicol=C3=A1s Ojeda B=C3=A4r and Gabriel Scherer)<br><br>- =
[#14297](https://github.com/ocaml/ocaml/issues/14297), [#14299](https://git=
hub.com/ocaml/ocaml/issues/14299): Avoid iterating on hash tables to produc=
e types or terms<br>&nbsp; (Vincent Laviron, review by Nicol=C3=A1s Ojeda B=
=C3=A4r and Gabriel Scherer)<br><br>* (*breaking change*) [#14322](https://=
github.com/ocaml/ocaml/issues/14322): Remove leftover hacks for handling pa=
ttern constraints<br>&nbsp; As a side effect, `let rec (_ as x) =3D ...` is=
 now always rejected instead of<br>&nbsp; being treated as equivalent to `l=
et rec x =3D ...`<br>&nbsp; (Vincent Laviron, review by Alistair O'Brien an=
d Florian Angeletti)<br><br>- [#14331](https://github.com/ocaml/ocaml/issue=
s/14331): Enforce current_level &lt;=3D generic_level, and explain create_s=
cope<br>&nbsp; (Jacques Garrigue and Takafumi Saikawa, review by Gabriel Sc=
herer)<br><br>* (*breaking change*) [#14388](https://github.com/ocaml/ocaml=
/issues/14388): Remove support for `let rec (module M : S) =3D e1 in e2`.<b=
r>&nbsp; (Alistair O'Brien, review by Vincent Laviron and Gabriel Scherer)<=
br><br>- [#14422](https://github.com/ocaml/ocaml/issues/14422): Refactoring=
 an `if match e with p1 -&gt; true | p2 -&gt; false then ...`<br>&nbsp; int=
o a match in typetexp.<br>&nbsp; (Samuel Vivien, review by Gabriel Scherer)=
<br><br>- [#13224](https://github.com/ocaml/ocaml/issues/13224): Clarify ba=
rriers and spin macros with delayed expansion.<br>&nbsp; (Antonin D=C3=A9ci=
mo, review by David Allsopp and Gabriel Scherer)<br><br>- [#14435](https://=
github.com/ocaml/ocaml/issues/14435), [#14455](https://github.com/ocaml/oca=
ml/issues/14455), [#14550](https://github.com/ocaml/ocaml/issues/14550): Ad=
d the not-root builtin ocamltest action. This<br>&nbsp; allows to skip test=
s that fail if the current user is root (superuser).<br>&nbsp; (Kate Deplai=
x, review by Gabriel Scherer, Nicol=C3=A1s Ojeda B=C3=A4r, and<br>&nbsp; &n=
bsp;Antonin D=C3=A9cimo)<br><br>- [#14457](https://github.com/ocaml/ocaml/i=
ssues/14457): Handle qualified `M.{ x }` patterns in untypeast<br>&nbsp; (B=
asile Cl=C3=A9ment, review by Florian Angeletti)<br><br>### Build system:<b=
r><br>- [#13705](https://github.com/ocaml/ocaml/issues/13705), [#14444](htt=
ps://github.com/ocaml/ocaml/issues/14444): Cache test results of custom Aut=
oconf tests from aclocal.m4.<br>&nbsp; (Antonin D=C3=A9cimo, review by Davi=
d Allsopp and Miod Vallat)<br><br>- [#13810](https://github.com/ocaml/ocaml=
/issues/13810): Support build of cross compilers to native freestanding tar=
gets<br>&nbsp; (Samuel Hym, review by Antonin D=C3=A9cimo and Romain Calasc=
ibetta)<br><br>- [#14243](https://github.com/ocaml/ocaml/issues/14243): New=
 configure option --with-additional-stublibsdir allows an<br>&nbsp; additio=
nal directory to be added to the start of ld.conf. Additionally, the<br>&nb=
sp; stublibs subdirectory is no longer created, nor added to ld.conf, when<=
br>&nbsp; building OCaml with --disable-shared.<br>&nbsp; (David Allsopp, r=
eview by Jonah Beckford, Damien Doligez and Hugo Heuzard)<br><br>- [#14244]=
(https://github.com/ocaml/ocaml/issues/14244): When targeting native Window=
s on Cygwin or MSYS2, preserve<br>&nbsp; backslashes in the supplied `--pre=
fix` (in particular, backslashes instead of<br>&nbsp; slashes will then be =
displayed by `ocamlopt -config-var standard_library`).<br>&nbsp; If the sup=
plied prefix contains a slash, then it is normalised, as<br>&nbsp; previous=
ly.<br>&nbsp; (David Allsopp, review by Jonah Beckford, Antonin D=C3=A9cimo=
, Damien Doligez and<br>&nbsp; &nbsp;Samuel Hym)<br><br>- [#14245](https://=
github.com/ocaml/ocaml/issues/14245): New --enable-runtime-search configure=
 option controls the<br>&nbsp; -runtime-search option used to build the byt=
ecode binaries in the compiler<br>&nbsp; distribution. --enable-runtime-sea=
rch-target controls the default value of<br>&nbsp; -runtime-search used for=
 bytecode executables produced by the compiler.<br>&nbsp; (David Allsopp, r=
eview by Damien Doligez and Samuel Hym)<br><br>- [#14484](https://github.co=
m/ocaml/ocaml/issues/14484): Set `_WIN32_WINNT` to require Windows 8/Server=
 2012 Windows header SDK<br>&nbsp; support.<br>&nbsp; (Antonin D=C3=A9cimo,=
 review by David Allsopp)<br><br>### Bug fixes:<br><br>- [#14123](https://g=
ithub.com/ocaml/ocaml/issues/14123): Fix integer-overflow problems in heap =
compaction.<br>&nbsp; (Nick Barnes, review by Antonin D=C3=A9cimo).<br><br>=
- [#14035](https://github.com/ocaml/ocaml/issues/14035): Fix the alignment =
of _Atomic long long unsigned int fields<br>&nbsp; before GCC 11.1 on i686.=
 Silence GCC note on newer versions.<br>&nbsp; (Antonin D=C3=A9cimo, review=
 by Sadiq Jaffer)<br><br>- [#14010](https://github.com/ocaml/ocaml/issues/1=
4010): Fix miscompilation / liveness errors for string operations<br>&nbsp;=
 (Mark Shinwell, Xavier Clerc, review by Xavier Leroy and Gabriel Scherer)<=
br><br>- [#14036](https://github.com/ocaml/ocaml/issues/14036): Fix nonterm=
ination of cycle printing in recursive modules with<br>&nbsp; `-short-paths=
`. Add error message for types considered abstract while<br>&nbsp; checking=
 recursive modules.<br>&nbsp; (Brandon Stride, review by Florian Angeletti)=
<br><br>- [#14065](https://github.com/ocaml/ocaml/issues/14065): Fix functi=
on signature mismatch of `__tsan_func_exit` with GCC 15.<br>&nbsp; Check in=
 the configure step if the TSan provided internal builtins are the<br>&nbsp=
; same as what we expect, introduce `caml_tsan_*` wrappers for the `__tsan_=
*`<br>&nbsp; functions we use.<br>&nbsp; (Hari Hara Naveen S, report by Har=
i Hara Naveen S,<br>&nbsp; review by Gabriel Scherer, Antonin D=C3=A9cimo, =
Olivier Nicole)<br><br>- [#14071](https://github.com/ocaml/ocaml/issues/140=
71): Fix exception name in Dynlink.Error printer.<br>&nbsp; (Etienne Millon=
, review by Nicol=C3=A1s Ojeda B=C3=A4r)<br><br>- [#13853](https://github.c=
om/ocaml/ocaml/issues/13853): Format breaks some line too early when there<=
br>&nbsp; is a break hint at the end.<br>&nbsp; (Florian Angeletti, review =
by Gabriel Scherer)<br><br>- [#10570](https://github.com/ocaml/ocaml/issues=
/10570): Fix handling of caml_sys_argv when exposed directly as an<br>&nbsp=
; external<br>&nbsp; (Keryan Didier, review by Vincent Laviron and Gabriel =
Scherer)<br><br>- [#14155](https://github.com/ocaml/ocaml/issues/14155): Au=
dit unexecuted phrases in compiler expect tests and<br>&nbsp; fix all occur=
rences<br>&nbsp; (Stefan Muenzel, review by Gabriel Scherer)<br><br>- [#141=
63](https://github.com/ocaml/ocaml/issues/14163), [#14176](https://github.c=
om/ocaml/ocaml/issues/14176): add a filename location to the deprecation al=
ert for implicit<br>&nbsp; uses of libraries bundled with the compiler (uni=
x,re,threads,dynlink)<br>&nbsp; (Florian Angeletti, report by Ali Caglayan,=
 review by Gabriel Scherer)<br><br>- [#14210](https://github.com/ocaml/ocam=
l/issues/14210): fix TSan-reported data race in weak pointers runtime<br>&n=
bsp; (Gabriel Scherer and Damien Doligez, report by Olivier Nicole,<br>&nbs=
p; &nbsp;review by KC Sivaramakrishnan)<br><br>- [#14213](https://github.co=
m/ocaml/ocaml/issues/14213): Fix shadow-stack-related crashes with TSan<br>=
&nbsp; (Olivier Nicole, report by Nathan Taylor, review by Gabriel Scherer =
and<br>&nbsp; &nbsp;Stefan Muenzel)<br><br>- [#13658](https://github.com/oc=
aml/ocaml/issues/13658), [#14181](https://github.com/ocaml/ocaml/issues/141=
81): Fix handling of recursive function types that can result<br>&nbsp; in =
an unbounded number of labeled or optional arguments.<br>&nbsp; (Stefan Mue=
nzel, report by Samuel Vivien, review by Florian Angeletti)<br><br>- [#1425=
5](https://github.com/ocaml/ocaml/issues/14255): Fix TSan bug with C calls =
that take many arguments<br>&nbsp; (Olivier Nicole and Miod Vallat, report =
by Nathan Taylor, review by Gabriel<br>&nbsp; &nbsp;Scherer)<br><br>- [#142=
30](https://github.com/ocaml/ocaml/issues/14230) : ocamltest fails to link =
test program with -custom in some cases<br>&nbsp; (Damien Doligez, review b=
y David Allsopp)<br><br>- [#14279](https://github.com/ocaml/ocaml/issues/14=
279): -dsource, preserve (mod) and other escaped infix keyword operators in=
<br>&nbsp; the printed source wherever possible.<br>&nbsp; (Florian Angelet=
ti, review by Gabriel Scherer)<br><br>- [#14300](https://github.com/ocaml/o=
caml/issues/14300), [#14304](https://github.com/ocaml/ocaml/issues/14304): =
fix a race between memprof and the minor GC, detected by TSan<br>&nbsp; (Ga=
briel Scherer, review by Stephen Dolan and Nick Barnes,<br>&nbsp; &nbsp;rep=
ort by Olivier Nicole)<br><br>- [#14332](https://github.com/ocaml/ocaml/iss=
ues/14332): Fix missing TSan instrumentation in subexpressions<br>&nbsp; (V=
incent Laviron, review by Gabriel Scherer and Olivier Nicole)<br><br>- [#14=
370](https://github.com/ocaml/ocaml/issues/14370), [#14429](https://github.=
com/ocaml/ocaml/issues/14429): Fix headers for C++ inclusion.<br>&nbsp; (An=
tonin D=C3=A9cimo, review by Gabriel Scherer)<br><br>- [#14417](https://git=
hub.com/ocaml/ocaml/issues/14417): Fix issue with nested packs on macOS.<br=
>&nbsp; (Vincent Laviron, report by Kate Deplaix, review by Gabriel Scherer=
)<br><br>- [#14423](https://github.com/ocaml/ocaml/issues/14423): Fix detec=
tion of SetThreadDescription on 32-bit builds, meaning that<br>&nbsp; Threa=
d.set_current_thread_name now works on 32-bit MSVC and uses the correct<br>=
&nbsp; mechanism on 32-bit mingw-w64.<br>&nbsp; (David Allsopp, review by A=
ntonin D=C3=A9cimo)<br><br>- [#14431](https://github.com/ocaml/ocaml/issues=
/14431): Enable native backend for DragonFly BSD. This builds ocamlopt on<b=
r>&nbsp; DragonFly.<br>&nbsp; (Michael Neumann, review by Gabriel Scherer a=
nd Kate Deplaix)<br><br>- [#14495](https://github.com/ocaml/ocaml/issues/14=
495): Fix infix-tag bug in the minor collector which could cause SEGVs<br>&=
nbsp; in multi-domain programs.<br>&nbsp; (Nick Barnes, review by Gabriel S=
cherer)<br><br>- [#14519](https://github.com/ocaml/ocaml/issues/14519): Fix=
 segfault when using `Runtime_events` under certain<br>&nbsp; circumstances=
 due to bad error checking when calling `mmap()`.<br>&nbsp; (Mark Elvers, r=
eview by Nicol=C3=A1s Ojeda B=C3=A4r)<br><br>- private, CVE-2026-28364, OSE=
C-2026-01: robustify intern.c<br>&nbsp; (Xavier Leroy and Nicol=C3=A1s Ojed=
a B=C3=A4r, review by Olivier Nicole, Mindy Preston,<br>&nbsp; Edwin T=C3=
=B6r=C3=B6k, and Gabriel Scherer)<br><br>- [#13693](https://github.com/ocam=
l/ocaml/issues/13693), [#14514](https://github.com/ocaml/ocaml/issues/14514=
): s390x: fix heap corruption with libasmrun_shared.so caused<br>&nbsp; by =
PLT lazy binding trampoline saving FPRs into OCaml's fiber stack.<br>&nbsp;=
 Replace @PLT calls with GOT-indirect calls in the s390x code emitter.<br>&=
nbsp; (Zane Hambly, review by David Allsopp and Xavier Leroy)<br><br>- [#14=
557](https://github.com/ocaml/ocaml/issues/14557), [#12150](https://github.=
com/ocaml/ocaml/issues/12150), [#14696](https://github.com/ocaml/ocaml/issu=
es/14696): ensure that the self type of class cannot escape<br>&nbsp; throu=
gh type constraints.<br>&nbsp; (Leo White, review by Florian Angeletti)<br>=
<br>- [#14603](https://github.com/ocaml/ocaml/issues/14603), [#14604](https=
://github.com/ocaml/ocaml/issues/14604): avoid Ctype.apply failures when mi=
xing<br>&nbsp; polymorphic types and unboxed constructors.<br>&nbsp; (Gabri=
el Scherer and Stefan Muenzel, report by Brandon Stride,<br>&nbsp; &nbsp;re=
view by Florian Angeletti)<br><br>- [#14626](https://github.com/ocaml/ocaml=
/issues/14626), [#14675](https://github.com/ocaml/ocaml/issues/14675): take=
 in account module-dependent functions when<br>&nbsp; determining if an opt=
ional argument is non-erasable.<br>&nbsp; (Alistair O'Brien and Florian Ang=
eletti, review by Gabriel Scherer)<br><br>- [#14635](https://github.com/oca=
ml/ocaml/issues/14635): Fix a bug in `caml_floatarray_gather` that would ca=
use<br>&nbsp; the result of `Float.Array.sub`, `Float.Array.append`, `Float=
.Array.concat`<br>&nbsp; (when empty) not to be equal to `[||]`.<br>&nbsp; =
(Marc Lasson, review by Gabriel Scherer)<br><br>- [#14644](https://github.c=
om/ocaml/ocaml/issues/14644), [#14647](https://github.com/ocaml/ocaml/issue=
s/14647): Fix a bug related to unhandled effects in bytecode.<br>&nbsp; (Vi=
ncent Laviron, report by Thibaut Mattio,<br>&nbsp; &nbsp;review by Nicol=C3=
=A1s Ojeda B=C3=A4r, Stephen Dolan and Olivier Nicole)<br><br>- [#14655](ht=
tps://github.com/ocaml/ocaml/issues/14655), [#14691](https://github.com/oca=
ml/ocaml/issues/14691): check for size overflow in caml_ba_reshape<br>&nbsp=
; (Stephen Dolan, review by Xavier Leroy)<br><br>- [#14667](https://github.=
com/ocaml/ocaml/issues/14667): enable application related warnings for modu=
le-dependent functions<br>&nbsp; (Florian Angeletti, review by Gabriel Sche=
rer)<br><br>- [#14690](https://github.com/ocaml/ocaml/issues/14690): Fix `N=
ame_type_mismatch` error message when the expected type is an<br>&nbsp; ali=
as: print the expanded path on the right-hand side of the equality, not<br>=
&nbsp; the alias twice.<br>&nbsp; (Weixie Cui, review by Florian Angeletti)=
<br><br>- [#14349](https://github.com/ocaml/ocaml/issues/14349), [#14718](h=
ttps://github.com/ocaml/ocaml/issues/14718), [#14722](https://github.com/oc=
aml/ocaml/issues/14722): runtime, fix in the orphaning of ephemerons<br>&nb=
sp; (Gabriel Scherer, review by Olivier Nicole and Damien Doligez,<br>&nbsp=
; &nbsp;report by Jan Midtgaard)<br><br>- [#14702](https://github.com/ocaml=
/ocaml/issues/14702): Fix hidden directory files leaking into the visible l=
oad path table.<br>&nbsp; When a hidden directory contained a file whose ba=
sename was already present,<br>&nbsp; the file could be incorrectly added t=
o the visible table.<br>&nbsp; (Hugo Heuzard, review by Florian Angeletti)<=
br><br>- [#14719](https://github.com/ocaml/ocaml/issues/14719), [#14721](ht=
tps://github.com/ocaml/ocaml/issues/14721): compute arity correctly for mod=
ule-dependent function<br>&nbsp; (Florian Angeletti, report by Jeremy Yallo=
p, review by Stefan Muenzel)<br><br>- [#14760](https://github.com/ocaml/oca=
ml/issues/14760), [#14802](https://github.com/ocaml/ocaml/issues/14802), [#=
14846](https://github.com/ocaml/ocaml/issues/14846): Correct the detection =
of argument defaults in<br>&nbsp; configure, fixing an incorrect error mess=
age when installing OCaml through<br>&nbsp; opam on OpenSUSE with the site-=
config package installed.<br>&nbsp; (David Allsopp, report and review by Ed=
win T=C3=B6r=C3=B6k)<br><br>- [#14797](https://github.com/ocaml/ocaml/issue=
s/14797): avoid dropping attributes attached to package types when pretty<b=
r>&nbsp; printing in surface syntax.<br>&nbsp; (Chet Murthy, review by Nico=
l=C3=A1s Ojeda B=C3=A4r)<br><br>- [#14853](https://github.com/ocaml/ocaml/i=
ssues/14853), CVE-2026-41083, OSEC-2026-05: fix quoting of filenames<br>&nb=
sp; &nbsp;passed to Filename.quote_command on Windows.<br>&nbsp; (David All=
sopp, report by Andrew Nesbitt, review by Florian Angeletti)<br><br></div><=
/div></body></html>
--=_d8422e55-5759-4e6e-b61f-b99e9da155d1--