From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: by sourceware.org (Postfix, from userid 1914) id 287143857C76; Tue, 12 Jul 2022 12:26:02 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 287143857C76 MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Content-Type: text/plain; charset="utf-8" From: Pierre-Marie de Rodat To: gcc-cvs@gcc.gnu.org Subject: [gcc r13-1630] [Ada] Refine heuristics for unreachable-code warnings X-Act-Checkin: gcc X-Git-Author: Bob Duff X-Git-Refname: refs/heads/master X-Git-Oldrev: 6a64ee3903166dcb1a7803fbf49c31d0f89875a8 X-Git-Newrev: e124352c0ada83486926f110c8b28a0a431c98b4 Message-Id: <20220712122602.287143857C76@sourceware.org> Date: Tue, 12 Jul 2022 12:26:02 +0000 (GMT) X-BeenThere: gcc-cvs@gcc.gnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Gcc-cvs mailing list List-Unsubscribe: , List-Archive: List-Help: List-Subscribe: , X-List-Received-Date: Tue, 12 Jul 2022 12:26:02 -0000 https://gcc.gnu.org/g:e124352c0ada83486926f110c8b28a0a431c98b4 commit r13-1630-ge124352c0ada83486926f110c8b28a0a431c98b4 Author: Bob Duff Date: Fri Jun 24 14:25:48 2022 -0400 [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. Diff: --- 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 b2a3661900c..e1b57222288 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 cfbf01092a6..0e65cbf4fb7 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 e5b1118d979..64cf5d041dd 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.