diff --git a/lib/elixir/lib/kernel.ex b/lib/elixir/lib/kernel.ex index 7ce0440aa0c..42e0228680f 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)}\" do-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..299a7584b5d 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\" do-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