re PR ada/20300 (ICE on undefined value of type derived from Character)

2005-03-29  Gary Dismukes  <dismukes@adacore.com>
	    Robert Dewar  <dewar@adacore.com>

	* exp_intr.adb (Expand_Dispatching_Constructor_Call): New procedure to
	expand a call to an instance of
	Ada.Tags.Generic_Dispatching_Constructor into a dispatching call to the
	Constructor actual of the instance. A class-wide membership
	check is also generated, to ensure that the tag passed to the instance
	denotes a type in the class.
	(Expand_Intrinsic_Call): Call Expand_Dispatching_Constructor in the case
	of Name_Generic_Dispatching_Constructor.

	* Makefile.rtl: Add a-tgdico.ads to the list of library units (new Ada
	05 unit for AI-260-02).

	* a-tgdico.ads: New file.

	* impunit.adb (Non_Imp_File_Names_05): Add entry "a-tgdico" for new
	predefined Ada 05 generic unit Ada.Tags.Generic_Dispatching_Constructor.

	* snames.ads, snames.adb (Preset_Names): Add entry for
	Generic_Dispatching_Constructor.

	PR ada/20300

	* sem_ch8.adb (Find_Direct_Name): Go to root type for check of
	character type cases.
	(Analyze_Subprogram_Renaming): Add special handling for
	the case of renaming of stream attributes when the renaming denotes a
	generic formal subprogram association for an abstract formal subprogram.
	Check that the attribute is a primitive stream attribute (and not
	a class-wide stream attribute) and then rewrite the attribute name
	as the name of the appropriate compiler-generated stream primitive.

From-SVN: r97172
This commit is contained in:
Gary Dismukes 2005-03-29 18:15:45 +02:00 committed by Arnaud Charlet
parent c857f5ed55
commit d239991ff6
7 changed files with 294 additions and 111 deletions

View File

@ -212,6 +212,7 @@ GNATRTL_NONTASKING_OBJS= \
a-szunha$(objext) \
a-szuzti$(objext) \
a-tags$(objext) \
a-tgdico$(objext) \
a-teioed$(objext) \
a-textio$(objext) \
a-ticoau$(objext) \

29
gcc/ada/a-tgdico.ads Normal file
View File

@ -0,0 +1,29 @@
------------------------------------------------------------------------------
-- --
-- GNAT COMPILER COMPONENTS --
-- --
-- ADA.TAGS.GENERIC_DISPATCHING_CONSTRUCTOR --
-- --
-- S p e c --
-- --
-- This specification is adapted from the Ada Reference Manual for use with --
-- GNAT. In accordance with the copyright of that document, you can freely --
-- copy and modify this specification, provided that if you redistribute a --
-- modified version, any changes that you have made are clearly indicated. --
-- --
------------------------------------------------------------------------------
generic
type T (<>) is abstract tagged limited private;
type Parameters (<>) is limited private;
with function Constructor (Params : access Parameters) return T is abstract;
function Ada.Tags.Generic_Dispatching_Constructor
(The_Tag : Tag; Params : access Parameters) return T'Class;
-- pragma Preelaborate (Generic_Dispatching_Constructor);
-- Commented out temporarily because various other predefined units do not
-- yet have proper categorization as specified by AI-362 (such as Ada.Tags,
-- Ada.Exceptions, etc.).
pragma Import (Intrinsic, Generic_Dispatching_Constructor);

View File

