File Suppress-warnings-from-v3_kernel-when-inlining-is-tu.patch of Package erlang

From d8afbc245f28c37c2417c86c9a2d9d27266fe37f Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Bj=C3=B6rn=20Gustavsson?= <bjorn@erlang.org>
Date: Thu, 17 Nov 2016 16:21:34 +0100
Subject: [PATCH] Suppress warnings from v3_kernel when inlining is turned on

v3_kernel may produce unwanted and confusing warnings for code that
has been inlined with the new inliner (cerl_inline).  Consider this
code:

-compile(inline).

compute1(X) ->
    add(X, 0).

compute2(X, Y) ->
    add(X, Y).

add(1, 0) ->
    1;
add(1, Y) ->       %% "this clause cannot match..."
    1 + Y;
add(X, Y) ->
    X + Y.

v3_kernel warns because add/2 has been inlined into compute1/1 and only
the first clause in add/2 will match. But the other clauses are needed
when add/2 is inlined into compute2/2, so the user cannot do anything
to eliminate the warning (short of manually inlining add/2, defeating the
purpose of the 'inline' option).

The warning would be reasonable if compute2/2 didn't exist, but it would
be too complicated for the compiler to figure whether a warning make
sense or not.

Therefore, suppress all warnings generated by v3_kernel if cerl_inline
has been run.

ERL-301
---
 lib/compiler/src/compile.erl         | 13 ++++++++++++-
 lib/compiler/test/warnings_SUITE.erl | 28 ++++++++++++++++++++++++++--
 2 files changed, 38 insertions(+), 3 deletions(-)

diff --git a/lib/compiler/src/compile.erl b/lib/compiler/src/compile.erl
index e951a25e0..97d63d399 100644
--- a/lib/compiler/src/compile.erl
+++ b/lib/compiler/src/compile.erl
@@ -684,7 +684,7 @@ kernel_passes() ->
      {iff,core,?pass(save_core_code)},
 
      %% Kernel Erlang and code generation.
-     {pass,v3_kernel},
+     ?pass(v3_kernel),
      {iff,dkern,{listing,"kernel"}},
      {iff,'to_kernel',{done,"kernel"}},
      {pass,v3_life},
@@ -1241,6 +1241,17 @@ core_fold_module_after_inlining(#compile{code=Code0,options=Opts}=St) ->
     {ok,Code,_Ws} = sys_core_fold:module(Code0, Opts),
     {ok,St#compile{code=Code}}.
 
+v3_kernel(#compile{code=Code0,options=Opts,warnings=Ws0}=St) ->
+    {ok,Code,Ws} = v3_kernel:module(Code0, Opts),
+    case Ws =:= [] orelse test_core_inliner(St) of
+	false ->
+	    {ok,St#compile{code=Code,warnings=Ws0++Ws}};
+	true ->
+	    %% cerl_inline may produce code that generates spurious
+	    %% warnings. Ignore any such warnings.
+	    {ok,St#compile{code=Code}}
+    end.
+
 test_old_inliner(#compile{options=Opts}) ->
     %% The point of this test is to avoid loading the old inliner
     %% if we know that it will not be used.
-- 
2.12.2

openSUSE Build Service is sponsored by