From d239991ff65181a5e81cd9e103f5543f1904c042 Mon Sep 17 00:00:00 2001
From: Gary Dismukes <dismukes@adacore.com>
Date: Tue, 29 Mar 2005 18:15:45 +0200
Subject: [PATCH] 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
---
 gcc/ada/Makefile.rtl |   1 +
 gcc/ada/a-tgdico.ads |  29 +++++++
 gcc/ada/exp_intr.adb |  83 +++++++++++++++++++
 gcc/ada/impunit.adb  |   1 +
 gcc/ada/sem_ch8.adb  |  97 ++++++++++++++++++----
 gcc/ada/snames.adb   |   1 +
 gcc/ada/snames.ads   | 193 ++++++++++++++++++++++---------------------
 7 files changed, 294 insertions(+), 111 deletions(-)
 create mode 100644 gcc/ada/a-tgdico.ads

diff --git a/gcc/ada/Makefile.rtl b/gcc/ada/Makefile.rtl
index 282cbff9569f..7687c33e6bce 100644
--- a/gcc/ada/Makefile.rtl
+++ b/gcc/ada/Makefile.rtl
@@ -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) \
diff --git a/gcc/ada/a-tgdico.ads b/gcc/ada/a-tgdico.ads
new file mode 100644
index 000000000000..8534d9f29570
--- /dev/null
+++ b/gcc/ada/a-tgdico.ads
@@ -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);
diff --git a/gcc/ada/exp_intr.adb b/gcc/ada/exp_intr.adb
index 1efd42bb6b33..b46b8f09c7d2 100644
--- a/gcc/ada/exp_intr.adb
+++ b/gcc/ada/exp_intr.adb
@@ -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
diff --git a/gcc/ada/impunit.adb b/gcc/ada/impunit.adb
index 9aae8522193b..f1303a2eb0a5 100644
--- a/gcc/ada/impunit.adb
+++ b/gcc/ada/impunit.adb
@@ -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
diff --git a/gcc/ada/sem_ch8.adb b/gcc/ada/sem_ch8.adb
index 5f8de03efc17..394f6dbb8e97 100644
--- a/gcc/ada/sem_ch8.adb
+++ b/gcc/ada/sem_ch8.adb
@@ -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));
diff --git a/gcc/ada/snames.adb b/gcc/ada/snames.adb
index 66f13453c50c..237984600d7b 100644
--- a/gcc/ada/snames.adb
+++ b/gcc/ada/snames.adb
@@ -607,6 +607,7 @@ package body Snames is
      "exception_message#" &
      "exception_name#" &
      "file#" &
+     "generic_dispatching_constructor#" &
      "import_address#" &
      "import_largest_value#" &
      "import_value#" &
diff --git a/gcc/ada/snames.ads b/gcc/ada/snames.ads
index 9b79ae448dc2..4c8d2547ef0e 100644
--- a/gcc/ada/snames.ads
+++ b/gcc/ada/snames.ads
@@ -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;
-- 
GitLab