@ -26,11 +26,13 @@
with Atree; use Atree;
with Einfo; use Einfo;
with Elists; use Elists;
with Errout; use Errout;
with Exp_Ch4; use Exp_Ch4;
with Exp_Ch7; use Exp_Ch7;
with Exp_Ch11; use Exp_Ch11;
with Exp_Code; use Exp_Code;
with Exp_Disp; use Exp_Disp;
with Exp_Fixd; use Exp_Fixd;
with Exp_Util; use Exp_Util;
with Itypes; use Itypes;
@ -61,6 +63,13 @@ package body Exp_Intr is
procedure Expand_Is_Negative (N : Node_Id);
-- Expand a call to the intrinsic Is_Negative function
procedure Expand_Dispatching_Constructor_Call (N : Node_Id);
-- Expand a call to an instantiation of Generic_Dispatching_Constructor
-- into a dispatching call to the actual subprogram associated with the
-- Constructor formal subprogram, passing it the Parameters actual of
-- the call to the instantiation and dispatching based on call's Tag
-- parameter.
procedure Expand_Exception_Call (N : Node_Id; Ent : RE_Id);
-- Expand a call to Exception_Information/Message/Name. The first
-- parameter, N, is the node for the function call, and Ent is the
@ -96,6 +105,77 @@ package body Exp_Intr is
-- Name_Source_Location - expand string of form file:line
-- Name_Enclosing_Entity - expand string with name of enclosing entity
-----------------------------------------
-- Expand_Dispatching_Constructor_Call --
-----------------------------------------
-- Transform a call to an instantiation of Generic_Dispatching_Constructor
-- of the form:
-- GDC_Instance (The_Tag, Parameters'Access)
-- to a class-wide conversion of a dispatching call to the actual
-- associated with the formal subprogram Construct, designating
-- The_Tag as the controlling tag of the call:
-- T'Class (Construct'Actual (Params)) -- Controlling tag is The_Tag
-- which will eventually be expanded to the following:
-- T'Class (The_Tag.all (Construct'Actual'Index).all (Params))
-- A class-wide membership test is also generated, preceding the call,
-- to ensure that the controlling tag denotes a type in T'Class.
procedure Expand_Dispatching_Constructor_Call (N : Node_Id) is
Loc : constant Source_Ptr := Sloc (N);
Tag_Arg : constant Node_Id := First_Actual (N);
Param_Arg : constant Node_Id := Next_Actual (Tag_Arg);
Subp_Decl : constant Node_Id := Parent (Parent (Entity (Name (N))));
Inst_Pkg : constant Node_Id := Parent (Subp_Decl);
Act_Rename : constant Node_Id :=
Next (Next (First (Visible_Declarations (Inst_Pkg))));
Act_Constr : constant Entity_Id := Entity (Name (Act_Rename));
Result_Typ : constant Entity_Id := Class_Wide_Type (Etype (Act_Constr));
Cnstr_Call : Node_Id;
begin
-- Create the call to the actual Constructor function
Cnstr_Call :=
Make_Function_Call (Loc,
Name => New_Occurrence_Of (Act_Constr, Loc),
Parameter_Associations => New_List (Relocate_Node (Param_Arg)));
-- Establish its controlling tag from the tag passed to the instance
Set_Controlling_Argument (Cnstr_Call, Relocate_Node (Tag_Arg));
-- Rewrite and analyze the call to the instance as a class-wide
-- conversion of the call to the actual constructor.
Rewrite (N, Convert_To (Result_Typ, Cnstr_Call));
Analyze_And_Resolve (N, Etype (Act_Constr));
-- Generate a class-wide membership test to ensure that the call's tag
-- argument denotes a type within the class.
Insert_Action (N,
Make_Implicit_If_Statement (N,
Condition =>
Make_Op_Not (Loc,
Make_DT_Access_Action (Result_Typ,
Action => CW_Membership,
Args => New_List (
Duplicate_Subexpr (Tag_Arg),
New_Reference_To (
Node (First_Elmt (Access_Disp_Table (
Root_Type (Result_Typ)))), Loc)))),
Then_Statements =>
New_List (Make_Raise_Statement (Loc,
New_Occurrence_Of (RTE (RE_Tag_Error), Loc)))));
end Expand_Dispatching_Constructor_Call;
---------------------------
-- Expand_Exception_Call --
---------------------------
@ -236,6 +316,9 @@ package body Exp_Intr is
elsif Nam = Name_Exception_Name then
Expand_Exception_Call (N, RE_Exception_Name_Simple);
elsif Nam = Name_Generic_Dispatching_Constructor then
Expand_Dispatching_Constructor_Call (N);
elsif Nam = Name_Import_Address
or else
Nam = Name_Import_Largest_Value

