public inbox for gcc-cvs@sourceware.org
help / color / mirror / Atom feed
* [gcc r13-241] [Ada] Cleanup unnecessary declare block in Check_Unreachable_Code
@ 2022-05-10  8:22 Pierre-Marie de Rodat
  0 siblings, 0 replies; only message in thread
From: Pierre-Marie de Rodat @ 2022-05-10  8:22 UTC (permalink / raw)
  To: gcc-cvs

https://gcc.gnu.org/g:ea22ec90df9649465b172269027fff8f0750047b

commit r13-241-gea22ec90df9649465b172269027fff8f0750047b
Author: Piotr Trojanek <trojanek@adacore.com>
Date:   Thu Jan 20 22:36:16 2022 +0100

    [Ada] Cleanup unnecessary declare block in Check_Unreachable_Code
    
    Cleanup related to static detection of references to uninitialized
    variables. Semantics is unaffected.
    
    gcc/ada/
    
            * sem_ch5.adb (Check_Unreachable_Code): Remove inner declare
            block; refill code and comments.

Diff:
---
 gcc/ada/sem_ch5.adb | 200 +++++++++++++++++++++++++---------------------------
 1 file changed, 98 insertions(+), 102 deletions(-)

diff --git a/gcc/ada/sem_ch5.adb b/gcc/ada/sem_ch5.adb
index 41b9ae02276..81767d8c324 100644
--- a/gcc/ada/sem_ch5.adb
+++ b/gcc/ada/sem_ch5.adb
@@ -4397,149 +4397,145 @@ package body Sem_Ch5 is
 
    procedure Check_Unreachable_Code (N : Node_Id) is
       Error_Node : Node_Id;
+      Nxt        : Node_Id;
       P          : Node_Id;
 
    begin
       if Is_List_Member (N) and then Comes_From_Source (N) then
-         declare
-            Nxt : Node_Id;
+         Nxt := Original_Node (Next (N));
 
-         begin
-            Nxt := Original_Node (Next (N));
+         --  Skip past pragmas
 
-            --  Skip past pragmas
+         while Nkind (Nxt) = N_Pragma loop
+            Nxt := Original_Node (Next (Nxt));
+         end loop;
 
-            while Nkind (Nxt) = N_Pragma loop
-               Nxt := Original_Node (Next (Nxt));
-            end loop;
+         --  If a label follows us, then we never have dead code, since someone
+         --  could branch to the label, so we just ignore it.
 
-            --  If a label follows us, then we never have dead code, since
-            --  someone could branch to the label, so we just ignore it.
+         if Nkind (Nxt) = N_Label then
+            return;
 
-            if Nkind (Nxt) = N_Label then
-               return;
+         --  Otherwise see if we have a real statement following us
 
-            --  Otherwise see if we have a real statement following us
+         elsif Present (Nxt)
+           and then Comes_From_Source (Nxt)
+           and then Is_Statement (Nxt)
+         then
+            --  Special very annoying exception. If we have a return that
+            --  follows a raise, then we allow it without a warning, since
+            --  the Ada RM annoyingly requires a useless return here.
 
-            elsif Present (Nxt)
-              and then Comes_From_Source (Nxt)
-              and then Is_Statement (Nxt)
+            if Nkind (Original_Node (N)) /= N_Raise_Statement
+              or else Nkind (Nxt) /= N_Simple_Return_Statement
             then
-               --  Special very annoying exception. If we have a return that
-               --  follows a raise, then we allow it without a warning, since
-               --  the Ada RM annoyingly requires a useless return here.
-
-               if Nkind (Original_Node (N)) /= N_Raise_Statement
-                 or else Nkind (Nxt) /= N_Simple_Return_Statement
-               then
-                  --  The rather strange shenanigans with the warning message
-                  --  here reflects the fact that Kill_Dead_Code is very good
-                  --  at removing warnings in deleted code, and this is one
-                  --  warning we would prefer NOT to have removed.
-
-                  Error_Node := Nxt;
+               --  The rather strange shenanigans with the warning message
+               --  here reflects the fact that Kill_Dead_Code is very good at
+               --  removing warnings in deleted code, and this is one warning
+               --  we would prefer NOT to have removed.
 
-                  --  If we have unreachable code, analyze and remove the
-                  --  unreachable code, since it is useless and we don't
-                  --  want to generate junk warnings.
+               Error_Node := Nxt;
 
-                  --  We skip this step if we are not in code generation mode
-                  --  or CodePeer mode.
+               --  If we have unreachable code, analyze and remove the
+               --  unreachable code, since it is useless and we don't want
+               --  to generate junk warnings.
 
-                  --  This is the one case where we remove dead code in the
-                  --  semantics as opposed to the expander, and we do not want
-                  --  to remove code if we are not in code generation mode,
-                  --  since this messes up the tree or loses useful information
-                  --  for CodePeer.
+               --  We skip this step if we are not in code generation mode
+               --  or CodePeer mode.
 
-                  --  Note that one might react by moving the whole circuit to
-                  --  exp_ch5, but then we lose the warning in -gnatc mode.
+               --  This is the one case where we remove dead code in the
+               --  semantics as opposed to the expander, and we do not want
+               --  to remove code if we are not in code generation mode, since
+               --  this messes up the tree or loses useful information for
+               --  CodePeer.
 
-                  if Operating_Mode = Generate_Code
-                    and then not CodePeer_Mode
-                  then
-                     loop
-                        Nxt := Next (N);
+               --  Note that one might react by moving the whole circuit to
+               --  exp_ch5, but then we lose the warning in -gnatc mode.
 
