From 695d17c250ad7d97afb379e74ef1413c4b7915b2 Mon Sep 17 00:00:00 2001 From: Wojtek Mach Date: Wed, 15 Apr 2026 17:37:10 +0200 Subject: [PATCH 1/2] Don't crash when inspecting OTP 29 native records --- lib/elixir/lib/inspect.ex | 4 ++++ lib/elixir/test/elixir/inspect_test.exs | 30 +++++++++++++++++++++++++ 2 files changed, 34 insertions(+) diff --git a/lib/elixir/lib/inspect.ex b/lib/elixir/lib/inspect.ex index a4d8e8143ab..d89d83b697e 100644 --- a/lib/elixir/lib/inspect.ex +++ b/lib/elixir/lib/inspect.ex @@ -669,6 +669,10 @@ defimpl Inspect, for: Any do Inspect.Map.inspect_as_struct(struct, Macro.inspect_atom(:literal, module), info, opts) end + def inspect(native_record, _opts) do + :io_lib.format("~p", [native_record]) |> IO.iodata_to_binary() + end + def inspect_as_struct(map, name, infos, opts) do open = color_doc("#" <> name <> "<", :map, opts) sep = color_doc(",", :map, opts) diff --git a/lib/elixir/test/elixir/inspect_test.exs b/lib/elixir/test/elixir/inspect_test.exs index 67a1544c9e6..ace9a2391c1 100644 --- a/lib/elixir/test/elixir/inspect_test.exs +++ b/lib/elixir/test/elixir/inspect_test.exs @@ -268,6 +268,36 @@ defmodule Inspect.TupleTest do end end +defmodule Inspect.NativeRecordTest do + use ExUnit.Case, async: true + + @moduletag skip: System.otp_release() < "29" + + @tag :tmp_dir + test "basic", %{tmp_dir: tmp_dir} do + File.write!("#{tmp_dir}/native_records_test.erl", """ + -module(native_records_test). + -export([test/0]). + -record #point{ x = 0.0, y = 0.0 }. + + test() -> + #point{}. + """) + + {"", 0} = System.cmd("erlc", ["native_records_test.erl"], cd: tmp_dir, stderr_to_stdout: true) + + {:module, _} = + :code.load_binary( + :native_records_test, + ~c"nofile", + File.read!("#{tmp_dir}/native_records_test.beam") + ) + + assert inspect(apply(:native_records_test, :test, [])) == + "#native_records_test:point{x = 0.0,y = 0.0}" + end +end + defmodule Inspect.ListTest do use ExUnit.Case, async: true From 2eb6599803b5846bef63594ac3b4266eea9e26e0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jos=C3=A9=20Valim?= Date: Thu, 16 Apr 2026 13:32:39 +0200 Subject: [PATCH 2/2] Apply suggestion from @josevalim --- lib/elixir/lib/inspect.ex | 1 + 1 file changed, 1 insertion(+) diff --git a/lib/elixir/lib/inspect.ex b/lib/elixir/lib/inspect.ex index d89d83b697e..374f80af153 100644 --- a/lib/elixir/lib/inspect.ex +++ b/lib/elixir/lib/inspect.ex @@ -669,6 +669,7 @@ defimpl Inspect, for: Any do Inspect.Map.inspect_as_struct(struct, Macro.inspect_atom(:literal, module), info, opts) end + # A temporary clause to deal with native records until they are officially supported def inspect(native_record, _opts) do :io_lib.format("~p", [native_record]) |> IO.iodata_to_binary() end