diff --git a/lib/elixir/src/elixir_expand.erl b/lib/elixir/src/elixir_expand.erl index b9d389e1686..a82796c5959 100644 --- a/lib/elixir/src/elixir_expand.erl +++ b/lib/elixir/src/elixir_expand.erl @@ -573,18 +573,24 @@ escape_map(Map) -> {'%{}', [], lists:sort(maps:to_list(Map))}. expand_multi_alias_call(Kind, Meta, Base, Refs, Opts, S, E) -> {BaseRef, SB, EB} = expand_without_aliases_report(Base, S, E), - Fun = fun - ({'__aliases__', _, Ref}, SR, ER) -> - expand({Kind, Meta, [elixir_aliases:concat([BaseRef | Ref]), Opts]}, SR, ER); + case is_atom(BaseRef) of + true -> + Fun = fun + ({'__aliases__', _, Ref}, SR, ER) -> + expand({Kind, Meta, [elixir_aliases:concat([BaseRef | Ref]), Opts]}, SR, ER); - (Ref, SR, ER) when is_atom(Ref) -> - expand({Kind, Meta, [elixir_aliases:concat([BaseRef, Ref]), Opts]}, SR, ER); + (Ref, SR, ER) when is_atom(Ref) -> + expand({Kind, Meta, [elixir_aliases:concat([BaseRef, Ref]), Opts]}, SR, ER); - (Other, _SR, _ER) -> - file_error(Meta, E, ?MODULE, {expected_compile_time_module, Kind, Other}) - end, + (Other, _SR, _ER) -> + file_error(Meta, E, ?MODULE, {expected_compile_time_module, Kind, Other}) + end, - mapfold(Fun, SB, EB, Refs). + mapfold(Fun, SB, EB, Refs); + + false -> + file_error(Meta, E, ?MODULE, {invalid_alias, Base}) + end. resolve_super(Meta, Arity, E) -> Module = assert_module_scope(Meta, super, E), diff --git a/lib/elixir/test/elixir/kernel/expansion_test.exs b/lib/elixir/test/elixir/kernel/expansion_test.exs index 0da0a505c4d..2dc037c0f45 100644 --- a/lib/elixir/test/elixir/kernel/expansion_test.exs +++ b/lib/elixir/test/elixir/kernel/expansion_test.exs @@ -118,6 +118,12 @@ defmodule Kernel.ExpansionTest do end) end + test "raises on multi-alias with non-atom base" do + assert_compile_error(~r"invalid alias: \"foo\"", fn -> + expand(quote(do: alias(foo.{Bar, Baz}))) + end) + end + test "invalid options" do assert_compile_error(~r"unsupported option :ops given to alias", fn -> expand(quote(do: alias(Foo, ops: 1)))