blob: 1931e02f59251c36f1d8e627c149b80e118c0d94 [file] [log] [blame]
------------------------------------------------------------------------------
-- --
-- GNAT COMPILER COMPONENTS --
-- --
-- W A R N S W --
-- --
-- B o d y --
-- --
-- Copyright (C) 1999-2023, Free Software Foundation, Inc. --
-- --
-- GNAT is free software; you can redistribute it and/or modify it under --
-- terms of the GNU General Public License as published by the Free Soft- --
-- ware Foundation; either version 3, or (at your option) any later ver- --
-- sion. GNAT is distributed in the hope that it will be useful, but WITH- --
-- OUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY --
-- or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License --
-- for more details. You should have received a copy of the GNU General --
-- Public License distributed with GNAT; see file COPYING3. If not, go to --
-- http://www.gnu.org/licenses for a complete copy of the license. --
-- --
-- GNAT was originally developed by the GNAT team at New York University. --
-- Extensive contributions were provided by Ada Core Technologies Inc. --
-- --
------------------------------------------------------------------------------
with Opt; use Opt;
with Output; use Output;
with System.Case_Util; use System.Case_Util;
package body Warnsw is
subtype Lowercase is Character range 'a' .. 'z';
-- Warning-enable switches are lowercase letters
Switch_To_Flag_Mapping : constant array (Warning_Family, Lowercase) of
-- Mapping from the letter after "-gnatw", "-gnatw." or "-gnatw_" to
-- the corresponding flag for the warning it enables. Special_Case means
-- Set_Warning_Switch must do something special, as opposed to simply
-- setting the corresponding flag. No_Such_Warning means the letter
-- is not a defined warning switch, which is an error.
X.Opt_Warnings_Enum :=
(Plain =>
('a' | 'e' | 'n' | 's' | 'u' | 'y' => Special_Case,
'b' => X.Warn_On_Bad_Fixed_Value,
'c' => X.Constant_Condition_Warnings,
'd' => X.Warn_On_Dereference,
'f' => X.Check_Unreferenced_Formals,
'g' => X.Warn_On_Unrecognized_Pragma,
'h' => X.Warn_On_Hiding,
'i' => X.Implementation_Unit_Warnings,
'j' => X.Warn_On_Obsolescent_Feature,
'k' => X.Warn_On_Constant,
'l' => X.Elab_Warnings,
'm' => X.Warn_On_Modified_Unread,
'o' => X.Address_Clause_Overlay_Warnings,
'p' => X.Ineffective_Inline_Warnings,
'q' => X.Warn_On_Questionable_Missing_Parens,
'r' => X.Warn_On_Redundant_Constructs,
't' => X.Warn_On_Deleted_Code,
'v' => X.Warn_On_No_Value_Assigned,
'w' => X.Warn_On_Assumed_Low_Bound,
'x' => X.Warn_On_Export_Import,
'z' => X.Warn_On_Unchecked_Conversion),
'.' =>
('e' | 'g' | 'x' => Special_Case,
'a' => X.Warn_On_Assertion_Failure,
'b' => X.Warn_On_Biased_Representation,
'c' => X.Warn_On_Unrepped_Components,
'd' => X.Warning_Doc_Switch,
'f' => X.Warn_On_Elab_Access,
'h' => X.Warn_On_Record_Holes,
'i' => X.Warn_On_Overlap,
'j' => X.Warn_On_Late_Primitives,
'k' => X.Warn_On_Standard_Redefinition,
'l' => X.List_Inherited_Aspects,
'm' => X.Warn_On_Suspicious_Modulus_Value,
'n' => X.Warn_On_Atomic_Synchronization,
'o' => X.Warn_On_All_Unread_Out_Parameters,
'p' => X.Warn_On_Parameter_Order,
'q' => X.Warn_On_Questionable_Layout,
'r' => X.Warn_On_Object_Renames_Function,
's' => X.Warn_On_Overridden_Size,
't' => X.Warn_On_Suspicious_Contract,
'u' => X.Warn_On_Unordered_Enumeration_Type,
'v' => X.Warn_On_Reverse_Bit_Order,
'w' => X.Warn_On_Warnings_Off,
'y' => X.List_Body_Required_Info,
'z' => X.Warn_On_Size_Alignment),
'_' =>
('b' | 'd' | 'e' | 'f' | 'g' | 'h' | 'i' | 'j' | 'k' | 'l' | 'm' |
'n' | 'o' | 't' | 'u' | 'v' | 'w' | 'x' | 'y' | 'z' =>
No_Such_Warning,
'a' => X.Warn_On_Anonymous_Allocators,
'c' => X.Warn_On_Unknown_Compile_Time_Warning,
'p' => X.Warn_On_Pedantic_Checks,
'q' => X.Warn_On_Ignored_Equality,
'r' => X.Warn_On_Component_Order,
's' => X.Warn_On_Ineffective_Predicate_Test));
All_Warnings : constant Warnings_State := -- Warnings set by -gnatw.e
(X.Elab_Info_Messages |
X.Warning_Doc_Switch |
X.Warn_On_Ada_2022_Compatibility |
X.Warn_On_Elab_Access |
X.No_Warn_On_Non_Local_Exception => False,
others => True);
-- Warning_Doc_Switch is not really a warning to be enabled, but controls
-- the form of warnings printed. No_Warn_On_Non_Local_Exception is handled
-- specially (see Warn_On_Non_Local_Exception). The others are not part of
-- -gnatw.e for historical reasons.
WA_Warnings : constant Warnings_State := -- Warnings set by -gnatwa
(X.Check_Unreferenced | -- -gnatwf/-gnatwu
X.Check_Unreferenced_Formals | -- -gnatwf/-gnatwu
X.Check_Withs | -- -gnatwu
X.Constant_Condition_Warnings | -- -gnatwc
X.Implementation_Unit_Warnings | -- -gnatwi
X.Ineffective_Inline_Warnings | -- -gnatwp
X.Warn_On_Ada_2005_Compatibility | -- -gnatwy
X.Warn_On_Ada_2012_Compatibility | -- -gnatwy
X.Warn_On_Anonymous_Allocators | -- -gnatw_a
X.Warn_On_Assertion_Failure | -- -gnatw.a
X.Warn_On_Assumed_Low_Bound | -- -gnatww
X.Warn_On_Bad_Fixed_Value | -- -gnatwb
X.Warn_On_Biased_Representation | -- -gnatw.b
X.Warn_On_Constant | -- -gnatwk
X.Warn_On_Export_Import | -- -gnatwx
X.Warn_On_Ineffective_Predicate_Test | -- -gnatw_s
X.Warn_On_Late_Primitives | -- -gnatw.j
X.Warn_On_Modified_Unread | -- -gnatwm
X.Warn_On_No_Value_Assigned | -- -gnatwv
X.Warn_On_Non_Local_Exception | -- -gnatw.x
X.Warn_On_Object_Renames_Function | -- -gnatw.r
X.Warn_On_Obsolescent_Feature | -- -gnatwj
X.Warn_On_Overlap | -- -gnatw.i
X.Warn_On_Parameter_Order | -- -gnatw.p
X.Warn_On_Questionable_Missing_Parens | -- -gnatwq
X.Warn_On_Redundant_Constructs | -- -gnatwr
X.Warn_On_Reverse_Bit_Order | -- -gnatw.v
X.Warn_On_Size_Alignment | -- -gnatw.z
X.Warn_On_Suspicious_Contract | -- -gnatw.t
X.Warn_On_Suspicious_Modulus_Value | -- -gnatw.m
X.Warn_On_Unchecked_Conversion | -- -gnatwz
X.Warn_On_Unrecognized_Pragma | -- -gnatwg
X.Warn_On_Unrepped_Components => -- -gnatw.c
True,
others => False);
----------------------
-- Restore_Warnings --
----------------------
procedure Restore_Warnings (W : Warnings_State) is
begin
Warning_Flags := W;
end Restore_Warnings;
-------------------
-- Save_Warnings --
-------------------
function Save_Warnings return Warnings_State is
begin
return Warning_Flags;
end Save_Warnings;
----------------------------
-- Set_GNAT_Mode_Warnings --
----------------------------
procedure Set_GNAT_Mode_Warnings is
begin
-- Set -gnatwa warnings and no others
Warning_Flags := (Warning_Flags and not All_Warnings) or WA_Warnings;
-- These warnings are added to the -gnatwa set
Address_Clause_Overlay_Warnings := True;
Warn_On_Questionable_Layout := True;
Warn_On_Overridden_Size := True;
-- These warnings are removed from the -gnatwa set
Implementation_Unit_Warnings := False;
Warn_On_Non_Local_Exception := False;
No_Warn_On_Non_Local_Exception := True;
Warn_On_Reverse_Bit_Order := False;
Warn_On_Size_Alignment := False;
Warn_On_Unrepped_Components := False;
end Set_GNAT_Mode_Warnings;
------------------------
-- Set_Warning_Switch --
------------------------
function Set_Warning_Switch
(Family : Warning_Family; C : Character) return Boolean
is
L : constant Character := To_Lower (C);
begin
-- Error case
if L not in Lowercase
or else Switch_To_Flag_Mapping (Family, L) = No_Such_Warning
then
if Ignore_Unrecognized_VWY_Switches then
declare
Family_Switch : constant String :=
(case Family is
when Plain => "", when '.' => ".", when '_' => "_");
begin
Write_Line
("unrecognized switch -gnatw" & Family_Switch & C &
" ignored");
end;
return True;
else
return False;
end if;
end if;
-- Special cases that don't fall into the normal pattern below
if Switch_To_Flag_Mapping (Family, L) = Special_Case then
case Family is
when Plain =>
case C is
when 'a' =>
-- "or" in the -gnatwa flags, possibly leaving others set
Warning_Flags := Warning_Flags or WA_Warnings;
when 'A' =>
-- Turn off the All_Warnings flags, except that
-- No_Warn_On_Non_Local_Exception is a special case.
Warning_Flags := Warning_Flags and not All_Warnings;
No_Warn_On_Non_Local_Exception := True;
when 'e' =>
Warning_Mode := Treat_As_Error;
when 'E' =>
Warning_Mode := Treat_Run_Time_Warnings_As_Errors;
when 'n' =>
Warning_Mode := Normal;
when 's' =>
Warning_Mode := Suppress;
when 'u' =>
Check_Unreferenced := True;
Check_Withs := True;
Check_Unreferenced_Formals := True;
when 'U' =>
Check_Unreferenced := False;
Check_Withs := False;
Check_Unreferenced_Formals := False;
when 'y' =>
Warn_On_Ada_2005_Compatibility := True;
Warn_On_Ada_2012_Compatibility := True;
when 'Y' =>
Warn_On_Ada_2005_Compatibility := False;
Warn_On_Ada_2012_Compatibility := False;
when others => raise Program_Error;
end case;
when '.' =>
case C is
when 'e' =>
-- "or" in the All_Warnings flags
Warning_Flags := Warning_Flags or All_Warnings;
when 'g' =>
Set_GNAT_Mode_Warnings;
when 'x' =>
Warn_On_Non_Local_Exception := True;
when 'X' =>
Warn_On_Non_Local_Exception := False;
No_Warn_On_Non_Local_Exception := True;
when others => raise Program_Error;
end case;
when '_' =>
raise Program_Error;
end case;
return True;
end if;
-- Normal pattern (lower case enables the warning, upper case disables
-- the warning).
if C in Lowercase then
Warning_Flags (Switch_To_Flag_Mapping (Family, C)) := True;
elsif L in Lowercase then
Warning_Flags (Switch_To_Flag_Mapping (Family, L)) := False;
else
raise Program_Error;
end if;
return True;
end Set_Warning_Switch;
end Warnsw;