diff options
author | Glauber Campinho <ggcampinho@gmail.com> | 2018-03-25 22:20:58 +0200 |
---|---|---|
committer | José Valim <jose.valim@gmail.com> | 2018-03-25 22:20:58 +0200 |
commit | a4ed1c93f9164b0723324cd5c579d320ad4a2b27 (patch) | |
tree | 3213b5317852b81367aa6a4ab43f69b081c41d66 | |
parent | 10b538c23b11d84368d51302467fe669df529b40 (diff) | |
download | elixir-a4ed1c93f9164b0723324cd5c579d320ad4a2b27.tar.gz |
Improve error messages for lists concatenation operator (#7487)
-rw-r--r-- | lib/elixir/src/elixir_expand.erl | 9 | ||||
-rw-r--r-- | lib/elixir/test/elixir/kernel/expansion_test.exs | 4 |
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 |