# OCaml 5.3.0 released

**URL:** <https://discuss.ocaml.org/t/ocaml-5-3-0-released/15916>\
**Category:** Ecosystem\
**Created:** [January 8, 2025, 10:21pm UTC](https://discuss.ocaml.org/t/ocaml-5-3-0-released/15916 "2025-01-08T22:21:00Z")\
**Posts on this page:** 20\
**Page:** 1

<div class="post-metadata">

**Author:** ![octachron](https://avatars.discourse-cdn.com/v4/letter/o/49beb7/32.png) [@octachron](https://discuss.ocaml.org/u/octachron)\
**Post date:** [January 8, 2025, 10:21pm UTC](https://discuss.ocaml.org/t/ocaml-5-3-0-released/15916/1 "2025-01-08T22:21:00Z")

</div>

We have the pleasure of announcing the release of OCaml version 5.3.0. dedicated  
to the memory of John William Mauchly and Paul Verlaine on the anniversary of  
their death.

> De la musique avant toute chose,  
> Et pour cela préfère l’Impair

> (Music first and foremost of all!  
> Choose your measure of odd not even)

Some of the highlights in OCaml 5.3.0 are:

- Syntax for deep effect handlers

- Restored MSVC port

- Re-introduced statistical memory profiling (statmemprof)

- utf-8 encoded Unicode source files and modest support of Unicode identifiers

- More space-efficient implementation of Dynarray

- Improved metadata on the pairs of declarations and definitions for merlin.

And a lot of incremental changes:

- Around 20 new functions in the standard library (in the `Domain`, `Dynarray`  
`Format`, `List`, `Queue`, `Sys`, and `Uchar` modules).
- Many fixes and improvements in the runtime
- Improved error messages for first-class modules, functors, labelled arguments,  
and type clashes.
- Numerous bug fixes

Please report any unexpected behaviours on the [OCaml issue tracker](https://github.com/ocaml/ocaml/issues).

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

Happy hacking,  
Florian Angeletti for the OCaml team.

* * *

## Installation Instructions

The base compiler can be installed as an opam switch with the following commands:

```bash
opam update
opam switch create 5.3.0

```

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

- [GitHub](https://github.com/ocaml/ocaml/releases/download/5.3.0/ocaml-5.3.0.tar.gz)
- [OCaml archives at Inria](https://caml.inria.fr/pub/distrib/ocaml-5.3/ocaml-5.3.0.tar.gz)

### Fine-Tuned Compiler Configuration

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

```bash
opam update
opam switch create <switch_name> ocaml-variants.5.3.0+options <option_list>

```

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

```bash
opam switch create 5.3.0+flambda+nffa ocaml-variants.5.3.0+options ocaml-option-flambda ocaml-option-no-flat-float-array

```

* * *

## Changelog

### Restored backend:

- [#12954](https://github.com/ocaml/ocaml/issues/12954): Restore the MSVC port  
(David Allsopp, Antonin Décimo, Samuel Hym, and Miod Vallat, review by Nicolás  
Ojeda Bär)

- [#13093](https://github.com/ocaml/ocaml/issues/13093): Allow building the MSVC port with clang-cl.  
(Antonin Décimo, review by Nicolás Ojeda Bär, Samuel Hym,  
David Allsopp and Sébastien Hinderer)

### Language features:

- [#12309](https://github.com/ocaml/ocaml/issues/12309), [#13158](https://github.com/ocaml/ocaml/issues/13158): Add syntax support for deep effect handlers  
(Leo White, Tom Kelly, Anil Madhavapeddy, KC Sivaramakrishnan, Xavier Leroy  
and Florian Angeletti, review by the same, Hugo Heuzard, and Ulysse Gérard)

- [#11736](https://github.com/ocaml/ocaml/issues/11736), [#12664](https://github.com/ocaml/ocaml/issues/12664), [#13628](https://github.com/ocaml/ocaml/issues/13628): Support utf-8 encoded source files and latin-9  
compatible identifiers.  
(Xavier Leroy and Florian Angeletti, review by Daniel Bünzli and  
Jules Aguillon)

- [#12828](https://github.com/ocaml/ocaml/issues/12828), [#13283](https://github.com/ocaml/ocaml/issues/13283): Add short syntax for dependent functor types `(X:A) -> ...`  
(Jeremy Yallop, review by Nicolás Ojeda Bär and Gabriel Scherer)

### Type system

- [#11891](https://github.com/ocaml/ocaml/issues/11891), [#12507](https://github.com/ocaml/ocaml/issues/12507): Allow to name new locally abstract types in constructor type  
annotations.  
(Jacques Garrigue, report and review by Gabriel Scherer and Florian Angeletti)

### Runtime system:

- [#11911](https://github.com/ocaml/ocaml/issues/11911), [#12923](https://github.com/ocaml/ocaml/issues/12923): Multicore statistical memory profiling.  
This restores a notable OCaml 4 feature that was missing  
in OCaml 5.  
(Nick Barnes, review by Stephen Dolan, Jacques-Henri Jourdan  
and Guillaume Munch-Maccagnoni).

- [#13419](https://github.com/ocaml/ocaml/issues/13419): Fix memory bugs in runtime events system.  
(B. Szilvasy and Nick Barnes, review by Miod Vallat, Nick Barnes,  
Tim McGilchrist, and Gabriel Scherer)

- [#13364](https://github.com/ocaml/ocaml/issues/13364): Emit major slice counters in the runtime events.  
(KC Sivaramakrishnan and Sadiq Jaffer, review by Gabriel Scherer)

- [#13382](https://github.com/ocaml/ocaml/issues/13382): Add more documentation for Runtime\_events types  
(Sadiq Jaffer, review by Tim McGilchrist, Miod Vallat and KC Sivaramakrishnan)

- [#13370](https://github.com/ocaml/ocaml/issues/13370): Fix a low-probability crash when calling Gc.counters.  
(Demi Marie Obenour, review by Gabriel Scherer)

- [#13272](https://github.com/ocaml/ocaml/issues/13272): Allow maximum number of domains to be specified as a OCAMLRUNPARAM  
parameter.  
(KC Sivaramakrishnan, review by Guillaume Munch-Maccagnoni, Miod Vallat,  
Gabriel Scherer, David Allsopp, request by Zachary Yedidia).

- [#12579](https://github.com/ocaml/ocaml/issues/12579): OS-based Synchronisation for Stop-the-World Sections  
(B. Szilvasy, review by Miod Vallat, Nick Barnes, Olivier Nicole,  
Gabriel Scherer and Damien Doligez)

- [#12789](https://github.com/ocaml/ocaml/issues/12789): Restore caml\_unregister\_frametable from OCaml 4  
(Frédéric Recoules, review by Gabriel Scherer)

- [#13003](https://github.com/ocaml/ocaml/issues/13003): new, more consistent names for array-creation C functions  
(Gabriel Scherer, review by Olivier Nicole)

- [#13013](https://github.com/ocaml/ocaml/issues/13013): introduce a `caml_result` type to supersede the  
use of ‘encoded exception values’ in the FFI.  
(Gabriel Scherer, review by Damien Doligez,  
Guillaume Munch-Maccagnoni and Xavier Leroy,  
suggested by Guillaume Munch-Maccagnoni)

- [#12407](https://github.com/ocaml/ocaml/issues/12407), [#13226](https://github.com/ocaml/ocaml/issues/13226): Resource-handling improvements: add  
exception-returning variants for all exception-raising functions in  
`caml/fail.h`, for the purpose of cleaning-up state and resources  
before raising.  
(Guillaume Munch-Maccagnoni, review by Damien Doligez, Xavier Leroy  
and Gabriel Scherer)

- [#13086](https://github.com/ocaml/ocaml/issues/13086): Avoid spurious major GC slices.  
(Damien Doligez, report by Stephen Dolan, review by Gabriel Scherer  
and Stephen Dolan)

- [#11779](https://github.com/ocaml/ocaml/issues/11779), [#13117](https://github.com/ocaml/ocaml/issues/13117): Improve logic for fiber stack alignment.  
(Miod Vallat, report by Damien Doligez, review by Gabriel Scherer)

- [#12839](https://github.com/ocaml/ocaml/issues/12839): Remove ATOMIC\_UINTNAT\_INIT from camlatomic.h (as part of a larger  
cleanup of camlatomic.h)  
(David Allsopp, review by Antonin Décimo, Sébastien Hinderer, Samuel Hym,  
Guillaume Munch-Maccagnoni and Miod Vallat)

- [#13163](https://github.com/ocaml/ocaml/issues/13163): Enable frame pointers on macOS x86\_64  
(Tim McGilchrist, review by Sébastien Hinderer and Fabrice Buoro)

- [#12951](https://github.com/ocaml/ocaml/issues/12951): Constify constructors and flags tables in C code (take 2).  
Now these tables will go in the readonly segment, where they belong.  
(Antonin Décimo, review by David Allsopp)

- [#10696](https://github.com/ocaml/ocaml/issues/10696): Introduce \_\_has\_attribute and \_\_has\_c\_attributes in  
\<caml/misc.h\> to test the support of specific atributes in C  
code. Introduce fallthrough as a wrapper around the fallthrough  
attribute.  
(Antonin Décimo, review by Nicolás Ojeda Bär, Xavier Leroy, and  
Gabriel Scherer)

- [#13083](https://github.com/ocaml/ocaml/issues/13083): Use macros from limits.h to avoid signed-integer wrap-around.  
Introduce CAML\_{U,}INTNAT\_{MIN,MAX} macros to expose {u,}intnat limits.  
(Antonin Décimo, review by Nick Barnes, Xavier Leroy, Gabriel Scherer,  
and Miod Vallat)

- [#13239](https://github.com/ocaml/ocaml/issues/13239): Check whether the compiler supports the labels as values  
extension to enable threaded code interpretation.  
(Antonin Décimo, review by Miod Vallat)

- [#13238](https://github.com/ocaml/ocaml/issues/13238): Enable software prefetching on x86 and x86\_64 when building  
with MSVC or clang-cl.  
(Antonin Décimo, review by Miod Vallat)

- [#13241](https://github.com/ocaml/ocaml/issues/13241), [#13261](https://github.com/ocaml/ocaml/issues/13261), [#13271](https://github.com/ocaml/ocaml/issues/13271): Add CFI\_SIGNAL\_FRAME to ARM64 and RiscV runtimes,  
for the purpose of displaying backtraces correctly in GDB.  
(Tim McGilchrist, review by Miod Vallat, Gabriel Scherer and  
KC Sivaramakrishnan)

- [#13139](https://github.com/ocaml/ocaml/issues/13139): Simplify CAMLalign to always use C23/C++11 alignas or C11  
\_Alignas. Ensures that stat data is always aligned to the best  
boundary.  
(Antonin Décimo, review by Miod Vallat and Xavier Leroy)

- [#13280](https://github.com/ocaml/ocaml/issues/13280): Check for support of compiler attributes. Allows using  
compiler attributes with clang-cl.  
(Antonin Décimo, review by Miod Vallat)

- [#13243](https://github.com/ocaml/ocaml/issues/13243): Enable C compiler warnings internally when building with  
clang-cl or MSVC. Provide fixes too.  
(Antonin Décimo, review by Miod Vallat and Xavier Leroy)

- [#13242](https://github.com/ocaml/ocaml/issues/13242): Define and use unreachable and trap annotation, and clean-up some  
runtime assertions.  
(Antonin Décimo, review by Miod Vallat, Gabriel Scherer, and David Allsopp)

- [#13402](https://github.com/ocaml/ocaml/issues/13402), [#13512](https://github.com/ocaml/ocaml/issues/13512), [#13549](https://github.com/ocaml/ocaml/issues/13549), [#13553](https://github.com/ocaml/ocaml/issues/13553): Revise bytecode implementation of callbacks  
so that it no longer produces dangling registered bytecode fragments.  
(Xavier Leroy, report by Jan Midtgaard, analysis by Stephen Dolan,  
review by Miod Vallat)

- [#13407](https://github.com/ocaml/ocaml/issues/13407): Add Runtime\_events.EV\_EMPTY\_MINOR  
(Thomas Leonard)

- [#13522](https://github.com/ocaml/ocaml/issues/13522): Confirm runtime events ring is still active after callback.  
(KC Sivaramakrishnan, review by Sadiq Jaffer and Miod Vallat)

- [#13529](https://github.com/ocaml/ocaml/issues/13529): Do not write to event ring after going out of stw participant set.  
(KC Sivaramakrishnan, review by Sadiq Jaffer)

### Code generation and optimizations:

- [#13014](https://github.com/ocaml/ocaml/issues/13014): Enable compile-time option -function-sections on all previously  
unsupported native backends (POWER, riscv64 and s390x)  
(Miod Vallat, review by Nicolás Ojeda Bär)

- [#7241](https://github.com/ocaml/ocaml/issues/7241), [#12555](https://github.com/ocaml/ocaml/issues/12555), [#13076](https://github.com/ocaml/ocaml/issues/13076), [#13138](https://github.com/ocaml/ocaml/issues/13138), [#13338](https://github.com/ocaml/ocaml/issues/13338), [#13152](https://github.com/ocaml/ocaml/issues/13152), [#13153](https://github.com/ocaml/ocaml/issues/13153), [#13154](https://github.com/ocaml/ocaml/issues/13154):  
fix a soundness bug in the pattern-matching compiler  
when side-effects mutate the scrutinee during matching.  
(Gabriel Scherer, review by Nick Roberts)

- [#13341](https://github.com/ocaml/ocaml/issues/13341): a warning when the pattern-matching compiler pessimizes code  
because side-effects may mutate the scrutinee during  
matching. (This warning is disabled by default, as this rarely  
happens and its performance impact is typically not noticeable.)  
(Gabriel Scherer, review by Nick Roberts, Florian Angeletti  
and David Allsopp)

- [#13179](https://github.com/ocaml/ocaml/issues/13179): Fix evaluation of toplevel lets in classes containing  
local opens  
(Vincent Laviron, review by Hugo Heuzard, Nathanaëlle Courant  
and Gabriel Scherer)

- [#13543](https://github.com/ocaml/ocaml/issues/13543): Remove some String-Bytes conversion from the stdlib to behave better  
with js\_of\_ocaml  
(Hugo Heuzard, review by Gabriel Scherer)

### Standard library:

- [#12885](https://github.com/ocaml/ocaml/issues/12885): move Dynarray to an unboxed representation  
(Gabriel Scherer, suggestions by Vincent Laviron,  
review by Olivier Nicole and Simon Cruanes, Yann Leray, Alain Frisch)

- [#12884](https://github.com/ocaml/ocaml/issues/12884): Add `Queue.drop`  
(Léo Andrès, review by Nicolás Ojeda Bär and Gabriel Scherer)

- [#13168](https://github.com/ocaml/ocaml/issues/13168): In Array.shuffle, clarify the code that validates the  
result of the user-supplied function `rand`, and improve the  
error message that is produced when this result is invalid.  
(François Pottier, review by Florian Angeletti, Daniel Bünzli  
and Gabriel Scherer)

- [#12133](https://github.com/ocaml/ocaml/issues/12133): Expose support for printing substrings in Format  
(Florian Angeletti, review by Daniel Bünzli, Gabriel Scherer  
and Nicolás Ojeda Bär)

- [#12869](https://github.com/ocaml/ocaml/issues/12869): Add List.take, List.drop, List.take\_while and List.drop\_while  
(Kate Deplaix and Oscar Butler-Aldridge, review by Nicolás Ojeda Bär,  
Craig Ferguson and Gabriel Scherer)

- [#13047](https://github.com/ocaml/ocaml/issues/13047): Add Sys.poll\_actions to (only) run pending runtime actions.  
(Nick Barnes, review by Gabriel Scherer, Guillaume Munch-Maccagnoni, and  
Vincent Laviron)

- [#13144](https://github.com/ocaml/ocaml/issues/13144): Dynarray.{equal, compare}  
(Gabriel Scherer,  
review by Jeremy Yallop, Daniel Bünzli and Olivier Nicole,  
request by Olivier Nicole)

- [#13171](https://github.com/ocaml/ocaml/issues/13171): expose `Domain.self_index : unit -> int` (a somewhat-dense  
indexing of currently-running domains) for advanced use-cases of  
domain-indexed concurrent data structures.  
(Gabriel Scherer,  
review by KC Sivaramakrishnan, Miod Vallat and Nicolás Ojeda Bär,  
report by Vesa Karvonen)

- [#13197](https://github.com/ocaml/ocaml/issues/13197): Dynarray.blit, which allows to extend the destination  
dynarray (0 \<= dst\_pos \<= dst\_length).  
(Gabriel Scherer, report by Hazem Elmasry,  
review by Olivier Nicole, Hazem Elmasry and Nicolás Ojeda Bär)

- (_breaking change_) [#13240](https://github.com/ocaml/ocaml/issues/13240): Add Uchar.seeded\_hash, Change Uchar.hash implementation.  
Previously, Uchar.hash was aliased to Uchar.to\_int. If you need that behavior,  
change your module instantiation from eg `module HT = Hashtbl.Make(Uchar)` to

```auto
  module HT = Hashtbl.Make(struct
    ...
    let hash = Uchar.to_int
  end)

```

If the current implementation is desired, and you have a hashtable module `HT`  
(produced with the `Make` functor) in persistent storage, use `HT.rebuild` to  
ensure it doesn’t break when reading from or writing to buckets.  
(Hazem ElMasry, review by Gabriel Scherer and Nicolás Ojeda Bär)

- [#13318](https://github.com/ocaml/ocaml/issues/13318): Fix regression in GC alarms, and fix them for flambda.  
(Guillaume Munch-Maccagnoni, report by Benjamin Monate, review by  
Vincent Laviron and Gabriel Scherer)

- [#13296](https://github.com/ocaml/ocaml/issues/13296): Add mem, memq, find\_opt, find\_index, find\_map and find\_mapi  
to Dynarray.  
(Jake H, review by Gabriel Scherer and Florian Angeletti)

### Other libraries:

- [#11996](https://github.com/ocaml/ocaml/issues/11996): release the dependency of dynlink on compilerlibs.  
(Sébastien Hinderer and Stephen Dolan, review by Damien Doligez and  
Hugo Heuzard)

- [#13326](https://github.com/ocaml/ocaml/issues/13326): Implement Unix.O\_APPEND on windows.  
(Romain Beauxis, review by Miod Vallat, Gabriel Scherer and Antonin Décimo)

### Tools:

- [#11716](https://github.com/ocaml/ocaml/issues/11716): ocamllex: mismatched parentheses and curly brackets are now caught  
by ocamllex, instead of causing invalid OCaml code to be generated.  
(Demi Marie Obenour, review by Damien Doligez and Xavier Leroy)

- [#12904](https://github.com/ocaml/ocaml/issues/12904): Run the testsuite with ThreadSanitizer on a PR when label  
`run-thread-sanitizer` is added  
(Olivier Nicole, suggested by Sébastien Hinderer and David Allsopp, review by  
Gabriel Scherer)

- (_breaking change_) [#13114](https://github.com/ocaml/ocaml/issues/13114): Support ocamldebug remote debugging over IPv6 on all  
platforms, and over Unix domain sockets on Windows.  
(Antonin Décimo, review by Gabriel Scherer and Miod Vallat)

- [#13136](https://github.com/ocaml/ocaml/issues/13136): Rewrite GDB extensions and macros in debugger-agnostic Python, and add  
LLDB support for them.  
(Nick Barnes, review by Tim McGilchrist and Gabriel Scherer)

### Toplevel:

- [#12891](https://github.com/ocaml/ocaml/issues/12891): Improved styling for initial prompt  
(Florian Angeletti, review by Gabriel Scherer)

- [#13053](https://github.com/ocaml/ocaml/issues/13053): Improved display of builtin types such as `_ list` when aliased.  
(Samuel Vivien, review by Florian Angeletti)

### Manual and documentation:

- [#13370](https://github.com/ocaml/ocaml/issues/13370): Document that that temporary variables holding GCd pointers must  
not be live across a GC.  
(Demi Marie Obenour)

- [#12298](https://github.com/ocaml/ocaml/issues/12298): Manual: emphasize that Bigarray.int refers to an OCaml integer,  
which does not match the C int type.  
(Edwin Török, review by Florian Angeletti)

- [#12868](https://github.com/ocaml/ocaml/issues/12868): Manual: simplify style colours of the post-processed manual and API  
HTML pages, and fix the search button icon  
(Yawar Amin, review by Simon Grondin, Gabriel Scherer, and Florian Angeletti)

- [#12949](https://github.com/ocaml/ocaml/issues/12949): document OCaml release cycles and version strings in  
`release-info/introduction.md`.  
(Florian Angeletti, review by Fabrice Buoro, Kate Deplaix, Damien Doligez, and  
Gabriel Scherer)

- [#12976](https://github.com/ocaml/ocaml/issues/12976): Manual: use webman//\*.html and  
webman//api/ for [OCaml.org](http://OCaml.org) HTML manual generation  
(Shakthi Kannan, review by Hannes Mehnert, and Florian Angeletti)

- [#13045](https://github.com/ocaml/ocaml/issues/13045): Emphasize caution about behaviour of custom block finalizers.  
(Nick Barnes)

- [#13216](https://github.com/ocaml/ocaml/issues/13216): document the new `caml_result` type in the FFI chapter of the manual.  
(Gabriel Scherer, review by Miod Vallat, Daniel Bünzli, Nick Barnes,  
Guillaume Munch-Maccagnoni and Antonin Décimo)

- [#13287](https://github.com/ocaml/ocaml/issues/13287): stdlib/sys.mli: Update documentation on Sys.opaque\_identity  
following [#9412](https://github.com/ocaml/ocaml/issues/9412).  
(Matt Walker, review by Guillaume Munch-Maccagnoni and Vincent Laviron)

- [#13295](https://github.com/ocaml/ocaml/issues/13295): Use syntax for deep effect handlers in the effect handlers manual  
page.  
(KC Sivaramakrishnan, review by Anil Madhavapeddy, Florian Angeletti and Miod  
Vallat)

- [#13424](https://github.com/ocaml/ocaml/issues/13424): Fix `Gc.quick_stat` documentation to clarify that returned fields  
`live_words`, `live_blocks`, `free_words`, and `fragments` are not zero.  
(Jan Midtgaard, review by Damien Doligez and KC Sivaramakrishnan)

- [#13440](https://github.com/ocaml/ocaml/issues/13440): Update documentation of `Gc.{control,get,set}` to reflect fields  
not currently supported on OCaml 5.  
(Jan Midtgaard, review by Gabriel Scherer)

- [#13469](https://github.com/ocaml/ocaml/issues/13469), [#13474](https://github.com/ocaml/ocaml/issues/13474), [#13535](https://github.com/ocaml/ocaml/issues/13535): Document that [Hashtbl.create n] creates a hash table  
with a default minimal size, even if [n] is very small or negative.  
(Antonin Décimo, Nick Bares, report by Nikolaus Huber and Jan Midtgaard,  
review by Florian Angeletti, Anil Madhavapeddy, Gabriel Scherer,  
and Miod Vallat)

- [#13666](https://github.com/ocaml/ocaml/issues/13666): Rewrite parts of the example code around nested lists in Chapter 6  
(Polymorphism and its limitations → Polymorphic recursion) giving the  
“depth” function [in the non-polymorphically-recursive part of the example]  
a much more sensible behavior; also fix a typo and some formatting.  
(Frank Steffahn, review by Florian Angeletti)

- [#13668](https://github.com/ocaml/ocaml/issues/13668): Document the basic support for unicode identifiers and the switch to  
UTF-8 encoded Unicode text for OCaml source file  
(Florian Angeletti, review by Nicolás Ojeda Bär and Daniel Bünzli)

### Compiler user-interface and warnings:

- (_breaking change_) [#12084](https://github.com/ocaml/ocaml/issues/12084), [#13669](https://github.com/ocaml/ocaml/issues/13669), [#13673](https://github.com/ocaml/ocaml/issues/13673): Check link order when creating archive and when using  
ocamlopt.  
(Hugo Heuzard, review by Stefan Muenzel and Sébastien Hinderer)

- [#12980](https://github.com/ocaml/ocaml/issues/12980): Explain type mismatch involving first-class modules by including  
the module level error message  
(Florian Angeletti, review by Vincent Laviron)

- [#12985](https://github.com/ocaml/ocaml/issues/12985), [#12988](https://github.com/ocaml/ocaml/issues/12988): Better error messages for partially applied functors.  
(Florian Angeletti, report by Arthur Wendling, review by Gabriel Scherer)

- [#13034](https://github.com/ocaml/ocaml/issues/13034), [#13260](https://github.com/ocaml/ocaml/issues/13260): Better error messages for mismatched function labels  
(Florian Angeletti, report by Daniel Bünzli, review by Gabriel Scherer and  
Samuel Vivien)

- [#13051](https://github.com/ocaml/ocaml/issues/13051): Add a “Syntax error” to error messages for invalid package signatures.  
(Samuel Vivien, review by Gabriel Scherer)

- [#13099](https://github.com/ocaml/ocaml/issues/13099): Fix erroneous loading of cmis for some module type errors.  
(Nick Roberts, review by Florian Angeletti)

- [#13151](https://github.com/ocaml/ocaml/issues/13151), name conflicts explanation as a footnote  
(Florian Angeletti, review by Gabriel Scherer)

- [#13228](https://github.com/ocaml/ocaml/issues/13228): Re-export Cmt2annot.{iterator,binary\_part} which had become hidden  
since [#11288](https://github.com/ocaml/ocaml/issues/11288) and broke ocamlbrowser.  
(David Allsopp, report by Jacques Garrigue, review by Sébastien Hinderer)

- [#13251](https://github.com/ocaml/ocaml/issues/13251): Register printer for errors in Emitaux  
(Vincent Laviron, review by Miod Vallat and Florian Angeletti)

- [#13255](https://github.com/ocaml/ocaml/issues/13255): Re-enable warning 34 for unused locally abstract types  
(Nick Roberts, review by Chris Casinghino and Florian Angeletti)

- [#12182](https://github.com/ocaml/ocaml/issues/12182): Improve the type clash error message.  
For example, this message:

- [#13471](https://github.com/ocaml/ocaml/issues/13471): add `-keywords <version?+list>` flag to define the list of keywords  
recognized by the lexer, for instance `-keywords 5.2` disable the `effect`  
keyword.  
(Florian Angeletti, review by Gabriel Scherer)

### Internal/compiler-libs changes:

- [#13286](https://github.com/ocaml/ocaml/issues/13286): Distinguish unique identifiers `Shape.Uid.t` according to their  
provenance: either an implementation or an interface.  
(Ulysse Gérard, review by Florian Angeletti and Leo White)

- [#13308](https://github.com/ocaml/ocaml/issues/13308): keep track of relations between declaration in the cmt files. This is  
useful information for external tools for navigation and analysis purposis.  
(Ulysse Gérard, Florian Angeletti, review by Florian Angeletti and Gabriel  
Scherer)

- [#11129](https://github.com/ocaml/ocaml/issues/11129), [#11148](https://github.com/ocaml/ocaml/issues/11148): enforce that ppxs do not produce `parsetree`s with  
an empty list of universally quantified type variables  
(`. int -> int` instead of `'a . int -> int'`)  
(Florian Angeletti, report by Simmo Saan, review by Gabriel Scherer)

- [#12534](https://github.com/ocaml/ocaml/issues/12534): document and refactor Matching.mk\_failaction\_pos  
(Gabriel Scherer, review by Vincent Laviron and Nick Roberts)

- [#13076](https://github.com/ocaml/ocaml/issues/13076): change the handling of Match\_failure exits in the pattern-matching  
compiler, to prepare for a complete fix for [#7241](https://github.com/ocaml/ocaml/issues/7241)  
(Gabriel Scherer, review by Thomas Refis and Nick Roberts)

- [#12896](https://github.com/ocaml/ocaml/issues/12896): Simplify the compilation of custom bytecode runtimes by explicitly  
compiling the primitives file before calling the linker. Tidy-up both the  
generating code and the output itself for C code being generated by the  
bytecode linker in `-custom` and `-output-*` modes.  
(David Allsopp, Antonin Décimo and Samuel Hym, review by Vincent Laviron)

- [#12932](https://github.com/ocaml/ocaml/issues/12932): Remove useless code in Typecore.type\_label\_exp (was a fix for [#4862](https://github.com/ocaml/ocaml/issues/4862))  
(Jacques Garrigue, review by Gabriel Scherer)

- [#12943](https://github.com/ocaml/ocaml/issues/12943): Make transient\_expr.scope a bitfield, and use it to store marks.  
Marks are automatically allocated, and removed when leaving their scope.  
Falls back to using TransientTypeSet when marks are exhausted.  
(Jacques Garrigue and Takafumi Saikawa, review by Basile Clément)

- [#12946](https://github.com/ocaml/ocaml/issues/12946): Make generalization automatic when leaving scope.  
As a result, the `Ctype.generalize*` and `Ctype.correct_levels` functions  
were removed. The latter is now called `Ctype.duplicate_type`.  
(Jacques Garrigue and Takafumi Saikawa, review by Richard Eisenberg)

- [#12968](https://github.com/ocaml/ocaml/issues/12968): Attach location to constants in the parsetree  
(Jules Aguillon, review by Gabriel Scherer)

- [#12959](https://github.com/ocaml/ocaml/issues/12959), [#13055](https://github.com/ocaml/ocaml/issues/13055): Avoid an internal error on recursive module type inconsistency  
(Florian Angeletti, review by Jacques Garrigue and Gabriel Scherer)

- [#13049](https://github.com/ocaml/ocaml/issues/13049): graphical debugging printer for types  
(Florian Angeletti, review by Gabriel Scherer)

- [#13074](https://github.com/ocaml/ocaml/issues/13074), [#13082](https://github.com/ocaml/ocaml/issues/13082), [#13084](https://github.com/ocaml/ocaml/issues/13084): refactoring in the pattern-matching compiler  
(Gabriel Scherer, review by Thomas Refis, Vincent Laviron and Nick Roberts)

- [#13067](https://github.com/ocaml/ocaml/issues/13067): rework volatile memory access rules under TSan to consider properly  
aligned smaller-than-register read operations as atomic, which gets rid of  
false positives on s390x  
(Miod Vallat, review by Fabien Buoro)

- [#13162](https://github.com/ocaml/ocaml/issues/13162): Use quoted strings to clarify code being generated.  
(Antonin Décimo, review by Miod Vallat and Gabriel Scherer)

- [#13015](https://github.com/ocaml/ocaml/issues/13015): Emit floating-point literals in .rodata section on ELF arm64  
platforms (Linux, \*BSD).  
(Miod Vallat, review by Nicolás Ojeda Bär)

- [#13169](https://github.com/ocaml/ocaml/issues/13169), [#13311](https://github.com/ocaml/ocaml/issues/13311): Introduce a document data type for compiler messages  
rather than relying on `Format.formatter -> unit` closures.  
(Florian Angeletti, review by Gabriel Scherer)

- [#13193](https://github.com/ocaml/ocaml/issues/13193): Remove the unused env\_init field from class blocks  
(Vincent Laviron, review by Jacques Garrigue)

- [#13257](https://github.com/ocaml/ocaml/issues/13257): integrate MetaOCaml in the Menhir grammar to ease MetaOCaml  
maintenance. This is a purely internal change: there is no support  
in the lexer, so no change to the surface OCaml grammar.  
(Oleg Kiselyov, Gabriel Scherer and Florian Angeletti,  
review by Jeremy Yallop)

- [#13289](https://github.com/ocaml/ocaml/issues/13289): Use C99 for loop to reduce the scope of the for loop iterator.  
(Antonin Décimo, review by Miod Vallat and Gabriel Scherer)

- [#13336](https://github.com/ocaml/ocaml/issues/13336): compiler-libs, split the `Printtyp` in three to only keep  
“user-friendly” functions in the `Printtyp` module.  
(Florian Angeletti, review by Gabriel Scherer)

- [#13361](https://github.com/ocaml/ocaml/issues/13361): split runtime/array.c functions to consistently expose  
uniform\_array and floatarray versions, use floatarray versions  
in Float.Array.  
(Gabriel Scherer, review by Nicolás Ojeda Bär)

- [#13507](https://github.com/ocaml/ocaml/issues/13507): A small refactoring to [free\_vars] to make it a bit faster  
by not allocating a list when the list is not necessary.  
(Richard Eisenberg, review by Jacques Garrigue)

### Build system:

- [#12909](https://github.com/ocaml/ocaml/issues/12909): Reorganise how MKEXE\_VIA\_CC is built to make it correct for MSVC by  
grouping all the linker flags at the end of the C compiler commandline  
(David Allsopp and Samuel Hym, review by Nicolás Ojeda Bär)

- [#12992](https://github.com/ocaml/ocaml/issues/12992), [#13009](https://github.com/ocaml/ocaml/issues/13009): Check that flexlink can be executed only when building in a  
native windows environment.  
(Romain Beauxis, review by David Allsopp and Sébastien Hinderer)

- [#12996](https://github.com/ocaml/ocaml/issues/12996): Only link with -lgcc\_eh when available.  
(Romain Beauxis, review by David Allsopp and Miod Vallat)

- (_breaking change_) [#13200](https://github.com/ocaml/ocaml/issues/13200): Do not use CFLAGS for linking.  
(Sébastien Hinderer, review by Gabriel Scherer, Antonin Décimo,  
Miod Vallat and Samuel Hym)

- [#13201](https://github.com/ocaml/ocaml/issues/13201), [#13244](https://github.com/ocaml/ocaml/issues/13244): Fix and speedup builds with TSan.  
(Sébastien Hinderer, review by Miod Vallat, Gabriel Scherer and  
Olivier Nicole)

- (_breaking change_) [#12578](https://github.com/ocaml/ocaml/issues/12578), [#12589](https://github.com/ocaml/ocaml/issues/12589), [#13322](https://github.com/ocaml/ocaml/issues/13322), [#13519](https://github.com/ocaml/ocaml/issues/13519): Use configured CFLAGS and CPPFLAGS _only_  
during the build of the compiler itself. Do not use them when  
compiling third-party C sources through the compiler. Flags for  
compiling third-party C sources can still be specified at configure  
time in the COMPILER\_{BYTECODE,NATIVE}\_{CFLAGS,CPPFLAGS}  
configuration variables.  
(Sébastien Hinderer, report by William Hu, review by David Allsopp)

- [#13285](https://github.com/ocaml/ocaml/issues/13285): continue the merge of the sub-makefiles into the root  
Makefile started with [#11243](https://github.com/ocaml/ocaml/issues/11243), [#11248](https://github.com/ocaml/ocaml/issues/11248), [#11268](https://github.com/ocaml/ocaml/issues/11268), [#11420](https://github.com/ocaml/ocaml/issues/11420), [#11675](https://github.com/ocaml/ocaml/issues/11675),  
[#12198](https://github.com/ocaml/ocaml/issues/12198), [#12321](https://github.com/ocaml/ocaml/issues/12321), [#12586](https://github.com/ocaml/ocaml/issues/12586), [#12616](https://github.com/ocaml/ocaml/issues/12616), [#12706](https://github.com/ocaml/ocaml/issues/12706) and [#13048](https://github.com/ocaml/ocaml/issues/13048).  
(Sébastien Hinderer, review by David Allsopp and Florian Angeletti)

### Bug fixes:

- [#12854](https://github.com/ocaml/ocaml/issues/12854): Add a test in the regression suite that flags the bug [#12825](https://github.com/ocaml/ocaml/issues/12825).  
(Luc Maranget)

- [#12888](https://github.com/ocaml/ocaml/issues/12888): fix printing of uncaught exceptions in `.cmo` files passed on the  
command-line of the toplevel.  
(Nicolás Ojeda Bär, review by Florian Angeletti, report by Daniel Bünzli)

- [#12910](https://github.com/ocaml/ocaml/issues/12910), [#12920](https://github.com/ocaml/ocaml/issues/12920): Fix an unsound interaction between first-class modules  
and polymorphic records by saving and restoring univar\_pairs.  
(Stephen Dolan, review by Gabriel Scherer, report by Jeremy Yallop)

- [#12994](https://github.com/ocaml/ocaml/issues/12994): Remove un-used and unsafe caml\_drop\_continuation  
(Tim McGilchrist, reviewed by Gabriel Scherer and Miod Vallat)

- [#12963](https://github.com/ocaml/ocaml/issues/12963): Restore caml\_runtime\_parameters implementation. This primitive allows  
programs to query the runtime parameters supplied to an OCaml program.  
Implementation missing since OCaml 5.0.  
(Tim McGilchrist, reviewed by David Allsopp and Miod Vallat)

- [#13012](https://github.com/ocaml/ocaml/issues/13012): parsing: Fix dropped attributes after a `-` or `+`  
The syntax `-(1 [@foo])` was incorrectly parsed as `-1`.  
(Jules Aguillon, reviewed by Gabriel Scherer, report by Gabriel Scherer)

- (_breaking change_) [#13070](https://github.com/ocaml/ocaml/issues/13070): On Windows, when configured with bootstrapped flexdll, don’t add  
+flexdll to the search path when -nostdlib is specified (which then means  
-L no longer gets passed to the system linker).  
(David Allsopp, review by Florian Angeletti)

- [#13089](https://github.com/ocaml/ocaml/issues/13089): Fix bug in `runtime_events` library which could result in garbled  
output under Windows.  
(B. Szilvasy, review by Nicolás Ojeda Bär and Miod Vallat)

- [#13088](https://github.com/ocaml/ocaml/issues/13088): A few type-checker behaviors look at a type to see if there are  
any labeled arguments in it. This sometimes required expansion, which  
could, in obscure scenarios, result in superfluous type errors.  
(Richard Eisenberg, review by Gabriel Scherer and Jacques Garrigue)

- [#13103](https://github.com/ocaml/ocaml/issues/13103): FreeBSD/amd64: properly annotate .o files with non-executable stack  
notes (Konstantin Belousov, review by Nicolás Ojeda Bär)

- [#13150](https://github.com/ocaml/ocaml/issues/13150): improve a transitive-closure computation algorithm in the flambda  
middle-end to avoid a compilation time blowup on Menhir-generated code  
(Florian Weimer, review by Gabriel Scherer and Pierre Chambart,  
report by Richard Jones)

- [#13166](https://github.com/ocaml/ocaml/issues/13166): Fix a MinGW/MSVC Sys.rename regression on renaming a parent directory  
to an empty child directory.  
(Jan Midtgaard, review by Antonin Décimo, Sébastien Hinderer, and  
David Allsopp)

- [#13185](https://github.com/ocaml/ocaml/issues/13185), [#13192](https://github.com/ocaml/ocaml/issues/13192): Reject type-level module aliases on functor parameter  
inside signatures.  
(Jacques Garrigue, report by Richard Eisenberg, review by Florian Angeletti)

- [#13170](https://github.com/ocaml/ocaml/issues/13170): Fix a bug that would result in some floating alerts `[@@@alert ...]`  
incorrectly triggering Warning 53.  
(Nicolás Ojeda Bär, review by Chris Casinghino and Florian Angeletti)

- [#13203](https://github.com/ocaml/ocaml/issues/13203): Do not issue warning 53 if the compiler is stopping before attributes  
have been accurately marked.  
(Chris Casinghino, review by Florian Angeletti)

- [#13207](https://github.com/ocaml/ocaml/issues/13207): Be sure to reload the register caching the exception handler in  
caml\_c\_call and caml\_c\_call\_stack\_args, as its value may have been changed  
if the OCaml stack is expanded during a callback.  
(Miod Vallat, report by Vesa Karvonen, review by Gabriel Scherer and  
Xavier Leroy)

- [#13209](https://github.com/ocaml/ocaml/issues/13209): Fix configure test that checks whether `ar` supports `@FILE`  
arguments.  
(Nicolás Ojeda Bär, report by Boris D.)

- [#13221](https://github.com/ocaml/ocaml/issues/13221): Compute more accurate instruction sizes for branch relocation on  
POWER.  
(Miod Vallat, review by Gabriel Scherer)

- [#13252](https://github.com/ocaml/ocaml/issues/13252): Rework register assignment in the interpreter code on m68k on Linux,  
due to the %a5 register being used by Glibc.  
(Miod Vallat, report by Stéphane Glondu, review by Gabriel Scherer and  
Xavier Leroy)

- [#13247](https://github.com/ocaml/ocaml/issues/13247): Disable lib\_unix/kill test for MacOS AMD64 with TSan, linking  
to llvm bug report causing infinite signal loops.  
(Tim McGilchrist, review by Olivier Nicole, Miod Vallat, Sébastien Hinderer  
and Gabriel Scherer)

- [#13234](https://github.com/ocaml/ocaml/issues/13234), [#13267](https://github.com/ocaml/ocaml/issues/13267): Open runtime events file in read-write mode on armel  
(armv5) systems due to atomic operations limitations on that  
platform.  
(Stéphane Glondu, review by Miod Vallat and Vincent Laviron)

- [#13273](https://github.com/ocaml/ocaml/issues/13273): Fix a call to test in configure.ac that was causing errors when  
LDFLAGS contains several words.  
(Stéphane Glondu, review by Miod Vallat)

- [#13290](https://github.com/ocaml/ocaml/issues/13290): Fix uninitialized and out of bounds reads in runtime\_events\_consumer.c  
(Edwin Török, review by Miod Vallat and Antonin Décimo)

- [#13306](https://github.com/ocaml/ocaml/issues/13306): An algorithm in the type-checker that checks two types for equality  
could sometimes, in theory, return the wrong answer. This patch fixes the  
oversight. No known program triggers the bug.  
(Richard Eisenberg, review by Florian Angeletti)

- [#13400](https://github.com/ocaml/ocaml/issues/13400): Initialize th-\>signal\_stack to avoid free of uninitialized data  
if the user calls caml\_c\_thread\_unregister on the main thread.  
(Richard W.M. Jones, review by Guillaume Munch-Maccagnoni and  
Gabriel Scherer)

- [#13140](https://github.com/ocaml/ocaml/issues/13140): POWER back-end: fix issue with call to `caml_call_realloc_stack`  
from a DLL  
(Xavier Leroy, review by Miod Vallat)

- [#13263](https://github.com/ocaml/ocaml/issues/13263), [#13560](https://github.com/ocaml/ocaml/issues/13560): fix printing true and false in toplevel and error  
messages (no more unexpected #true)  
(Florian Angeletti, report by Samuel Vivien, review by Gabriel Scherer)

- [#13388](https://github.com/ocaml/ocaml/issues/13388), [#13540](https://github.com/ocaml/ocaml/issues/13540): raises an error message (and not an internal compiler error)  
when two local substitutions are incompatible (for instance `module type S:=sig end type t:=(module S)`)  
(Florian Angeletti, report by Nailen Matschke, review by Gabriel Scherer, and  
Leo White)

- [#13408](https://github.com/ocaml/ocaml/issues/13408): Fix misplaced debug runtime assertion triggerable by a race  
between domain exit and backup thread  
(Miod Vallat and Gabriel Scherer, report by Jan Midtgaard)

- [#13417](https://github.com/ocaml/ocaml/issues/13417): `Filename.quote_command`: fix handling of forward slashes in program  
path under Win32.  
(Nicolás Ojeda Bär, review by David Allsopp and Damien Doligez)

- [#13501](https://github.com/ocaml/ocaml/issues/13501): Regression on mutually recursive types caused by [#12180](https://github.com/ocaml/ocaml/issues/12180).  
Resuscitate Typedecl.update\_type.  
(Jacques Garrigue and Takafumi Saikawa, review by Florian Angeletti, Richard  
Eisenberg and Gabriel Scherer)

- [#13502](https://github.com/ocaml/ocaml/issues/13502): Fix misindexing related to `Gc.finalise_last` that could prevent  
finalisers from being run.  
(Nick Roberts, review by Mark Shinwell)

- [#13495](https://github.com/ocaml/ocaml/issues/13495), [#13514](https://github.com/ocaml/ocaml/issues/13514): Fix typechecker crash while typing objects  
(Jacques Garrigue, report by Nicolás Ojeda Bär, review by  
Nicolas Ojeda Bär, Gabriel Scherer, Stephen Dolan, Florian Angeletti)

- [#13391](https://github.com/ocaml/ocaml/issues/13391), [#13551](https://github.com/ocaml/ocaml/issues/13551): fix a printing bug with `-dsource` when using  
raw literal inside a locally abstract type constraint  
(i.e. `let f: type \#for. ... `)  
(Florian Angeletti, report by Nick Roberts, review by Richard Eisenberg)

- [#13520](https://github.com/ocaml/ocaml/issues/13520): Fix compilation of native-code version of systhreads. Bytecode fields  
were being included in the thread descriptors.  
(David Allsopp, review by Sébastien Hinderer and Miod Vallat)

- [#13541](https://github.com/ocaml/ocaml/issues/13541), [#13591](https://github.com/ocaml/ocaml/issues/13591): Fix headers for C++ inclusion.  
(Antonin Décimo, review by Nick Barnes, report by Kate Deplaix)

- [#13579](https://github.com/ocaml/ocaml/issues/13579), [#13583](https://github.com/ocaml/ocaml/issues/13583): Unsoundness involving non-injective types + gadts  
(Jacques Garrigue, report by @v-gb,  
review by Richard Eisenberg and Florian Angeletti)

- [#13598](https://github.com/ocaml/ocaml/issues/13598): Falsely triggered warning 56 [unreachable-case]  
This was caused by unproper protection of the retyping function.  
(Jacques Garrigue, report by Tõivo Leedjärv, review by Florian Angeletti)

- [#13603](https://github.com/ocaml/ocaml/issues/13603), [#13604](https://github.com/ocaml/ocaml/issues/13604): fix source printing in the presence of the escaped raw  
identifier `\#mod`.  
(Florian Angeletti, report by Chris Casinghino, review by Gabriel Scherer)

---

<div class="post-metadata">

**Author:** ![octachron](https://avatars.discourse-cdn.com/v4/letter/o/49beb7/32.png) [@octachron](https://discuss.ocaml.org/u/octachron)\
**Post date:** [January 8, 2025, 10:22pm UTC](https://discuss.ocaml.org/t/ocaml-5-3-0-released/15916/2 "2025-01-08T22:22:18Z")

</div>



---

<div class="post-metadata">

**Author:** ![dbuenzli](https://sea2.discourse-cdn.com/flex020/user_avatar/discuss.ocaml.org/dbuenzli/32/18_2.png) [@dbuenzli](https://discuss.ocaml.org/u/dbuenzli)\
**Post date:** [January 8, 2025, 11:24pm UTC](https://discuss.ocaml.org/t/ocaml-5-3-0-released/15916/3 "2025-01-08T23:24:38Z")

</div>

Thank you for the release work!

> [@octachron](#):
>
> - Restored MSVC portIt is now possible to use the MSVC toolchain on Windows, restoring the last  
> missing port from OCaml 4 (except for the native compiler support for 32-bit  
> architectures which is not planned)

This is good news. Do you happen to have any insight at how it remains important, from the library eco-system perspective, to support the 4.14.\* line ? (I see the word of caution about 5.0 has not been removed from the README)

---

<div class="post-metadata">

**Author:** ![dra27](https://sea2.discourse-cdn.com/flex020/user_avatar/discuss.ocaml.org/dra27/32/5294_2.png) [@dra27](https://discuss.ocaml.org/u/dra27)\
**Post date:** [January 9, 2025, 5:43am UTC](https://discuss.ocaml.org/t/ocaml-5-3-0-released/15916/4 "2025-01-09T05:43:44Z")

</div>

> [@dbuenzli](#):
>
> This is good news. Do you happen to have any insight at how it remains important, from the library eco-system perspective, to support the 4.14.\* line ? (I see the word of caution about 5.0 has not been removed from the README)

The warning has been “softened” ([Soften the 5.0 cautionary README note by dra27 · Pull Request #13394 · ocaml/ocaml · GitHub](https://github.com/ocaml/ocaml/pull/13394)). My (personal) intuition is that supporting 4.14.\* remains important for now, because there are users of large codebases which are still in the process of evaluating OCaml 5.x, but that nothing reported is unsolvable (so far 🤞). I would hope that by this time next year the cautionary note is able to be removed entirely. Note that existing known issues are in OCaml’s issue tracker, in particular the [Performance](https://github.com/ocaml/ocaml/labels/Performance) and [gc](https://github.com/ocaml/ocaml/labels/gc) labels.

As ever, if one has a system using OCaml 4.x which for whatever reason cannot be switched to OCaml 5.x (_especially_ if this is owing to a performance degradation), please do file an issue or start a discussion here, even if the system in question is closed-source (it’s obviously somewhat harder to investigate those regressions, but it’s still immensely useful to know the problems exist).

---

<div class="post-metadata">

**Author:** ![semarie](https://sea2.discourse-cdn.com/flex020/user_avatar/discuss.ocaml.org/semarie/32/5531_2.png) [@semarie](https://discuss.ocaml.org/u/semarie)\
**Post date:** [January 9, 2025, 11:27am UTC](https://discuss.ocaml.org/t/ocaml-5-3-0-released/15916/5 "2025-01-09T11:27:55Z")

</div>

I would like to signal that [The OCaml system, release 5.3](https://ocaml.org/manual/5.3/index.html) page has several dead links (HTTP 404) for the href in the line “This manual is also available in PDF, plain text, as a bundle of HTML files, and as a bundle of Emacs Info files”.

Thanks for this release.

---

<div class="post-metadata">

**Author:** ![virgile](https://sea2.discourse-cdn.com/flex020/user_avatar/discuss.ocaml.org/virgile/32/2854_2.png) [@virgile](https://discuss.ocaml.org/u/virgile)\
**Post date:** [January 9, 2025, 12:01pm UTC](https://discuss.ocaml.org/t/ocaml-5-3-0-released/15916/6 "2025-01-09T12:01:06Z")

</div>

Moreover, the links to the documentation of the [stdlib’s module](https://ocaml.org/manual/5.3/stdlib.html) are incorrect. They refer to a non-existing `libref` directory, while the pages seem to be in the `api` directory (e.g. [`https://ocaml.org/manual/5.3/libref/Arg.html`](https://ocaml.org/manual/5.3/libref/Arg.html) → [`https://ocaml.org/manual/5.3/api/Arg.html`](https://ocaml.org/manual/5.3/api/Arg.html))

---

<div class="post-metadata">

**Author:** ![octachron](https://avatars.discourse-cdn.com/v4/letter/o/49beb7/32.png) [@octachron](https://discuss.ocaml.org/u/octachron)\
**Post date:** [January 9, 2025, 12:13pm UTC](https://discuss.ocaml.org/t/ocaml-5-3-0-released/15916/7 "2025-01-09T12:13:44Z")

</div>

This is being fixed, I somehow sent the stand-alone html version of the manual to `ocaml.org` rather than the `ocaml.org` version.

---

<div class="post-metadata">

**Author:** ![octachron](https://avatars.discourse-cdn.com/v4/letter/o/49beb7/32.png) [@octachron](https://discuss.ocaml.org/u/octachron)\
**Post date:** [January 9, 2025, 4:17pm UTC](https://discuss.ocaml.org/t/ocaml-5-3-0-released/15916/8 "2025-01-09T16:17:36Z")

</div>

The manual and standard library documentation has been fixed now, thanks for the report !

---

<div class="post-metadata">

**Author:** ![nojaf](https://sea2.discourse-cdn.com/flex020/user_avatar/discuss.ocaml.org/nojaf/32/5587_2.png) [@nojaf](https://discuss.ocaml.org/u/nojaf)\
**Post date:** [January 10, 2025, 10:24am UTC](https://discuss.ocaml.org/t/ocaml-5-3-0-released/15916/9 "2025-01-10T10:24:34Z")

</div>

So, after reading the section “Debugging Improvements” from [Tarides | OCaml 5.3: Features and Fixes!](https://tarides.com/blog/2025-01-09-ocaml-5-3-features-and-fixes/) would this mean that debugging in say Vscode with OCaml earlybird is magically better on Mac after updating to 5.3?

---

<div class="post-metadata">

**Author:** ![EmileTrotignon](https://sea2.discourse-cdn.com/flex020/user_avatar/discuss.ocaml.org/emiletrotignon/32/5913_2.png) [@EmileTrotignon](https://discuss.ocaml.org/u/EmileTrotignon)\
**Post date:** [January 10, 2025, 10:55am UTC](https://discuss.ocaml.org/t/ocaml-5-3-0-released/15916/10 "2025-01-10T10:55:49Z")

</div>

No, earlybird uses ocamldebug, it debugs the bytecode (and because of that is not platform specific). The improvement are for lldb which debugs native code.

---

<div class="post-metadata">

**Author:** ![giltho](https://sea2.discourse-cdn.com/flex020/user_avatar/discuss.ocaml.org/giltho/32/3521_2.png) [@giltho](https://discuss.ocaml.org/u/giltho)\
**Post date:** [January 10, 2025, 12:40pm UTC](https://discuss.ocaml.org/t/ocaml-5-3-0-released/15916/11 "2025-01-10T12:40:51Z")

</div>

Absolute banger of a release 💥💥💥  
Thank you ❤

---

<div class="post-metadata">

**Author:** ![lambda\_foo](https://sea2.discourse-cdn.com/flex020/user_avatar/discuss.ocaml.org/lambda_foo/32/275_2.png) [@lambda\_foo](https://discuss.ocaml.org/u/lambda_foo)\
**Post date:** [January 12, 2025, 10:22pm UTC](https://discuss.ocaml.org/t/ocaml-5-3-0-released/15916/12 "2025-01-12T22:22:27Z")

</div>

The debugging improvements are all for native code but apply equally to both LLDB and GDB, where that makes sense. At the moment my focus is on improving native debugging since **I think** it will have the largest impact. If anyone wants to help me please get in touch.

Improving bytecode debugging would be useful but I don’t have much information about how people are using it and whether it is more / less important than native debugging.

---

<div class="post-metadata">

**Author:** ![toots](https://sea2.discourse-cdn.com/flex020/user_avatar/discuss.ocaml.org/toots/32/3323_2.png) [@toots](https://discuss.ocaml.org/u/toots)\
**Post date:** [January 13, 2025, 6:02am UTC](https://discuss.ocaml.org/t/ocaml-5-3-0-released/15916/13 "2025-01-13T06:02:58Z")

</div>

While super supportive and stoked for the pace of improvement in the OCaml releases, I have to note that this Gc regression has been documented for a while: [Regression with default GC settings between `4.14.2` and `5.1.1` · Issue #13123 · ocaml/ocaml · GitHub](https://github.com/ocaml/ocaml/issues/13123).

The last release of our software has reduced memory footprint at runtime so I think that we might be able to work around it but, so far, this issue is the reason we still recommend OCaml 4.14 for our production users.

---

<div class="post-metadata">

**Author:** ![bluddy](https://sea2.discourse-cdn.com/flex020/user_avatar/discuss.ocaml.org/bluddy/32/104_2.png) [@bluddy](https://discuss.ocaml.org/u/bluddy)\
**Post date:** [January 13, 2025, 6:26am UTC](https://discuss.ocaml.org/t/ocaml-5-3-0-released/15916/14 "2025-01-13T06:26:40Z")

</div>

Native debugging is far more important in general. Because it’s still limited though, especially with regard to value inspection, people tend to see bytecode debugging as more useful, but bytecode debugging is also not available in some contexts.

---

<div class="post-metadata">

**Author:** ![nojaf](https://sea2.discourse-cdn.com/flex020/user_avatar/discuss.ocaml.org/nojaf/32/5587_2.png) [@nojaf](https://discuss.ocaml.org/u/nojaf)\
**Post date:** [January 14, 2025, 5:43pm UTC](https://discuss.ocaml.org/t/ocaml-5-3-0-released/15916/15 "2025-01-14T17:43:22Z")

</div>

Pardon my ignorance, but does anyone have any links on how to set this up with Mac and vscode?  
Is that a thing for native debugging?

---

<div class="post-metadata">

**Author:** ![lambda\_foo](https://sea2.discourse-cdn.com/flex020/user_avatar/discuss.ocaml.org/lambda_foo/32/275_2.png) [@lambda\_foo](https://discuss.ocaml.org/u/lambda_foo)\
**Post date:** [January 14, 2025, 9:33pm UTC](https://discuss.ocaml.org/t/ocaml-5-3-0-released/15916/16 "2025-01-14T21:33:39Z")

</div>

Such a thing does exist, I documented my Emacs setup [Debugging OCaml with Emacs · Perpetually Curious Blog](https://lambdafoo.com/posts/2024-03-25-ocaml-debugging-with-emacs.html)

The short version for VSCode is:

1. Install `CodeLLDB` and `OCaml Platform`
2. Setup a `launch.json` at the top level of the project (example in that blog post).
3. Profit!

At step 3 you’ll be able to debug a binary, step through it and get accurate backtraces. Unfortunately at that point you’ll run into the current limitations of native debugging on macOS. Setting breakpoints based on symbol names requires [ocaml#13050](https://github.com/ocaml/ocaml/pull/13050) and setting breakpoints based on filename / line number requires some minimal amount of DWARF information to be emitted by the compiler (my current work).

---

<div class="post-metadata">

**Author:** ![adrien](https://avatars.discourse-cdn.com/v4/letter/a/ea666f/32.png) [@adrien](https://discuss.ocaml.org/u/adrien)\
**Post date:** [February 9, 2025, 1:59pm UTC](https://discuss.ocaml.org/t/ocaml-5-3-0-released/15916/17 "2025-02-09T13:59:22Z")

</div>

If I’ve understood correctly, 5.3 makes memtrace possible again. Is memtrace usable again right away or does it need changes to adapt to 5.3?

It’s possible my program is affected in the same way as liquidsoap; I’ve copied the GC settings that @toots changed there and testing now but it will take more time to test (memory usage happens after network queries so it’s not easy to speed up reproducing the situation).

---

<div class="post-metadata">

**Author:** ![kit-ty-kate](https://sea2.discourse-cdn.com/flex020/user_avatar/discuss.ocaml.org/kit-ty-kate/32/5953_2.png) [@kit-ty-kate](https://discuss.ocaml.org/u/kit-ty-kate)\
**Post date:** [February 9, 2025, 2:14pm UTC](https://discuss.ocaml.org/t/ocaml-5-3-0-released/15916/18 "2025-02-09T14:14:45Z")

</div>

memtrace needs changes to be usable again. You can follow the progress at [janestreet/memtrace#22](https://github.com/janestreet/memtrace/pull/22)

---

<div class="post-metadata">

**Author:** ![lambda\_foo](https://sea2.discourse-cdn.com/flex020/user_avatar/discuss.ocaml.org/lambda_foo/32/275_2.png) [@lambda\_foo](https://discuss.ocaml.org/u/lambda_foo)\
**Post date:** [February 10, 2025, 2:43am UTC](https://discuss.ocaml.org/t/ocaml-5-3-0-released/15916/19 "2025-02-10T02:43:20Z")

</div>

What @kit-ty-kate said 🙂

The changes to `memtrace` are minimal (mostly locking around writing to a file) but sufficient to profile various applications using OCaml 5 domains and effects. Please test it out and report any issues or improvements you would find useful.

There is lots of scope for improving both the memtrace library itself and providing new ways of visualising the data. In particular supporting the directed graph view that [pprof](https://go.dev/blog/pprof) uses or Tree-maps like [firefox](https://firefox-source-docs.mozilla.org/devtools-user/memory/tree_map_view/index.html), which I’m starting to look at with the help of an intern at Tarides.

---

<div class="post-metadata">

**Author:** ![adrien](https://avatars.discourse-cdn.com/v4/letter/a/ea666f/32.png) [@adrien](https://discuss.ocaml.org/u/adrien)\
**Post date:** [February 10, 2025, 9:44pm UTC](https://discuss.ocaml.org/t/ocaml-5-3-0-released/15916/20 "2025-02-10T21:44:37Z")

</div>

Thanks @kit-ty-kate and @lambda_foo . I’ll give it a try this week. Treemaps also sound wonderful, can’t wait to see the result. 🙂

[Next page](https://discuss.ocaml.org/t/ocaml-5-3-0-released/15916.md?page=2)
