From 2eea0f68b21f54108d3c03875c9bacddc42aec40 Mon Sep 17 00:00:00 2001 From: sabiwara Date: Mon, 2 Mar 2026 13:19:31 +0900 Subject: [PATCH 1/2] Raise clearer error when reserved word used at the top level of defmodule --- lib/elixir/lib/kernel.ex | 5 +++++ lib/elixir/test/elixir/kernel/errors_test.exs | 12 ++++++++++++ 2 files changed, 17 insertions(+) diff --git a/lib/elixir/lib/kernel.ex b/lib/elixir/lib/kernel.ex index 7ce0440aa0c..a8316b6a28b 100644 --- a/lib/elixir/lib/kernel.ex +++ b/lib/elixir/lib/kernel.ex @@ -5220,6 +5220,11 @@ defmodule Kernel do end end + defmacro defmodule(alias, [{:do, _block}, {atom, _} | _]) when is_atom(atom) do + raise ArgumentError, + "unexpected reserved word at the top-level of the \"defmodule #{Macro.to_string(alias)}\" block: #{atom}" + end + defp module_meta({_, meta, _}), do: meta defp module_meta(_), do: [] diff --git a/lib/elixir/test/elixir/kernel/errors_test.exs b/lib/elixir/test/elixir/kernel/errors_test.exs index d41ed9d0146..31d09541c3b 100644 --- a/lib/elixir/test/elixir/kernel/errors_test.exs +++ b/lib/elixir/test/elixir/kernel/errors_test.exs @@ -1003,6 +1003,18 @@ defmodule Kernel.ErrorsTest do ) end + test "reserved word used at module top-level" do + assert_eval_raise( + ArgumentError, + ["unexpected reserved word at the top-level of the \"defmodule Foo\" block: catch"], + """ + defmodule Foo do + def foo, do: :foo catch :bar + end + """ + ) + end + defp bad_remote_call(x), do: x.foo() defmacro sample(0), do: 0 From 3b2b2c7794f0d45bce49867be3bb2105949e2828 Mon Sep 17 00:00:00 2001 From: sabiwara Date: Mon, 2 Mar 2026 17:23:50 +0900 Subject: [PATCH 2/2] Improve message: do-block --- lib/elixir/lib/kernel.ex | 2 +- lib/elixir/test/elixir/kernel/errors_test.exs | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/elixir/lib/kernel.ex b/lib/elixir/lib/kernel.ex index a8316b6a28b..42e0228680f 100644 --- a/lib/elixir/lib/kernel.ex +++ b/lib/elixir/lib/kernel.ex @@ -5222,7 +5222,7 @@ defmodule Kernel do defmacro defmodule(alias, [{:do, _block}, {atom, _} | _]) when is_atom(atom) do raise ArgumentError, - "unexpected reserved word at the top-level of the \"defmodule #{Macro.to_string(alias)}\" block: #{atom}" + "unexpected reserved word at the top-level of the \"defmodule #{Macro.to_string(alias)}\" do-block: #{atom}" end defp module_meta({_, meta, _}), do: meta diff --git a/lib/elixir/test/elixir/kernel/errors_test.exs b/lib/elixir/test/elixir/kernel/errors_test.exs index 31d09541c3b..299a7584b5d 100644 --- a/lib/elixir/test/elixir/kernel/errors_test.exs +++ b/lib/elixir/test/elixir/kernel/errors_test.exs @@ -1006,7 +1006,7 @@ defmodule Kernel.ErrorsTest do test "reserved word used at module top-level" do assert_eval_raise( ArgumentError, - ["unexpected reserved word at the top-level of the \"defmodule Foo\" block: catch"], + ["unexpected reserved word at the top-level of the \"defmodule Foo\" do-block: catch"], """ defmodule Foo do def foo, do: :foo catch :bar