gnat_ugn.texi: Document -gnatw.y/-gnatw.Y.

2013-10-17  Robert Dewar  <dewar@adacore.com>

	* gnat_ugn.texi: Document -gnatw.y/-gnatw.Y.
	* opt.ads (List_Body_Required_Info): New flag.
	* prep.adb: Minor reformatting.
	* sem_ch7.adb (Unit_Requires_Body_Info): New
	procedure (Analyze_Package_Specification): Add call to
	Unit_Requires_Body_Info.
	* ug_words: Add entries for -gnatw.y and -gnatw.Y.
	* usage.adb: Add line for new warning switch -gnatw.y/.Y.
	* vms_data.ads: Add entry for [NO_]WHY_SPEC_NEEDS_BODY warning
	qualifier.
	* warnsw.ads, warnsw.adb: Implement new warning switch -gnatw.y/.Y.

From-SVN: r203748
This commit is contained in:
Robert Dewar 2013-10-17 10:36:08 +00:00 committed by Arnaud Charlet
parent 5114f3ff9a
commit 9877936160
10 changed files with 221 additions and 10 deletions

View File

@ -1,3 +1,17 @@
2013-10-17 Robert Dewar <dewar@adacore.com>
* gnat_ugn.texi: Document -gnatw.y/-gnatw.Y.
* opt.ads (List_Body_Required_Info): New flag.
* prep.adb: Minor reformatting.
* sem_ch7.adb (Unit_Requires_Body_Info): New
procedure (Analyze_Package_Specification): Add call to
Unit_Requires_Body_Info.
* ug_words: Add entries for -gnatw.y and -gnatw.Y.
* usage.adb: Add line for new warning switch -gnatw.y/.Y.
* vms_data.ads: Add entry for [NO_]WHY_SPEC_NEEDS_BODY warning
qualifier.
* warnsw.ads, warnsw.adb: Implement new warning switch -gnatw.y/.Y.
2013-10-17 Yannick Moy <moy@adacore.com>
* sem_ch8.adb (Find_Direct_Name): Keep track of assignments for

View File

@ -5738,6 +5738,25 @@ This warning can also be turned on using @option{-gnatwa}.
This switch suppresses the warnings intended to help in identifying
incompatibilities between Ada language versions.
@item -gnatw.y
@emph{Activate information messages for why package spec needs body}
@cindex @option{-gnatw.y} (@command{gcc})
@cindex Package spec needing body
There are a number of cases in which a package spec needs a body.
For example, the use of pragma Elaborate_Body, or the declaration
of a procedure specification requiring a completion. This switch
causes information messages to be output showing why a package
specification requires a body. This can be useful in the case of
a large package specification which is unexpectedly requiring a
body. The default is that such information messages are not output.
@item -gnatw.Y
@emph{Disable information messages for why package spec needs body}
@cindex @option{-gnatw.Y} (@command{gcc})
@cindex No information messages for why package spec needs body
This switch suppresses the output of information messages showing why
a package specification needs a body.
@item -gnatwz
@emph{Activate warnings on unchecked conversions.}
@cindex @option{-gnatwz} (@command{gcc})

View File

@ -841,6 +841,11 @@ package Opt is
-- Set to True to skip compile and bind steps (except when Bind_Only is
-- set to True).
List_Body_Required_Info : Boolean := False;
-- GNATMAKE
-- List info messages about why a package requires a body. Modified by use
-- of -gnatw.y/.Y.
List_Inherited_Aspects : Boolean := False;
-- GNAT
-- List inherited invariants, preconditions, and postconditions from

View File

