From e124352c0ada83486926f110c8b28a0a431c98b4 Mon Sep 17 00:00:00 2001 From: Bob Duff Date: Fri, 24 Jun 2022 14:25:48 -0400 Subject: [PATCH] [Ada] Refine heuristics for unreachable-code warnings This patch refines the heuristics for when we warn about unreachable code, to avoid common false alarms. 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. --- gcc/ada/sem_ch5.adb | 28 ++++++++++++++++++++++++++-- gcc/ada/sem_util.adb | 12 ------------ gcc/ada/sem_util.ads | 3 --- 3 files changed, 26 insertions(+), 17 deletions(-) diff --git a/gcc/ada/sem_ch5.adb b/gcc/ada/sem_ch5.adb index b2a3661..e1b5722 100644 --- 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 index cfbf010..0e65cbf 100644 --- 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 index e5b1118..64cf5d0 100644 --- 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. -- 2.7.4