Elixir v1.14.4 released

This release adds basic support for Erlang/OTP 26. When migrating
to Erlang/OTP 26, keep it mind it changes how maps are stored
internally and they will be printed and traversed in a different
order (note maps never provided a guarantee of their order).
To aid migration, this release adds :sort_maps to inspect
custom options, in case you want to sort them before inspection:

inspect(map, custom_options: [sort_maps: true])

Enhancements

Elixir

  • [Inspect] Add :sort_maps to Inspect.Opts.custom_options

IEx

  • [IEx] Support shell history in Erlang/OTP 26+

Mix

  • [mix compile.elixir] Optimize application tracer

Bug fixes

Elixir

  • [Code] Properly handle blocks with comments in all cases in Code.quoted_to_string_with_comments/2
  • [Kernel] Fix debug_info/4 when returning core_v1
  • [Kernel] Store complete path on quote keep: true to avoid invalid stacktraces
  • [Kernel] Fix column count when tokenizing escaped interpolations
  • [Stream] Fix Stream.zip/1 hanging on empty list

Mix

  • [mix format] Don’t call formatter on directories
39 Likes

Awesome, thanks.

In asdf I can see 1.14.4 for OTP 23-25, but not for 26. Is it a fault on bob builder side? I have tried to manually download https://repo.hex.pm/builds/elixir/v1.14.4-otp-26.zip, but I got an access denied error.

Edit: Also the release on Github does not include version for OTP 26. Didn’t checked, but maybe someone forgot to update build matrix?

This is intentional, as there is no official 26 release yet. But you can run the compiled for 25 on 26 or compile from source on 26.

13 Likes

Makes sense. It’s awesome that even RC is more or less supported.

I Tried 1.14.4 on OTP 26 release RC 2 on Windows 10.

Compilation seems to hang.

Which project were you compiling and with which command?

One of my own projects that compiled fine on 1.14.2 on OPT 25.3

The command: mix compile – force

I have tried to compile a new project, generated by phx.new command, but I got:

===> Analyzing applications…
===> Compiling cowlib
===> Compiling src/cow_sse.erl failed
src/cow_sse.erl:56:29: type variable ‘State’ is only used once (is unbound)

Here is a version:

$ elixir --version
Erlang/OTP 26 [RELEASE CANDIDATE 2] [erts-14.0] [source] [64-bit] [smp:8:8] [ds:8:8:10] [async-threads:1] [jit:ns]

Elixir 1.15.0-dev (7e7a1fa) (compiled with Erlang/OTP 26)

Can you try cloning Cowboy from the git repo and compiling it? Maybe it is something rather specific to Erlang/OTP than Elixir?

Ok, so here is a result using RC2:

$ make all
 DEP    cowlib (2.12.1)
 DEP    ranch (1.8.0)
make[1]: Entering directory '$HOME/cowboy/deps/cowlib'
 DEPEND cowlib.d
 ERLC   cow_base64url.erl cow_cookie.erl cow_date.erl cow_hpack.erl cow_http.erl cow_http2.erl cow_http2_machine.erl cow_http_hd.erl cow_http_struct_hd.erl cow_http_te.erl cow_iolists.erl cow_link.erl cow_mimetypes.erl cow_multipart.erl cow_qs.erl cow_spdy.erl cow_sse.erl cow_uri.erl cow_uri_template.erl cow_ws.erl
 APP    cowlib
make[1]: Leaving directory '$HOME/cowboy/deps/cowlib'
make[1]: Entering directory '$HOME/cowboy/deps/ranch'
 DEPEND ranch.d
 ERLC   ranch.erl ranch_acceptor.erl ranch_acceptors_sup.erl ranch_app.erl ranch_conns_sup.erl ranch_crc32c.erl ranch_listener_sup.erl ranch_protocol.erl ranch_proxy_header.erl ranch_server.erl ranch_ssl.erl ranch_sup.erl ranch_tcp.erl ranch_transport.erl
 APP    ranch
make[1]: Leaving directory '$HOME/cowboy/deps/ranch'
 DEPEND cowboy.d
 ERLC   cowboy.erl cowboy_app.erl cowboy_bstr.erl cowboy_children.erl cowboy_clear.erl cowboy_clock.erl cowboy_compress_h.erl cowboy_constraints.erl cowboy_handler.erl cowboy_http.erl cowboy_http2.erl cowboy_loop.erl cowboy_metrics_h.erl cowboy_middleware.erl cowboy_req.erl cowboy_rest.erl cowboy_router.erl cowboy_static.erl cowboy_stream.erl cowboy_stream_h.erl cowboy_sub_protocol.erl cowboy_sup.erl cowboy_tls.erl cowboy_tracer_h.erl cowboy_websocket.erl
 APP    cowboy
 GEN    rebar.config

Erlang version:

Erlang/OTP 26 [RELEASE CANDIDATE 2] [erts-14.0] [source] [64-bit] [smp:8:8] [ds:8:8:10] [async-threads:1] [jit:ns]

