You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Copy file name to clipboardExpand all lines: CHANGELOG.md
+65-9Lines changed: 65 additions & 9 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -175,6 +175,68 @@ The code above has a type violation, which is now caught by the type system:
175
175
176
176
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/).
177
177
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
+
178
240
## v1.20.0-rc.4 (2026-03-31)
179
241
180
242
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.
232
294
#### Elixir
233
295
234
296
*[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`
236
298
*[File] Fix `File.cp_r/3` infinite loop with symlink cycles
237
299
*[File] Fix `File.cp_r/3` infinite loop when copying into subdirectory of source
238
300
*[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.
261
323
*[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
262
324
*[mix deps] Parallelize dep lock status checks during `deps.loadpaths`, improving boot times in projects with many git dependencies
263
325
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
271
327
272
328
#### IEx
273
329
@@ -318,7 +374,7 @@ This release requires Erlang/OTP 27+ and is compatible with Erlang/OTP 29.
318
374
319
375
#### Elixir
320
376
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
Copy file name to clipboardExpand all lines: lib/elixir/pages/references/gradual-set-theoretic-types.md
-15Lines changed: 0 additions & 15 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -237,21 +237,6 @@ Type inference in Elixir is best-effort: it doesn't guarantee it will find all p
237
237
238
238
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.
239
239
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
-
defexample(x) do
250
-
fun =fn->Integer.to_string(x) end
251
-
{String.to_integer(x), fun}
252
-
end
253
-
```
254
-
255
240
## Roadmap
256
241
257
242
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