diff mbox series

[Ada] Refine heuristics for unreachable-code warnings

Message ID 20220712122522.GA3404764@adacore.com
State New
Headers show
Series [Ada] Refine heuristics for unreachable-code warnings | expand

Commit Message

Pierre-Marie de Rodat July 12, 2022, 12:25 p.m. UTC
This patch refines the heuristics for when we warn about unreachable
code, to avoid common false alarms.

Tested on x86_64-pc-linux-gnu, committed on trunk

gcc/ada/

	* sem_ch5.adb (Check_Unreachable_Code): Refine heuristics.
	* sem_util.ads, sem_util.adb (Is_Static_Constant_Name): Remove
	this; instead we have a new function Is_Simple_Case in
	Sem_Ch5.Check_Unreachable_Code.
diff mbox series

Patch

diff --git a/gcc/ada/sem_ch5.adb b/gcc/ada/sem_ch5.adb
--- a/gcc/ada/sem_ch5.adb
+++ b/gcc/ada/sem_ch5.adb
@@ -4393,6 +4393,31 @@  package body Sem_Ch5 is
    ----------------------------
 
    procedure Check_Unreachable_Code (N : Node_Id) is
+
+      function Is_Simple_Case (N : Node_Id) return Boolean;
+      --  N is the condition of an if statement. True if N is simple enough
+      --  that we should not set Unblocked_Exit_Count in the special case
+      --  below.
+
+      --------------------
+      -- Is_Simple_Case --
+      --------------------
+
+      function Is_Simple_Case (N : Node_Id) return Boolean is
+      begin
+         return
+            Is_Trivial_Boolean (N)
+           or else
+            (Comes_From_Source (N)
+               and then Is_Static_Expression (N)
+               and then Nkind (N) in N_Identifier | N_Expanded_Name
+               and then Ekind (Entity (N)) = E_Constant)
+           or else
+            (not In_Instance
+               and then Nkind (Original_Node (N)) = N_Op_Not
+               and then Is_Simple_Case (Right_Opnd (Original_Node (N))));
+      end Is_Simple_Case;
+
       Error_Node : Node_Id;
       Nxt        : Node_Id;
       P          : Node_Id;
@@ -4574,8 +4599,7 @@  package body Sem_Ch5 is
               and then No (Else_Statements (P))
               and then Is_OK_Static_Expression (Condition (P))
               and then Is_True (Expr_Value (Condition (P)))
-              and then not Is_Trivial_Boolean (Condition (P))
-              and then not Is_Static_Constant_Name (Condition (P))
+              and then not Is_Simple_Case (Condition (P))
             then
                pragma Assert (Unblocked_Exit_Count = 2);
                Unblocked_Exit_Count := 0;


diff --git a/gcc/ada/sem_util.adb b/gcc/ada/sem_util.adb
--- a/gcc/ada/sem_util.adb
+++ b/gcc/ada/sem_util.adb
@@ -21532,18 +21532,6 @@  package body Sem_Util is
         and then Entity (N) in Standard_True | Standard_False;
    end Is_Trivial_Boolean;
 
-   -----------------------------
-   -- Is_Static_Constant_Name --
-   -----------------------------
-
-   function Is_Static_Constant_Name (N : Node_Id) return Boolean is
-   begin
-      return Comes_From_Source (N)
-        and then Is_Static_Expression (N)
-        and then Nkind (N) in N_Identifier | N_Expanded_Name
-        and then Ekind (Entity (N)) = E_Constant;
-   end Is_Static_Constant_Name;
-
    --------------------------------------
    -- Is_Unchecked_Conversion_Instance --
    --------------------------------------


diff --git a/gcc/ada/sem_util.ads b/gcc/ada/sem_util.ads
--- a/gcc/ada/sem_util.ads
+++ b/gcc/ada/sem_util.ads
@@ -2485,9 +2485,6 @@  package Sem_Util is
    --  Determine whether source node N denotes "True" or "False". Note that
    --  this is not true for expressions that got folded to True or False.
 
-   function Is_Static_Constant_Name (N : Node_Id) return Boolean;
-   --  True if N is a name that statically denotes a static constant.
-
    function Is_Unchecked_Conversion_Instance (Id : Entity_Id) return Boolean;
    --  Determine whether an arbitrary entity denotes an instance of function
    --  Ada.Unchecked_Conversion.