Skip to content

Commit 75a3272

Browse files
authored
Fix expand crash on invalid multialias root (#14698)
1 parent 2cfd329 commit 75a3272

File tree

2 files changed

+21
-9
lines changed

2 files changed

+21
-9
lines changed

lib/elixir/src/elixir_expand.erl

Lines changed: 15 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -573,18 +573,24 @@ escape_map(Map) -> {'%{}', [], lists:sort(maps:to_list(Map))}.
573573
expand_multi_alias_call(Kind, Meta, Base, Refs, Opts, S, E) ->
574574
{BaseRef, SB, EB} = expand_without_aliases_report(Base, S, E),
575575

576-
Fun = fun
577-
({'__aliases__', _, Ref}, SR, ER) ->
578-
expand({Kind, Meta, [elixir_aliases:concat([BaseRef | Ref]), Opts]}, SR, ER);
576+
case is_atom(BaseRef) of
577+
true ->
578+
Fun = fun
579+
({'__aliases__', _, Ref}, SR, ER) ->
580+
expand({Kind, Meta, [elixir_aliases:concat([BaseRef | Ref]), Opts]}, SR, ER);
579581

580-
(Ref, SR, ER) when is_atom(Ref) ->
581-
expand({Kind, Meta, [elixir_aliases:concat([BaseRef, Ref]), Opts]}, SR, ER);
582+
(Ref, SR, ER) when is_atom(Ref) ->
583+
expand({Kind, Meta, [elixir_aliases:concat([BaseRef, Ref]), Opts]}, SR, ER);
582584

583-
(Other, _SR, _ER) ->
584-
file_error(Meta, E, ?MODULE, {expected_compile_time_module, Kind, Other})
585-
end,
585+
(Other, _SR, _ER) ->
586+
file_error(Meta, E, ?MODULE, {expected_compile_time_module, Kind, Other})
587+
end,
586588

587-
mapfold(Fun, SB, EB, Refs).
589+
mapfold(Fun, SB, EB, Refs);
590+
591+
false ->
592+
file_error(Meta, E, ?MODULE, {invalid_alias, Base})
593+
end.
588594

589595
resolve_super(Meta, Arity, E) ->
590596
Module = assert_module_scope(Meta, super, E),

lib/elixir/test/elixir/kernel/expansion_test.exs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -118,6 +118,12 @@ defmodule Kernel.ExpansionTest do
118118
end)
119119
end
120120

121+
test "raises on multi-alias with non-atom base" do
122+
assert_compile_error(~r"invalid alias: \"foo\"", fn ->
123+
expand(quote(do: alias(foo.{Bar, Baz})))
124+
end)
125+
end
126+
121127
test "invalid options" do
122128
assert_compile_error(~r"unsupported option :ops given to alias", fn ->
123129
expand(quote(do: alias(Foo, ops: 1)))

0 commit comments

Comments
 (0)