diff --git a/gcc/ada/errout.adb b/gcc/ada/errout.adb index c4761bd1bc9e8c2a98eb64893843fef2bbd59a84..4622290897b9edc8443f7c421b689a3d1121e69e 100644 --- a/gcc/ada/errout.adb +++ b/gcc/ada/errout.adb @@ -213,6 +213,10 @@ package body Errout is -- should have 'Class appended to its name (see Add_Class procedure), and -- is otherwise unchanged. + procedure Validate_Specific_Warnings; + -- Checks that specific warnings are consistent (for non-configuration + -- case, properly closed, and used). + function Warn_Insertion return String; -- This is called for warning messages only (so Warning_Msg_Char is set) -- and returns a corresponding string to use at the beginning of generated @@ -1745,7 +1749,7 @@ package body Errout is -- do this on the last call, after all possible warnings are posted. if Last_Call then - Validate_Specific_Warnings (Error_Msg'Access); + Validate_Specific_Warnings; end if; end Finalize; @@ -2001,6 +2005,50 @@ package body Errout is -- True if S starts with Size_For end Is_Size_Too_Small_Message; + -------------------------------- + -- Validate_Specific_Warnings -- + -------------------------------- + + procedure Validate_Specific_Warnings is + begin + if not Warnsw.Warn_On_Warnings_Off then + return; + end if; + + for J in Specific_Warnings.First .. Specific_Warnings.Last loop + declare + SWE : Specific_Warning_Entry renames Specific_Warnings.Table (J); + + begin + if not SWE.Config then + + -- Warn for unmatched Warnings (Off, ...) + + if SWE.Open then + Error_Msg_N + ("?.w?pragma Warnings Off with no matching Warnings On", + SWE.Start); + + -- Warn for ineffective Warnings (Off, ..) + + elsif not SWE.Used + + -- Do not issue this warning for -Wxxx messages since the + -- back-end doesn't report the information. Note that there + -- is always an asterisk at the start of every message. + + and then not + (SWE.Msg'Length > 3 and then SWE.Msg (2 .. 3) = "-W") + then + Error_Msg_N + ("?.w?no warning suppressed by this pragma", + SWE.Start); + end if; + end if; + end; + end loop; + end Validate_Specific_Warnings; + --------------- -- Last_Node -- --------------- diff --git a/gcc/ada/errout.ads b/gcc/ada/errout.ads index 5a7764aa0a36f26821f1676cd525a7b911c01cc0..089da867d45468366e7fd56f2aaef2f8e3b322b3 100644 --- a/gcc/ada/errout.ads +++ b/gcc/ada/errout.ads @@ -896,7 +896,7 @@ package Errout is -- location from which warnings are to be turned back on. procedure Set_Specific_Warning_Off - (Loc : Source_Ptr; + (Node : Node_Id; Msg : String; Reason : String_Id; Config : Boolean; diff --git a/gcc/ada/erroutc.adb b/gcc/ada/erroutc.adb index 125cbf822ffc68306c5f9ed7ea119da8db3ec6d8..96d8d128d843467d37d980eb4de8d87e05192492 100644 --- a/gcc/ada/erroutc.adb +++ b/gcc/ada/erroutc.adb @@ -38,6 +38,7 @@ with Fname; use Fname; with Namet; use Namet; with Opt; use Opt; with Output; use Output; +with Sinfo.Nodes; with Sinput; use Sinput; with Snames; use Snames; with Stringt; use Stringt; @@ -1650,15 +1651,16 @@ package body Erroutc is ------------------------------ procedure Set_Specific_Warning_Off - (Loc : Source_Ptr; + (Node : Node_Id; Msg : String; Reason : String_Id; Config : Boolean; Used : Boolean := False) is + Loc : constant Source_Ptr := Sinfo.Nodes.Sloc (Node); begin Specific_Warnings.Append - ((Start => Loc, + ((Start => Node, Msg => new String'(Msg), Stop => Source_Last (Get_Source_File_Index (Loc)), Reason => Reason, @@ -1680,12 +1682,13 @@ package body Erroutc is for J in 1 .. Specific_Warnings.Last loop declare SWE : Specific_Warning_Entry renames Specific_Warnings.Table (J); + Start_Loc : constant Source_Ptr := Sinfo.Nodes.Sloc (SWE.Start); begin if Msg = SWE.Msg.all - and then Loc > SWE.Start + and then Loc > Start_Loc and then SWE.Open - and then Get_Source_File_Index (SWE.Start) = + and then Get_Source_File_Index (Start_Loc) = Get_Source_File_Index (Loc) then SWE.Stop := Loc; @@ -1801,49 +1804,6 @@ package body Erroutc is return False; end Sloc_In_Range; - -------------------------------- - -- Validate_Specific_Warnings -- - -------------------------------- - - procedure Validate_Specific_Warnings (Eproc : Error_Msg_Proc) is - begin - if not Warn_On_Warnings_Off then - return; - end if; - - for J in Specific_Warnings.First .. Specific_Warnings.Last loop - declare - SWE : Specific_Warning_Entry renames Specific_Warnings.Table (J); - - begin - if not SWE.Config then - - -- Warn for unmatched Warnings (Off, ...) - - if SWE.Open then - Eproc.all - ("?.w?pragma Warnings Off with no matching Warnings On", - SWE.Start); - - -- Warn for ineffective Warnings (Off, ..) - - elsif not SWE.Used - - -- Do not issue this warning for -Wxxx messages since the - -- back-end doesn't report the information. Note that there - -- is always an asterisk at the start of every message. - - and then not - (SWE.Msg'Length > 3 and then SWE.Msg (2 .. 3) = "-W") - then - Eproc.all - ("?.w?no warning suppressed by this pragma", SWE.Start); - end if; - end if; - end; - end loop; - end Validate_Specific_Warnings; - ------------------------------------- -- Warning_Specifically_Suppressed -- ------------------------------------- @@ -1859,13 +1819,13 @@ package body Erroutc is for J in Specific_Warnings.First .. Specific_Warnings.Last loop declare SWE : Specific_Warning_Entry renames Specific_Warnings.Table (J); - + Start_Loc : constant Source_Ptr := Sinfo.Nodes.Sloc (SWE.Start); begin -- Pragma applies if it is a configuration pragma, or if the -- location is in range of a specific non-configuration pragma. if SWE.Config - or else Sloc_In_Range (Loc, SWE.Start, SWE.Stop) + or else Sloc_In_Range (Loc, Start_Loc, SWE.Stop) then if Matches (Msg.all, SWE.Msg.all) or else Matches (Tag, SWE.Msg.all) diff --git a/gcc/ada/erroutc.ads b/gcc/ada/erroutc.ads index 94631093b2c4810bdd8c6490a60597f3ccd2c759..250461f4b5c55b267a60059ed5011ab900398d73 100644 --- a/gcc/ada/erroutc.ads +++ b/gcc/ada/erroutc.ads @@ -347,7 +347,7 @@ package Erroutc is -- which is the pattern to match for suppressing a warning. type Specific_Warning_Entry is record - Start : Source_Ptr; + Start : Node_Id; Stop : Source_Ptr; -- Starting and ending source pointers for the range. These are always -- from the same source file. @@ -651,7 +651,7 @@ package Erroutc is -- last non-deleted message. procedure Set_Specific_Warning_Off - (Loc : Source_Ptr; + (Node : Node_Id; Msg : String; Reason : String_Id; Config : Boolean; @@ -659,13 +659,13 @@ package Erroutc is -- This is called in response to the two argument form of pragma Warnings -- where the first argument is OFF, and the second argument is a string -- which identifies a specific warning to be suppressed. The first argument - -- is the start of the suppression range, and the second argument is the - -- string from the pragma. Loc is the location of the pragma (which is the - -- start of the range to suppress). Reason is the reason string from the - -- pragma, or the null string if no reason is given. Config is True for the - -- configuration pragma case (where there is no requirement for a matching - -- OFF pragma). Used is set True to disable the check that the warning - -- actually has the effect of suppressing a warning. + -- is the corresponding N_Pragma node, and the second argument is the + -- string from the pragma. Sloc (Node) is the start of the range to + -- suppress. Reason is the reason string from the pragma, or the null + -- string if no reason is given. Config is True for the configuration + -- pragma case (where there is no requirement for a matching OFF pragma). + -- Used is set True to disable the check that the warning actually has the + -- effect of suppressing a warning. procedure Set_Specific_Warning_On (Loc : Source_Ptr; @@ -717,11 +717,4 @@ package Erroutc is -- given by Warning_As_Error pragmas, as stored in the Warnings_As_Errors -- table. - type Error_Msg_Proc is - access procedure (Msg : String; Flag_Location : Source_Ptr); - procedure Validate_Specific_Warnings (Eproc : Error_Msg_Proc); - -- Checks that specific warnings are consistent (for non-configuration - -- case, properly closed, and used). The argument is a pointer to the - -- Error_Msg procedure to be called if any inconsistencies are detected. - end Erroutc; diff --git a/gcc/ada/sem_prag.adb b/gcc/ada/sem_prag.adb index d7acd4604ded73b00c16d09a47e47db9ae7a79bd..dfc415da3f3442ed0fcfe89a0647edceedd32642 100644 --- a/gcc/ada/sem_prag.adb +++ b/gcc/ada/sem_prag.adb @@ -27014,7 +27014,7 @@ package body Sem_Prag is begin if Chars (Argx) = Name_Off then Set_Specific_Warning_Off - (Loc, Message, Reason, + (N, Message, Reason, Config => Is_Configuration_Pragma, Used => Inside_A_Generic or else In_Instance);