From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: by sourceware.org (Postfix, from userid 1914) id 1C3C6385841A; Thu, 2 Dec 2021 16:28:38 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 1C3C6385841A 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 r12-5727] [Ada] Refactor nested loops in warning on unassigned out parameter X-Act-Checkin: gcc X-Git-Author: Piotr Trojanek X-Git-Refname: refs/heads/master X-Git-Oldrev: e2e877266de127fbcd6f14e85e0c46ce4731c207 X-Git-Newrev: 1fde9333dc31007083ac792896820ca29837c342 Message-Id: <20211202162838.1C3C6385841A@sourceware.org> Date: Thu, 2 Dec 2021 16:28:38 +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: Thu, 02 Dec 2021 16:28:38 -0000 https://gcc.gnu.org/g:1fde9333dc31007083ac792896820ca29837c342 commit r12-5727-g1fde9333dc31007083ac792896820ca29837c342 Author: Piotr Trojanek Date: Mon Nov 22 12:15:29 2021 +0100 [Ada] Refactor nested loops in warning on unassigned out parameter gcc/ada/ * sem_warn.adb (Warn_On_Unassigned_Out_Parameter): Move inner loop at the beginning of subprogram, so it is executed only once; fix order in the "add an ad hoc" phrase. Diff: --- gcc/ada/sem_warn.adb | 44 +++++++++++++++++++++----------------------- 1 file changed, 21 insertions(+), 23 deletions(-) diff --git a/gcc/ada/sem_warn.adb b/gcc/ada/sem_warn.adb index 3d7e4124e0a..2842a2ccb40 100644 --- a/gcc/ada/sem_warn.adb +++ b/gcc/ada/sem_warn.adb @@ -4237,8 +4237,7 @@ package body Sem_Warn is (Return_Node : Node_Id; Scope_Id : Entity_Id) is - Form : Entity_Id; - Form2 : Entity_Id; + Form : Entity_Id; begin -- Ignore if procedure or return statement does not come from source @@ -4249,6 +4248,26 @@ package body Sem_Warn is return; end if; + -- Before we issue the warning, add an ad hoc defence against the most + -- common case of false positives with this warning which is the case + -- where there is a Boolean OUT parameter that has been set, and whose + -- meaning is "ignore the values of the other parameters". We can't of + -- course reliably tell this case at compile time, but the following + -- test kills a lot of false positives, without generating a significant + -- number of false negatives (missed real warnings). + + Form := First_Formal (Scope_Id); + while Present (Form) loop + if Ekind (Form) = E_Out_Parameter + and then Root_Type (Etype (Form)) = Standard_Boolean + and then not Never_Set_In_Source_Check_Spec (Form) + then + return; + end if; + + Next_Formal (Form); + end loop; + -- Loop through formals Form := First_Formal (Scope_Id); @@ -4263,27 +4282,6 @@ package body Sem_Warn is and then Is_Scalar_Type (Etype (Form)) and then not Present (Unset_Reference (Form)) then - -- Before we issue the warning, an add ad hoc defence against the - -- most common case of false positives with this warning which is - -- the case where there is a Boolean OUT parameter that has been - -- set, and whose meaning is "ignore the values of the other - -- parameters". We can't of course reliably tell this case at - -- compile time, but the following test kills a lot of false - -- positives, without generating a significant number of false - -- negatives (missed real warnings). - - Form2 := First_Formal (Scope_Id); - while Present (Form2) loop - if Ekind (Form2) = E_Out_Parameter - and then Root_Type (Etype (Form2)) = Standard_Boolean - and then not Never_Set_In_Source_Check_Spec (Form2) - then - return; - end if; - - Next_Formal (Form2); - end loop; - -- Here all conditions are met, record possible unset reference Set_Unset_Reference (Form, Return_Node);