OTP 28.0 Released
Erlang/OTP
otp@REDACTED
Wed May 21 09:55:57 CEST 2025
Inital Release: OTP 28.0
Git Tag: OTP-28.0
Date: 2025-05-21
Trouble Report Id: OTP-16607, OTP-19096, OTP-19115, OTP-19125,
OTP-19127, OTP-19135, OTP-19141, OTP-19144,
OTP-19155, OTP-19156, OTP-19159, OTP-19161,
OTP-19180, OTP-19184, OTP-19194, OTP-19198,
OTP-19204, OTP-19207, OTP-19224, OTP-19226,
OTP-19228, OTP-19230, OTP-19231, OTP-19233,
OTP-19250, OTP-19259, OTP-19262, OTP-19263,
OTP-19271, OTP-19278, OTP-19279, OTP-19285,
OTP-19287, OTP-19290, OTP-19295, OTP-19296,
OTP-19297, OTP-19303, OTP-19306, OTP-19308,
OTP-19313, OTP-19314, OTP-19315, OTP-19317,
OTP-19323, OTP-19324, OTP-19334, OTP-19337,
OTP-19339, OTP-19343, OTP-19345, OTP-19354,
OTP-19355, OTP-19364, OTP-19367, OTP-19369,
OTP-19371, OTP-19376, OTP-19386, OTP-19393,
OTP-19394, OTP-19396, OTP-19398, OTP-19401,
OTP-19403, OTP-19404, OTP-19406, OTP-19413,
OTP-19414, OTP-19419, OTP-19420, OTP-19421,
OTP-19422, OTP-19425, OTP-19426, OTP-19427,
OTP-19430, OTP-19431, OTP-19432, OTP-19441,
OTP-19450, OTP-19451, OTP-19452, OTP-19453,
OTP-19454, OTP-19456, OTP-19460, OTP-19463,
OTP-19465, OTP-19472, OTP-19473, OTP-19474,
OTP-19476, OTP-19477, OTP-19478, OTP-19479,
OTP-19480, OTP-19481, OTP-19483, OTP-19484,
OTP-19485, OTP-19487, OTP-19488, OTP-19492,
OTP-19500, OTP-19502, OTP-19503, OTP-19505,
OTP-19507, OTP-19508, OTP-19509, OTP-19510,
OTP-19511, OTP-19512, OTP-19513, OTP-19514,
OTP-19515, OTP-19516, OTP-19517, OTP-19518,
OTP-19519, OTP-19520, OTP-19521, OTP-19522,
OTP-19523, OTP-19524, OTP-19526, OTP-19528,
OTP-19531, OTP-19532, OTP-19533, OTP-19534,
OTP-19535, OTP-19536, OTP-19537, OTP-19538,
OTP-19539, OTP-19540, OTP-19541, OTP-19544,
OTP-19551, OTP-19553, OTP-19554, OTP-19555,
OTP-19556, OTP-19566, OTP-19570, OTP-19572,
OTP-19573, OTP-19574, OTP-19575, OTP-19576,
OTP-19578, OTP-19580, OTP-19583, OTP-19584,
OTP-19586, OTP-19588, OTP-19589, OTP-19590,
OTP-19591, OTP-19593, OTP-19594, OTP-19596,
OTP-19597, OTP-19598, OTP-19601, OTP-19603,
OTP-19604, OTP-19607, OTP-19609, OTP-19612,
OTP-19613, OTP-19614, OTP-19615, OTP-19616,
OTP-19617, OTP-19618, OTP-19620, OTP-19621,
OTP-19624, OTP-19627, OTP-19628, OTP-19629,
OTP-19630
Seq num: GH-7819, GH-8037, GH-8099, GH-8113, GH-8223,
GH-8483, GH-8558, GH-8822, GH-8842, GH-8967,
GH-8985, GH-9092, GH-9113, GH-9173, GH-9255,
GH-9279, GH-9366, GH-9413, GH-9436, GH-9438,
GH-9470, GH-9487, GH-9500, GH-9536, GH-9557,
GH-9565, GH-9668, GH-9722, GH-9754,
OTP-16608, OTP-19482, OTP-19545, OTP-19576,
PR-7830, PR-7970, PR-8078, PR-8100, PR-8207,
PR-8261, PR-8429, PR-8494, PR-8540, PR-8547,
PR-8556, PR-8573, PR-8589, PR-8590, PR-8592,
PR-8600, PR-8625, PR-8642, PR-8651, PR-8660,
PR-8670, PR-8695, PR-8697, PR-8699, PR-8704,
PR-8734, PR-8772, PR-8792, PR-8793, PR-8798,
PR-8805, PR-8812, PR-8820, PR-8862, PR-8885,
PR-8887, PR-8894, PR-8913, PR-8926, PR-8932,
PR-8937, PR-8938, PR-8943, PR-8945, PR-8960,
PR-8962, PR-8966, PR-8968, PR-8973, PR-8975,
PR-8976, PR-8988, PR-9005, PR-9006, PR-9013,
PR-9019, PR-9020, PR-9042, PR-9045, PR-9079,
PR-9082, PR-9083, PR-9094, PR-9095, PR-9101,
PR-9106, PR-9116, PR-9119, PR-9121, PR-9122,
PR-9124, PR-9129, PR-9141, PR-9149, PR-9154,
PR-9171, PR-9186, PR-9192, PR-9207, PR-9214,
PR-9219, PR-9229, PR-9231, PR-9232, PR-9246,
PR-9251, PR-9253, PR-9269, PR-9271, PR-9272,
PR-9275, PR-9276, PR-9277, PR-9280, PR-9287,
PR-9289, PR-9298, PR-9299, PR-9305, PR-9316,
PR-9321, PR-9327, PR-9330, PR-9333, PR-9334,
PR-9342, PR-9344, PR-9363, PR-9376, PR-9388,
PR-9396, PR-9398, PR-9399, PR-9402, PR-9406,
PR-9408, PR-9409, PR-9410, PR-9417, PR-9433,
PR-9441, PR-9445, PR-9446, PR-9448, PR-9468,
PR-9472, PR-9478, PR-9484, PR-9488, PR-9495,
PR-9504, PR-9508, PR-9511, PR-9514, PR-9515,
PR-9516, PR-9517, PR-9518, PR-9519, PR-9537,
PR-9538, PR-9543, PR-9563, PR-9571, PR-9574,
PR-9579, PR-9582, PR-9586, PR-9587, PR-9590,
PR-9594, PR-9595, PR-9604, PR-9608, PR-9610,
PR-9615, PR-9621, PR-9625, PR-9630, PR-9639,
PR-9648, PR-9654, PR-9659, PR-9660, PR-9670,
PR-9671, PR-9677, PR-9678, PR-9680, PR-9705,
PR-9711, PR-9714, PR-9717, PR-9718, PR-9733,
PR-9735, PR-9755, PR-9758, PR-9759, PR-9772,
PR-9774, PR-9775, PR-9786, PR-9787, PR-9791,
PR-9794, PR-9809, PR-9819
System: OTP
Release: 28
Application: asn1-5.4, common_test-1.28, compiler-9.0,
crypto-5.6, debugger-6.0, dialyzer-5.4,
diameter-2.5, edoc-1.4, eldap-1.2.15,
erl_interface-5.6, erts-16.0, et-1.7.2,
eunit-2.10, ftp-1.2.4, inets-9.4,
jinterface-1.15, kernel-10.3, megaco-4.8,
mnesia-4.24, observer-2.18, odbc-2.16,
os_mon-2.11, parsetools-2.7, public_key-1.18,
reltool-1.0.2, runtime_tools-2.2, sasl-4.3,
snmp-5.19, ssh-5.3, ssl-11.3, stdlib-7.0,
syntax_tools-4.0, tftp-1.2.3, tools-4.1.2,
wx-2.5, xmerl-2.1.4
Predecessor: OTP
Check out the git tag OTP-28.0, and build a full OTP system including
documentation.
# HIGHLIGHTS
- For various error types, the compiler now tries to suggest potential fixes by
adding "did you mean ...?" at the end of error messages.
When a function is used with wrong arity, the compiler will try to suggest a
defined function with the same name but a different arity. For example, given
the following module:
-module(typos).
-export([t/0]).
bar(A) -> A.
bar(A,A,A) -> A.
bar(A,A,A,A) -> A.
t() -> bar(0, 0).
The compiler will emit the following message:
typo.erl:6:12: function bar/2 undefined, did you mean bar/1,3,4?
% 6| t() -> bar(0, 0).
% | ^
For compiler errors that can easily be caused by typos, the compiler will try
to suggest what the correct variable or function name, could be. For example,
given the following module:
-module(typos).
-export([bar/2]).
bar(A0, B0) ->
A + B.
the compiler will emit the following error messages:
typos.erl:5:5: variable 'A' is unbound, did you mean 'A0'?
% 5| A + B.
% | ^
typos.erl:5:9: variable 'B' is unbound, did you mean 'B0'?
% 5| A + B.
% | ^
Error types that now suggest correct arities: `bad_inline`, `undefined_nif`,
`bad_nowarn_unused_function`, `bad_nowarn_bif_clash`, `undefined_function`.
Error types that now suggest correct names: `bad_inline`, `undefined_nif`,
`bad_nowarn_unused_function`, `undefined_on_load`, `undefined_function`,
`undefined_record`, `undefined_field`, `unbound_var`.
Using a function with wrong arity has higher precedence than having a typo in
the function name. If the compiler can find a defined function with the same
name but a different arity, it will not suggest a defined function with a
close-enough name, regardless of arity.
Own Id: OTP-19180
Application(s): compiler, stdlib
Related Id(s): PR-8699, PR-9094
- Comprehensions have been extended with zip generators according to EEP 73.
Example:
1> [A+B || A <- [1,2,3] && B <- [4,5,6]].
[5,7,9]
Own Id: OTP-19184
Application(s): compiler, debugger, stdlib, syntax_tools
Related Id(s): PR-8926
- Functionality making it possible for processes to enable reception of
priority messages has been introduced in accordance with EEP 76.
Own Id: OTP-19198
Application(s): erts
Related Id(s): PR-9269, PR-9519, PR-9590
- The `erl -noshell` mode has been updated to have two sub modes called `raw`
and `cooked`, where `cooked` is the old default behaviour and `raw` can be
used to bypass the line-editing support of the native terminal. Using `raw`
mode it is possible to read keystrokes as they happen without the user having
to press Enter. Also, the `raw` mode does not echo the typed characters to
stdout. An example of how to create a tic-tac-toe game using this mechanism is
included in the documentation.
Own Id: OTP-19314
Application(s): erts, stdlib
Related Id(s): GH-8037, PR-8962
- New strict generators have been added for comprehensions.
The currently existing generators are "relaxed": they ignore terms in the
right-hand side expression that do not match the left-hand side pattern.
The new strict generators fail with exception `badmatch` if a pattern doesn't
match.
Examples:
Using the current relaxed generator operator `<-`, any element not matching
the pattern `{_,_}` will be silently discarded:
1> [T || {_,_}=T <- [{ok,1},ok,{error,2}]].
[{ok,1},{error,2}]
If the intention is that all lists processed by a list comprehension must only
contain tuples of size two, using the new strict version of the operator
ensures that term not matching will cause a crash:
2> [T || {_,_}=T <:- [{ok,1},ok,{error,2}]].
** exception error: no match of right hand side value ok
Using the strict generator operator to mark the intention that all list
elements must match the pattern could help finding mistakes quicker if
something unpexected is added to the list processed by the generator.
The strict version for bitstring generators is `<:=`.
Own Id: OTP-19317
Application(s): compiler, debugger, stdlib, syntax_tools
Related Id(s): PR-8625
- The `join(Binaries, Separator)` function that joins a list of binaries has
been added to the `binary` module.
Own Id: OTP-19337
Application(s): stdlib
Related Id(s): GH-8099, PR-8100
- EEP-69: Nominal Types has been implemented. As a side effect, nominal types
can encode opaque types. We changed all opaque-handling logic and improved
opaque warnings in Dialyzer.
All existing Erlang type systems are structural: two types are seen as
equivalent if their structures are the same. Type comparisons are based on the
structures of the types, not on how the user explicitly defines them. For
example, in the following example, `meter()` and `foot()` are equivalent. The
two types can be used interchangeably. Neither of them differ from the basic
type `integer()`.
-type meter() :: integer().
-type foot() :: integer().
Nominal typing is an alternative type system, where two types are equivalent
if and only if they are declared with the same type name. The EEP proposes one
new syntax -nominal for declaring nominal types. Under nominal typing,
`meter()` and `foot()` are no longer compatible. Whenever a function expects
type `meter()`, passing in type `foot()` would result in a Dialyzer error.
-nominal meter() :: integer().
-nominal foot() :: integer().
More nominal type-checking rules can be found in the EEP. It is worth noting
that most work for adding nominal types and type-checking is in
`erl_types.erl`. The rest are changes that removed the previous opaque
type-checking, and added an improved version of it using nominal type-checking
with reworked warnings.
Backwards compatibility for opaque type-checking is not preserved by this PR.
Previous opaque warnings can appear with slightly different wordings. A new
kind of opaque warning `opaque_union` is added, together with a Dialyzer
option `no_opaque_union` to turn this kind of warnings off.
Own Id: OTP-19364
Application(s): dialyzer, diameter, edoc, erts, eunit, kernel, mnesia,
parsetools, runtime_tools, snmp
Related Id(s): PR-9079
- Module `re` has been updated to use PCRE2, which is mostly backward
compatible with PCRE.
The most noticeable incompatibilities are
- The default character encoding is pure ASCII and not Latin1. Unicode support
is still available with options `unicode` and `ucp`.
- Options `bsr_anycrlf`, `bsr_unicode` and `{newline,_}` are only set when a
regex is compiled and cannot be changed at matching for precompiled regex.
Own Id: OTP-19431
Application(s): erts, stdlib
Related Id(s): PR-9299, PR-9610
*** POTENTIAL INCOMPATIBILITY ***
- It is now possible to use any base for floating point numbers as described in
EEP 75: Based Floating Point Literals.
Computers represent floating point numbers in binary, but such numbers are
typically printed using base ten, for example 0.314159265e1. To maintain exact
bit-level precision when converting numbers to and from text, it is better to
use a base that matches the internally used base, such as 16 for a compact but
still exact representation, or 2 for visualizing or writing down the exact
internal format. One particular case where such exact representations are
useful is in code generating tools.
Examples:
> 2#0.111.
0.875
> 16#fefe.fefe#e16.
1.2041849337671418e24
Own Id: OTP-19452
Application(s): otp, stdlib
Related Id(s): PR-9106
- There is a new `zstd` module that does Zstandard compression.
Own Id: OTP-19477
Application(s): stdlib
Related Id(s): PR-9316
- The compilerâs alias analysis pass is now both faster and less conservative,
allowing optimizations of records and binary construction to be applied in
more cases.
Own Id: OTP-19502
Application(s): compiler
Related Id(s): PR-8695
- Line numbers used to be reported in the following way:
1> lists:last([]).
** exception error: no function clause matching lists:last([]) (lists.erl, line 389)
Starting from Erlang/OTP 28, line numbers are now reported in the following
way:
1> lists:last([]).
** exception error: no function clause matching lists:last([]) (lists.erl:389)
Own Id: OTP-19538
Application(s): stdlib
Related Id(s): PR-9468
- SPDX 2.2 Source Software-Bill-Of-Materials for Erlang/OTP compliant with NTIA
minimum requirements.
The SBOM contains a root package. Inside the root package there are multiple
SPDX packages. Each SPDX package corresponds to an Erlang/OTP application and
the Erlang runtime system (erts). Inside each package, there may be multiple
packages, such as vendor dependency packages inside the erts SPDX package.
Own Id: OTP-19553
Application(s): otp
Related Id(s): PR-9586, PR-9630, PR-9660, PR-9714
- Added functions that produce utf-8 binaries instead of iolists. New functions
are: io_lib:bformat/2, io_lib:bformat/3, io_lib:bfwrite/2,
io_lib:bfwrite/3, io_lib:bwrite/2 and io_lib:bwrite_string/3.
Own Id: OTP-19556
Application(s): stdlib
Related Id(s): PR-9772
- An **experimental** API for a native debugger has been added. The main
components are the following:
- A new compiler option `beam_debug_info` for the Erlang compiler. When given,
most optimizations are disabled and debug information suitable for the
native debugger are added to generated BEAM files.
- A new `+D` emulator flag. When given, the VM becomes "debuggable", which
means that when modules that been compiled with the `beam_debug_info` option
are loaded, the code is instrumented so that one can enable and disable
breakpoints on executable lines.
- An experimental `erl_debugger` module with a new debugging API. Essentially,
it allows a single, local, process to be registered as the "debugger"
process for the node. This process is the one that will receive messages
notifying that a process hit a breakpoint. This way, the front-end
implementation of a debugger (such as edb from WhatApp) can be decoupled
from OTP.
- The `erl_debugger` module also exposes new BIFs to inspect `X` and `Y`
registers of a suspended process. Together with new code-information BIFs,
this let's a debugger show the values of variables in scope for a suspended
process.
Own Id: OTP-19609
Application(s): compiler, erts, kernel
Related Id(s): PR-8670, PR-9334, PR-9604
- The ancient ASN.1 modules used in `public_key` has been replaced with more
modern versions, but we have strived to keep the documented Erlang API for the
`public_key` application compatible.
Own Id: OTP-19612
Application(s): asn1, public_key
Related Id(s): PR-9774
*** POTENTIAL INCOMPATIBILITY ***
- Removed the default values for SCTP send (sndbuf) and receive (recbuf)
buffers.
Own Id: OTP-19627
Application(s): kernel
Related Id(s): GH-9722, OTP-19576
# POTENTIAL INCOMPATIBILITIES
- `proc_lib:stop/1,3` (and in extension gen_server:stop/3, gen_statem:stop/3
and so on) have been updated to not throw an error if the process to be
stopped exits with the same reason as given to proc_lib:stop/3.
Own Id: OTP-19233
Application(s): stdlib
Related Id(s): PR-8772
- The size of an atom in the Erlang source code was limited to 255 bytes in
previous releases, meaning that an atom containing only emojis could contain
only 63 emojis.
While atoms are still only allowed to contain 255 characters, the number of
bytes is no longer limited.
External tools that parse the `AtU8` chunk of a BEAM file directly need to be
updated. Tools that use
`beam_lib:chunks(Beam, [atoms)`](beam_lib:chunks/2) to read the atom table
will continue to work.
Own Id: OTP-19285
Application(s): compiler, erts, stdlib
Related Id(s): PR-8913
- The `undec_rest` option would be ignored in generated functions for exclusive
decode. The option is now respected, meaning that the return value from such
functions are now three-tuples instead of a two-tuples.
Own Id: OTP-19290
Application(s): asn1
Related Id(s): PR-8798
- The literals chunk in BEAM is no longer compressed, resulting in slightly
smaller BEAM files when a BEAM file is stripped using
beam_lib:strip_files/1.
This is a potential incompatibility for tools that read and interpret the
contents of the literal chunk. One way to update such tools to work with the
new format is to retrieve the chunk using
`beam_lib:chunks(Beam, [literals)`](beam_lib:chunks/2).
Own Id: OTP-19323
Application(s): compiler, erts, stdlib
Related Id(s): GH-8967, PR-8988
- The `abort_if_missing_suites` option now defaults to `true`. If you prefer the
old behavior, set `abort_if_missing_suites` to `false` in your test runs.
Own Id: OTP-19355
Application(s): common_test
Related Id(s): PR-9045
- CBC algorithms are not offered by default. See Configuring algorithms in SSH
if you wish to enable them.
Own Id: OTP-19420
Application(s): ssh
Related Id(s): PR-9277
- Module `re` has been updated to use PCRE2, which is mostly backward
compatible with PCRE.
The most noticeable incompatibilities are
- The default character encoding is pure ASCII and not Latin1. Unicode support
is still available with options `unicode` and `ucp`.
- Options `bsr_anycrlf`, `bsr_unicode` and `{newline,_}` are only set when a
regex is compiled and cannot be changed at matching for precompiled regex.
Own Id: OTP-19431
Application(s): erts, stdlib
Related Id(s): PR-9299, PR-9610
*** HIGHLIGHT ***
- If a process being suspended using `erlang:suspend_process()` currently is
waiting in a `receive ... after` expression, the timer for the timeout will
now also be suspended until the process is resumed.
Own Id: OTP-19536
Application(s): erts
Related Id(s): PR-8670
- Change automatic hibernation of static supervisors so that they will hibernate
after being idle for 1 second instead of only after starting, dynamic
supervisors (simple_one_for_one) will not be hibernated at all. An option to
the supervisor is added to make it configurable for the application. This
option defaults to 1 second for static supervisors and to infinity for the
simple_one_for_one supervisors.
Own Id: OTP-19597
Application(s): stdlib
Related Id(s): PR-9680
- The ancient ASN.1 modules used in `public_key` has been replaced with more
modern versions, but we have strived to keep the documented Erlang API for the
`public_key` application compatible.
Own Id: OTP-19612
Application(s): asn1, public_key
Related Id(s): PR-9774
*** HIGHLIGHT ***
- The socket option names for built-in socket options in the module `socket` has
been cleaned up.
Now, for known socket options, it is only the canonical protocol names that
are allowed such as `ip` for the socket option `{ip,recvtos}`. Previously, due
to being a protocol alias; `{'IP',recvtos}` was also allowed, as was the
incorrect `{hopopt,recvtos}` because the protocol `hopopt` on Linux has the
same protocol number as `ip`.
So, to reduce confusion, all enumerated protocol names with the same number,
are not allowed for the known protocol options, only the canonical name.
Own Id: OTP-19615
Application(s): erts
Related Id(s): PR-9718
# OTP-28.0
## Improvements and New Features
- It is now possible to use any base for floating point numbers as described in
EEP 75: Based Floating Point Literals.
Computers represent floating point numbers in binary, but such numbers are
typically printed using base ten, for example 0.314159265e1. To maintain exact
bit-level precision when converting numbers to and from text, it is better to
use a base that matches the internally used base, such as 16 for a compact but
still exact representation, or 2 for visualizing or writing down the exact
internal format. One particular case where such exact representations are
useful is in code generating tools.
Examples:
> 2#0.111.
0.875
> 16#fefe.fefe#e16.
1.2041849337671418e24
Own Id: OTP-19452
Related Id(s): PR-9106
*** HIGHLIGHT ***
- Fixed licenses in files and added ORT curations to the following apps: otp,
eldap, erl_interface, eunit, parsetools, stdlib, syntax_tools, and ERTS.
Own Id: OTP-19478
Related Id(s): PR-9376, PR-9402, PR-9819
- Fixes the sarif generation in the scan code script
Own Id: OTP-19492
Related Id(s): PR-9409
- SPDX 2.2 Source Software-Bill-Of-Materials for Erlang/OTP compliant with NTIA
minimum requirements.
The SBOM contains a root package. Inside the root package there are multiple
SPDX packages. Each SPDX package corresponds to an Erlang/OTP application and
the Erlang runtime system (erts). Inside each package, there may be multiple
packages, such as vendor dependency packages inside the erts SPDX package.
Own Id: OTP-19553
Related Id(s): PR-9586, PR-9630, PR-9660, PR-9714
*** HIGHLIGHT ***
- Fixes wrong relationship order for SPDX packages and mistaken inclusion of
erts documentation in the erts test SPDX package.
Own Id: OTP-19601
Related Id(s): PR-9717
- sbom validates copyrights to be of a specific format, as defined in the
LICENSE-HEADERS.md, which will prevent mistakes in copyrights
Own Id: OTP-19607
Related Id(s): PR-9758
- SBOM produces package url as per the Erlang Ecosystem Foundation guidelines
Own Id: OTP-19629
Related Id(s): PR-9791
# asn1-5.4
## Fixed Bugs and Malfunctions
- The `undec_rest` option would be ignored in generated functions for exclusive
decode. The option is now respected, meaning that the return value from such
functions are now three-tuples instead of a two-tuples.
Own Id: OTP-19290
Related Id(s): PR-8798
*** POTENTIAL INCOMPATIBILITY ***
## Improvements and New Features
- The license and copyright header has changed format to include an
`SPDX-License-Identifier`. At the same time, most files have been updated to
follow a uniform standard for license headers.
Own Id: OTP-19575
Related Id(s): PR-9670
- The ancient ASN.1 modules used in `public_key` has been replaced with more
modern versions, but we have strived to keep the documented Erlang API for the
`public_key` application compatible.
Own Id: OTP-19612
Related Id(s): PR-9774
*** HIGHLIGHT ***
*** POTENTIAL INCOMPATIBILITY ***
> #### Full runtime dependencies of asn1-5.4
>
> erts-14.0, kernel-9.0, stdlib-5.0
# common_test-1.28
## Fixed Bugs and Malfunctions
- Replaced calls to deprecated `crypto:start()` with
`application:start(crypto)`.
Own Id: OTP-19485
Related Id(s): PR-8592
- Enhance specs of timeout for improving documentation and dialyzer analysis.
Own Id: OTP-19604
Related Id(s): PR-9574
## Improvements and New Features
- The overage reports in HTML can be rendered in dark mode if requested by the
user's browser.
Own Id: OTP-19159
Related Id(s): PR-7830
- The `abort_if_missing_suites` option now defaults to `true`. If you prefer the
old behavior, set `abort_if_missing_suites` to `false` in your test runs.
Own Id: OTP-19355
Related Id(s): PR-9045
*** POTENTIAL INCOMPATIBILITY ***
- Fixed licenses in files and added ORT curations to the following apps: otp,
eldap, erl_interface, eunit, parsetools, stdlib, syntax_tools, and ERTS.
Own Id: OTP-19478
Related Id(s): PR-9376, PR-9402, PR-9819
- Added support for compiling Erlang/OTP for Windows on ARM64.
Own Id: OTP-19480
Related Id(s): PR-8734
- The license and copyright header has changed format to include an
`SPDX-License-Identifier`. At the same time, most files have been updated to
follow a uniform standard for license headers.
Own Id: OTP-19575
Related Id(s): PR-9670
> #### Full runtime dependencies of common_test-1.28
>
> compiler-6.0, crypto-4.5, debugger-4.1, erts-7.0, ftp-1.0, inets-6.0,
> kernel-8.4, observer-2.1, runtime_tools-1.8.16, sasl-2.5, snmp-5.1.2, ssh-4.0,
> stdlib-4.0, syntax_tools-1.7, tools-3.2, xmerl-1.3.8
# compiler-9.0
## Fixed Bugs and Malfunctions
- The compiler will now emit warnings when some map patterns cannot possibly
match because a previous clauses matches the same pattern. For example:
mm_1(#{}) -> a;
mm_1(#{b := B}) -> {b,B}.
mm_2(#{a := A}) -> {a,A};
mm_2(#{a := A, b := B}) -> {b,A,B}.
The second clause of these function can never match and the compiler will now
emit a warning for both of them.
Note that the compiler is not guaranteed to emit warnings for every possible
map pattern that cannot match.
Own Id: OTP-19141
Related Id(s): GH-8558, PR-8600
- The size of an atom in the Erlang source code was limited to 255 bytes in
previous releases, meaning that an atom containing only emojis could contain
only 63 emojis.
While atoms are still only allowed to contain 255 characters, the number of
bytes is no longer limited.
External tools that parse the `AtU8` chunk of a BEAM file directly need to be
updated. Tools that use
`beam_lib:chunks(Beam, [atoms)`](beam_lib:chunks/2) to read the atom table
will continue to work.
Own Id: OTP-19285
Related Id(s): PR-8913
*** POTENTIAL INCOMPATIBILITY ***
- The literals chunk in BEAM is no longer compressed, resulting in slightly
smaller BEAM files when a BEAM file is stripped using
beam_lib:strip_files/1.
This is a potential incompatibility for tools that read and interpret the
contents of the literal chunk. One way to update such tools to work with the
new format is to retrieve the chunk using
`beam_lib:chunks(Beam, [literals)`](beam_lib:chunks/2).
Own Id: OTP-19323
Related Id(s): GH-8967, PR-8988
*** POTENTIAL INCOMPATIBILITY ***
- The final validation step in the compiler will now reject modules containing
functions with more than 255 arguments. No impact is expected as the emulator
has always refused to load these modules.
Own Id: OTP-19376
Related Id(s): GH-9113, PR-9121
- Replaced calls to deprecated `crypto:start()` with
`application:start(crypto)`.
Own Id: OTP-19485
Related Id(s): PR-8592
- Refactor code to not rely on `+nowarn_shadow_vars`.
Own Id: OTP-19574
Related Id(s): PR-9678
## Improvements and New Features
- The EEP-48 doc chunk embedded into `.beam` files by the compiler is now
`compressed` and `deterministic`.
Own Id: OTP-19096
Related Id(s): PR-8494
- Provided that the map argument for a maps:put/3 call is known to the
compiler to be a map, the compiler will replace such calls with the
corresponding update using the map syntax.
Own Id: OTP-19115
Related Id(s): PR-8540
- For various error types, the compiler now tries to suggest potential fixes by
adding "did you mean ...?" at the end of error messages.
When a function is used with wrong arity, the compiler will try to suggest a
defined function with the same name but a different arity. For example, given
the following module:
-module(typos).
-export([t/0]).
bar(A) -> A.
bar(A,A,A) -> A.
bar(A,A,A,A) -> A.
t() -> bar(0, 0).
The compiler will emit the following message:
typo.erl:6:12: function bar/2 undefined, did you mean bar/1,3,4?
% 6| t() -> bar(0, 0).
% | ^
For compiler errors that can easily be caused by typos, the compiler will try
to suggest what the correct variable or function name, could be. For example,
given the following module:
-module(typos).
-export([bar/2]).
bar(A0, B0) ->
A + B.
the compiler will emit the following error messages:
typos.erl:5:5: variable 'A' is unbound, did you mean 'A0'?
% 5| A + B.
% | ^
typos.erl:5:9: variable 'B' is unbound, did you mean 'B0'?
% 5| A + B.
% | ^
Error types that now suggest correct arities: `bad_inline`, `undefined_nif`,
`bad_nowarn_unused_function`, `bad_nowarn_bif_clash`, `undefined_function`.
Error types that now suggest correct names: `bad_inline`, `undefined_nif`,
`bad_nowarn_unused_function`, `undefined_on_load`, `undefined_function`,
`undefined_record`, `undefined_field`, `unbound_var`.
Using a function with wrong arity has higher precedence than having a typo in
the function name. If the compiler can find a defined function with the same
name but a different arity, it will not suggest a defined function with a
close-enough name, regardless of arity.
Own Id: OTP-19180
Related Id(s): PR-8699, PR-9094
*** HIGHLIGHT ***
- Comprehensions have been extended with zip generators according to EEP 73.
Example:
1> [A+B || A <- [1,2,3] && B <- [4,5,6]].
[5,7,9]
Own Id: OTP-19184
Related Id(s): PR-8926
*** HIGHLIGHT ***
- Documentation chunks (EEP-48) has been updated to include the following
reserved metadata fields: `behaviours`, `group`, `source_path`, and
`source_annos`. The compiler has also been updated to emit this metadata. See
the EEP-48 documentation for more details.
Own Id: OTP-19306
Related Id(s): PR-8945, PR-8975
- New strict generators have been added for comprehensions.
The currently existing generators are "relaxed": they ignore terms in the
right-hand side expression that do not match the left-hand side pattern.
The new strict generators fail with exception `badmatch` if a pattern doesn't
match.
Examples:
Using the current relaxed generator operator `<-`, any element not matching
the pattern `{_,_}` will be silently discarded:
1> [T || {_,_}=T <- [{ok,1},ok,{error,2}]].
[{ok,1},{error,2}]
If the intention is that all lists processed by a list comprehension must only
contain tuples of size two, using the new strict version of the operator
ensures that term not matching will cause a crash:
2> [T || {_,_}=T <:- [{ok,1},ok,{error,2}]].
** exception error: no match of right hand side value ok
Using the strict generator operator to mark the intention that all list
elements must match the pattern could help finding mistakes quicker if
something unpexected is added to the list processed by the generator.
The strict version for bitstring generators is `<:=`.
Own Id: OTP-19317
Related Id(s): PR-8625
*** HIGHLIGHT ***
- New options for suppressing behaviour warnings have been added:
- `nowarn_conflicting_behaviours`
- `nowarn_undefined_behaviour_func`
- `nowarn_undefined_behaviour`
- `nowarn_undefined_behaviour_callbacks`
- `nowarn_ill_defined_behaviour_callbacks`
- `nowarn_ill_defined_optional_callbacks`
Own Id: OTP-19334
Related Id(s): GH-8985, PR-9020
- Some BIFs with side-effects are optimized in `try`/`catch` in the same way as
guard BIFs in order to gain performance.
The following BIFs that are optimized in this way: `binary_to_atom/1`,
`binary_to_atom/2`, `binary_to_existing_atom/1`, `list_to_atom/1`, and
`list_to_existing_atom/1`.
Own Id: OTP-19339
Related Id(s): PR-9042, PR-9122
- The compiler now converts known documentation attribute metadata entries from
unicode:chardata/0 to unicode:unicode_binary/0.
Own Id: OTP-19394
Related Id(s): PR-9192
- The `warn_deprecated_catch` option enables warnings for use of old-style catch
expressions on the form `catch Expr` instead of the modern
`try ... catch ... end`. To prevent new uses of uses of old catches to be
added, this compiler option can be enabled on the project level and
`-compile(nowarn_deprecated_catch).` added to individual files that still
contain old catches.
Own Id: OTP-19425
Related Id(s): PR-9154
- Defining a fun in terms of an imported function is not allowed. Before this
release, the compiler would not catch this kind of error if the name of the
imported function happened to be a BIF. Consider this example:
-module(fun_example).
-export([foo/0, bar/0]).
-import(m, [max/2, not_a_bif/0]).
foo() ->
fun max/2.
bar() ->
fun not_a_bif/0.
The compiler in Erlang/OTP 27 would generate the following messages:
fun_example.erl:9:5: function not_a_bif/0 undefined
% 9| fun not_a_bif/0.
% | ^
fun_example.erl:3:2: Warning: import directive overrides auto-imported BIF max/2 --
use "-compile({no_auto_import,[max/2]})." to resolve name clash
% 3| -import(m, [max/2, not_a_bif/0]).
% | ^
That is, there would be a (cryptic) error for `fun not_a_bif/0`, but only a
warning for `fun max/2`.
When compiling with this release, both attempts to create a fun will result in
error messages (as well as a warning):
fun_example.erl:6:5: creating a fun from imported name max/2 is not allowed
% 6| fun max/2.
% | ^
fun_example.erl:9:5: creating a fun from imported name not_a_bif/0 is not allowed
% 9| fun not_a_bif/0.
% | ^
fun_example.erl:3:2: Warning: import directive overrides auto-imported BIF max/2 --
use "-compile({no_auto_import,[max/2]})." to resolve name clash
% 3| -import(m, [max/2, not_a_bif/0]).
% | ^
Also, attempting to call a local function having the same name as
auto-imported BIF would result in an error if the BIF was added to Erlang/OTP
before R14, and a warning for newer BIFs. This has been changed to always emit
a warning. For example:
-module(bif_example).
-export([bar/1]).
bar(B) ->
is_boolean(B).
is_boolean(B) ->
B =:= true orelse B =:= false.
will now result in the following warning instead of an error:
if_example.erl:5:5: Warning: ambiguous call of overridden auto-imported BIF is_boolean/1 --
use erlang:is_boolean/1 or "-compile({no_auto_import,[is_boolean/1]})." to resolve name clash
% 5| is_boolean(B).
% | ^
Own Id: OTP-19432
Related Id(s): PR-9246
- The compilerâs alias analysis pass is now both faster and less conservative,
allowing optimizations of records and binary construction to be applied in
more cases.
Own Id: OTP-19502
Related Id(s): PR-8695
*** HIGHLIGHT ***
- BEAM files no longer include a `Meta` chunk if there are no features used.
That slightly decreases the size of BEAM files, and it also ensures that
`m(Module)` and `beam_lib:md5(Beam)` will match for preloaded modules.
Own Id: OTP-19524
Related Id(s): PR-9517
- The license and copyright header has changed format to include an
`SPDX-License-Identifier`. At the same time, most files have been updated to
follow a uniform standard for license headers.
Own Id: OTP-19575
Related Id(s): PR-9670
- An **experimental** API for a native debugger has been added. The main
components are the following:
- A new compiler option `beam_debug_info` for the Erlang compiler. When given,
most optimizations are disabled and debug information suitable for the
native debugger are added to generated BEAM files.
- A new `+D` emulator flag. When given, the VM becomes "debuggable", which
means that when modules that been compiled with the `beam_debug_info` option
are loaded, the code is instrumented so that one can enable and disable
breakpoints on executable lines.
- An experimental `erl_debugger` module with a new debugging API. Essentially,
it allows a single, local, process to be registered as the "debugger"
process for the node. This process is the one that will receive messages
notifying that a process hit a breakpoint. This way, the front-end
implementation of a debugger (such as edb from WhatApp) can be decoupled
from OTP.
- The `erl_debugger` module also exposes new BIFs to inspect `X` and `Y`
registers of a suspended process. Together with new code-information BIFs,
this let's a debugger show the values of variables in scope for a suspended
process.
Own Id: OTP-19609
Related Id(s): PR-8670, PR-9334, PR-9604
*** HIGHLIGHT ***
> #### Full runtime dependencies of compiler-9.0
>
> crypto-5.1, erts-13.0, kernel-8.4, stdlib-6.0
# crypto-5.6
## Fixed Bugs and Malfunctions
- Fixed minor potential leak of EVP_MAC when `crypto` module is unloaded.
Own Id: OTP-19500
Related Id(s): PR-9119
- Added copyright and license to crypto_ec_curves.erl
Own Id: OTP-19554
## Improvements and New Features
- The crypto:start/0, crypto:stop/0, and crypto:enable_fips_mode/1
functions have been deprecated.
Own Id: OTP-19155
Related Id(s): PR-8592
- Warnings are now logged if module `crypto` with FIPS-supported OpenSSL is
loaded without application `crypto` being loaded. In this case FIPS will be
disabled even if the user had set application parameter `fips_mode`.
Own Id: OTP-19156
Related Id(s): PR-8590
- The functionality of crypto:crypto_one_time_aead/6 is now also available in
the new functions crypto:crypto_one_time_aead_init/4 and
crypto:crypto_one_time_aead/4, which makes it possible to reuse
initialization.
Own Id: OTP-19426
Related Id(s): PR-9289
- Added support for compiling Erlang/OTP for Windows on ARM64.
Own Id: OTP-19480
Related Id(s): PR-8734
- New key `fips_provider_buildinfo` in map returned by crypto:info/0. If
present, it contains the version of the FIPS provider which may be different
than the version of the rest of OpenSSL.
Own Id: OTP-19487
Related Id(s): GH-9366, PR-9410
- Exported `crypto` types `sha3()`, `hmac_hash_algorithm()` and
`cmac_cipher_algorithm()`.
Own Id: OTP-19510
Related Id(s): PR-9448
- When compiling C/C++ code on Unix systems, the compiler hardening flags
suggested by the Open Source Security Foundation are now enabled by default.
To disable them, pass `--disable-security-hardening-flags` to `configure`.
Own Id: OTP-19519
Related Id(s): PR-9441
- The license and copyright header has changed format to include an
`SPDX-License-Identifier`. At the same time, most files have been updated to
follow a uniform standard for license headers.
Own Id: OTP-19575
Related Id(s): PR-9670
> #### Full runtime dependencies of crypto-5.6
>
> erts-9.0, kernel-6.0, stdlib-3.9
# debugger-6.0
## Fixed Bugs and Malfunctions
- Error handling has been improved when modules fail to load.
Own Id: OTP-19484
Related Id(s): GH-7819, PR-9399
## Improvements and New Features
- Comprehensions have been extended with zip generators according to EEP 73.
Example:
1> [A+B || A <- [1,2,3] && B <- [4,5,6]].
[5,7,9]
Own Id: OTP-19184
Related Id(s): PR-8926
*** HIGHLIGHT ***
- New strict generators have been added for comprehensions.
The currently existing generators are "relaxed": they ignore terms in the
right-hand side expression that do not match the left-hand side pattern.
The new strict generators fail with exception `badmatch` if a pattern doesn't
match.
Examples:
Using the current relaxed generator operator `<-`, any element not matching
the pattern `{_,_}` will be silently discarded:
1> [T || {_,_}=T <- [{ok,1},ok,{error,2}]].
[{ok,1},{error,2}]
If the intention is that all lists processed by a list comprehension must only
contain tuples of size two, using the new strict version of the operator
ensures that term not matching will cause a crash:
2> [T || {_,_}=T <:- [{ok,1},ok,{error,2}]].
** exception error: no match of right hand side value ok
Using the strict generator operator to mark the intention that all list
elements must match the pattern could help finding mistakes quicker if
something unpexected is added to the list processed by the generator.
The strict version for bitstring generators is `<:=`.
Own Id: OTP-19317
Related Id(s): PR-8625
*** HIGHLIGHT ***
- The license and copyright header has changed format to include an
`SPDX-License-Identifier`. At the same time, most files have been updated to
follow a uniform standard for license headers.
Own Id: OTP-19575
Related Id(s): PR-9670
> #### Full runtime dependencies of debugger-6.0
>
> compiler-8.0, erts-15.0, kernel-10.0, stdlib-7.0, wx-2.0
# dialyzer-5.4
## Fixed Bugs and Malfunctions
- The `-Wno_unknown` option will now prevent a warning being printed to standard
output when the command line interface is used.
Own Id: OTP-19262
Related Id(s): GH-8822, PR-8885
## Improvements and New Features
- EEP-69: Nominal Types has been implemented. As a side effect, nominal types
can encode opaque types. We changed all opaque-handling logic and improved
opaque warnings in Dialyzer.
All existing Erlang type systems are structural: two types are seen as
equivalent if their structures are the same. Type comparisons are based on the
structures of the types, not on how the user explicitly defines them. For
example, in the following example, `meter()` and `foot()` are equivalent. The
two types can be used interchangeably. Neither of them differ from the basic
type `integer()`.
-type meter() :: integer().
-type foot() :: integer().
Nominal typing is an alternative type system, where two types are equivalent
if and only if they are declared with the same type name. The EEP proposes one
new syntax -nominal for declaring nominal types. Under nominal typing,
`meter()` and `foot()` are no longer compatible. Whenever a function expects
type `meter()`, passing in type `foot()` would result in a Dialyzer error.
-nominal meter() :: integer().
-nominal foot() :: integer().
More nominal type-checking rules can be found in the EEP. It is worth noting
that most work for adding nominal types and type-checking is in
`erl_types.erl`. The rest are changes that removed the previous opaque
type-checking, and added an improved version of it using nominal type-checking
with reworked warnings.
Backwards compatibility for opaque type-checking is not preserved by this PR.
Previous opaque warnings can appear with slightly different wordings. A new
kind of opaque warning `opaque_union` is added, together with a Dialyzer
option `no_opaque_union` to turn this kind of warnings off.
Own Id: OTP-19364
Related Id(s): PR-9079
*** HIGHLIGHT ***
- Fixed licenses in files and added ORT curations to the following apps: otp,
eldap, erl_interface, eunit, parsetools, stdlib, syntax_tools, and ERTS.
Own Id: OTP-19478
Related Id(s): PR-9376, PR-9402, PR-9819
- The license and copyright header has changed format to include an
`SPDX-License-Identifier`. At the same time, most files have been updated to
follow a uniform standard for license headers.
Own Id: OTP-19575
Related Id(s): PR-9670
> #### Full runtime dependencies of dialyzer-5.4
>
> compiler-8.0, erts-12.0, kernel-8.0, stdlib-5.0, syntax_tools-2.0
# diameter-2.5
## Fixed Bugs and Malfunctions
- With this change diameter will not crash when decoding a DiameterURI without
port number.
Own Id: OTP-19620
Related Id(s): PR-9321
## Improvements and New Features
- EEP-69: Nominal Types has been implemented. As a side effect, nominal types
can encode opaque types. We changed all opaque-handling logic and improved
opaque warnings in Dialyzer.
All existing Erlang type systems are structural: two types are seen as
equivalent if their structures are the same. Type comparisons are based on the
structures of the types, not on how the user explicitly defines them. For
example, in the following example, `meter()` and `foot()` are equivalent. The
two types can be used interchangeably. Neither of them differ from the basic
type `integer()`.
-type meter() :: integer().
-type foot() :: integer().
Nominal typing is an alternative type system, where two types are equivalent
if and only if they are declared with the same type name. The EEP proposes one
new syntax -nominal for declaring nominal types. Under nominal typing,
`meter()` and `foot()` are no longer compatible. Whenever a function expects
type `meter()`, passing in type `foot()` would result in a Dialyzer error.
-nominal meter() :: integer().
-nominal foot() :: integer().
More nominal type-checking rules can be found in the EEP. It is worth noting
that most work for adding nominal types and type-checking is in
`erl_types.erl`. The rest are changes that removed the previous opaque
type-checking, and added an improved version of it using nominal type-checking
with reworked warnings.
Backwards compatibility for opaque type-checking is not preserved by this PR.
Previous opaque warnings can appear with slightly different wordings. A new
kind of opaque warning `opaque_union` is added, together with a Dialyzer
option `no_opaque_union` to turn this kind of warnings off.
Own Id: OTP-19364
Related Id(s): PR-9079
*** HIGHLIGHT ***
- The license and copyright header has changed format to include an
`SPDX-License-Identifier`. At the same time, most files have been updated to
follow a uniform standard for license headers.
Own Id: OTP-19575
Related Id(s): PR-9670
- With this change diameter will not use slave terminology
Own Id: OTP-19621
Related Id(s): PR-9786
> #### Full runtime dependencies of diameter-2.5
>
> erts-10.0, kernel-3.2, ssl-9.0, stdlib-5.0
# edoc-1.4
## Fixed Bugs and Malfunctions
- Refactor code to not rely on `+nowarn_shadow_vars`.
Own Id: OTP-19574
Related Id(s): PR-9678
## Improvements and New Features
- EEP-69: Nominal Types has been implemented. As a side effect, nominal types
can encode opaque types. We changed all opaque-handling logic and improved
opaque warnings in Dialyzer.
All existing Erlang type systems are structural: two types are seen as
equivalent if their structures are the same. Type comparisons are based on the
structures of the types, not on how the user explicitly defines them. For
example, in the following example, `meter()` and `foot()` are equivalent. The
two types can be used interchangeably. Neither of them differ from the basic
type `integer()`.
-type meter() :: integer().
-type foot() :: integer().
Nominal typing is an alternative type system, where two types are equivalent
if and only if they are declared with the same type name. The EEP proposes one
new syntax -nominal for declaring nominal types. Under nominal typing,
`meter()` and `foot()` are no longer compatible. Whenever a function expects
type `meter()`, passing in type `foot()` would result in a Dialyzer error.
-nominal meter() :: integer().
-nominal foot() :: integer().
More nominal type-checking rules can be found in the EEP. It is worth noting
that most work for adding nominal types and type-checking is in
`erl_types.erl`. The rest are changes that removed the previous opaque
type-checking, and added an improved version of it using nominal type-checking
with reworked warnings.
Backwards compatibility for opaque type-checking is not preserved by this PR.
Previous opaque warnings can appear with slightly different wordings. A new
kind of opaque warning `opaque_union` is added, together with a Dialyzer
option `no_opaque_union` to turn this kind of warnings off.
Own Id: OTP-19364
Related Id(s): PR-9079
*** HIGHLIGHT ***
- The license and copyright header has changed format to include an
`SPDX-License-Identifier`. At the same time, most files have been updated to
follow a uniform standard for license headers.
Own Id: OTP-19575
Related Id(s): PR-9670
> #### Full runtime dependencies of edoc-1.4
>
> erts-11.0, inets-5.10, kernel-7.0, stdlib-4.0, syntax_tools-2.0, xmerl-1.3.7
# eldap-1.2.15
## Fixed Bugs and Malfunctions
- Enhance specs of timeout for improving documentation and dialyzer analysis.
Own Id: OTP-19604
Related Id(s): PR-9574
## Improvements and New Features
- Fixed licenses in files and added ORT curations to the following apps: otp,
eldap, erl_interface, eunit, parsetools, stdlib, syntax_tools, and ERTS.
Own Id: OTP-19478
Related Id(s): PR-9376, PR-9402, PR-9819
- The license and copyright header has changed format to include an
`SPDX-License-Identifier`. At the same time, most files have been updated to
follow a uniform standard for license headers.
Own Id: OTP-19575
Related Id(s): PR-9670
> #### Full runtime dependencies of eldap-1.2.15
>
> asn1-3.0, erts-6.0, kernel-3.0, ssl-5.3.4, stdlib-3.4
# erl_interface-5.6
## Improvements and New Features
- Fixed licenses in files and added ORT curations to the following apps: otp,
eldap, erl_interface, eunit, parsetools, stdlib, syntax_tools, and ERTS.
Own Id: OTP-19478
Related Id(s): PR-9376, PR-9402, PR-9819
- Added support for compiling Erlang/OTP for Windows on ARM64.
Own Id: OTP-19480
Related Id(s): PR-8734
- When compiling C/C++ code on Unix systems, the compiler hardening flags
suggested by the Open Source Security Foundation are now enabled by default.
To disable them, pass `--disable-security-hardening-flags` to `configure`.
Own Id: OTP-19519
Related Id(s): PR-9441
- The license and copyright header has changed format to include an
`SPDX-License-Identifier`. At the same time, most files have been updated to
follow a uniform standard for license headers.
Own Id: OTP-19575
Related Id(s): PR-9670
- Update of MD5 implementation from OpenSSL version 3.1.4 to 3.5.
Own Id: OTP-19614
Related Id(s): PR-9775
## Known Bugs and Problems
- The `ei` API for decoding/encoding terms is not fully 64-bit compatible since
terms that have a representation on the external term format larger than 2 GB
cannot be handled.
Own Id: OTP-16607
Related Id(s): OTP-16608
# erts-16.0
## Fixed Bugs and Malfunctions
- ETS tables with more than 2 billion keys are now supported.
Own Id: OTP-19144
Related Id(s): PR-8589
- The zlib library included in Erlang/OTP has been updated to version 1.3.1.
Own Id: OTP-19259
Related Id(s): PR-8862
- `to_erl` no longer clears the screen when attaching to a `run_erl` session.
Own Id: OTP-19263
Related Id(s): PR-8943
- The size of an atom in the Erlang source code was limited to 255 bytes in
previous releases, meaning that an atom containing only emojis could contain
only 63 emojis.
While atoms are still only allowed to contain 255 characters, the number of
bytes is no longer limited.
External tools that parse the `AtU8` chunk of a BEAM file directly need to be
updated. Tools that use
`beam_lib:chunks(Beam, [atoms)`](beam_lib:chunks/2) to read the atom table
will continue to work.
Own Id: OTP-19285
Related Id(s): PR-8913
*** POTENTIAL INCOMPATIBILITY ***
- Fixed a bug where `erlc` would crash if its path contained spaces.
Own Id: OTP-19295
Related Id(s): PR-8937
- The `-noshell` mode has been updated to read data lazily from standard
input. Before this fix any data would be read greedily which meant that Erlang
could consume data not meant for it. It also meant that in order for
shell:start_interactive/0 to work on Windows an API that did not support
reading of Unicode characters had to be used.
Own Id: OTP-19313
Related Id(s): GH-8113, PR-8962
- The literals chunk in BEAM is no longer compressed, resulting in slightly
smaller BEAM files when a BEAM file is stripped using
beam_lib:strip_files/1.
This is a potential incompatibility for tools that read and interpret the
contents of the literal chunk. One way to update such tools to work with the
new format is to retrieve the chunk using
`beam_lib:chunks(Beam, [literals)`](beam_lib:chunks/2).
Own Id: OTP-19323
Related Id(s): GH-8967, PR-8988
*** POTENTIAL INCOMPATIBILITY ***
- Fixed erlang:localtime_to_universaltime/2 with `IsDST` set to `true` and a
timezone without daylight saving (for example `UTC`) to assume that the
provided localtime does not have DST. This has always been the behaviour, but
glibc versions after 2.37 changed it so that the behavior in Erlang also
changed.
Own Id: OTP-19453
Related Id(s): PR-9207
- Support for the `TZ` environment variable has been added on Windows. Before
this change only the time zone configured in the OS was ever used.
Own Id: OTP-19454
Related Id(s): PR-9207
- Suppressed various warnings when building the emulator with recent versions of
GCC
Own Id: OTP-19488
Related Id(s): GH-9413, PR-9417
- Fixed a bug in re:run and re:compile where the pattern parameter would be read
incorrectly if it was a sub-binary.
Own Id: OTP-19507
Related Id(s): GH-9438, PR-9478
- Fixed a broken makefile rule that made it so that `O2` and `-O2` could not be
part of the directory path when building Erlang/OTP. Bug has been present
since R11B released 2006.
Own Id: OTP-19518
Related Id(s): GH-9487, PR-9488
- Fixed the index types of modules `atomics` and `counters` from `integer()` to
`pos_integer()`, which is more correct.
Own Id: OTP-19532
Related Id(s): PR-9538
- Fix `erl` flags `+Q`, `+P` and `+t` to not allow values greater
than 4294975487. Before this fix, the runtime would either truncate the value
or crash depending on which value was given.
Own Id: OTP-19594
Related Id(s): GH-9668, PR-9671
- The socket option names for built-in socket options in the module `socket` has
been cleaned up.
Now, for known socket options, it is only the canonical protocol names that
are allowed such as `ip` for the socket option `{ip,recvtos}`. Previously, due
to being a protocol alias; `{'IP',recvtos}` was also allowed, as was the
incorrect `{hopopt,recvtos}` because the protocol `hopopt` on Linux has the
same protocol number as `ip`.
So, to reduce confusion, all enumerated protocol names with the same number,
are not allowed for the known protocol options, only the canonical name.
Own Id: OTP-19615
Related Id(s): PR-9718
*** POTENTIAL INCOMPATIBILITY ***
- On windows, socket:sendv could incorrectly return {ok, integer()} on Windows.
Own Id: OTP-19617
Related Id(s): OTP-19482
## Improvements and New Features
- Functionality making it possible for processes to enable reception of
priority messages has been introduced in accordance with EEP 76.
Own Id: OTP-19198
Related Id(s): PR-9269, PR-9519, PR-9590
*** HIGHLIGHT ***
- The trace:system/3 function has been added. It has a similar interface as
erlang:system_monitor/2 but it also supports trace sessions.
Own Id: OTP-19271
Related Id(s): PR-8660
- Added support for `SIGWINCH`, `SIGCONT`, and `SIGINFO` signals to
os:set_signal/2 where available.
Own Id: OTP-19278
Related Id(s): PR-8887, PR-8938
- The `erl -noshell` mode has been updated to have two sub modes called `raw`
and `cooked`, where `cooked` is the old default behaviour and `raw` can be
used to bypass the line-editing support of the native terminal. Using `raw`
mode it is possible to read keystrokes as they happen without the user having
to press Enter. Also, the `raw` mode does not echo the typed characters to
stdout. An example of how to create a tic-tac-toe game using this mechanism is
included in the documentation.
Own Id: OTP-19314
Related Id(s): GH-8037, PR-8962
*** HIGHLIGHT ***
- EEP-69: Nominal Types has been implemented. As a side effect, nominal types
can encode opaque types. We changed all opaque-handling logic and improved
opaque warnings in Dialyzer.
All existing Erlang type systems are structural: two types are seen as
equivalent if their structures are the same. Type comparisons are based on the
structures of the types, not on how the user explicitly defines them. For
example, in the following example, `meter()` and `foot()` are equivalent. The
two types can be used interchangeably. Neither of them differ from the basic
type `integer()`.
-type meter() :: integer().
-type foot() :: integer().
Nominal typing is an alternative type system, where two types are equivalent
if and only if they are declared with the same type name. The EEP proposes one
new syntax -nominal for declaring nominal types. Under nominal typing,
`meter()` and `foot()` are no longer compatible. Whenever a function expects
type `meter()`, passing in type `foot()` would result in a Dialyzer error.
-nominal meter() :: integer().
-nominal foot() :: integer().
More nominal type-checking rules can be found in the EEP. It is worth noting
that most work for adding nominal types and type-checking is in
`erl_types.erl`. The rest are changes that removed the previous opaque
type-checking, and added an improved version of it using nominal type-checking
with reworked warnings.
Backwards compatibility for opaque type-checking is not preserved by this PR.
Previous opaque warnings can appear with slightly different wordings. A new
kind of opaque warning `opaque_union` is added, together with a Dialyzer
option `no_opaque_union` to turn this kind of warnings off.
Own Id: OTP-19364
Related Id(s): PR-9079
*** HIGHLIGHT ***
- Two BIFs have been added to the `erlang` module.
erlang:processes_iterator/0 returns a process iterator that can be used to
iterate through the process table.
erlang:process_next/1 takes in a process iterator and returns a 2-tuple,
consisting of a process identifier and a new process iterator. When the
process iterator runs out of processes in the process table, `none` will be
returned.
Using these BIFs to scan the processes scales better than using
erlang:processes/0, at the cost of giving less consistency guarantees.
Process identifiers returned from consecutive calls of erlang:process_next/1
may not be a consistent snapshot of all elements existing in the table during
any of the calls. A process identifier is only guaranteed to be returned from
a call to erlang:processes_next/1 if it was alive before the call to
erlang:processes_iterator/0 and was still alive when
erlang:processes_next/1 returned `none`.
Own Id: OTP-19369
Related Id(s): PR-9129
- Improved open debug for gen_tcp_socket (connect and listen) and gen_udp_socket
(open).
Own Id: OTP-19386
- Module `re` has been updated to use PCRE2, which is mostly backward
compatible with PCRE.
The most noticeable incompatibilities are
- The default character encoding is pure ASCII and not Latin1. Unicode support
is still available with options `unicode` and `ucp`.
- Options `bsr_anycrlf`, `bsr_unicode` and `{newline,_}` are only set when a
regex is compiled and cannot be changed at matching for precompiled regex.
Own Id: OTP-19431
Related Id(s): PR-9299, PR-9610
*** HIGHLIGHT ***
*** POTENTIAL INCOMPATIBILITY ***
- When booting the runtime system on a 32-bit computer with a single core, the
boot code will try to minimize the peak memory use by disabling parallel
loading of BEAM files.
Own Id: OTP-19450
Related Id(s): PR-9342
- A `socket` option `{otp,select_read}` has been added that enables keeping a
socket in the VM select/poll set between calls to recv functions.
This increases throughput by reducing the number of calls to said functions.
Own Id: OTP-19451
Related Id(s): PR-9344
- `erlc` will now write compiler warnings and errors to standard error, instead
of standard output, in common with other language compilers.
Own Id: OTP-19460
Related Id(s): GH-9255, PR-9363
- Fixed the Windows build to always include `.pdb` files for all DLLs and
executables to help with debugging.
Own Id: OTP-19465
Related Id(s): PR-9229
- Improve the naming of the (internal) esock mutex(es). It is now possible to
configure (as in autoconf) the use of simple names for the esock mutex(es).
Own Id: OTP-19472
Related Id(s): PR-9388
- An optimization for appending 0 bits to a binary was removed in patch releases
for OTP versions 25, 26, and 27. This optimization has been reintroduced in
Erlang/OTP 28.
Own Id: OTP-19473
Related Id(s): PR-8697, PR-9396
- Fixed licenses in files and added ORT curations to the following apps: otp,
eldap, erl_interface, eunit, parsetools, stdlib, syntax_tools, and ERTS.
Own Id: OTP-19478
Related Id(s): PR-9376, PR-9402, PR-9819
- When using `enif_select_read` (or `enif_select` with `ERL_NIF_SELECT_READ`) on
systems with kernel polling enabled (that is most Unix systems), file
descriptors that are always re-enabled as soon as they trigger are now part of
a specialized pollset just as `driver_select`. This reduces the CPU usage in
such scenarios as the erts does not have to re-insert the FD everytime it it
triggered. As a result of this optimization `socket` based reading uses a
lot less CPU and achieves a higher throughput.
Own Id: OTP-19479
Related Id(s): PR-9275
- Added support for compiling Erlang/OTP for Windows on ARM64.
Own Id: OTP-19480
Related Id(s): PR-8734
- The Windows installer no longer creates the `erl.ini` file, making
installations redistributable.
Own Id: OTP-19481
Related Id(s): PR-9330
- Added erlang:hibernate/0, which hibernates a process without discarding the
stack.
Own Id: OTP-19503
Related Id(s): PR-9406
- The asmjit library (used by BeamJIT) has been updated to version
029075b84bf0161a761beb63e6eda519a29020db.
Own Id: OTP-19509
Related Id(s): PR-9495
- When compiling C/C++ code on Unix systems, the compiler hardening flags
suggested by the Open Source Security Foundation are now enabled by default.
To disable them, pass `--disable-security-hardening-flags` to `configure`.
Own Id: OTP-19519
Related Id(s): PR-9441
- If a process being suspended using `erlang:suspend_process()` currently is
waiting in a `receive ... after` expression, the timer for the timeout will
now also be suspended until the process is resumed.
Own Id: OTP-19536
Related Id(s): PR-8670
*** POTENTIAL INCOMPATIBILITY ***
- A test module for TLS distribution over `socket` has been implemented.
Own Id: OTP-19539
Related Id(s): PR-9511
- Upgrade pcre2 to 10.45
Own Id: OTP-19541
Related Id(s): PR-9582
- The `+R` emulator options has been removed. It has had any effect since
Erlang/OTP R9.
Own Id: OTP-19551
Related Id(s): PR-9608
- The license and copyright header has changed format to include an
`SPDX-License-Identifier`. At the same time, most files have been updated to
follow a uniform standard for license headers.
Own Id: OTP-19575
Related Id(s): PR-9670
- Increase the default inet-driver buffer size(s). Also introduce kernel
parameters for UDP and SCTP to change the sizes when creating (those) sockets.
Own Id: OTP-19576
- Add `+JPperfdirectory <dir>` for specifying which directory Erlang should
place perf symbol information files.
Own Id: OTP-19589
Related Id(s): GH-9500, PR-9639
- Allow multiple static nifs to be part of the same archive. See the NIF
documentation for details.
Own Id: OTP-19590
Related Id(s): PR-9625
- Various improvements reducing lock contention on run queues due to task
stealing.
Own Id: OTP-19591
Related Id(s): PR-9594
- The new implementation has the same behavior as the previous one. The newer
compilers already have native support for FP16, so this implementation is only
relevant for older compilers. For this reason, the new implementation has not
been tested for speed.
Own Id: OTP-19603
Related Id(s): PR-9735
- An **experimental** API for a native debugger has been added. The main
components are the following:
- A new compiler option `beam_debug_info` for the Erlang compiler. When given,
most optimizations are disabled and debug information suitable for the
native debugger are added to generated BEAM files.
- A new `+D` emulator flag. When given, the VM becomes "debuggable", which
means that when modules that been compiled with the `beam_debug_info` option
are loaded, the code is instrumented so that one can enable and disable
breakpoints on executable lines.
- An experimental `erl_debugger` module with a new debugging API. Essentially,
it allows a single, local, process to be registered as the "debugger"
process for the node. This process is the one that will receive messages
notifying that a process hit a breakpoint. This way, the front-end
implementation of a debugger (such as edb from WhatApp) can be decoupled
from OTP.
- The `erl_debugger` module also exposes new BIFs to inspect `X` and `Y`
registers of a suspended process. Together with new code-information BIFs,
this let's a debugger show the values of variables in scope for a suspended
process.
Own Id: OTP-19609
Related Id(s): PR-8670, PR-9334, PR-9604
*** HIGHLIGHT ***
- Update internal `ryu` implementation to use latest version. The new version is
a little bit faster in some scenarios. `ryu` is used by `float_to_list/1` and
similar functions to convert floats to strings.
Own Id: OTP-19613
Related Id(s): PR-9733
- Update of MD5 implementation from OpenSSL version 3.1.4 to 3.5.
Own Id: OTP-19614
Related Id(s): PR-9775
- Small optimization in binary_to_term by not allocating an unnecessary large
native stack frame.
Own Id: OTP-19618
Related Id(s): PR-9759, PR-9809
> #### Full runtime dependencies of erts-16.0
>
> kernel-9.0, sasl-3.3, stdlib-4.1
# et-1.7.2
## Improvements and New Features
- The license and copyright header has changed format to include an
`SPDX-License-Identifier`. At the same time, most files have been updated to
follow a uniform standard for license headers.
Own Id: OTP-19575
Related Id(s): PR-9670
> #### Full runtime dependencies of et-1.7.2
>
> erts-9.0, kernel-5.3, runtime_tools-1.10, stdlib-3.4, wx-1.2
# eunit-2.10
## Fixed Bugs and Malfunctions
- Fix so that when running tests in parallel and one test is cancelled due to a
failing setup, it is report as cancelled. Before this fix the cancellation was
ignored.
Own Id: OTP-19630
Related Id(s): PR-9794
## Improvements and New Features
- EEP-69: Nominal Types has been implemented. As a side effect, nominal types
can encode opaque types. We changed all opaque-handling logic and improved
opaque warnings in Dialyzer.
All existing Erlang type systems are structural: two types are seen as
equivalent if their structures are the same. Type comparisons are based on the
structures of the types, not on how the user explicitly defines them. For
example, in the following example, `meter()` and `foot()` are equivalent. The
two types can be used interchangeably. Neither of them differ from the basic
type `integer()`.
-type meter() :: integer().
-type foot() :: integer().
Nominal typing is an alternative type system, where two types are equivalent
if and only if they are declared with the same type name. The EEP proposes one
new syntax -nominal for declaring nominal types. Under nominal typing,
`meter()` and `foot()` are no longer compatible. Whenever a function expects
type `meter()`, passing in type `foot()` would result in a Dialyzer error.
-nominal meter() :: integer().
-nominal foot() :: integer().
More nominal type-checking rules can be found in the EEP. It is worth noting
that most work for adding nominal types and type-checking is in
`erl_types.erl`. The rest are changes that removed the previous opaque
type-checking, and added an improved version of it using nominal type-checking
with reworked warnings.
Backwards compatibility for opaque type-checking is not preserved by this PR.
Previous opaque warnings can appear with slightly different wordings. A new
kind of opaque warning `opaque_union` is added, together with a Dialyzer
option `no_opaque_union` to turn this kind of warnings off.
Own Id: OTP-19364
Related Id(s): PR-9079
*** HIGHLIGHT ***
- Fixed licenses in files and added ORT curations to the following apps: otp,
eldap, erl_interface, eunit, parsetools, stdlib, syntax_tools, and ERTS.
Own Id: OTP-19478
Related Id(s): PR-9376, PR-9402, PR-9819
- The license and copyright header has changed format to include an
`SPDX-License-Identifier`. At the same time, most files have been updated to
follow a uniform standard for license headers.
Own Id: OTP-19575
Related Id(s): PR-9670
> #### Full runtime dependencies of eunit-2.10
>
> erts-9.0, kernel-5.3, stdlib-3.4
# ftp-1.2.4
## Improvements and New Features
- The license and copyright header has changed format to include an
`SPDX-License-Identifier`. At the same time, most files have been updated to
follow a uniform standard for license headers.
Own Id: OTP-19575
Related Id(s): PR-9670
> #### Full runtime dependencies of ftp-1.2.4
>
> erts-7.0, kernel-6.0, runtime_tools-1.15.1, ssl-10.2, stdlib-3.5
# inets-9.4
## Fixed Bugs and Malfunctions
- Replaced calls to deprecated `crypto:start()` with
`application:start(crypto)`.
Own Id: OTP-19485
Related Id(s): PR-8592
- Enhance specs of timeout for improving documentation and dialyzer analysis.
Own Id: OTP-19604
Related Id(s): PR-9574
## Improvements and New Features
- Enhanced http client documentation.
Own Id: OTP-19520
Related Id(s): PR-9516
- Enhance made to mod_esi documentation
Own Id: OTP-19521
Related Id(s): PR-9472
- The license and copyright header has changed format to include an
`SPDX-License-Identifier`. At the same time, most files have been updated to
follow a uniform standard for license headers.
Own Id: OTP-19575
Related Id(s): PR-9670
- Inets Makefiles now create and use dependencies files for .erl files
Own Id: OTP-19624
Related Id(s): PR-9101
> #### Full runtime dependencies of inets-9.4
>
> erts-14.0, kernel-9.0, mnesia-4.12, public_key-1.13, runtime_tools-1.8.14,
> ssl-9.0, stdlib-5.0, stdlib-6.0
# jinterface-1.15
## Improvements and New Features
- The `.class` files of jinterface are now part of the prebuilt archive using
Java 8.
Own Id: OTP-19308
Related Id(s): PR-8960
- The license and copyright header has changed format to include an
`SPDX-License-Identifier`. At the same time, most files have been updated to
follow a uniform standard for license headers.
Own Id: OTP-19575
Related Id(s): PR-9670
# kernel-10.3
## Fixed Bugs and Malfunctions
- Fixed an issue where output to the shell would not print the prompt on a new
line.
Own Id: OTP-19228
Related Id(s): PR-8820
- When in `shell` is in `-noshell` mode, and in `latin1` encoding mode, io
requests in latin1 encoding will not be translated to unicode and back to
latin1.
Own Id: OTP-19296
Related Id(s): PR-9013
- Fixed a bug where a composing unicode character would bind to a character not
available to the user and deleting that character would cause a crash.
Own Id: OTP-19297
Related Id(s): PR-9005
- The `-noshell` mode has been updated to read data lazily from standard
input. Before this fix any data would be read greedily which meant that Erlang
could consume data not meant for it. It also meant that in order for
shell:start_interactive/0 to work on Windows an API that did not support
reading of Unicode characters had to be used.
Own Id: OTP-19313
Related Id(s): GH-8113, PR-8962
- The Erlang shell no longer crashes when a shell prompt ends with an escape
sequence.
Own Id: OTP-19414
Related Id(s): PR-9272
- code:get_doc/1 now works for cover-compiled modules.
Own Id: OTP-19513
Related Id(s): PR-9433
- An infinite loop in CNAME loop detection that can cause Out Of Memory has been
fixed. This affected CNAME lookup with the internal DNS resolver.
Own Id: OTP-19544
Related Id(s): PR-9587, OTP-19545
- The internal resolver framework has been fixed to wait with the first resolver
lookup until the ERL_INETRC environment variable has been applied.
Previously, on some platform(s) (Linux) a first lookup when figuring out the
domain name was always placed on the `native` resolver even if ERL_INETRC was
used to disable it.
Own Id: OTP-19555
Related Id(s): PR-9543
- Fix `logger:add_handler(default, ...)` to correctly replay events generated
during startup when the default logger is set to `undefined` in logger's
configuration parameters.
Own Id: OTP-19588
Related Id(s): GH-9436, PR-9595
- Enhance specs of timeout for improving documentation and dialyzer analysis.
Own Id: OTP-19604
Related Id(s): PR-9574
- Removed the default values for SCTP send (sndbuf) and receive (recbuf)
buffers.
Own Id: OTP-19627
Related Id(s): GH-9722, OTP-19576
*** HIGHLIGHT ***
## Improvements and New Features
- application:load/1 slows down as the number of directories in the code path
increases because the call to code:where_is_file/1 for the '.app' file must
scan each directory for the app.
`code_server` maintains a cache of the contents of directories in the path.
Re-using that cache when searching for '.app' files in application:load/1
may improve its runtime, especially when loading multiple applications.
Own Id: OTP-19194
Related Id(s): PR-8078
- The `Erlang SSH daemon` now uses the same backend to handle multiline
functionality as the Erlang shell.
Own Id: OTP-19226
Related Id(s): PR-8805
- Added support for `SIGWINCH`, `SIGCONT`, and `SIGINFO` signals to
os:set_signal/2 where available.
Own Id: OTP-19278
Related Id(s): PR-8887, PR-8938
- Add net_kernel:allowed/0, it returns a list of nodes that are explicitly
allowed to connect to the node by calling net_kernel:allow/1
Own Id: OTP-19287
Related Id(s): PR-8207
- Documentation chunks (EEP-48) has been updated to include the following
reserved metadata fields: `behaviours`, `group`, `source_path`, and
`source_annos`. The compiler has also been updated to emit this metadata. See
the EEP-48 documentation for more details.
Own Id: OTP-19306
Related Id(s): PR-8945, PR-8975
- The erpc:call/3, erpc:call/5, erpc:multicall/3, and erpc:multicall/5
functions now also accept an option map as last argument containing the
`timeout` and `always_spawn` options. The `always_spawn` option can be used in
order to ensure that the call operation will use a newly spawned process when
executing the remote call.
Own Id: OTP-19343
Related Id(s): PR-8642
- EEP-69: Nominal Types has been implemented. As a side effect, nominal types
can encode opaque types. We changed all opaque-handling logic and improved
opaque warnings in Dialyzer.
All existing Erlang type systems are structural: two types are seen as
equivalent if their structures are the same. Type comparisons are based on the
structures of the types, not on how the user explicitly defines them. For
example, in the following example, `meter()` and `foot()` are equivalent. The
two types can be used interchangeably. Neither of them differ from the basic
type `integer()`.
-type meter() :: integer().
-type foot() :: integer().
Nominal typing is an alternative type system, where two types are equivalent
if and only if they are declared with the same type name. The EEP proposes one
new syntax -nominal for declaring nominal types. Under nominal typing,
`meter()` and `foot()` are no longer compatible. Whenever a function expects
type `meter()`, passing in type `foot()` would result in a Dialyzer error.
-nominal meter() :: integer().
-nominal foot() :: integer().
More nominal type-checking rules can be found in the EEP. It is worth noting
that most work for adding nominal types and type-checking is in
`erl_types.erl`. The rest are changes that removed the previous opaque
type-checking, and added an improved version of it using nominal type-checking
with reworked warnings.
Backwards compatibility for opaque type-checking is not preserved by this PR.
Previous opaque warnings can appear with slightly different wordings. A new
kind of opaque warning `opaque_union` is added, together with a Dialyzer
option `no_opaque_union` to turn this kind of warnings off.
Own Id: OTP-19364
Related Id(s): PR-9079
*** HIGHLIGHT ***
- Improved open debug for gen_tcp_socket (connect and listen) and gen_udp_socket
(open).
Own Id: OTP-19386
- `t:io:standard_error/0` has been updated to write via a NIF API instead of a
port. This allows it to access the dirty-scheduler pool and make sure that
writes have been written to the OSs `stderr` when io:format/3 and equivalent
return.
Own Id: OTP-19401
Related Id(s): PR-9116
- Added the option `exception_on_failure` to os:cmd/2 to make os:cmd/2 raise
an exception if the command fails to execute.
Own Id: OTP-19404
Related Id(s): PR-9082
- A `socket` option `{otp,select_read}` has been added that enables keeping a
socket in the VM select/poll set between calls to recv functions.
This increases throughput by reducing the number of calls to said functions.
Own Id: OTP-19451
Related Id(s): PR-9344
- Add a configure chapter to the socket usage guide
Own Id: OTP-19522
Related Id(s): PR-9508
- The license and copyright header has changed format to include an
`SPDX-License-Identifier`. At the same time, most files have been updated to
follow a uniform standard for license headers.
Own Id: OTP-19575
Related Id(s): PR-9670
- Increase the default inet-driver buffer size(s). Also introduce kernel
parameters for UDP and SCTP to change the sizes when creating (those) sockets.
Own Id: OTP-19576
- An **experimental** API for a native debugger has been added. The main
components are the following:
- A new compiler option `beam_debug_info` for the Erlang compiler. When given,
most optimizations are disabled and debug information suitable for the
native debugger are added to generated BEAM files.
- A new `+D` emulator flag. When given, the VM becomes "debuggable", which
means that when modules that been compiled with the `beam_debug_info` option
are loaded, the code is instrumented so that one can enable and disable
breakpoints on executable lines.
- An experimental `erl_debugger` module with a new debugging API. Essentially,
it allows a single, local, process to be registered as the "debugger"
process for the node. This process is the one that will receive messages
notifying that a process hit a breakpoint. This way, the front-end
implementation of a debugger (such as edb from WhatApp) can be decoupled
from OTP.
- The `erl_debugger` module also exposes new BIFs to inspect `X` and `Y`
registers of a suspended process. Together with new code-information BIFs,
this let's a debugger show the values of variables in scope for a suspended
process.
Own Id: OTP-19609
Related Id(s): PR-8670, PR-9334, PR-9604
*** HIGHLIGHT ***
> #### Full runtime dependencies of kernel-10.3
>
> crypto-5.0, erts-15.2.5, sasl-3.0, stdlib-6.0
# megaco-4.8
## Fixed Bugs and Malfunctions
- Add missing spec and doc for exported functions.
Own Id: OTP-19523
## Improvements and New Features
- Nano seconds are now used for (example) meas result presentation.
Nanoseconds are now used, for example, in `meas` result presentations.
Own Id: OTP-19403
- Added support for compiling Erlang/OTP for Windows on ARM64.
Own Id: OTP-19480
Related Id(s): PR-8734
- When compiling C/C++ code on Unix systems, the compiler hardening flags
suggested by the Open Source Security Foundation are now enabled by default.
To disable them, pass `--disable-security-hardening-flags` to `configure`.
Own Id: OTP-19519
Related Id(s): PR-9441
- Add copyright notice to files that still had none.
Own Id: OTP-19570
- The license and copyright header has changed format to include an
`SPDX-License-Identifier`. At the same time, most files have been updated to
follow a uniform standard for license headers.
Own Id: OTP-19575
Related Id(s): PR-9670
- Tweaked some of the meas examples in order to make them benchmark compatible.
Own Id: OTP-19598
> #### Full runtime dependencies of megaco-4.8
>
> asn1-3.0, debugger-4.0, erts-12.0, et-1.5, kernel-8.0, runtime_tools-1.8.14,
> stdlib-2.5
# mnesia-4.24
## Improvements and New Features
- EEP-69: Nominal Types has been implemented. As a side effect, nominal types
can encode opaque types. We changed all opaque-handling logic and improved
opaque warnings in Dialyzer.
All existing Erlang type systems are structural: two types are seen as
equivalent if their structures are the same. Type comparisons are based on the
structures of the types, not on how the user explicitly defines them. For
example, in the following example, `meter()` and `foot()` are equivalent. The
two types can be used interchangeably. Neither of them differ from the basic
type `integer()`.
-type meter() :: integer().
-type foot() :: integer().
Nominal typing is an alternative type system, where two types are equivalent
if and only if they are declared with the same type name. The EEP proposes one
new syntax -nominal for declaring nominal types. Under nominal typing,
`meter()` and `foot()` are no longer compatible. Whenever a function expects
type `meter()`, passing in type `foot()` would result in a Dialyzer error.
-nominal meter() :: integer().
-nominal foot() :: integer().
More nominal type-checking rules can be found in the EEP. It is worth noting
that most work for adding nominal types and type-checking is in
`erl_types.erl`. The rest are changes that removed the previous opaque
type-checking, and added an improved version of it using nominal type-checking
with reworked warnings.
Backwards compatibility for opaque type-checking is not preserved by this PR.
Previous opaque warnings can appear with slightly different wordings. A new
kind of opaque warning `opaque_union` is added, together with a Dialyzer
option `no_opaque_union` to turn this kind of warnings off.
Own Id: OTP-19364
Related Id(s): PR-9079
*** HIGHLIGHT ***
- The license and copyright header has changed format to include an
`SPDX-License-Identifier`. At the same time, most files have been updated to
follow a uniform standard for license headers.
Own Id: OTP-19575
Related Id(s): PR-9670
> #### Full runtime dependencies of mnesia-4.24
>
> erts-9.0, kernel-5.3, stdlib-5.0
# observer-2.18
## Fixed Bugs and Malfunctions
- Enhance specs of timeout for improving documentation and dialyzer analysis.
Own Id: OTP-19604
Related Id(s): PR-9574
## Improvements and New Features
- With this change etop from observer application will scroll as top from shell
Own Id: OTP-19528
Related Id(s): PR-9659
- The license and copyright header has changed format to include an
`SPDX-License-Identifier`. At the same time, most files have been updated to
follow a uniform standard for license headers.
Own Id: OTP-19575
Related Id(s): PR-9670
> #### Full runtime dependencies of observer-2.18
>
> erts-15.0, et-1.5, kernel-10.0, runtime_tools-2.1, stdlib-5.0, wx-2.3
# odbc-2.16
## Fixed Bugs and Malfunctions
- Enhance specs of timeout for improving documentation and dialyzer analysis.
Own Id: OTP-19604
Related Id(s): PR-9574
## Improvements and New Features
- Updated odbc configure to enable easier use of iodbc driver.
Own Id: OTP-19456
Related Id(s): PR-9083
- Added support for compiling Erlang/OTP for Windows on ARM64.
Own Id: OTP-19480
Related Id(s): PR-8734
- When compiling C/C++ code on Unix systems, the compiler hardening flags
suggested by the Open Source Security Foundation are now enabled by default.
To disable them, pass `--disable-security-hardening-flags` to `configure`.
Own Id: OTP-19519
Related Id(s): PR-9441
- The license and copyright header has changed format to include an
`SPDX-License-Identifier`. At the same time, most files have been updated to
follow a uniform standard for license headers.
Own Id: OTP-19575
Related Id(s): PR-9670
> #### Full runtime dependencies of odbc-2.16
>
> erts-6.0, kernel-3.0, stdlib-2.0
# os_mon-2.11
## Fixed Bugs and Malfunctions
- Enhance specs of timeout for improving documentation and dialyzer analysis.
Own Id: OTP-19604
Related Id(s): PR-9574
## Improvements and New Features
- `m:disksup` will now recognize HAMMER2 volumes.
Own Id: OTP-19207
Related Id(s): PR-8704
- The license and copyright header has changed format to include an
`SPDX-License-Identifier`. At the same time, most files have been updated to
follow a uniform standard for license headers.
Own Id: OTP-19575
Related Id(s): PR-9670
> #### Full runtime dependencies of os_mon-2.11
>
> erts-14.0, kernel-9.0, sasl-4.2.1, stdlib-5.0
# parsetools-2.7
## Improvements and New Features
- EEP-69: Nominal Types has been implemented. As a side effect, nominal types
can encode opaque types. We changed all opaque-handling logic and improved
opaque warnings in Dialyzer.
All existing Erlang type systems are structural: two types are seen as
equivalent if their structures are the same. Type comparisons are based on the
structures of the types, not on how the user explicitly defines them. For
example, in the following example, `meter()` and `foot()` are equivalent. The
two types can be used interchangeably. Neither of them differ from the basic
type `integer()`.
-type meter() :: integer().
-type foot() :: integer().
Nominal typing is an alternative type system, where two types are equivalent
if and only if they are declared with the same type name. The EEP proposes one
new syntax -nominal for declaring nominal types. Under nominal typing,
`meter()` and `foot()` are no longer compatible. Whenever a function expects
type `meter()`, passing in type `foot()` would result in a Dialyzer error.
-nominal meter() :: integer().
-nominal foot() :: integer().
More nominal type-checking rules can be found in the EEP. It is worth noting
that most work for adding nominal types and type-checking is in
`erl_types.erl`. The rest are changes that removed the previous opaque
type-checking, and added an improved version of it using nominal type-checking
with reworked warnings.
Backwards compatibility for opaque type-checking is not preserved by this PR.
Previous opaque warnings can appear with slightly different wordings. A new
kind of opaque warning `opaque_union` is added, together with a Dialyzer
option `no_opaque_union` to turn this kind of warnings off.
Own Id: OTP-19364
Related Id(s): PR-9079
*** HIGHLIGHT ***
- Fixed licenses in files and added ORT curations to the following apps: otp,
eldap, erl_interface, eunit, parsetools, stdlib, syntax_tools, and ERTS.
Own Id: OTP-19478
Related Id(s): PR-9376, PR-9402, PR-9819
- The license and copyright header has changed format to include an
`SPDX-License-Identifier`. At the same time, most files have been updated to
follow a uniform standard for license headers.
Own Id: OTP-19575
Related Id(s): PR-9670
> #### Full runtime dependencies of parsetools-2.7
>
> erts-6.0, kernel-3.0, stdlib-3.4
# public_key-1.18
## Fixed Bugs and Malfunctions
- Enable public_key to decode legacy certs using md2 hash.
Own Id: OTP-19616
Related Id(s): GH-9754, PR-9755
## Improvements and New Features
- When compiling C/C++ code on Unix systems, the compiler hardening flags
suggested by the Open Source Security Foundation are now enabled by default.
To disable them, pass `--disable-security-hardening-flags` to `configure`.
Own Id: OTP-19519
Related Id(s): PR-9441
- Ignore instead of crashing unhandled entries when loading CA-certificates.
Own Id: OTP-19573
Related Id(s): GH-9565, PR-9677
- The license and copyright header has changed format to include an
`SPDX-License-Identifier`. At the same time, most files have been updated to
follow a uniform standard for license headers.
Own Id: OTP-19575
Related Id(s): PR-9670
- The ancient ASN.1 modules used in `public_key` has been replaced with more
modern versions, but we have strived to keep the documented Erlang API for the
`public_key` application compatible.
Own Id: OTP-19612
Related Id(s): PR-9774
*** HIGHLIGHT ***
*** POTENTIAL INCOMPATIBILITY ***
> #### Full runtime dependencies of public_key-1.18
>
> asn1-5.0, crypto-5.0, erts-13.0, kernel-8.0, stdlib-4.0
# reltool-1.0.2
## Improvements and New Features
- The license and copyright header has changed format to include an
`SPDX-License-Identifier`. At the same time, most files have been updated to
follow a uniform standard for license headers.
Own Id: OTP-19575
Related Id(s): PR-9670
> #### Full runtime dependencies of reltool-1.0.2
>
> erts-15.0, kernel-9.0, sasl-4.2.1, stdlib-5.0, tools-2.6.14, wx-2.3
# runtime_tools-2.2
## Improvements and New Features
- EEP-69: Nominal Types has been implemented. As a side effect, nominal types
can encode opaque types. We changed all opaque-handling logic and improved
opaque warnings in Dialyzer.
All existing Erlang type systems are structural: two types are seen as
equivalent if their structures are the same. Type comparisons are based on the
structures of the types, not on how the user explicitly defines them. For
example, in the following example, `meter()` and `foot()` are equivalent. The
two types can be used interchangeably. Neither of them differ from the basic
type `integer()`.
-type meter() :: integer().
-type foot() :: integer().
Nominal typing is an alternative type system, where two types are equivalent
if and only if they are declared with the same type name. The EEP proposes one
new syntax -nominal for declaring nominal types. Under nominal typing,
`meter()` and `foot()` are no longer compatible. Whenever a function expects
type `meter()`, passing in type `foot()` would result in a Dialyzer error.
-nominal meter() :: integer().
-nominal foot() :: integer().
More nominal type-checking rules can be found in the EEP. It is worth noting
that most work for adding nominal types and type-checking is in
`erl_types.erl`. The rest are changes that removed the previous opaque
type-checking, and added an improved version of it using nominal type-checking
with reworked warnings.
Backwards compatibility for opaque type-checking is not preserved by this PR.
Previous opaque warnings can appear with slightly different wordings. A new
kind of opaque warning `opaque_union` is added, together with a Dialyzer
option `no_opaque_union` to turn this kind of warnings off.
Own Id: OTP-19364
Related Id(s): PR-9079
*** HIGHLIGHT ***
- When compiling C/C++ code on Unix systems, the compiler hardening flags
suggested by the Open Source Security Foundation are now enabled by default.
To disable them, pass `--disable-security-hardening-flags` to `configure`.
Own Id: OTP-19519
Related Id(s): PR-9441
- The license and copyright header has changed format to include an
`SPDX-License-Identifier`. At the same time, most files have been updated to
follow a uniform standard for license headers.
Own Id: OTP-19575
Related Id(s): PR-9670
- With this change observer will use cheaper iterators to avoid locking when not
necessary.
Own Id: OTP-19584
Related Id(s): PR-9711
> #### Full runtime dependencies of runtime_tools-2.2
>
> erts-16.0, kernel-10.0, mnesia-4.12, stdlib-6.0
# sasl-4.3
## Fixed Bugs and Malfunctions
- Fixed the documentation for the ExtraFiles option to systools:make_tar/2.
Own Id: OTP-19279
Related Id(s): GH-8842, PR-8894
## Improvements and New Features
- `.appup` files are now included in releases in order to make it possible to
create upgrade packages from an installed release.
Own Id: OTP-19398
Related Id(s): PR-8973
- The license and copyright header has changed format to include an
`SPDX-License-Identifier`. At the same time, most files have been updated to
follow a uniform standard for license headers.
Own Id: OTP-19575
Related Id(s): PR-9670
> #### Full runtime dependencies of sasl-4.3
>
> erts-15.0, kernel-6.0, stdlib-4.0, tools-2.6.14
# snmp-5.19
## Improvements and New Features
- EEP-69: Nominal Types has been implemented. As a side effect, nominal types
can encode opaque types. We changed all opaque-handling logic and improved
opaque warnings in Dialyzer.
All existing Erlang type systems are structural: two types are seen as
equivalent if their structures are the same. Type comparisons are based on the
structures of the types, not on how the user explicitly defines them. For
example, in the following example, `meter()` and `foot()` are equivalent. The
two types can be used interchangeably. Neither of them differ from the basic
type `integer()`.
-type meter() :: integer().
-type foot() :: integer().
Nominal typing is an alternative type system, where two types are equivalent
if and only if they are declared with the same type name. The EEP proposes one
new syntax -nominal for declaring nominal types. Under nominal typing,
`meter()` and `foot()` are no longer compatible. Whenever a function expects
type `meter()`, passing in type `foot()` would result in a Dialyzer error.
-nominal meter() :: integer().
-nominal foot() :: integer().
More nominal type-checking rules can be found in the EEP. It is worth noting
that most work for adding nominal types and type-checking is in
`erl_types.erl`. The rest are changes that removed the previous opaque
type-checking, and added an improved version of it using nominal type-checking
with reworked warnings.
Backwards compatibility for opaque type-checking is not preserved by this PR.
Previous opaque warnings can appear with slightly different wordings. A new
kind of opaque warning `opaque_union` is added, together with a Dialyzer
option `no_opaque_union` to turn this kind of warnings off.
Own Id: OTP-19364
Related Id(s): PR-9079
*** HIGHLIGHT ***
- Added support for compiling Erlang/OTP for Windows on ARM64.
Own Id: OTP-19480
Related Id(s): PR-8734
- When compiling C/C++ code on Unix systems, the compiler hardening flags
suggested by the Open Source Security Foundation are now enabled by default.
To disable them, pass `--disable-security-hardening-flags` to `configure`.
Own Id: OTP-19519
Related Id(s): PR-9441
- Add copyright notice to files that still had none.
Own Id: OTP-19572
- The license and copyright header has changed format to include an
`SPDX-License-Identifier`. At the same time, most files have been updated to
follow a uniform standard for license headers.
Own Id: OTP-19575
Related Id(s): PR-9670
> #### Full runtime dependencies of snmp-5.19
>
> crypto-4.6, erts-12.0, kernel-8.0, mnesia-4.12, runtime_tools-1.8.14,
> stdlib-5.0
# ssh-5.3
## Fixed Bugs and Malfunctions
- The implementation of the ssh server-side supervision tree has been improved.
Own Id: OTP-19324
Related Id(s): GH-8223, PR-8968
- SSH daemon accepts fun as tcpip_tunnel_in option. This provides more control
over TCP connection tunnel handle by server.
Own Id: OTP-19566
Related Id(s): PR-9571
## Improvements and New Features
- The `Erlang SSH daemon` now uses the same backend to handle multiline
functionality as the Erlang shell.
Own Id: OTP-19226
Related Id(s): PR-8805
- CBC algorithms are not offered by default. See Configuring algorithms in SSH
if you wish to enable them.
Own Id: OTP-19420
Related Id(s): PR-9277
*** POTENTIAL INCOMPATIBILITY ***
- Daemon can be configured (bannerfun option) to send banner message at the
beginning of user authentication.
Own Id: OTP-19535
Related Id(s): PR-9149
- The license and copyright header has changed format to include an
`SPDX-License-Identifier`. At the same time, most files have been updated to
follow a uniform standard for license headers.
Own Id: OTP-19575
Related Id(s): PR-9670
- For interoperability reasons, SSH ignore message with no length specified is
treated as message with zero length specified - it will not cause decode
error.
Own Id: OTP-19586
Related Id(s): PR-9214
- Documentation improvements.
Own Id: OTP-19596
Related Id(s): PR-9298
> #### Full runtime dependencies of ssh-5.3
>
> crypto-5.0, erts-14.0, kernel-10.3, public_key-1.6.1, runtime_tools-1.15.1,
> stdlib-5.0, stdlib-6.0
# ssl-11.3
## Improvements and New Features
- Refactoring, minor optimizations and improved log printouts.
Own Id: OTP-19367
Related Id(s): PR-9019
- supervisor:which_child/2 is now used to make start-up code for
TLS-connections simpler and more straight forward, and to increase stability
and maintainability of the ssl application.
Own Id: OTP-19406
Related Id(s): PR-9231
- The data handling for tls-v1.3 has been optimized.
Own Id: OTP-19430
Related Id(s): PR-9305
- Added experimental socket support.
Own Id: OTP-19463
Related Id(s): PR-9398
- Improve code health by removing dead code.
Own Id: OTP-19531
Related Id(s): PR-9563
- A test module for TLS distribution over `socket` has been implemented.
Own Id: OTP-19539
Related Id(s): PR-9511
- The license and copyright header has changed format to include an
`SPDX-License-Identifier`. At the same time, most files have been updated to
follow a uniform standard for license headers.
Own Id: OTP-19575
Related Id(s): PR-9670
> #### Full runtime dependencies of ssl-11.3
>
> crypto-5.6, erts-16.0, inets-5.10.7, kernel-10.3, public_key-1.16.4,
> runtime_tools-1.15.1, stdlib-7.0
# stdlib-7.0
## Fixed Bugs and Malfunctions
- Shell help now orders the commands in alphabetical order.
Own Id: OTP-19161
Related Id(s): PR-8573
- `proc_lib:stop/1,3` (and in extension gen_server:stop/3, gen_statem:stop/3
and so on) have been updated to not throw an error if the process to be
stopped exits with the same reason as given to proc_lib:stop/3.
Own Id: OTP-19233
Related Id(s): PR-8772
*** POTENTIAL INCOMPATIBILITY ***
- The size of an atom in the Erlang source code was limited to 255 bytes in
previous releases, meaning that an atom containing only emojis could contain
only 63 emojis.
While atoms are still only allowed to contain 255 characters, the number of
bytes is no longer limited.
External tools that parse the `AtU8` chunk of a BEAM file directly need to be
updated. Tools that use
`beam_lib:chunks(Beam, [atoms)`](beam_lib:chunks/2) to read the atom table
will continue to work.
Own Id: OTP-19285
Related Id(s): PR-8913
*** POTENTIAL INCOMPATIBILITY ***
- argparse:help/1 now accepts unicode:chardata/0.
Own Id: OTP-19303
Related Id(s): PR-8932
- The literals chunk in BEAM is no longer compressed, resulting in slightly
smaller BEAM files when a BEAM file is stripped using
beam_lib:strip_files/1.
This is a potential incompatibility for tools that read and interpret the
contents of the literal chunk. One way to update such tools to work with the
new format is to retrieve the chunk using
`beam_lib:chunks(Beam, [literals)`](beam_lib:chunks/2).
Own Id: OTP-19323
Related Id(s): GH-8967, PR-8988
*** POTENTIAL INCOMPATIBILITY ***
- The previous digraph_utils:preorder/1 and digraph_utils:postorder/1 did
not start the traversal from root nodes. This fix makes both traversals only
start or restart from a root node in one of the components, or an arbitrary
node if no root node can be visited.
Own Id: OTP-19393
Related Id(s): PR-9171
- Auto-completion in the shell is now significantly faster for function
parameters that uses complex custom types.
Own Id: OTP-19413
Related Id(s): PR-9271
- Stringfying a non-latin1 atom will now produce a readable string instead of
encoding each character using `\x{...}` escape sequences. Example:
-define(S(T), ??T).
atom() ->
?S('аÑом').
The `atom/0` function now returns `"'аÑом'"` instead of
`"'\\x{430}\\x{442}\\x{43E}\\x{43C}'"`.
Own Id: OTP-19421
Related Id(s): GH-9173, PR-9276
- A few minor issues were corrected in `syntax_tools`, as well in the
`erl_anno` module.
Own Id: OTP-19422
Related Id(s): PR-9253
- `m:dets` could print error messages to standard output when repairing DETS
files. This has been changed to send the messages to `logger`.
`ets:fun2ms` would print an error message to standard output as well as
returning an error tuple. The printing of the message has been removed.
Own Id: OTP-19427
Related Id(s): PR-9232, PR-9446
- The functions for converting to and from the RFC1339 date and time format
would not properly handle fractional seconds for negative times.
Own Id: OTP-19441
Related Id(s): GH-9279, PR-9280
- Replaced calls to deprecated `crypto:start()` with
`application:start(crypto)`.
Own Id: OTP-19485
Related Id(s): PR-8592
- Fixed a bug when calling shell completion on a reserved word followed by a _(_
would crash the shell.
Own Id: OTP-19511
Related Id(s): GH-9470
- Corrected the spec of ets:update_element/4.
Own Id: OTP-19514
Related Id(s): PR-9504
- Corrected the spec for ets:info/1.
Own Id: OTP-19515
Related Id(s): PR-9514
- Fixed crash when defining records with a string field in the shell
Own Id: OTP-19533
Related Id(s): GH-9557
- Details in the hibernation implementation and time-out handling has been
improved for `gen_statem`. In particular to avoid selective receive when
cancelling a time-out.
Own Id: OTP-19540
Related Id(s): PR-9579
- Fixed a bug when getting help on a module compiled without debug_info.
Own Id: OTP-19583
Related Id(s): PR-9654
- Fix `zip` extraction to wrap invalid DOS timestamps to their correct value
instead of returning the actual value. Before this fix the timestamp returned
could have a second greater than 59. The bug has been present since Erlang/OTP
27.1.
Own Id: OTP-19593
Related Id(s): GH-9536, PR-9537
- Enhance specs of timeout for improving documentation and dialyzer analysis.
Own Id: OTP-19604
Related Id(s): PR-9574
## Improvements and New Features
- Singleton type variables in an union type do not make sense from Dialyzer's
point of view. The following example is ill-typed:
-spec run_test(Opts) -> term()
when Opts :: {join_specs, Bool} | {test, Bool}.
This used to be reported as a warning. In OTP-28, this is an error
Own Id: OTP-19125
Related Id(s): PR-8556
- By default, sets created by the `sets` module will now be represented as
maps.
Own Id: OTP-19127
Related Id(s): PR-8429
- For various error types, the compiler now tries to suggest potential fixes by
adding "did you mean ...?" at the end of error messages.
When a function is used with wrong arity, the compiler will try to suggest a
defined function with the same name but a different arity. For example, given
the following module:
-module(typos).
-export([t/0]).
bar(A) -> A.
bar(A,A,A) -> A.
bar(A,A,A,A) -> A.
t() -> bar(0, 0).
The compiler will emit the following message:
typo.erl:6:12: function bar/2 undefined, did you mean bar/1,3,4?
% 6| t() -> bar(0, 0).
% | ^
For compiler errors that can easily be caused by typos, the compiler will try
to suggest what the correct variable or function name, could be. For example,
given the following module:
-module(typos).
-export([bar/2]).
bar(A0, B0) ->
A + B.
the compiler will emit the following error messages:
typos.erl:5:5: variable 'A' is unbound, did you mean 'A0'?
% 5| A + B.
% | ^
typos.erl:5:9: variable 'B' is unbound, did you mean 'B0'?
% 5| A + B.
% | ^
Error types that now suggest correct arities: `bad_inline`, `undefined_nif`,
`bad_nowarn_unused_function`, `bad_nowarn_bif_clash`, `undefined_function`.
Error types that now suggest correct names: `bad_inline`, `undefined_nif`,
`bad_nowarn_unused_function`, `undefined_on_load`, `undefined_function`,
`undefined_record`, `undefined_field`, `unbound_var`.
Using a function with wrong arity has higher precedence than having a typo in
the function name. If the compiler can find a defined function with the same
name but a different arity, it will not suggest a defined function with a
close-enough name, regardless of arity.
Own Id: OTP-19180
Related Id(s): PR-8699, PR-9094
*** HIGHLIGHT ***
- Comprehensions have been extended with zip generators according to EEP 73.
Example:
1> [A+B || A <- [1,2,3] && B <- [4,5,6]].
[5,7,9]
Own Id: OTP-19184
Related Id(s): PR-8926
*** HIGHLIGHT ***
- Before restarting a child, a supervisor must check if the restart limit is
reached. This adds a penalty to the overall restart time, which should be kept
low. The algorithm has been optimized from 2\*O(n) to O(n) behavior.
Own Id: OTP-19204
Related Id(s): PR-8261
- Added the possibility to configure shell docs column width through the stdlib
parameter `shell_docs_columns`.
Own Id: OTP-19224
Related Id(s): PR-8651
- The io:setopts/2 function now accepts the `line_history` option for more
explicit handling of when to save shell history.
Own Id: OTP-19230
Related Id(s): PR-8792
- The shell now prints a help message explaining how to interrupt a running
command when stuck executing a command for longer than 5 seconds.
Own Id: OTP-19231
Related Id(s): PR-8793
- Binaries can now be used as input to calendar:rfc3339_to_system_time/2, and
produced as output of calendar:system_time_to_rfc3339/2.
Own Id: OTP-19250
Related Id(s): PR-8812
- The `erl -noshell` mode has been updated to have two sub modes called `raw`
and `cooked`, where `cooked` is the old default behaviour and `raw` can be
used to bypass the line-editing support of the native terminal. Using `raw`
mode it is possible to read keystrokes as they happen without the user having
to press Enter. Also, the `raw` mode does not echo the typed characters to
stdout. An example of how to create a tic-tac-toe game using this mechanism is
included in the documentation.
Own Id: OTP-19314
Related Id(s): GH-8037, PR-8962
*** HIGHLIGHT ***
- Added io:get_password/0 that can read passwords from stdin when in "raw"
`-noshell` mode.
Own Id: OTP-19315
Related Id(s): PR-8962, PR-9006
- New strict generators have been added for comprehensions.
The currently existing generators are "relaxed": they ignore terms in the
right-hand side expression that do not match the left-hand side pattern.
The new strict generators fail with exception `badmatch` if a pattern doesn't
match.
Examples:
Using the current relaxed generator operator `<-`, any element not matching
the pattern `{_,_}` will be silently discarded:
1> [T || {_,_}=T <- [{ok,1},ok,{error,2}]].
[{ok,1},{error,2}]
If the intention is that all lists processed by a list comprehension must only
contain tuples of size two, using the new strict version of the operator
ensures that term not matching will cause a crash:
2> [T || {_,_}=T <:- [{ok,1},ok,{error,2}]].
** exception error: no match of right hand side value ok
Using the strict generator operator to mark the intention that all list
elements must match the pattern could help finding mistakes quicker if
something unpexected is added to the list processed by the generator.
The strict version for bitstring generators is `<:=`.
Own Id: OTP-19317
Related Id(s): PR-8625
*** HIGHLIGHT ***
- New options for suppressing behaviour warnings have been added:
- `nowarn_conflicting_behaviours`
- `nowarn_undefined_behaviour_func`
- `nowarn_undefined_behaviour`
- `nowarn_undefined_behaviour_callbacks`
- `nowarn_ill_defined_behaviour_callbacks`
- `nowarn_ill_defined_optional_callbacks`
Own Id: OTP-19334
Related Id(s): GH-8985, PR-9020
- The `join(Binaries, Separator)` function that joins a list of binaries has
been added to the `binary` module.
Own Id: OTP-19337
Related Id(s): GH-8099, PR-8100
*** HIGHLIGHT ***
- The supervisor:which_child/2 function has been added to facilitate getting
the pid of a sibling process; that is a process under same supervisor as the
process that calls to call the new function.
Own Id: OTP-19345
Related Id(s): PR-8976
- The function erl_anno:set_end_location/2 for setting the end location of a
token has been added.
Own Id: OTP-19354
Related Id(s): PR-8966
- Added a warning for calling non-exported functions with the remote function
call syntax from the same module, and likewise for the remote fun syntax.
Own Id: OTP-19371
Related Id(s): GH-9092, PR-9095
- The `warn_deprecated_catch` option enables warnings for use of old-style catch
expressions on the form `catch Expr` instead of the modern
`try ... catch ... end`. To prevent new uses of uses of old catches to be
added, this compiler option can be enabled on the project level and
`-compile(nowarn_deprecated_catch).` added to individual files that still
contain old catches.
Own Id: OTP-19425
Related Id(s): PR-9154
- Module `re` has been updated to use PCRE2, which is mostly backward
compatible with PCRE.
The most noticeable incompatibilities are
- The default character encoding is pure ASCII and not Latin1. Unicode support
is still available with options `unicode` and `ucp`.
- Options `bsr_anycrlf`, `bsr_unicode` and `{newline,_}` are only set when a
regex is compiled and cannot be changed at matching for precompiled regex.
Own Id: OTP-19431
Related Id(s): PR-9299, PR-9610
*** HIGHLIGHT ***
*** POTENTIAL INCOMPATIBILITY ***
- Defining a fun in terms of an imported function is not allowed. Before this
release, the compiler would not catch this kind of error if the name of the
imported function happened to be a BIF. Consider this example:
-module(fun_example).
-export([foo/0, bar/0]).
-import(m, [max/2, not_a_bif/0]).
foo() ->
fun max/2.
bar() ->
fun not_a_bif/0.
The compiler in Erlang/OTP 27 would generate the following messages:
fun_example.erl:9:5: function not_a_bif/0 undefined
% 9| fun not_a_bif/0.
% | ^
fun_example.erl:3:2: Warning: import directive overrides auto-imported BIF max/2 --
use "-compile({no_auto_import,[max/2]})." to resolve name clash
% 3| -import(m, [max/2, not_a_bif/0]).
% | ^
That is, there would be a (cryptic) error for `fun not_a_bif/0`, but only a
warning for `fun max/2`.
When compiling with this release, both attempts to create a fun will result in
error messages (as well as a warning):
fun_example.erl:6:5: creating a fun from imported name max/2 is not allowed
% 6| fun max/2.
% | ^
fun_example.erl:9:5: creating a fun from imported name not_a_bif/0 is not allowed
% 9| fun not_a_bif/0.
% | ^
fun_example.erl:3:2: Warning: import directive overrides auto-imported BIF max/2 --
use "-compile({no_auto_import,[max/2]})." to resolve name clash
% 3| -import(m, [max/2, not_a_bif/0]).
% | ^
Also, attempting to call a local function having the same name as
auto-imported BIF would result in an error if the BIF was added to Erlang/OTP
before R14, and a warning for newer BIFs. This has been changed to always emit
a warning. For example:
-module(bif_example).
-export([bar/1]).
bar(B) ->
is_boolean(B).
is_boolean(B) ->
B =:= true orelse B =:= false.
will now result in the following warning instead of an error:
if_example.erl:5:5: Warning: ambiguous call of overridden auto-imported BIF is_boolean/1 --
use erlang:is_boolean/1 or "-compile({no_auto_import,[is_boolean/1]})." to resolve name clash
% 5| is_boolean(B).
% | ^
Own Id: OTP-19432
Related Id(s): PR-9246
- It is now possible to use any base for floating point numbers as described in
EEP 75: Based Floating Point Literals.
Computers represent floating point numbers in binary, but such numbers are
typically printed using base ten, for example 0.314159265e1. To maintain exact
bit-level precision when converting numbers to and from text, it is better to
use a base that matches the internally used base, such as 16 for a compact but
still exact representation, or 2 for visualizing or writing down the exact
internal format. One particular case where such exact representations are
useful is in code generating tools.
Examples:
> 2#0.111.
0.875
> 16#fefe.fefe#e16.
1.2041849337671418e24
Own Id: OTP-19452
Related Id(s): PR-9106
*** HIGHLIGHT ***
- The callback function `handle_continue/2` in `gen_server` callback modules is
now cached like the others, thanks to code cleanup and optimization of the
internal behaviour loop.
This should only improve performance, not affect functionality.
Own Id: OTP-19474
Related Id(s): PR-9333
- Encoding done by the `json` module has been optimized.
Own Id: OTP-19476
Related Id(s): PR-9251
- There is a new `zstd` module that does Zstandard compression.
Own Id: OTP-19477
Related Id(s): PR-9316
*** HIGHLIGHT ***
- Fixed licenses in files and added ORT curations to the following apps: otp,
eldap, erl_interface, eunit, parsetools, stdlib, syntax_tools, and ERTS.
Own Id: OTP-19478
Related Id(s): PR-9376, PR-9402, PR-9819
- Functions of a module can now be grouped in the shell code completion by using
the _group_ key in the _-doc_ attribute e.g. ``` -doc(#{group=><<"Public
API">>). fetch()->...
Functions, callbacks and types in the module reference documentation of OTP is now grouped using this feature.
Own Id: OTP-19483
Related Id(s): [PR-9408]
- Added calendar:universal_time_to_system_time/1,2 and
calendar:local_time_to_system_time/1,2
Own Id: OTP-19505
Related Id(s): PR-9445
- Improve error messages for json:decode/1.
Own Id: OTP-19508
Related Id(s): PR-9484
- ETS `heir` can be set without getting an `ETS-TRANSFER` message. Useful when
the heir is a supervisor process that cannot handle custom messages.
Own Id: OTP-19512
Related Id(s): PR-7970
- Added support for the Unicode 16 standard.
Own Id: OTP-19516
Related Id(s): PR-9141, PR-9518
- When documenting a function or type that needs to deal with durations, usually
we can document it as "time in milliseconds". Since the `timer` family of
functions (`hms`, `hours`, `seconds`, ...) all return time in milliseconds, it
is useful to be able to use this type in type specifications.
Own Id: OTP-19526
Related Id(s): PR-9515
- A new event time-out has been implemented in `gen_server`, that behaves more
like the one in `gen_statem`.
See the type gen_server:action/0 for `{timeout|hibernate,...}`, and also
related functions.
Own Id: OTP-19537
Related Id(s): PR-9287, PR-9615, PR-9621
- Line numbers used to be reported in the following way:
1> lists:last([]).
** exception error: no function clause matching lists:last([]) (lists.erl, line 389)
Starting from Erlang/OTP 28, line numbers are now reported in the following
way:
1> lists:last([]).
** exception error: no function clause matching lists:last([]) (lists.erl:389)
Own Id: OTP-19538
Related Id(s): PR-9468
*** HIGHLIGHT ***
- Upgrade pcre2 to 10.45
Own Id: OTP-19541
Related Id(s): PR-9582
- Added functions that produce utf-8 binaries instead of iolists. New functions
are: io_lib:bformat/2, io_lib:bformat/3, io_lib:bfwrite/2,
io_lib:bfwrite/3, io_lib:bwrite/2 and io_lib:bwrite_string/3.
Own Id: OTP-19556
Related Id(s): PR-9772
*** HIGHLIGHT ***
- The license and copyright header has changed format to include an
`SPDX-License-Identifier`. At the same time, most files have been updated to
follow a uniform standard for license headers.
Own Id: OTP-19575
Related Id(s): PR-9670
- A list of PCRE2 incompatibilities is documented in a user's guide for stdlib.
Own Id: OTP-19578
Related Id(s): PR-9705
- Change automatic hibernation of static supervisors so that they will hibernate
after being idle for 1 second instead of only after starting, dynamic
supervisors (simple_one_for_one) will not be hibernated at all. An option to
the supervisor is added to make it configurable for the application. This
option defaults to 1 second for static supervisors and to infinity for the
simple_one_for_one supervisors.
Own Id: OTP-19597
Related Id(s): PR-9680
*** POTENTIAL INCOMPATIBILITY ***
> #### Full runtime dependencies of stdlib-7.0
>
> compiler-5.0, crypto-4.5, erts-16.0, kernel-10.0, sasl-3.0, syntax_tools-3.2.1
# syntax_tools-4.0
## Fixed Bugs and Malfunctions
- A few minor issues were corrected in `syntax_tools`, as well in the
`erl_anno` module.
Own Id: OTP-19422
Related Id(s): PR-9253
## Improvements and New Features
- Comprehensions have been extended with zip generators according to EEP 73.
Example:
1> [A+B || A <- [1,2,3] && B <- [4,5,6]].
[5,7,9]
Own Id: OTP-19184
Related Id(s): PR-8926
*** HIGHLIGHT ***
- New strict generators have been added for comprehensions.
The currently existing generators are "relaxed": they ignore terms in the
right-hand side expression that do not match the left-hand side pattern.
The new strict generators fail with exception `badmatch` if a pattern doesn't
match.
Examples:
Using the current relaxed generator operator `<-`, any element not matching
the pattern `{_,_}` will be silently discarded:
1> [T || {_,_}=T <- [{ok,1},ok,{error,2}]].
[{ok,1},{error,2}]
If the intention is that all lists processed by a list comprehension must only
contain tuples of size two, using the new strict version of the operator
ensures that term not matching will cause a crash:
2> [T || {_,_}=T <:- [{ok,1},ok,{error,2}]].
** exception error: no match of right hand side value ok
Using the strict generator operator to mark the intention that all list
elements must match the pattern could help finding mistakes quicker if
something unpexected is added to the list processed by the generator.
The strict version for bitstring generators is `<:=`.
Own Id: OTP-19317
Related Id(s): PR-8625
*** HIGHLIGHT ***
- Fixed licenses in files and added ORT curations to the following apps: otp,
eldap, erl_interface, eunit, parsetools, stdlib, syntax_tools, and ERTS.
Own Id: OTP-19478
Related Id(s): PR-9376, PR-9402, PR-9819
- The license and copyright header has changed format to include an
`SPDX-License-Identifier`. At the same time, most files have been updated to
follow a uniform standard for license headers.
Own Id: OTP-19575
Related Id(s): PR-9670
> #### Full runtime dependencies of syntax_tools-4.0
>
> compiler-9.0, erts-16.0, kernel-10.3, stdlib-7.0
# tftp-1.2.3
## Improvements and New Features
- The license and copyright header has changed format to include an
`SPDX-License-Identifier`. At the same time, most files have been updated to
follow a uniform standard for license headers.
Own Id: OTP-19575
Related Id(s): PR-9670
> #### Full runtime dependencies of tftp-1.2.3
>
> erts-6.0, kernel-6.0, stdlib-5.0
# tools-4.1.2
## Fixed Bugs and Malfunctions
- A crash has been eliminated in tprof:collect/0 when unloading a module while
collecting traces.
Own Id: OTP-19135
Related Id(s): GH-8483, PR-8547
- Improved the `indent-region` Emacs command, which could indent badly when
inside multiline string.
Own Id: OTP-19396
Related Id(s): PR-9186
- eprof:start_profiling/3 can now return information about which process it
failed to trace.
Own Id: OTP-19419
Related Id(s): PR-9219
- Fixed a race condition when processes cause the Cover server to be started at
the same time.
Own Id: OTP-19517
Related Id(s): PR-9124
- Fix bug in `tprof` where the session name could not be set.
Own Id: OTP-19580
Related Id(s): PR-9648
- Add `tprof` to the `.app` file.
Own Id: OTP-19628
Related Id(s): PR-9787
## Improvements and New Features
- The license and copyright header has changed format to include an
`SPDX-License-Identifier`. At the same time, most files have been updated to
follow a uniform standard for license headers.
Own Id: OTP-19575
Related Id(s): PR-9670
> #### Full runtime dependencies of tools-4.1.2
>
> compiler-8.5, erts-15.0, erts-15.0, kernel-10.0, runtime_tools-2.1, stdlib-6.0
# wx-2.5
## Improvements and New Features
- Fixed licenses in files and added ORT curations to the following apps: otp,
eldap, erl_interface, eunit, parsetools, stdlib, syntax_tools, and ERTS.
Own Id: OTP-19478
Related Id(s): PR-9376, PR-9402, PR-9819
- Added support for compiling Erlang/OTP for Windows on ARM64.
Own Id: OTP-19480
Related Id(s): PR-8734
- When compiling C/C++ code on Unix systems, the compiler hardening flags
suggested by the Open Source Security Foundation are now enabled by default.
To disable them, pass `--disable-security-hardening-flags` to `configure`.
Own Id: OTP-19519
Related Id(s): PR-9441
- The license and copyright header has changed format to include an
`SPDX-License-Identifier`. At the same time, most files have been updated to
follow a uniform standard for license headers.
Own Id: OTP-19575
Related Id(s): PR-9670
> #### Full runtime dependencies of wx-2.5
>
> erts-12.0, kernel-8.0, stdlib-5.0
# xmerl-2.1.4
## Fixed Bugs and Malfunctions
- With this change all public functions in xmerl have specs.
Own Id: OTP-19534
Related Id(s): PR-9327
## Improvements and New Features
- The license and copyright header has changed format to include an
`SPDX-License-Identifier`. At the same time, most files have been updated to
follow a uniform standard for license headers.
Own Id: OTP-19575
Related Id(s): PR-9670
> #### Full runtime dependencies of xmerl-2.1.4
>
> erts-6.0, kernel-8.4, stdlib-2.5
# Thanks to
Adam Wight, Aleksander Lisiecki, Alexandre Rodrigues, Anders Ã
gren Thuné, Andrea
Leopardi, Ariel Otilibili, Benedikt Reinartz, Benjamin Philip, Brujo Benavides,
Chris Freeze, Christophe De Troyer, Cocoa, Dairon Medina Caro, Daniel Gorin,
Daniel Kozmacs, Dániel Szoboszlay, dependabotbot, Dmitri Vereshchagin, Dominic
Letz, Douglas Vought, Egor Ignatov, Eksperimental, Frank Hunleth, Freddie
Lamble, Fredrik Frantzen, Frej Drejhammar, Gary Rennie, Hichem Fantar, Ilya
Klyuchnikov, iri, Isabell H, Jan Uhlig, Jean-Louis Huynen, Jean-Sébastien
Pédron, João Henrique Ferreira de Freitas, Johannes Christ, Jonas Bernoulli,
Jonatan KÅosko, José Valim, Juan Barrios, Julian Doherty, Keyhan Jannat Khah â,
Kirill A. Korinsky, lucioleKi, Lukasz Samson, Maria Scott, Mario Idival, Mario
Uher, Marko Mindek, Martin Davidsson, Matwey V. Kornilov, Maxim Fedorov, Michael
Davis, Michael Neumann, Nelson Vides, Nicholas Moen, Onno Vos, Paul Guyot,
Philip Munksgaard, preciz, Richard Carlsson, Roberto Aloi, Robin Morisset,
Roeland van Batenburg, ruslandoga, Ryan Kirkman, S0AndS0, sabiwara, Sam Weaver,
Sergei Shuvatov, siiky, Simon Cornish, Siri Hansen, Stavros Aronis, Stefan
Grundmann, Steffen Deusch, Tobias Pfeiffer, Tomer, Vadim Yanitskiy, Vance
Shipley, William Fank Thomé, williamthome, William Yang, Wojtek Mach, Wojtek
Surowka, yagogarea, Yoshiyuki Kurauchi, Zero King
More information about the erlang-announce
mailing list