summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--lib/elixir/src/elixir_expand.erl9
-rw-r--r--lib/elixir/test/elixir/kernel/expansion_test.exs4
2 files changed, 13 insertions, 0 deletions
diff --git a/lib/elixir/src/elixir_expand.erl b/lib/elixir/src/elixir_expand.erl
index 167598be8..728518803 100644
--- a/lib/elixir/src/elixir_expand.erl
+++ b/lib/elixir/src/elixir_expand.erl
@@ -734,6 +734,7 @@ expand_remote(Receiver, DotMeta, Right, Meta, Args, #{context := Context} = E, E
{EArgs, EA} = expand_args(Args, E),
Rewritten = elixir_rewrite:rewrite(Receiver, DotMeta, Right, Meta, EArgs),
maybe_warn_struct_comparison(Rewritten, Args, E),
+ assert_valid_args_for_remote(Rewritten, Context, E),
case allowed_in_context(Rewritten, Arity, Context) of
true ->
{Rewritten, elixir_env:mergev(EL, EA)};
@@ -752,6 +753,11 @@ allowed_in_context(_, _Arity, guard) ->
allowed_in_context(_, _, _) ->
true.
+assert_valid_args_for_remote({{'.', _, [erlang, '++']}, Meta, [Left, _Right]}, match, E) when not is_list(Left) ->
+ form_error(Meta, ?key(E, file), ?MODULE, {invalid_arg_for_lists_concatenation, Left});
+assert_valid_args_for_remote(_, _, _) ->
+ ok.
+
maybe_warn_struct_comparison({{'.', _, [erlang, Op]}, Meta, [ELeft, ERight]}, [Left, Right], E)
when Op =:= '>'; Op =:= '<'; Op =:= '=<'; Op =:= '>=' ->
Result =
@@ -991,6 +997,9 @@ format_error(wrong_number_of_args_for_super) ->
format_error({invalid_arg_for_pin, Arg}) ->
io_lib:format("invalid argument for unary operator ^, expected an existing variable, got: ^~ts",
['Elixir.Macro':to_string(Arg)]);
+format_error({invalid_arg_for_lists_concatenation, Arg}) ->
+ io_lib:format("invalid argument for ++ operator inside a match, expected a literal list, got: ~ts",
+ ['Elixir.Macro':to_string(Arg)]);
format_error({pin_outside_of_match, Arg}) ->
io_lib:format("cannot use ^~ts outside of match clauses", ['Elixir.Macro':to_string(Arg)]);
format_error(unbound_underscore) ->
diff --git a/lib/elixir/test/elixir/kernel/expansion_test.exs b/lib/elixir/test/elixir/kernel/expansion_test.exs
index 277a569f3..0f6530fcd 100644
--- a/lib/elixir/test/elixir/kernel/expansion_test.exs
+++ b/lib/elixir/test/elixir/kernel/expansion_test.exs
@@ -536,6 +536,10 @@ defmodule Kernel.ExpansionTest do
message = ~r"cannot invoke remote function :erlang.make_ref/0 inside match"
assert_raise CompileError, message, fn -> expand(quote(do: make_ref() = :foo)) end
+
+ assert_raise CompileError, ~r"invalid argument for \+\+ operator", fn ->
+ expand(quote(do: "a" ++ "b" = "ab"))
+ end
end
test "in guards" do