diff options
author | Piotr Trojanek <trojanek@adacore.com> | 2021-11-22 12:15:29 +0100 |
---|---|---|
committer | Pierre-Marie de Rodat <derodat@adacore.com> | 2021-12-02 16:26:22 +0000 |
commit | 1fde9333dc31007083ac792896820ca29837c342 (patch) | |
tree | 5b26244cec20d9601ae31b5679ada4630e8825e7 | |
parent | e2e877266de127fbcd6f14e85e0c46ce4731c207 (diff) | |
download | gcc-1fde9333dc31007083ac792896820ca29837c342.zip gcc-1fde9333dc31007083ac792896820ca29837c342.tar.gz gcc-1fde9333dc31007083ac792896820ca29837c342.tar.bz2 |
[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.
-rw-r--r-- | gcc/ada/sem_warn.adb | 44 |
1 files changed, 21 insertions, 23 deletions
diff --git a/gcc/ada/sem_warn.adb b/gcc/ada/sem_warn.adb index 3d7e412..2842a2c 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); |