-                        --  Quit deleting when we have nothing more to delete
-                        --  or if we hit a label (since someone could transfer
-                        --  control to a label, so we should not delete it).
+               if Operating_Mode = Generate_Code
+                 and then not CodePeer_Mode
+               then
+                  loop
+                     Nxt := Next (N);
 
-                        exit when No (Nxt) or else Nkind (Nxt) = N_Label;
+                     --  Quit deleting when we have nothing more to delete
+                     --  or if we hit a label (since someone could transfer
+                     --  control to a label, so we should not delete it).
 
-                        --  Statement/declaration is to be deleted
+                     exit when No (Nxt) or else Nkind (Nxt) = N_Label;
 
-                        Analyze (Nxt);
-                        Remove (Nxt);
-                        Kill_Dead_Code (Nxt);
-                     end loop;
-                  end if;
+                     --  Statement/declaration is to be deleted
 
-                  Error_Msg
-                    ("??unreachable code!", Sloc (Error_Node), Error_Node);
+                     Analyze (Nxt);
+                     Remove (Nxt);
+                     Kill_Dead_Code (Nxt);
+                  end loop;
                end if;
 
-            --  If the unconditional transfer of control instruction is the
-            --  last statement of a sequence, then see if our parent is one of
-            --  the constructs for which we count unblocked exits, and if so,
-            --  adjust the count.
-
-            else
-               P := Parent (N);
+               Error_Msg
+                 ("??unreachable code!", Sloc (Error_Node), Error_Node);
+            end if;
 
-               --  Statements in THEN part or ELSE part of IF statement
+         --  If the unconditional transfer of control instruction is the
+         --  last statement of a sequence, then see if our parent is one of
+         --  the constructs for which we count unblocked exits, and if so,
+         --  adjust the count.
 
-               if Nkind (P) = N_If_Statement then
-                  null;
+         else
+            P := Parent (N);
 
-               --  Statements in ELSIF part of an IF statement
+            --  Statements in THEN part or ELSE part of IF statement
 
-               elsif Nkind (P) = N_Elsif_Part then
-                  P := Parent (P);
-                  pragma Assert (Nkind (P) = N_If_Statement);
+            if Nkind (P) = N_If_Statement then
+               null;
 
-               --  Statements in CASE statement alternative
+            --  Statements in ELSIF part of an IF statement
 
-               elsif Nkind (P) = N_Case_Statement_Alternative then
-                  P := Parent (P);
-                  pragma Assert (Nkind (P) = N_Case_Statement);
+            elsif Nkind (P) = N_Elsif_Part then
+               P := Parent (P);
+               pragma Assert (Nkind (P) = N_If_Statement);
 
-               --  Statements in body of block
+            --  Statements in CASE statement alternative
 
-               elsif Nkind (P) = N_Handled_Sequence_Of_Statements
-                 and then Nkind (Parent (P)) = N_Block_Statement
-               then
-                  --  The original loop is now placed inside a block statement
-                  --  due to the expansion of attribute 'Loop_Entry. Return as
-                  --  this is not a "real" block for the purposes of exit
-                  --  counting.
+            elsif Nkind (P) = N_Case_Statement_Alternative then
+               P := Parent (P);
+               pragma Assert (Nkind (P) = N_Case_Statement);
 
-                  if Nkind (N) = N_Loop_Statement
-                    and then Subject_To_Loop_Entry_Attributes (N)
-                  then
-                     return;
-                  end if;
+            --  Statements in body of block
 
-               --  Statements in exception handler in a block
+            elsif Nkind (P) = N_Handled_Sequence_Of_Statements
+              and then Nkind (Parent (P)) = N_Block_Statement
+            then
+               --  The original loop is now placed inside a block statement
+               --  due to the expansion of attribute 'Loop_Entry. Return as
+               --  this is not a "real" block for the purposes of exit
+               --  counting.
 
-               elsif Nkind (P) = N_Exception_Handler
-                 and then Nkind (Parent (P)) = N_Handled_Sequence_Of_Statements
-                 and then Nkind (Parent (Parent (P))) = N_Block_Statement
+               if Nkind (N) = N_Loop_Statement
+                 and then Subject_To_Loop_Entry_Attributes (N)
                then
-                  null;
-
-               --  None of these cases, so return
-
-               else
                   return;
                end if;
 
-               --  This was one of the cases we are looking for (i.e. the
-               --  parent construct was IF, CASE or block) so decrement count.
+            --  Statements in exception handler in a block
 
-               Unblocked_Exit_Count := Unblocked_Exit_Count - 1;
+            elsif Nkind (P) = N_Exception_Handler
+              and then Nkind (Parent (P)) = N_Handled_Sequence_Of_Statements
+              and then Nkind (Parent (Parent (P))) = N_Block_Statement
+            then
+               null;
+
+            --  None of these cases, so return
+
+            else
+               return;
             end if;
-         end;
+
+            --  This was one of the cases we are looking for (i.e. the parent
+            --  construct was IF, CASE or block) so decrement count.
+
+            Unblocked_Exit_Count := Unblocked_Exit_Count - 1;
+         end if;
       end if;
    end Check_Unreachable_Code;


^ permalink raw reply	[flat|nested] only message in thread

only message in thread, other threads:[~2022-05-10  8:22 UTC | newest]

Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2022-05-10  8:22 [gcc r13-241] [Ada] Cleanup unnecessary declare block in Check_Unreachable_Code Pierre-Marie de Rodat

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).