https://gcc.gnu.org/g:f3577958976bc7f74e68e4c1048ba4d86bbe6b9f
commit r16-6626-gf3577958976bc7f74e68e4c1048ba4d86bbe6b9f Author: Viljar Indus <[email protected]> Date: Mon Dec 8 13:26:54 2025 +0200 ada: Add diagnostic entry consistency checks Verify that every diagnostic that has a switch also has the same diagnostic marked as one of the diagnostics for that same switch. Additionally verify that for every diagnostic marked for a switch these diagnostics have the same switch marked as its switch. gcc/ada/ChangeLog: * errid.adb (Check_Diagnostic_To_Switch_Consistency): New subprogram for checking the consistency of diagnostics. (Check_Switch_To_Diagnostic_Consistency) New subprogram for checking the consistency of switches. (Add_All_Diagnostic_Rules): Check diagnostic consitency. (Add_All_Switch_Rules): Check switch consitency. Diff: --- gcc/ada/errid.adb | 69 ++++++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 68 insertions(+), 1 deletion(-) diff --git a/gcc/ada/errid.adb b/gcc/ada/errid.adb index a432f016652b..f20e08fab060 100644 --- a/gcc/ada/errid.adb +++ b/gcc/ada/errid.adb @@ -23,19 +23,84 @@ -- -- ------------------------------------------------------------------------------ -with Erroutc.SARIF_Emitter; use Erroutc.SARIF_Emitter; +with Errid.Diagnostic_Repository; use Errid.Diagnostic_Repository; +with Errid.Switch_Repository; use Errid.Switch_Repository; +with Erroutc.SARIF_Emitter; use Erroutc.SARIF_Emitter; package body Errid is Doc_Directory : constant String := "./error_codes"; Doc_Extension : constant String := ".md"; + Diagnostic_Inconsistency : exception; + procedure Add_All_Diagnostic_Rules (Printer : in out SARIF_Printer); -- Add all active Diagnostic_Id-s to the SARIF_Printer procedure Add_All_Switch_Rules (Printer : in out SARIF_Printer); -- Add all active Switch_Id-s to the SARIF_Printer + procedure Check_Diagnostic_To_Switch_Consistency (D_Id : Diagnostic_Id); + -- Check that if a diagnostic has a switch then that diagnostic is also + -- included in the list of diagnostics for that switch. + + procedure Check_Switch_To_Diagnostic_Consistency (S_Id : Switch_Id); + -- Check that if a Switch has diagnostics then that diagnostic has the same + -- switch marked as its switch. + + -------------------------------------------- + -- Check_Diagnostic_To_Switch_Consistency -- + -------------------------------------------- + + procedure Check_Diagnostic_To_Switch_Consistency (D_Id : Diagnostic_Id) is + D : constant Diagnostic_Entry_Type := Diagnostic_Entries (D_Id); + Err_Msg : constant String := + Switch_Id'Image (D.Switch) + & " should contain " + & Diagnostic_Id'Image (D_Id) + & " in its diagnostics"; + begin + if D.Switch = No_Switch_Id then + return; + end if; + + if Switches (D.Switch).Diagnostics = null then + raise Diagnostic_Inconsistency with Err_Msg; + end if; + + for DD of Switches (D.Switch).Diagnostics.all loop + if D_Id = DD then + return; + end if; + end loop; + + raise Diagnostic_Inconsistency with Err_Msg; + end Check_Diagnostic_To_Switch_Consistency; + + -------------------------------------------- + -- Check_Switch_To_Diagnostic_Consistency -- + -------------------------------------------- + + procedure Check_Switch_To_Diagnostic_Consistency (S_Id : Switch_Id) is + S : constant Switch_Type := Switches (S_Id); + D : Diagnostic_Entry_Type; + begin + if S.Diagnostics = null then + return; + end if; + + for D_Id of S.Diagnostics.all loop + D := Diagnostic_Entries (D_Id); + if D.Switch /= S_Id then + raise Diagnostic_Inconsistency + with + Switch_Id'Image (S_Id) + & " should be the switch for " + & Diagnostic_Id'Image (D_Id); + end if; + end loop; + end Check_Switch_To_Diagnostic_Consistency; + ---------------------------- -- Get_Documentation_File -- ---------------------------- @@ -72,6 +137,7 @@ package body Errid is for Id in Diagnostic_Id loop if Id /= No_Diagnostic_Id then Diagnostic_Id_Lists.Append (Printer.Diagnostics, Id); + Check_Diagnostic_To_Switch_Consistency (Id); end if; end loop; end Add_All_Diagnostic_Rules; @@ -86,6 +152,7 @@ package body Errid is for S in Switch_Id loop if S /= No_Switch_Id then Switch_Id_Lists.Append (Printer.Switches, S); + Check_Switch_To_Diagnostic_Consistency (S); end if; end loop; end Add_All_Switch_Rules;
