You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
126 lines
5.4 KiB
126 lines
5.4 KiB
From 237a71311c5ae4fc5dd3c7a590a7b6dab97a664a Mon Sep 17 00:00:00 2001
|
|
From: Wojtek Mach <wojtekmach@users.noreply.github.com>
|
|
Date: Tue, 23 Mar 2021 17:40:04 +0100
|
|
Subject: [PATCH 2/3] Update warnings for OTP master (#10807)
|
|
|
|
---
|
|
lib/elixir/src/elixir_erl_compiler.erl | 34 ++++++++++++-------
|
|
.../test/elixir/kernel/warning_test.exs | 25 --------------
|
|
2 files changed, 21 insertions(+), 38 deletions(-)
|
|
|
|
diff --git a/lib/elixir/src/elixir_erl_compiler.erl b/lib/elixir/src/elixir_erl_compiler.erl
|
|
index 7010b59fd..e0aa05114 100644
|
|
--- a/lib/elixir/src/elixir_erl_compiler.erl
|
|
+++ b/lib/elixir/src/elixir_erl_compiler.erl
|
|
@@ -94,6 +94,8 @@ handle_file_warning(true, _File, {_Line, sys_core_fold, {nomatch_shadow, _}}) ->
|
|
|
|
%% Those we implement ourselves
|
|
handle_file_warning(_, _File, {_Line, v3_core, {map_key_repeated, _}}) -> ok;
|
|
+handle_file_warning(_, _File, {_Line, sys_core_fold, {ignored, useless_building}}) -> ok;
|
|
+%% TODO: remove when we require Erlang/OTP 24
|
|
handle_file_warning(_, _File, {_Line, sys_core_fold, useless_building}) -> ok;
|
|
|
|
%% Ignore all linting errors (only come up on parse transforms)
|
|
@@ -112,11 +114,11 @@ handle_file_error(File, {Line, Module, Desc}) ->
|
|
elixir_errors:compile_error([{line, Line}], File, Message).
|
|
|
|
%% Mention the capture operator in make_fun
|
|
-custom_format(sys_core_fold, {no_effect, {erlang, make_fun, 3}}) ->
|
|
+custom_format(sys_core_fold, {ignored, {no_effect, {erlang, make_fun, 3}}}) ->
|
|
"the result of the capture operator & (:erlang.make_fun/3) is never used";
|
|
|
|
%% Make no_effect clauses pretty
|
|
-custom_format(sys_core_fold, {no_effect, {erlang, F, A}}) ->
|
|
+custom_format(sys_core_fold, {ignored, {no_effect, {erlang, F, A}}}) ->
|
|
{Fmt, Args} = case erl_internal:comp_op(F, A) of
|
|
true -> {"use of operator ~ts has no effect", [elixir_utils:erlang_comparison_op_to_elixir(F)]};
|
|
false ->
|
|
@@ -127,12 +129,20 @@ custom_format(sys_core_fold, {no_effect, {erlang, F, A}}) ->
|
|
end,
|
|
io_lib:format(Fmt, Args);
|
|
|
|
-%% Rewrite nomatch_guard to be more generic it can happen inside if, unless, and the like
|
|
-custom_format(sys_core_fold, nomatch_guard) ->
|
|
+%% Rewrite nomatch to be more generic, it can happen inside if, unless, and the like
|
|
+custom_format(sys_core_fold, {nomatch, X}) when X == guard; X == no_clause ->
|
|
"this check/guard will always yield the same result";
|
|
|
|
+custom_format(sys_core_fold, {nomatch, {shadow, Line, {ErlName, ErlArity}}}) ->
|
|
+ {Name, Arity} = elixir_utils:erl_fa_to_elixir_fa(ErlName, ErlArity),
|
|
+
|
|
+ io_lib:format(
|
|
+ "this clause for ~ts/~B cannot match because a previous clause at line ~B always matches",
|
|
+ [Name, Arity, Line]
|
|
+ );
|
|
+
|
|
%% Handle literal eval failures
|
|
-custom_format(sys_core_fold, {eval_failure, {Mod, Name, Arity}, Error}) ->
|
|
+custom_format(sys_core_fold, {failed, {eval_failure, {Mod, Name, Arity}, Error}}) ->
|
|
#{'__struct__' := Struct} = 'Elixir.Exception':normalize(error, Error),
|
|
{ExMod, ExName, ExArgs} = elixir_rewrite:erl_to_ex(Mod, Name, lists:duplicate(Arity, nil)),
|
|
Call = 'Elixir.Exception':format_mfa(ExMod, ExName, length(ExArgs)),
|
|
@@ -143,18 +153,16 @@ custom_format(sys_core_fold, {eval_failure, {Mod, Name, Arity}, Error}) ->
|
|
["the call to ", Trimmed, " will fail with ", elixir_aliases:inspect(Struct)];
|
|
|
|
%% TODO: remove when we require OTP 24
|
|
+custom_format(sys_core_fold, {nomatch_shadow, Line, FA}) ->
|
|
+ custom_format(sys_core_fold, {nomatch, {shadow, Line, FA}});
|
|
+custom_format(sys_core_fold, nomatch_guard) ->
|
|
+ custom_format(sys_core_fold, {nomatch, guard});
|
|
+custom_format(sys_core_fold, {no_effect, X}) ->
|
|
+ custom_format(sys_core_fold, {ignored, {no_effect, X}});
|
|
custom_format(sys_core_fold, {eval_failure, Error}) ->
|
|
#{'__struct__' := Struct} = 'Elixir.Exception':normalize(error, Error),
|
|
["this expression will fail with ", elixir_aliases:inspect(Struct)];
|
|
|
|
-custom_format(sys_core_fold, {nomatch_shadow,Line,{ErlName,ErlArity}}) ->
|
|
- {Name, Arity} = elixir_utils:erl_fa_to_elixir_fa(ErlName, ErlArity),
|
|
-
|
|
- io_lib:format(
|
|
- "this clause for ~ts/~B cannot match because a previous clause at line ~B always matches",
|
|
- [Name, Arity, Line]
|
|
- );
|
|
-
|
|
custom_format([], Desc) ->
|
|
io_lib:format("~p", [Desc]);
|
|
|
|
diff --git a/lib/elixir/test/elixir/kernel/warning_test.exs b/lib/elixir/test/elixir/kernel/warning_test.exs
|
|
index 15a984a54..37334ff65 100644
|
|
--- a/lib/elixir/test/elixir/kernel/warning_test.exs
|
|
+++ b/lib/elixir/test/elixir/kernel/warning_test.exs
|
|
@@ -1154,31 +1154,6 @@ def foo(x), do: :ok
|
|
purge(Sample)
|
|
end
|
|
|
|
- test "with and do clauses emit errors, else clauses do not" do
|
|
- assert capture_err(fn ->
|
|
- Code.compile_string("""
|
|
- with {:first, int} when is_integer(int) <- {:second, Integer.gcd(2, 4)} do
|
|
- int
|
|
- end
|
|
- """)
|
|
- end) =~ "this clause cannot match"
|
|
-
|
|
- assert capture_err(fn ->
|
|
- Code.compile_string("""
|
|
- with {:first, int1} when is_integer(int1) <- {:first, Integer.gcd(2, 4)},
|
|
- {:second, int2} when is_integer(int2) <- {:second, Integer.gcd(2, 4)} do
|
|
- {:ok, int1 + int2}
|
|
- else
|
|
- {:first, nil} -> {:error, "first number is not integer"}
|
|
- {:second, nil} -> {:error, "second number is not integer"}
|
|
- end
|
|
- """)
|
|
- end) == ""
|
|
- after
|
|
- purge(Sample1)
|
|
- purge(Sample2)
|
|
- end
|
|
-
|
|
test "warning on code point escape" do
|
|
assert capture_err(fn ->
|
|
Code.eval_string("? ")
|
|
--
|
|
2.31.1
|
|
|