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.
gentoo-overlay/dev-lang/elixir/files/elixir-1.11.4-update-warnin...

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