View File

@ -363,6 +363,7 @@ package body Impunit is
"a-swunha", -- Ada.Strings.Wide_Unbounded.Hash
"a-szmzco", -- Ada.Strings.Wide_Wide_Maps.Wide_Wide_Constants;
"a-szunha", -- Ada.Strings.Wide_Wide_Unbounded.Hash
"a-tgdico", -- Ada.Tags.Generic_Dispatching_Constructor;
"a-tiunio", -- Ada.Text_IO.Unbounded_IO;
"a-wwunio", -- Ada.Wide_Text_IO.Wide_Unbounded_IO;
"a-zttest", -- Ada.Wide_Wide_Text_IO.Text_Streams

View File

@ -29,6 +29,7 @@ with Debug; use Debug;
with Einfo; use Einfo;
with Elists; use Elists;
with Errout; use Errout;
with Exp_Tss; use Exp_Tss;
with Exp_Util; use Exp_Util;
with Fname; use Fname;
with Freeze; use Freeze;
@ -1102,10 +1103,11 @@ package body Sem_Ch8 is
Save_AV : constant Ada_Version_Type := Ada_Version;
Nam : constant Node_Id := Name (N);
New_S : Entity_Id;
Old_S : Entity_Id := Empty;
Old_S : Entity_Id := Empty;
Rename_Spec : Entity_Id;
Is_Actual : Boolean := False;
Inst_Node : Node_Id := Empty;
Formal_Spec : constant Node_Id := Corresponding_Formal_Spec (N);
Is_Actual : constant Boolean := Present (Formal_Spec);
Inst_Node : Node_Id := Empty;
function Original_Subprogram (Subp : Entity_Id) return Entity_Id;
-- Find renamed entity when the declaration is a renaming_as_body
@ -1167,8 +1169,75 @@ package body Sem_Ch8 is
-- is missing an argument when it is analyzed.
if Nkind (Nam) = N_Attribute_Reference then
Attribute_Renaming (N);
return;
-- In the case of an abstract formal subprogram association,
-- rewrite an actual given by a stream attribute as the name
-- of the corresponding stream primitive of the type.
if Is_Actual and then Is_Abstract (Formal_Spec) then
declare
Stream_Prim : Entity_Id;
Prefix_Type : constant Entity_Id := Entity (Prefix (Nam));
begin
-- The class-wide forms of the stream attributes are not
-- primitive dispatching operations (even though they
-- internally dispatch to a stream attribute).
if Is_Class_Wide_Type (Prefix_Type) then
Error_Msg_N
("attribute must be a primitive dispatching operation",
Nam);
return;
end if;
-- Retrieve the primitive subprogram associated with the
-- attribute. This can only be a stream attribute, since
-- those are the only ones that are dispatching (and the
-- actual for an abstract formal subprogram must be a
-- dispatching operation).
case Attribute_Name (Nam) is
when Name_Input =>
Stream_Prim :=
Find_Prim_Op (Prefix_Type, TSS_Stream_Input);
when Name_Output =>
Stream_Prim :=
Find_Prim_Op (Prefix_Type, TSS_Stream_Output);
when Name_Read =>
Stream_Prim :=
Find_Prim_Op (Prefix_Type, TSS_Stream_Read);
when Name_Write =>
Stream_Prim :=
Find_Prim_Op (Prefix_Type, TSS_Stream_Write);
when others =>
Error_Msg_N
("attribute must be a primitive dispatching operation",
Nam);
return;
end case;
-- Rewrite the attribute into the name of its corresponding
-- primitive dispatching subprogram. We can then proceed with
-- the usual processing for subprogram renamings.
declare
Prim_Name : constant Node_Id :=
Make_Identifier (Sloc (Nam),
Chars => Chars (Stream_Prim));
begin
Set_Entity (Prim_Name, Stream_Prim);
Rewrite (Nam, Prim_Name);
Analyze (Nam);
end;
end;
-- Normal processing for a renaming of an attribute
else
Attribute_Renaming (N);
return;
end if;
end if;
-- Check whether this declaration corresponds to the instantiation
@ -1183,9 +1252,8 @@ package body Sem_Ch8 is
-- is determined in Find_Renamed_Entity. If the entity is an operator,
-- Find_Renamed_Entity applies additional visibility checks.
if Present (Corresponding_Formal_Spec (N)) then
Is_Actual := True;
Inst_Node := Unit_Declaration_Node (Corresponding_Formal_Spec (N));
if Is_Actual then
Inst_Node := Unit_Declaration_Node (Formal_Spec);
if Is_Entity_Name (Nam)
and then Present (Entity (Nam))
@ -1477,9 +1545,7 @@ package body Sem_Ch8 is
-- indicate that the renaming is an abstract dispatching operation
-- with a controlling type.
if Is_Actual
and then Is_Abstract (Corresponding_Formal_Spec (N))
then
if Is_Actual and then Is_Abstract (Formal_Spec) then
-- Mark the renaming as abstract here, so Find_Dispatching_Type
-- see it as corresponding to a generic association for a
-- formal abstract subprogram
@ -1547,7 +1613,7 @@ package body Sem_Ch8 is
if (Ekind (Old_S) = E_Procedure or else Ekind (Old_S) = E_Function)
and then Is_Abstract (Old_S)
and then not Is_Abstract (Corresponding_Formal_Spec (N))
and then not Is_Abstract (Formal_Spec)
then
Error_Msg_N
("abstract subprogram not allowed as generic actual", Nam);
@ -2801,14 +2867,15 @@ package body Sem_Ch8 is
Case_Str : constant String := Name_Buffer (1 .. Name_Len);
Case_Stm : constant Node_Id := Parent (Parent (N));
Case_Typ : constant Entity_Id := Etype (Expression (Case_Stm));
Case_Rtp : constant Entity_Id := Root_Type (Case_Typ);
Lit : Node_Id;
begin
if Is_Enumeration_Type (Case_Typ)
and then Case_Typ /= Standard_Character
and then Case_Typ /= Standard_Wide_Character
and then Case_Typ /= Standard_Wide_Wide_Character
and then Case_Rtp /= Standard_Character
and then Case_Rtp /= Standard_Wide_Character
and then Case_Rtp /= Standard_Wide_Wide_Character
then
Lit := First_Literal (Case_Typ);
Get_Name_String (Chars (Lit));

