Commit aaf31e16 by Arnaud Charlet

[multiple changes]

2010-06-18  Pascal Obry  <obry@adacore.com>

	* make.adb, prj-nmsc.adb: Fix source filenames casing in debug output.

2010-06-18  Vincent Celier  <celier@adacore.com>

	* gnatcmd.adb: For gnatcheck, add -gnatec= switch for a global
	configuration pragmas file and, if -U is not used, for a local one.

2010-06-18  Ed Schonberg  <schonberg@adacore.com>

	* sem_elim.adb (Check_Eliminated): Use full information on entity name
	when it is given in the pragma by a selected component.
	(Check_For_Eliminated_Subprogram): Do no emit error if within a
	instance body that is itself within a generic unit.
	* sem_ch12.adb (Analyze_Subprogram_Instance): If the subprogram is
	eliminated, mark as well the anonymous subprogram that is its alias
	and appears within the wrapper package.

From-SVN: r160986
parent 175d6559
2010-06-18 Pascal Obry <obry@adacore.com>
* make.adb, prj-nmsc.adb: Fix source filenames casing in debug output.
2010-06-18 Vincent Celier <celier@adacore.com>
* gnatcmd.adb: For gnatcheck, add -gnatec= switch for a global
configuration pragmas file and, if -U is not used, for a local one.
2010-06-18 Ed Schonberg <schonberg@adacore.com>
* sem_elim.adb (Check_Eliminated): Use full information on entity name
when it is given in the pragma by a selected component.
(Check_For_Eliminated_Subprogram): Do no emit error if within a
instance body that is itself within a generic unit.
* sem_ch12.adb (Analyze_Subprogram_Instance): If the subprogram is
eliminated, mark as well the anonymous subprogram that is its alias
and appears within the wrapper package.
2010-06-18 Bob Duff <duff@adacore.com> 2010-06-18 Bob Duff <duff@adacore.com>
* g-pehage.ads, g-pehage.adb (Produce): Clean up some of the code. * g-pehage.ads, g-pehage.adb (Produce): Clean up some of the code.
......
...@@ -6,7 +6,7 @@ ...@@ -6,7 +6,7 @@
-- -- -- --
-- B o d y -- -- B o d y --
-- -- -- --
-- Copyright (C) 1996-2009, Free Software Foundation, Inc. -- -- Copyright (C) 1996-2010, Free Software Foundation, Inc. --
-- -- -- --
-- GNAT is free software; you can redistribute it and/or modify it under -- -- 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- -- -- terms of the GNU General Public License as published by the Free Soft- --
...@@ -122,6 +122,7 @@ procedure GNATCmd is ...@@ -122,6 +122,7 @@ procedure GNATCmd is
Naming_String : constant SA := new String'("naming"); Naming_String : constant SA := new String'("naming");
Binder_String : constant SA := new String'("binder"); Binder_String : constant SA := new String'("binder");
Builder_String : constant SA := new String'("builder");
Compiler_String : constant SA := new String'("compiler"); Compiler_String : constant SA := new String'("compiler");
Check_String : constant SA := new String'("check"); Check_String : constant SA := new String'("check");
Synchronize_String : constant SA := new String'("synchronize"); Synchronize_String : constant SA := new String'("synchronize");
...@@ -139,7 +140,8 @@ procedure GNATCmd is ...@@ -139,7 +140,8 @@ procedure GNATCmd is
new String_List'((Naming_String, Binder_String)); new String_List'((Naming_String, Binder_String));
Packages_To_Check_By_Check : constant String_List_Access := Packages_To_Check_By_Check : constant String_List_Access :=
new String_List'((Naming_String, Check_String, Compiler_String)); new String_List'
((Naming_String, Builder_String, Check_String, Compiler_String));
Packages_To_Check_By_Sync : constant String_List_Access := Packages_To_Check_By_Sync : constant String_List_Access :=
new String_List'((Naming_String, Synchronize_String, Compiler_String)); new String_List'((Naming_String, Synchronize_String, Compiler_String));
...@@ -363,7 +365,7 @@ procedure GNATCmd is ...@@ -363,7 +365,7 @@ procedure GNATCmd is
if Add_Sources then if Add_Sources then
-- For gnatcheck, gnatpp and gnatmetric , create a temporary file -- For gnatcheck, gnatpp and gnatmetric, create a temporary file
-- and put the list of sources in it. -- and put the list of sources in it.
if The_Command = Check or else if The_Command = Check or else
...@@ -2198,6 +2200,87 @@ begin ...@@ -2198,6 +2200,87 @@ begin
Add_To_Carg_Switches Add_To_Carg_Switches
(new String'("-gnatem=" & Get_Name_String (M_File))); (new String'("-gnatem=" & Get_Name_String (M_File)));
end if; end if;
-- For gnatcheck, also indicate a global configuration pragmas
-- file and, if -U is not used, a local one.
if The_Command = Check then
declare
Pkg : constant Prj.Package_Id :=
Prj.Util.Value_Of
(Name => Name_Builder,
In_Packages => Project.Decl.Packages,
In_Tree => Project_Tree);
Variable : Variable_Value :=
Prj.Util.Value_Of
(Name => No_Name,
Attribute_Or_Array_Name =>
Name_Global_Configuration_Pragmas,
In_Package => Pkg,
In_Tree => Project_Tree);
begin
if (Variable = Nil_Variable_Value or else
Length_Of_Name (Variable.Value) = 0)
and then Pkg /= No_Package
then
Variable :=
Prj.Util.Value_Of
(Name => Name_Ada,
Attribute_Or_Array_Name => Name_Global_Config_File,
In_Package => Pkg,
In_Tree => Project_Tree);
end if;
if Variable /= Nil_Variable_Value and then
Length_Of_Name (Variable.Value) /= 0
then
Add_To_Carg_Switches
(new String'
("-gnatec=" & Get_Name_String (Variable.Value)));
end if;
end;
if not All_Projects then
declare
Pkg : constant Prj.Package_Id :=
Prj.Util.Value_Of
(Name => Name_Compiler,
In_Packages => Project.Decl.Packages,
In_Tree => Project_Tree);
Variable : Variable_Value :=
Prj.Util.Value_Of
(Name => No_Name,
Attribute_Or_Array_Name =>
Name_Local_Configuration_Pragmas,
In_Package => Pkg,
In_Tree => Project_Tree);
begin
if (Variable = Nil_Variable_Value or else
Length_Of_Name (Variable.Value) = 0)
and then Pkg /= No_Package
then
Variable :=
Prj.Util.Value_Of
(Name => Name_Ada,
Attribute_Or_Array_Name =>
Name_Local_Config_File,
In_Package => Pkg,
In_Tree => Project_Tree);
end if;
if Variable /= Nil_Variable_Value and then
Length_Of_Name (Variable.Value) /= 0
then
Add_To_Carg_Switches
(new String'
("-gnatec=" &
Get_Name_String (Variable.Value)));
end if;
end;
end if;
end if;
end; end;
end if; end if;
......
...@@ -1395,7 +1395,7 @@ package body Make is ...@@ -1395,7 +1395,7 @@ package body Make is
if Project_Of_Current_Object_Directory /= Project then if Project_Of_Current_Object_Directory /= Project then
Project_Of_Current_Object_Directory := Project; Project_Of_Current_Object_Directory := Project;
Object_Directory := Project.Object_Directory.Name; Object_Directory := Project.Object_Directory.Display_Name;
-- Set the working directory to the object directory of the actual -- Set the working directory to the object directory of the actual
-- project. -- project.
...@@ -6078,7 +6078,7 @@ package body Make is ...@@ -6078,7 +6078,7 @@ package body Make is
exception exception
when others => when others =>
-- Delete the temporary mapping file, if one was created. -- Delete the temporary mapping file, if one was created
if Mapping_Path /= No_Path then if Mapping_Path /= No_Path then
Delete_Temporary_File (Project_Tree, Mapping_Path); Delete_Temporary_File (Project_Tree, Mapping_Path);
......
...@@ -703,7 +703,7 @@ package body Prj.Nmsc is ...@@ -703,7 +703,7 @@ package body Prj.Nmsc is
if Current_Verbosity = High then if Current_Verbosity = High then
Write_Str ("Adding source File: "); Write_Str ("Adding source File: ");
Write_Str (Get_Name_String (File_Name)); Write_Str (Get_Name_String (Display_File));
if Index /= 0 then if Index /= 0 then
Write_Str (" at" & Index'Img); Write_Str (" at" & Index'Img);
...@@ -813,8 +813,8 @@ package body Prj.Nmsc is ...@@ -813,8 +813,8 @@ package body Prj.Nmsc is
----------- -----------
procedure Check procedure Check
(Project : Project_Id; (Project : Project_Id;
Data : in out Tree_Processing_Data) Data : in out Tree_Processing_Data)
is is
Specs : Array_Element_Id; Specs : Array_Element_Id;
Bodies : Array_Element_Id; Bodies : Array_Element_Id;
...@@ -4883,7 +4883,7 @@ package body Prj.Nmsc is ...@@ -4883,7 +4883,7 @@ package body Prj.Nmsc is
if not Removed and then List = Nil_String then if not Removed and then List = Nil_String then
if Current_Verbosity = High then if Current_Verbosity = High then
Write_Str (" Adding Source Dir="); Write_Str (" Adding Source Dir=");
Write_Line (Get_Name_String (Path_Id)); Write_Line (Get_Name_String (Display_Path_Id));
end if; end if;
String_Element_Table.Increment_Last (Data.Tree.String_Elements); String_Element_Table.Increment_Last (Data.Tree.String_Elements);
...@@ -6845,7 +6845,9 @@ package body Prj.Nmsc is ...@@ -6845,7 +6845,9 @@ package body Prj.Nmsc is
begin begin
if Current_Verbosity = High then if Current_Verbosity = High then
Write_Attr ("Source_Dir", Source_Directory); Write_Attr
("Source_Dir",
Source_Directory (Source_Directory'First .. Dir_Last));
Write_Line (Num_Nod.Number'Img); Write_Line (Num_Nod.Number'Img);
end if; end if;
...@@ -7382,7 +7384,7 @@ package body Prj.Nmsc is ...@@ -7382,7 +7384,7 @@ package body Prj.Nmsc is
while Current /= Nil_String loop while Current /= Nil_String loop
Element := In_Tree.String_Elements.Table (Current); Element := In_Tree.String_Elements.Table (Current);
Write_Str (" "); Write_Str (" ");
Write_Line (Get_Name_String (Element.Value)); Write_Line (Get_Name_String (Element.Display_Value));
Current := Element.Next; Current := Element.Next;
end loop; end loop;
......
...@@ -4005,11 +4005,14 @@ package body Sem_Ch12 is ...@@ -4005,11 +4005,14 @@ package body Sem_Ch12 is
-- If the instance is a child unit, mark the Id accordingly. Mark -- If the instance is a child unit, mark the Id accordingly. Mark
-- the anonymous entity as well, which is the real subprogram and -- the anonymous entity as well, which is the real subprogram and
-- which is used when the instance appears in a context clause. -- which is used when the instance appears in a context clause.
-- Similarly, propagate the Is_Eliminated flag to handle properly
-- nested eliminated subprograms.
Set_Is_Child_Unit (Act_Decl_Id, Is_Child_Unit (Defining_Entity (N))); Set_Is_Child_Unit (Act_Decl_Id, Is_Child_Unit (Defining_Entity (N)));
Set_Is_Child_Unit (Anon_Id, Is_Child_Unit (Defining_Entity (N))); Set_Is_Child_Unit (Anon_Id, Is_Child_Unit (Defining_Entity (N)));
New_Overloaded_Entity (Act_Decl_Id); New_Overloaded_Entity (Act_Decl_Id);
Check_Eliminated (Act_Decl_Id); Check_Eliminated (Act_Decl_Id);
Set_Is_Eliminated (Anon_Id, Is_Eliminated (Act_Decl_Id));
-- In compilation unit case, kill elaboration checks on the -- In compilation unit case, kill elaboration checks on the
-- instantiation, since they are never needed -- the body is -- instantiation, since they are never needed -- the body is
......
...@@ -29,6 +29,7 @@ with Errout; use Errout; ...@@ -29,6 +29,7 @@ with Errout; use Errout;
with Lib; use Lib; with Lib; use Lib;
with Namet; use Namet; with Namet; use Namet;
with Nlists; use Nlists; with Nlists; use Nlists;
with Opt; use Opt;
with Sem; use Sem; with Sem; use Sem;
with Sem_Prag; use Sem_Prag; with Sem_Prag; use Sem_Prag;
with Sem_Util; use Sem_Util; with Sem_Util; use Sem_Util;
...@@ -287,7 +288,8 @@ package body Sem_Elim is ...@@ -287,7 +288,8 @@ package body Sem_Elim is
goto Continue; goto Continue;
end if; end if;
-- Find enclosing unit -- Find enclosing unit, and verify that its name and those of its
-- parents match.
Scop := Cunit_Entity (Current_Sem_Unit); Scop := Cunit_Entity (Current_Sem_Unit);
...@@ -329,9 +331,6 @@ package body Sem_Elim is ...@@ -329,9 +331,6 @@ package body Sem_Elim is
end if; end if;
Scop := Scope (Scop); Scop := Scope (Scop);
while Ekind (Scop) = E_Block loop
Scop := Scope (Scop);
end loop;
if Scop /= Standard_Standard and then J = 1 then if Scop /= Standard_Standard and then J = 1 then
goto Continue; goto Continue;
...@@ -342,8 +341,60 @@ package body Sem_Elim is ...@@ -342,8 +341,60 @@ package body Sem_Elim is
goto Continue; goto Continue;
end if; end if;
-- Check for case of given entity is a library level subprogram if Present (Elmt.Entity_Node)
-- and we have the single parameter Eliminate case, a match! and then Elmt.Entity_Scope /= null
then
-- Check that names of enclosing scopes match.
-- Skip blocks and wrapper package of subprogram instances,
-- which do not appear in the pragma.
Scop := Scope (E);
for J in reverse Elmt.Entity_Scope'Range loop
while Ekind (Scop) = E_Block
or else
(Ekind (Scop) = E_Package
and then Is_Wrapper_Package (Scop))
loop
Scop := Scope (Scop);
end loop;
if Elmt.Entity_Scope (J) /= Chars (Scop) then
if Ekind (Scop) /= E_Protected_Type
or else Comes_From_Source (Scop)
then
goto Continue;
-- For simple protected declarations, retrieve the source
-- name of the object, which appeared in the Eliminate
-- pragma.
else
declare
Decl : constant Node_Id :=
Original_Node (Parent (Scop));
begin
if Elmt.Entity_Scope (J) /=
Chars (Defining_Identifier (Decl))
then
if J > 0 then
null;
end if;
goto Continue;
end if;
end;
end if;
end if;
Scop := Scope (Scop);
end loop;
end if;
-- If given entity is a library level subprogram and pragma had a
-- single parameter, a match!
if Is_Compilation_Unit (E) if Is_Compilation_Unit (E)
and then Is_Subprogram (E) and then Is_Subprogram (E)
...@@ -672,7 +723,15 @@ package body Sem_Elim is ...@@ -672,7 +723,15 @@ package body Sem_Elim is
Enclosing_Subp := Enclosing_Subprogram (Enclosing_Subp); Enclosing_Subp := Enclosing_Subprogram (Enclosing_Subp);
end loop; end loop;
Eliminate_Error_Msg (N, Ultimate_Subp); -- Emit error, unless we are within an instance body and
-- the expander is disabled, which indicates an instance
-- within an enclosing generic.
if In_Instance_Body and then not Expander_Active then
null;
else
Eliminate_Error_Msg (N, Ultimate_Subp);
end if;
end if; end if;
end Check_For_Eliminated_Subprogram; end Check_For_Eliminated_Subprogram;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment