From 3c88c16b0fa5bd3799efe7dcd9da3454fa38bc83 Mon Sep 17 00:00:00 2001 From: Andrea Leopardi Date: Fri, 24 Jun 2016 00:21:25 +0200 Subject: [PATCH] Raise an error when trying to make private macros overridable (#4856) This is not supported as of today because of bugs regarding defoverride and macros, but we decided to not support overriding private macros at all so let's raise a nice error message. For the record, supporting overridable private macros would be very annoying since we rely on function names and the such for implementing overridable stuff, and for private macros we just generate functions on the fly. --- lib/elixir/lib/module.ex | 4 ++++ lib/elixir/test/elixir/kernel/overridable_test.exs | 14 ++++++++++++++ 2 files changed, 18 insertions(+) diff --git a/lib/elixir/lib/module.ex b/lib/elixir/lib/module.ex index 0ab539df93..976c7a3eff 100644 --- a/lib/elixir/lib/module.ex +++ b/lib/elixir/lib/module.ex @@ -830,6 +830,10 @@ defmodule Module do false -> {name, arity} = tuple raise "cannot make function #{name}/#{arity} overridable because it was not defined" + {{{:def, {name, arity}}, :defmacrop, _line, _file, _check, _location, _defaults}, _clauses} -> + raise ArgumentError, + "cannot make private macro #{name}/#{arity} overridable, overriding " <> + "private macros is not supported" clause -> neighbours = if :elixir_compiler.get_opt(:internal) do diff --git a/lib/elixir/test/elixir/kernel/overridable_test.exs b/lib/elixir/test/elixir/kernel/overridable_test.exs index 52fc28faa4..2af58fe1ae 100644 --- a/lib/elixir/test/elixir/kernel/overridable_test.exs +++ b/lib/elixir/test/elixir/kernel/overridable_test.exs @@ -189,4 +189,18 @@ defmodule Kernel.OverridableTest do test "overridable macros" do assert Overridable.overridable_macro(1) == 1101 end + + test "private macros can't be overridden" do + message = + "cannot make private macro foo/0 overridable, overriding " <> + "private macros is not supported" + assert_raise ArgumentError, message, fn -> + Code.eval_string """ + defmodule Foo do + defmacrop foo, do: 1 + defoverridable foo: 0 + end + """ + end + end end