View File

@ -607,6 +607,7 @@ package body Snames is
"exception_message#" &
"exception_name#" &
"file#" &
"generic_dispatching_constructor#" &
"import_address#" &
"import_largest_value#" &
"import_value#" &

View File

@ -880,126 +880,127 @@ package Snames is
-- Note: Asm is missing from this list, since Asm is a legitimate
-- convention name. So is To_Adress, which is a GNAT attribute.
First_Intrinsic_Name : constant Name_Id := N + 544;
Name_Divide : constant Name_Id := N + 544;
Name_Enclosing_Entity : constant Name_Id := N + 545;
Name_Exception_Information : constant Name_Id := N + 546;
Name_Exception_Message : constant Name_Id := N + 547;
Name_Exception_Name : constant Name_Id := N + 548;
Name_File : constant Name_Id := N + 549;
Name_Import_Address : constant Name_Id := N + 550;
Name_Import_Largest_Value : constant Name_Id := N + 551;
Name_Import_Value : constant Name_Id := N + 552;
Name_Is_Negative : constant Name_Id := N + 553;
Name_Line : constant Name_Id := N + 554;
Name_Rotate_Left : constant Name_Id := N + 555;
Name_Rotate_Right : constant Name_Id := N + 556;
Name_Shift_Left : constant Name_Id := N + 557;
Name_Shift_Right : constant Name_Id := N + 558;
Name_Shift_Right_Arithmetic : constant Name_Id := N + 559;
Name_Source_Location : constant Name_Id := N + 560;
Name_Unchecked_Conversion : constant Name_Id := N + 561;
Name_Unchecked_Deallocation : constant Name_Id := N + 562;
Name_To_Pointer : constant Name_Id := N + 563;
Last_Intrinsic_Name : constant Name_Id := N + 563;
First_Intrinsic_Name : constant Name_Id := N + 544;
Name_Divide : constant Name_Id := N + 544;
Name_Enclosing_Entity : constant Name_Id := N + 545;
Name_Exception_Information : constant Name_Id := N + 546;
Name_Exception_Message : constant Name_Id := N + 547;
Name_Exception_Name : constant Name_Id := N + 548;
Name_File : constant Name_Id := N + 549;
Name_Generic_Dispatching_Constructor : constant Name_Id := N + 550;
Name_Import_Address : constant Name_Id := N + 551;
Name_Import_Largest_Value : constant Name_Id := N + 552;
Name_Import_Value : constant Name_Id := N + 553;
Name_Is_Negative : constant Name_Id := N + 554;
Name_Line : constant Name_Id := N + 555;
Name_Rotate_Left : constant Name_Id := N + 556;
Name_Rotate_Right : constant Name_Id := N + 557;
Name_Shift_Left : constant Name_Id := N + 558;
Name_Shift_Right : constant Name_Id := N + 559;
Name_Shift_Right_Arithmetic : constant Name_Id := N + 560;
Name_Source_Location : constant Name_Id := N + 561;
Name_Unchecked_Conversion : constant Name_Id := N + 562;
Name_Unchecked_Deallocation : constant Name_Id := N + 563;
Name_To_Pointer : constant Name_Id := N + 564;
Last_Intrinsic_Name : constant Name_Id := N + 564;
-- Reserved words used only in Ada 95
First_95_Reserved_Word : constant Name_Id := N + 564;
Name_Abstract : constant Name_Id := N + 564;
Name_Aliased : constant Name_Id := N + 565;
Name_Protected : constant Name_Id := N + 566;
Name_Until : constant Name_Id := N + 567;
Name_Requeue : constant Name_Id := N + 568;
Name_Tagged : constant Name_Id := N + 569;
Last_95_Reserved_Word : constant Name_Id := N + 569;
First_95_Reserved_Word : constant Name_Id := N + 565;
Name_Abstract : constant Name_Id := N + 565;
Name_Aliased : constant Name_Id := N + 566;
Name_Protected : constant Name_Id := N + 567;
Name_Until : constant Name_Id := N + 568;
Name_Requeue : constant Name_Id := N + 569;
Name_Tagged : constant Name_Id := N + 570;
Last_95_Reserved_Word : constant Name_Id := N + 570;
subtype Ada_95_Reserved_Words is
Name_Id range First_95_Reserved_Word .. Last_95_Reserved_Word;
-- Miscellaneous names used in semantic checking
Name_Raise_Exception : constant Name_Id := N + 570;
Name_Raise_Exception : constant Name_Id := N + 571;
-- Additional reserved words and identifiers used in GNAT Project Files
-- Note that Name_External is already previously declared
Name_Ada_Roots : constant Name_Id := N + 571;
Name_Binder : constant Name_Id := N + 572;
Name_Binder_Driver : constant Name_Id := N + 573;
Name_Body_Suffix : constant Name_Id := N + 574;
Name_Builder : constant Name_Id := N + 575;
Name_Compiler : constant Name_Id := N + 576;
Name_Compiler_Driver : constant Name_Id := N + 577;
Name_Compiler_Kind : constant Name_Id := N + 578;
Name_Compute_Dependency : constant Name_Id := N + 579;
Name_Cross_Reference : constant Name_Id := N + 580;
Name_Default_Linker : constant Name_Id := N + 581;
Name_Default_Switches : constant Name_Id := N + 582;
Name_Dependency_Option : constant Name_Id := N + 583;
Name_Exec_Dir : constant Name_Id := N + 584;
Name_Executable : constant Name_Id := N + 585;
Name_Executable_Suffix : constant Name_Id := N + 586;
Name_Extends : constant Name_Id := N + 587;
Name_Externally_Built : constant Name_Id := N + 588;
Name_Finder : constant Name_Id := N + 589;
Name_Global_Configuration_Pragmas : constant Name_Id := N + 590;
Name_Gnatls : constant Name_Id := N + 591;
Name_Gnatstub : constant Name_Id := N + 592;
Name_Implementation : constant Name_Id := N + 593;
Name_Implementation_Exceptions : constant Name_Id := N + 594;
Name_Implementation_Suffix : constant Name_Id := N + 595;
Name_Include_Option : constant Name_Id := N + 596;
Name_Language_Processing : constant Name_Id := N + 597;
Name_Languages : constant Name_Id := N + 598;
Name_Library_Dir : constant Name_Id := N + 599;
Name_Library_Auto_Init : constant Name_Id := N + 600;
Name_Library_GCC : constant Name_Id := N + 601;
Name_Library_Interface : constant Name_Id := N + 602;
Name_Library_Kind : constant Name_Id := N + 603;
Name_Library_Name : constant Name_Id := N + 604;
Name_Library_Options : constant Name_Id := N + 605;
Name_Library_Reference_Symbol_File : constant Name_Id := N + 606;
Name_Library_Src_Dir : constant Name_Id := N + 607;
Name_Library_Symbol_File : constant Name_Id := N + 608;
Name_Library_Symbol_Policy : constant Name_Id := N + 609;
Name_Library_Version : constant Name_Id := N + 610;
Name_Linker : constant Name_Id := N + 611;
Name_Local_Configuration_Pragmas : constant Name_Id := N + 612;
Name_Locally_Removed_Files : constant Name_Id := N + 613;
Name_Metrics : constant Name_Id := N + 614;
Name_Naming : constant Name_Id := N + 615;
Name_Object_Dir : constant Name_Id := N + 616;
Name_Pretty_Printer : constant Name_Id := N + 617;
Name_Project : constant Name_Id := N + 618;
Name_Separate_Suffix : constant Name_Id := N + 619;
Name_Source_Dirs : constant Name_Id := N + 620;
Name_Source_Files : constant Name_Id := N + 621;
Name_Source_List_File : constant Name_Id := N + 622;
Name_Spec : constant Name_Id := N + 623;
Name_Spec_Suffix : constant Name_Id := N + 624;
Name_Specification : constant Name_Id := N + 625;
Name_Specification_Exceptions : constant Name_Id := N + 626;
Name_Specification_Suffix : constant Name_Id := N + 627;
Name_Switches : constant Name_Id := N + 628;
Name_Ada_Roots : constant Name_Id := N + 572;
Name_Binder : constant Name_Id := N + 573;
Name_Binder_Driver : constant Name_Id := N + 574;
Name_Body_Suffix : constant Name_Id := N + 575;
Name_Builder : constant Name_Id := N + 576;
Name_Compiler : constant Name_Id := N + 577;
Name_Compiler_Driver : constant Name_Id := N + 578;
Name_Compiler_Kind : constant Name_Id := N + 579;
Name_Compute_Dependency : constant Name_Id := N + 580;
Name_Cross_Reference : constant Name_Id := N + 581;
Name_Default_Linker : constant Name_Id := N + 582;
Name_Default_Switches : constant Name_Id := N + 583;
Name_Dependency_Option : constant Name_Id := N + 584;
Name_Exec_Dir : constant Name_Id := N + 585;
Name_Executable : constant Name_Id := N + 586;
Name_Executable_Suffix : constant Name_Id := N + 587;
Name_Extends : constant Name_Id := N + 588;
Name_Externally_Built : constant Name_Id := N + 589;
Name_Finder : constant Name_Id := N + 590;
Name_Global_Configuration_Pragmas : constant Name_Id := N + 591;
Name_Gnatls : constant Name_Id := N + 592;
Name_Gnatstub : constant Name_Id := N + 593;
Name_Implementation : constant Name_Id := N + 594;
Name_Implementation_Exceptions : constant Name_Id := N + 595;
Name_Implementation_Suffix : constant Name_Id := N + 596;
Name_Include_Option : constant Name_Id := N + 597;
Name_Language_Processing : constant Name_Id := N + 598;
Name_Languages : constant Name_Id := N + 599;
Name_Library_Dir : constant Name_Id := N + 600;
Name_Library_Auto_Init : constant Name_Id := N + 601;
Name_Library_GCC : constant Name_Id := N + 602;
Name_Library_Interface : constant Name_Id := N + 603;
Name_Library_Kind : constant Name_Id := N + 604;
Name_Library_Name : constant Name_Id := N + 605;
Name_Library_Options : constant Name_Id := N + 606;
Name_Library_Reference_Symbol_File : constant Name_Id := N + 607;
Name_Library_Src_Dir : constant Name_Id := N + 608;
Name_Library_Symbol_File : constant Name_Id := N + 609;
Name_Library_Symbol_Policy : constant Name_Id := N + 610;
Name_Library_Version : constant Name_Id := N + 611;
Name_Linker : constant Name_Id := N + 612;
Name_Local_Configuration_Pragmas : constant Name_Id := N + 613;
Name_Locally_Removed_Files : constant Name_Id := N + 614;
Name_Metrics : constant Name_Id := N + 615;
Name_Naming : constant Name_Id := N + 616;
Name_Object_Dir : constant Name_Id := N + 617;
Name_Pretty_Printer : constant Name_Id := N + 618;
Name_Project : constant Name_Id := N + 619;
Name_Separate_Suffix : constant Name_Id := N + 620;
Name_Source_Dirs : constant Name_Id := N + 621;
Name_Source_Files : constant Name_Id := N + 622;
Name_Source_List_File : constant Name_Id := N + 623;
Name_Spec : constant Name_Id := N + 624;
Name_Spec_Suffix : constant Name_Id := N + 625;
Name_Specification : constant Name_Id := N + 626;
Name_Specification_Exceptions : constant Name_Id := N + 627;
Name_Specification_Suffix : constant Name_Id := N + 628;
Name_Switches : constant Name_Id := N + 629;
-- Other miscellaneous names used in front end
Name_Unaligned_Valid : constant Name_Id := N + 629;
Name_Unaligned_Valid : constant Name_Id := N + 630;
-- ----------------------------------------------------------------
First_2005_Reserved_Word : constant Name_Id := N + 630;
Name_Interface : constant Name_Id := N + 630;
Name_Overriding : constant Name_Id := N + 631;
Name_Synchronized : constant Name_Id := N + 632;
Last_2005_Reserved_Word : constant Name_Id := N + 632;
First_2005_Reserved_Word : constant Name_Id := N + 631;
Name_Interface : constant Name_Id := N + 631;
Name_Overriding : constant Name_Id := N + 632;
Name_Synchronized : constant Name_Id := N + 633;
Last_2005_Reserved_Word : constant Name_Id := N + 633;
subtype Ada_2005_Reserved_Words is
Name_Id range First_2005_Reserved_Word .. Last_2005_Reserved_Word;
-- Mark last defined name for consistency check in Snames body
Last_Predefined_Name : constant Name_Id := N + 632;
Last_Predefined_Name : constant Name_Id := N + 633;
subtype Any_Operator_Name is Name_Id range
First_Operator_Name .. Last_Operator_Name;