From 82a3d164aa74b8df9aec89586c9805e47c82e348 Mon Sep 17 00:00:00 2001
From: Hans Bolinder <hasse@erlang.org>
Date: Mon, 12 May 2014 14:43:42 +0200
Subject: Let Yecc use the new -dialyzer attribute

Suppress Dialyzer warnings for clauses the only purpose of which is to
catch bugs in Yecc.
---
 lib/parsetools/src/yecc.erl        | 18 +++++++++++++++---
 lib/parsetools/test/yecc_SUITE.erl | 18 +++++++++---------
 2 files changed, 24 insertions(+), 12 deletions(-)

diff --git a/lib/parsetools/src/yecc.erl b/lib/parsetools/src/yecc.erl
index f4657663e6..3fcec73ce2 100644
--- a/lib/parsetools/src/yecc.erl
+++ b/lib/parsetools/src/yecc.erl
@@ -2064,11 +2064,13 @@ output_actions(St0, StateJumps, StateInfo) ->
     SelS = [{State,Called} || 
                {{State,_JActions}, {State,Called}} <- 
                    lists:zip(StateJumps, lists:keysort(1, Sel))],
+    St05 =
+        fwrite(St0, <<"-dialyzer({nowarn_function, yeccpars2/7}).\n">>, []),
     St10 = foldl(fun({State, Called}, St_0) ->
                          {State, #state_info{state_repr = IState}} = 
                              lookup_state(StateInfo, State),
                          output_state_selection(St_0, State, IState, Called)
-            end, St0, SelS),
+            end, St05, SelS),
     St20 = fwrite(St10, <<"yeccpars2(Other, _, _, _, _, _, _) ->\n">>, []),
     St = fwrite(St20,
                 ?YECC_BUG(<<"{missing_state_in_action_table, Other}">>, []),
@@ -2089,7 +2091,8 @@ output_state_selection(St0, State, IState, Called) ->
            [Comment, IState]).
 
 output_state_actions(St, State, State, {Actions,jump_none}, SI) ->
-    output_state_actions1(St, State, Actions, true, normal, SI);
+    St1 = output_state_actions_begin(St, State, Actions),
+    output_state_actions1(St1, State, Actions, true, normal, SI);
 output_state_actions(St0, State, State, {Actions, Jump}, SI) ->
     {Tag, To, Common} = Jump,
     CS = case Tag of
@@ -2099,13 +2102,22 @@ output_state_actions(St0, State, State, {Actions, Jump}, SI) ->
     St = output_state_actions1(St0, State, Actions, true, {to, CS}, SI),
     if 
         To =:= State ->
-            output_state_actions1(St, CS, Common, true, normal, SI);
+            St1 = output_state_actions_begin(St, State, Actions),
+            output_state_actions1(St1, CS, Common, true, normal, SI);
         true ->
             St
     end;
 output_state_actions(St, State, JState, _XActions, _SI) ->
     fwrite(St, <<"%% yeccpars2_~w: see yeccpars2_~w\n\n">>, [State, JState]).
 
+output_state_actions_begin(St, State, Actions) ->
+    case [yes || {_, #reduce{}} <- Actions] of
+        [] ->
+            fwrite(St, <<"-dialyzer({nowarn_function, yeccpars2_~w/7}).\n">>,
+                   [State]); % Only when yeccerror(T) is output.
+        _ -> St
+    end.
+
 output_state_actions1(St, State, [], IsFirst, normal, _SI) ->
     output_state_actions_fini(State, IsFirst, St);
 output_state_actions1(St0, State, [], IsFirst, {to, ToS}, _SI) ->
diff --git a/lib/parsetools/test/yecc_SUITE.erl b/lib/parsetools/test/yecc_SUITE.erl
index d308d21f82..c18dc15e37 100644
--- a/lib/parsetools/test/yecc_SUITE.erl
+++ b/lib/parsetools/test/yecc_SUITE.erl
@@ -1,7 +1,7 @@
 %%
 %% %CopyrightBegin%
 %%
-%% Copyright Ericsson AB 2005-2013. All Rights Reserved.
+%% Copyright Ericsson AB 2005-2014. All Rights Reserved.
 %%
 %% The contents of this file are subject to the Erlang Public License,
 %% Version 1.1, (the "License"); you may not use this file except in
@@ -340,8 +340,8 @@ syntax(Config) when is_list(Config) ->
                           {_,[{L1,_,{undefined_function,{yeccpars2_2_,1}}},
                               {L2,_,{bad_inline,{yeccpars2_2_,1}}}]}],
                    []} = compile:file(Parserfile1, [basic_validation,return]),
