Inital Release: OTP 28.0 Git Tag: OTP-28.0 Date: 2025-04-16 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-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-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-19566, OTP-19570, OTP-19572, OTP-19573, OTP-19574, OTP-19575, OTP-19576, OTP-19578, OTP-19580, OTP-19584, OTP-19586, OTP-19588, OTP-19589, OTP-19590, OTP-19591, OTP-19593, OTP-19594, OTP-19596, OTP-19597, OTP-19598 Seq num: #9388, 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-9487, GH-9500, GH-9536, GH-9565, GH-9668, OTP-16608, OTP-19545, 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-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-9327, PR-9330, PR-9333, PR-9342, PR-9344, PR-9363, PR-9376, 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-9579, PR-9582, PR-9586, PR-9587, PR-9590, PR-9594, PR-9595, PR-9608, PR-9610, PR-9615, PR-9621, PR-9625, PR-9630, PR-9639, PR-9648, PR-9659, PR-9660, PR-9670, PR-9671, PR-9677, PR-9678, PR-9680, PR-9705, PR-9711, PR-9714 System: OTP Release: 28 Application: asn1-5.3.5, 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.3.3, 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.3 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 # 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 # 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 - 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 *** # asn1-5.3.5 ## 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 > #### Full runtime dependencies of asn1-5.3.5 > > 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 ## 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 *** - 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 > #### 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 *** - 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 ## 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 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 ## 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 - 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 - 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 ## 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 ## 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): #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 - 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