Eshell V14.0

That seems to have succeeded. Thank you, I will further investigate it.

1 Like

To easy reproduce this issue:

  1. Install Erlang 26 RC2 and compile Elixir main branch (I did that right before first reply)
  2. Create a test script with only Mix.install call and simply run it
$ asdf current 
elixir          ref:main        $HOME/.tool-versions
erlang          26.0-rc2        $HOME/.tool-versions

$ cat test.exs
Mix.install [:cowboy]

$ elixir test.exs 
Resolving Hex dependencies...
Resolution completed in 0.152s
New:
  cowboy 2.9.0
  cowlib 2.11.0
  ranch 1.8.0
* Getting cowboy (Hex package)
* Getting cowlib (Hex package)
* Getting ranch (Hex package)
You have added/upgraded packages you could sponsor, run `mix hex.sponsor` to learn more
===> Analyzing applications...
===> Compiling ranch
===> Analyzing applications...
===> Compiling cowlib
===> Compiling src/cow_sse.erl failed
src/cow_sse.erl:56:29: type variable 'State' is only used once (is unbound)

** (Mix.Error) Could not compile dependency :cowlib, "$HOME/.asdf/installs/elixir/ref-main/.mix/elixir/1-15/rebar3 bare compile --paths $HOME/.cache/mix/installs/elixir-1.15.0-dev-erts-14.0/6c3f4dbc449833fbf9e38467f547f6c8/_build/dev/lib/*/ebin" command failed. Errors may have been logged above. You may run Mix.install/2 to try again or change the arguments to Mix.install/2 to try another version
    (mix 1.15.0-dev) lib/mix.ex:538: Mix.raise/2
    (mix 1.15.0-dev) lib/mix/tasks/deps.compile.ex:310: Mix.Tasks.Deps.Compile.do_command/5
    (mix 1.15.0-dev) lib/mix/tasks/deps.compile.ex:220: Mix.Tasks.Deps.Compile.do_rebar3/2
    (mix 1.15.0-dev) lib/mix/tasks/deps.compile.ex:96: anonymous fn/4 in Mix.Tasks.Deps.Compile.compile/2
    (elixir 1.15.0-dev) lib/enum.ex:1685: Enum."-map/2-lists^map/1-0-"/2
    (elixir 1.15.0-dev) lib/enum.ex:1685: Enum."-map/2-lists^map/1-0-"/2
    (mix 1.15.0-dev) lib/mix/tasks/deps.compile.ex:80: Mix.Tasks.Deps.Compile.compile/2
    (mix 1.15.0-dev) lib/mix/tasks/deps.loadpaths.ex:82: Mix.Tasks.Deps.Loadpaths.deps_check/2

this is also an issues with 1.14.4 on OTP 26 RC2, not just 1.15.0-dev

Perfect, thank you. It may also be a rebar issue, so we will have to investigate on that end as well.

Unfortunately I know rebar only from name. :sweat_smile: Can we debug what commands were executed like in make all output?

I have tested all combinations of v1.14.4 and main branch with RC1 and RC2 … Both Elixir versions behave same on specific RC version.

On RC1 I got a Segmentation fault when testing elixir app (ex_unit).

On RC2 I have issue as in above comments (Elixir compiles without any problem).

The root cause is the following:

  1. Erlang/OTP 26 added new linting errors to detect previously invalid (but not warned) typespecs: dialyzer: fix singleton type var in union types by kikofernandez · Pull Request #6864 · erlang/otp · GitHub

  2. cowlib was affected by this. A new version (2.9.1) was released but Cowboy depends on cowlib (2.9.0)

For now, you can either forcibly bump cowlib by declaring 2.9.1 with override or wait until there is a new cowboy version out. I have also asked the Erlang/OTP team if it can be a warning for now.

6 Likes

With OTP 26 just released, I tried compiling an existing project that worked fine on OTP 25.2.3 / Elixir 1.14.4

The compile hangs…

​C:\Projects\pca
λ mix deps.get
Resolving Hex dependencies…
Resolution completed in 0.083s
Unchanged:
castore 1.0.2
certifi 2.9.0
db_connection 2.5.0
decimal 2.1.1
excoding 0.1.5
fs 6.12.0
gen_smtp 1.2.0
hackney 1.18.1
idna 6.1.1
jason 1.4.0
metrics 1.0.1
mime 2.0.3
mimerl 1.2.0
mix_rebar3 0.2.0
parse_trans 3.3.1
pdf_generator 0.6.2
ranch 2.1.0
rustler 0.28.0
rustler_precompiled 0.6.1
ssl_verify_fun 1.1.6
telemetry 1.2.1
tesla 1.7.0
toml 0.7.0
unicode_util_compat 0.7.0
​C:\Projects\pca
λ mix compile --force
==> decimal
Compiling 4 files (.ex)
Generated decimal app

We found a bug that makes Elixir hang when shelled out on Windows. Are you running on Windows? If so, you will need to wait until v1.14.5. :slight_smile:

3 Likes