From: Piotr Trojanek Date: Mon, 22 Nov 2021 11:15:29 +0000 (+0100) Subject: [Ada] Refactor nested loops in warning on unassigned out parameter X-Git-Tag: basepoints/gcc-13~2586 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=1fde9333dc31007083ac792896820ca29837c342;p=thirdparty%2Fgcc.git [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 --git a/gcc/ada/sem_warn.adb b/gcc/ada/sem_warn.adb index 3d7e4124e0ae..2842a2ccb402 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);