-            ?line L1 = 28 + SzYeccPre,
-            ?line L2 = 35 + SzYeccPre
+            ?line L1 = 31 + SzYeccPre,
+            ?line L2 = 38 + SzYeccPre
     end(),
 
     %% Bad macro in action. OTP-7224.
@@ -358,8 +358,8 @@ syntax(Config) when is_list(Config) ->
                           {_,[{L1,_,{undefined_function,{yeccpars2_2_,1}}},
                               {L2,_,{bad_inline,{yeccpars2_2_,1}}}]}],
                    []} = compile:file(Parserfile1, [basic_validation,return]),
-            ?line L1 = 28 + SzYeccPre,
-            ?line L2 = 35 + SzYeccPre
+            ?line L1 = 31 + SzYeccPre,
+            ?line L2 = 38 + SzYeccPre
     end(),
 
     %% Check line numbers. OTP-7224.
@@ -1619,8 +1619,8 @@ otp_7292(Config) when is_list(Config) ->
                         {L2,_,{bad_inline,{yeccpars2_2_,1}}}]}],
                    [{_,[{16,_,{unused_function,{foo,0}}}]}]} = 
                 compile:file(Parserfile1, [basic_validation, return]),
-            ?line L1 = 38 + SzYeccPre,
-            ?line L2 = 45 + SzYeccPre
+            L1 = 41 + SzYeccPre,
+            L2 = 48 + SzYeccPre
     end(),
 
     YeccPre = filename:join(Dir, "yeccpre.hrl"),
@@ -1637,8 +1637,8 @@ otp_7292(Config) when is_list(Config) ->
                         {L2,_,{bad_inline,{yeccpars2_2_,1}}}]}],
                    [{_,[{16,_,{unused_function,{foo,0}}}]}]} = 
                 compile:file(Parserfile1, [basic_validation, return]),
-            ?line L1 = 37 + SzYeccPre,
-            ?line L2 = 44 + SzYeccPre
+            ?line L1 = 40 + SzYeccPre,
+            ?line L2 = 47 + SzYeccPre
     end(),
 
     file:delete(YeccPre),
-- 
cgit v1.2.3


From d18d8f4ba327a1c99d7812efb450b445558b154c Mon Sep 17 00:00:00 2001
From: Hans Bolinder <hasse@erlang.org>
Date: Mon, 30 Jun 2014 10:08:41 +0200
Subject: Let Leex use the new -dialyzer attribute

---
 lib/parsetools/include/leexinc.hrl | 8 ++++++++
 1 file changed, 8 insertions(+)

diff --git a/lib/parsetools/include/leexinc.hrl b/lib/parsetools/include/leexinc.hrl
index 938aef58f9..2657fdcfaa 100644
--- a/lib/parsetools/include/leexinc.hrl
+++ b/lib/parsetools/include/leexinc.hrl
@@ -44,6 +44,8 @@ string(Ics0, L0, Tcs, Ts) ->
 %% Test for and remove the end token wrapper. Push back characters
 %% are prepended to RestChars.
 
+-dialyzer({nowarn_function, string_cont/4}).
+
 string_cont(Rest, Line, {token,T}, Ts) ->
     string(Rest, Line, Rest, [T|Ts]);
 string_cont(Rest, Line, {token,T,Push}, Ts) ->
@@ -113,6 +115,8 @@ token(S0, Ics0, L0, Tcs, Tlen0, Tline, A0, Alen0) ->
 %% If we have a token or error then return done, else if we have a
 %% skip_token then continue.
 
+-dialyzer({nowarn_function, token_cont/3}).
+
 token_cont(Rest, Line, {token,T}) ->
     {done,{ok,T,Line},Rest};
 token_cont(Rest, Line, {token,T,Push}) ->
@@ -187,6 +191,8 @@ tokens(S0, Ics0, L0, Tcs, Tlen0, Tline, Ts, A0, Alen0) ->
 %% a token then save it and continue, else if we have a skip_token
 %% just continue.
 
+-dialyzer({nowarn_function, tokens_cont/4}).
+
 tokens_cont(Rest, Line, {token,T}, Ts) ->
     tokens(yystate(), Rest, Line, Rest, 0, Line, [T|Ts], reject, 0);
 tokens_cont(Rest, Line, {token,T,Push}, Ts) ->
@@ -238,6 +244,8 @@ skip_tokens(S0, Ics0, L0, Tcs, Tlen0, Tline, Error, A0, Alen0) ->
 %% Skip tokens until we have an end_token or error then return done
 %% with the original rror.
 
+-dialyzer({nowarn_function, skip_cont/4}).
+
 skip_cont(Rest, Line, {token,_T}, Error) ->
     skip_tokens(yystate(), Rest, Line, Rest, 0, Line, Error, reject, 0);
 skip_cont(Rest, Line, {token,_T,Push}, Error) ->
-- 
cgit v1.2.3