Skip to content

Commit c2d3971

Browse files
committed
Update CHANGELOG
1 parent 472a49d commit c2d3971

2 files changed

Lines changed: 65 additions & 24 deletions

File tree

CHANGELOG.md

Lines changed: 65 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -175,6 +175,68 @@ The code above has a type violation, which is now caught by the type system:
175175

176176
The type system was made possible thanks to a partnership between [CNRS](https://www.cnrs.fr/) and [Remote](https://remote.com/). The development work is currently sponsored by [Fresha](https://www.fresha.com/) and [Tidewave](https://tidewave.ai/).
177177

178+
## v1.20.0-rc.5 (2026-05-13)
179+
180+
This release requires Erlang/OTP 27+ and is compatible with Erlang/OTP 29.
181+
182+
### 1. Enhancements
183+
184+
#### EEx
185+
186+
* [EEx] Optimize compiler by flattening expr list only once
187+
188+
#### Elixir
189+
190+
* [Base] Optimize Base validation functions by using SWAR techniques
191+
* [Float] Optimize `Float.round/2` by avoiding big integers
192+
* [Inspect] Increase inspect limit to help print deeply nested data structures
193+
* [Inspect] Support printing Erlang records (using Erlang notation)
194+
* [Kernel] Add occurrence typing on `case`, `cond`, and `with`
195+
* [Registry] Switch `{:duplicate, :key}` key_ets to ordered_set with composite keys
196+
* [String] SWAR-optimize ASCII fast paths in `String.length/1` and `String.slice/3`
197+
198+
#### ExUnit
199+
200+
* [ExUnit] Show remaining runs when using `--repeat-until-failure`
201+
202+
#### IEx
203+
204+
* [IEx.Helpers] Add `source/1`
205+
206+
#### Mix
207+
208+
* [mix app.tree] Support `--output` option
209+
* [mix deps.tree] Support `--output` option
210+
* [mix help] Support printing docs for types and callbacks
211+
* [mix format] Support `--no-compile` option
212+
* [mix source] Add `mix source MODULE` to print or open a given module/function location
213+
214+
### 2. Potential breaking changes
215+
216+
#### Elixir
217+
218+
* [Kernel] Disallow raw CR line ending in strings, comments and after `?` for security reasons
219+
220+
### 3. Bug fixes
221+
222+
#### Elixir
223+
224+
* [Kernel] Fix a compiler crash when importing a module with `only: :sigils` option when the imported module exports non-sigil symbols with `sigil_` prefix
225+
* [Kernel] Reject negative Duration in `to_timeout/1`
226+
* [Macro] Fix generation of heredocs in `Macro.to_string/1` with escaped trailing newline
227+
* [Path] Consistently return path as binary in `Path.relative_to_cwd/2`
228+
* [Stream] Raise in `Stream.cycle/1` when enumerable reduce call yields no elements
229+
* [String] Support empty pattern list in `String.count/2`
230+
231+
#### Logger
232+
233+
* [Logger] Persist log level to app env in `Logger.configure/1`
234+
235+
#### Mix
236+
237+
* [Mix] Use `non_executable_binary_to_term` on loopback pubsub
238+
* [mix compile.elixir] Fix scenario where Elixir would tag mtimes in the future
239+
178240
## v1.20.0-rc.4 (2026-03-31)
179241

180242
This release requires Erlang/OTP 27+ and is compatible with Erlang/OTP 29.
@@ -232,7 +294,7 @@ This release requires Erlang/OTP 27+ and is compatible with Erlang/OTP 29.
232294
#### Elixir
233295

234296
* [Enum] Fix `Enum.slice/2` for ranges with step > 1 sliced by step > 1
235-
* [File] Preserve directory permissions in `File.cp_r/3`
297+
* [File] Allowing preserving directory permissions in `File.cp_r/3`
236298
* [File] Fix `File.cp_r/3` infinite loop with symlink cycles
237299
* [File] Fix `File.cp_r/3` infinite loop when copying into subdirectory of source
238300
* [File] Warn when defining `@type record()`, fixes CI on Erlang/OTP 29
@@ -261,13 +323,7 @@ This release requires Erlang/OTP 27+ and is compatible with Erlang/OTP 29.
261323
* [mix compile] Add `module_definition: :interpreted` option to `Code` which allows module definitions to be evaluated instead of compiled. In some applications/architectures, this can lead to drastic improvements to compilation times. Note this does not affect the generated `.beam` file, which will have the same performance/behaviour as before
262324
* [mix deps] Parallelize dep lock status checks during `deps.loadpaths`, improving boot times in projects with many git dependencies
263325

264-
### 2. Potential breaking changes
265-
266-
#### Elixir
267-
268-
* `map.foo()` (accessing a map field with parens) and `mod.foo` (invoking a function without parens) will now raise instead of emitting runtime warnings, aligning themselves with the type system behaviour
269-
270-
### 3. Bug fixes
326+
### 2. Bug fixes
271327

272328
#### IEx
273329

@@ -318,7 +374,7 @@ This release requires Erlang/OTP 27+ and is compatible with Erlang/OTP 29.
318374

319375
#### Elixir
320376

321-
* `require SomeModule` no longer expands to the given module at compile-time, but it still returns the module at runtime. Note that while Elixir does not guarantee macros will expand to certain constructs, but since this can break code relying on the previous behaviour, such as `require(SomeMod).some_macro()`, we are adding this note to the CHANGELOG
377+
* `require SomeModule` no longer expands to the given module at compile-time, but it still returns the module at runtime. Note Elixir does not guarantee macros will expand to certain constructs, but since this can break code relying on the previous behaviour, such as `require(SomeMod).some_macro()`, we are adding this note to the CHANGELOG
322378

323379
### 3. Hard deprecations
324380

lib/elixir/pages/references/gradual-set-theoretic-types.md

Lines changed: 0 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -237,21 +237,6 @@ Type inference in Elixir is best-effort: it doesn't guarantee it will find all p
237237

238238
In the long term, Elixir developers who want static typing guarantees must explicitly add type signatures to their functions (see "Roadmap"). Any function with an explicit type signature will be typed checked against the user-provided annotations, as in other statically typed languages.
239239

240-
### False positives during inference
241-
242-
Our goal with type inference is to avoid false positives: we will only emit typing violations if the code always fails. However, in some situations, Elixir may, on purpose, define a more strict type during inference, as to encourage certain idioms or to help spot bugs. Those cases are documented below.
243-
244-
* Struct update syntax: when using the struct update syntax, `%User{user | name: "John Doe"}`, `user` must be guaranteed statically to be always be a `User` struct
245-
246-
* Single-clause anonymous functions: Elixir always considers the code inside anonynous functions to be executed. For example, in the snippet below, even though the code will only fail at runtime if the anonymous function is later executed, Elixir will treat it as if the function is always executed. If the function has multiple clauses, then Elixir doesn't know which clause will be executed, and makes no assumption.
247-
248-
```elixir
249-
def example(x) do
250-
fun = fn -> Integer.to_string(x) end
251-
{String.to_integer(x), fun}
252-
end
253-
```
254-
255240
## Roadmap
256241

257242
At this moment, Elixir implements type inference of all language constructs. The goal is to assess performance and collect feedback on the quality of error messages, before introducing user facing types.

0 commit comments

Comments
 (0)