@ -284,13 +284,14 @@ package body Prep is
end loop;
end if;
-- And put the value in the result
Result.Is_A_String := False;
-- Even if the value is a string, we still set Is_A_String to False,
-- to avoid adding additional quotes in the preprocessed sources when
-- replacing $<symbol>.
Result.Is_A_String := False;
-- Put the value in the result
Start_String;
Store_String_Chars (Definition (Index + 1 .. Definition'Last));
Result.Value := End_String;

View File

@ -136,6 +136,11 @@ package body Sem_Ch7 is
-- inherited private operation has been overridden, then it's replaced by
-- the overriding operation.
procedure Unit_Requires_Body_Info (P : Entity_Id);
-- Outputs info messages showing why package specification P requires a
-- body. Caller has checked that the switch requesting this information
-- is set, and that the package does indeed require a body.
--------------------------
-- Analyze_Package_Body --
--------------------------
@ -1515,6 +1520,15 @@ package body Sem_Ch7 is
("\pragma Elaborate_Body is required in this case", P);
end;
end if;
-- If switch set, output information on why body required
if List_Body_Required_Info
and then In_Extended_Main_Source_Unit (Id)
and then Unit_Requires_Body (Id)
then
Unit_Requires_Body_Info (Id);
end if;
end Analyze_Package_Specification;
--------------------------------------
@ -1686,8 +1700,8 @@ package body Sem_Ch7 is
and then No (Interface_Alias (Node (Op_Elmt_2)))
then
-- The private inherited operation has been
-- overridden by an explicit subprogram: replace
-- the former by the latter.
-- overridden by an explicit subprogram:
-- replace the former by the latter.
New_Op := Node (Op_Elmt_2);
Replace_Elmt (Op_Elmt, New_Op);
@ -2748,4 +2762,135 @@ package body Sem_Ch7 is
return False;
end Unit_Requires_Body;
-----------------------------
-- Unit_Requires_Body_Info --
-----------------------------
procedure Unit_Requires_Body_Info (P : Entity_Id) is
E : Entity_Id;
begin
-- Imported entity never requires body. Right now, only subprograms can
-- be imported, but perhaps in the future we will allow import of
-- packages.
if Is_Imported (P) then
return;
-- Body required if library package with pragma Elaborate_Body
elsif Has_Pragma_Elaborate_Body (P) then
Error_Msg_N
("?Y?info: & requires body (Elaborate_Body)", P);
-- Body required if subprogram
elsif Is_Subprogram (P) or else Is_Generic_Subprogram (P) then
Error_Msg_N ("?Y?info: & requires body (subprogram case)", P);
-- Body required if generic parent has Elaborate_Body
elsif Ekind (P) = E_Package
and then Nkind (Parent (P)) = N_Package_Specification
and then Present (Generic_Parent (Parent (P)))
then
declare
G_P : constant Entity_Id := Generic_Parent (Parent (P));
begin
if Has_Pragma_Elaborate_Body (G_P) then
Error_Msg_N
("?Y?info: & requires body (generic parent Elaborate_Body)",
P);
end if;
end;
-- A [generic] package that introduces at least one non-null abstract
-- state requires completion. However, there is a separate rule that
-- requires that such a package have a reason other than this for a
-- body being required (if necessary a pragma Elaborate_Body must be
-- provided). If Ignore_Abstract_State is True, we don't do this check
-- (so we can use Unit_Requires_Body to check for some other reason).
elsif Ekind_In (P, E_Generic_Package, E_Package)
and then Present (Abstract_States (P))
and then
not Is_Null_State (Node (First_Elmt (Abstract_States (P))))
then
Error_Msg_N
("?Y?info: & requires body (non-null abstract state aspect)",
P);
end if;
-- Otherwise search entity chain for entity requiring completion
E := First_Entity (P);
while Present (E) loop
-- Always ignore child units. Child units get added to the entity
-- list of a parent unit, but are not original entities of the
-- parent, and so do not affect whether the parent needs a body.
if Is_Child_Unit (E) then
null;
-- Ignore formal packages and their renamings
elsif Ekind (E) = E_Package
and then Nkind (Original_Node (Unit_Declaration_Node (E))) =
N_Formal_Package_Declaration
then
null;
-- Otherwise test to see if entity requires a completion.
-- Note that subprogram entities whose declaration does not come
-- from source are ignored here on the basis that we assume the
-- expander will provide an implicit completion at some point.
elsif (Is_Overloadable (E)
and then Ekind (E) /= E_Enumeration_Literal
and then Ekind (E) /= E_Operator
and then not Is_Abstract_Subprogram (E)
and then not Has_Completion (E)
and then Comes_From_Source (Parent (E)))
or else
(Ekind (E) = E_Package
and then E /= P
and then not Has_Completion (E)
and then Unit_Requires_Body (E))
or else
(Ekind (E) = E_Incomplete_Type
and then No (Full_View (E))
and then not Is_Generic_Type (E))
or else
(Ekind_In (E, E_Task_Type, E_Protected_Type)
and then not Has_Completion (E))
or else
(Ekind (E) = E_Generic_Package
and then E /= P
and then not Has_Completion (E)
and then Unit_Requires_Body (E))
or else
(Is_Generic_Subprogram (E)
and then not Has_Completion (E))
then
Error_Msg_Node_2 := E;
Error_Msg_NE
("?Y?info: & requires body (& requires completion)",
E, P);
-- Entity that does not require completion
else
null;
end if;
Next_Entity (E);
end loop;
end Unit_Requires_Body_Info;
end Sem_Ch7;

View File

@ -204,6 +204,8 @@ gcc -c ^ GNAT COMPILE
-gnatw.X ^ /WARNINGS=NOLOCAL_RAISE_HANDLING
-gnatwy ^ /WARNINGS=ADA_2005_COMPATIBILITY
-gnatwY ^ /WARNINGS=NOADA_2005_COMPATIBILITY
-gnatw.y ^ /WARNINGS=WHY_SPEC_NEEDS_BODY
-gnatw.Y ^ /WARNINGS=NOWHY_SPEC_NEEDS_BODY
-gnatwz ^ /WARNINGS=UNCHECKED_CONVERSIONS
-gnatwZ ^ /WARNINGS=NOUNCHECKED_CONVERSIONS
-gnatW8 ^ /WIDE_CHARACTER_ENCODING=UTF8

View File

@ -576,6 +576,8 @@ begin
Write_Line (" .X* turn off warnings for non-local exception");
Write_Line (" y*+ turn on warnings for Ada compatibility issues");
Write_Line (" Y turn off warnings for Ada compatibility issues");
Write_Line (" .y turn on info messages for why pkg body needed");
Write_Line (" .Y* turn off info messages for why pkg body needed");
Write_Line (" z*+ turn on warnings for suspicious " &
"unchecked conversion");
Write_Line (" Z turn off warnings for suspicious " &

View File

@ -3222,6 +3222,10 @@ package VMS_Data is
"-gnatwy " &
"NOADA_2005_COMPATIBILITY " &
"-gnatwY " &
"WHY_SPEC_NEEDS_BODY " &
"-gnatw.y " &
"NO_WHY_SPEC_NEEDS_BODY " &
"-gnatw.Y " &
"UNCHECKED_CONVERSIONS " &
"-gnatwz " &
"NOUNCHECKED_CONVERSIONS " &
@ -3487,12 +3491,11 @@ package VMS_Data is
-- VARIABLES_UNINITIALIZED Activates warnings on unassigned variables.
-- Causes warnings to be generated when a variable
-- is accessed which may not be properly
-- uninitialized.
-- The default is that such warnings are
-- generated.
-- uninitialized. The default is that such
-- warnings are generated.
--
-- NOVARIABLES_UNINITIALIZED Suppress warnings for uninitialized
-- variables.
-- NOVARIABLES_UNINITIALIZED
-- Suppress warnings for uninitialized variables.
--
-- TAG_WARNINGS Causes the string [xxx] to be added to warnings
-- that are controlled by the warning string xxx,
@ -3500,6 +3503,12 @@ package VMS_Data is
-- by default, the tag is [enabled by default].
--
-- NOTAG_WARNINGS Turns off warning tag output (default setting).
--
-- WHY_SPEC_NEEDS_BODY Generates information messages showing why a
-- package specification requires a body.
--
-- NO_WHY_SPEC_NEEDS_BODY Turns off information messages showing why a
-- package specification requires a body.
S_GCC_WarnX : aliased constant S := "/NOWARNINGS " &
"-gnatws";

View File

@ -51,6 +51,8 @@ package body Warnsw is
W.Implementation_Unit_Warnings;
Ineffective_Inline_Warnings :=
W.Ineffective_Inline_Warnings;
List_Body_Required_Info :=
W.List_Body_Required_Info;
List_Inherited_Aspects :=
W.List_Inherited_Aspects;
Warning_Doc_Switch :=
@ -145,6 +147,8 @@ package body Warnsw is
Implementation_Unit_Warnings;
W.Ineffective_Inline_Warnings :=
Ineffective_Inline_Warnings;
W.List_Body_Required_Info :=
List_Body_Required_Info;
W.List_Inherited_Aspects :=
List_Inherited_Aspects;
W.Warning_Doc_Switch :=
@ -257,6 +261,7 @@ package body Warnsw is
Elab_Warnings := True;
Implementation_Unit_Warnings := True;
Ineffective_Inline_Warnings := True;
List_Body_Required_Info := True;
List_Inherited_Aspects := True;
Warning_Doc_Switch := True;
Warn_On_Ada_2005_Compatibility := True;
@ -386,6 +391,12 @@ package body Warnsw is
Warn_On_Non_Local_Exception := False;
No_Warn_On_Non_Local_Exception := True;
when 'y' =>
List_Body_Required_Info := True;
when 'Y' =>
List_Body_Required_Info := False;
when others =>
if Ignore_Unrecognized_VWY_Switches then
Write_Line ("unrecognized switch -gnatw." & C & " ignored");
@ -411,6 +422,7 @@ package body Warnsw is
Elab_Warnings := False;
Implementation_Unit_Warnings := False;
Ineffective_Inline_Warnings := True;
List_Body_Required_Info := False;
List_Inherited_Aspects := False;
Warning_Doc_Switch := False;
Warn_On_Ada_2005_Compatibility := True;
@ -492,6 +504,7 @@ package body Warnsw is
Elab_Warnings := False;
Implementation_Unit_Warnings := False;
Ineffective_Inline_Warnings := False;
List_Body_Required_Info := False;
List_Inherited_Aspects := False;
Warning_Doc_Switch := False;
Warn_On_Ada_2005_Compatibility := False;

View File

@ -68,6 +68,7 @@ package Warnsw is
Elab_Warnings : Boolean;
Implementation_Unit_Warnings : Boolean;
Ineffective_Inline_Warnings : Boolean;
List_Body_Required_Info : Boolean;
List_Inherited_Aspects : Boolean;
Warning_Doc_Switch : Boolean;
Warn_On_Ada_2005_Compatibility : Boolean;