[COMMITTED,30/30] ada: Allow 'others' in formal packages with overloaded formals

Message ID 20240520074858.222435-30-poulhies@adacore.com
State Committed
Commit b3cfe6e88ffcc636d83e4ac5708065c3131e1766
Headers
Series [COMMITTED,01/30] ada: Rework and augment documentation on strict aliasing |

Checks

Context Check Description
linaro-tcwg-bot/tcwg_gcc_build--master-arm fail Patch failed to apply
linaro-tcwg-bot/tcwg_gcc_build--master-aarch64 fail Patch failed to apply

Commit Message

Marc Poulhiès May 20, 2024, 7:48 a.m. UTC
  From: Bob Duff <duff@adacore.com>

If a generic package has two or more generic formal parameters with the
same defining name (which can happen only for formal subprograms), then
RM-12.7(4.1/3) disallows named associations in a corresponding formal
package. This is not intended to cover "others => <>".

This patch allows "others => <>" even when it applies to such
formals. Previously, the compiler incorrectly gave an error.

Minor related cleanups involving type Text_Ptr.

gcc/ada/

	* sem_ch12.adb: Misc cleanups and comment fixes.
	(Check_Overloaded_Formal_Subprogram): Remove the Others_Choice
	error message.
	(Others_Choice): Remove this variable; no longer needed.
	* types.ads (Text_Ptr): Add a range constraint limiting the
	subtype to values that are actually used. This has the advantage
	that when the compiler is compiled with validity checks,
	uninitialized values of subtypes Text_Ptr and Source_Ptr will be
	caught.
	* sinput.ads (Sloc_Adjust): Use the base subtype; this is used as
	an offset, so we need to allow arbitrary negative values.

Tested on x86_64-pc-linux-gnu, committed on master.

---
 gcc/ada/sem_ch12.adb | 27 ++++++++++-----------------
 gcc/ada/sinput.ads   |  2 +-
 gcc/ada/types.ads    |  7 +++----
 3 files changed, 14 insertions(+), 22 deletions(-)
  

Patch

diff --git a/gcc/ada/sem_ch12.adb b/gcc/ada/sem_ch12.adb
index 4ceddda2052..9919cda6340 100644
--- a/gcc/ada/sem_ch12.adb
+++ b/gcc/ada/sem_ch12.adb
@@ -1130,10 +1130,11 @@  package body Sem_Ch12 is
       Saved_Formal    : Node_Id;
 
       Default_Formals : constant List_Id := New_List;
-      --  If an Others_Choice is present, some of the formals may be defaulted.
-      --  To simplify the treatment of visibility in an instance, we introduce
-      --  individual defaults for each such formal. These defaults are
-      --  appended to the list of associations and replace the Others_Choice.
+      --  If an N_Others_Choice is present, some of the formals may be
+      --  defaulted. To simplify the treatment of visibility in an instance,
+      --  we introduce individual defaults for each such formal. These
+      --  defaults are appended to the list of associations and replace the
+      --  N_Others_Choice.
 
       Found_Assoc : Node_Id;
       --  Association for the current formal being match. Empty if there are
@@ -1145,9 +1146,8 @@  package body Sem_Ch12 is
       Num_Actuals    : Nat := 0;
 
       Others_Present : Boolean := False;
-      Others_Choice  : Node_Id := Empty;
       --  In Ada 2005, indicates partial parameterization of a formal
-      --  package. As usual an other association must be last in the list.
+      --  package. As usual an 'others' association must be last in the list.
 
       procedure Build_Subprogram_Wrappers;
       --  Ada 2022: AI12-0272 introduces pre/postconditions for formal
@@ -1195,7 +1195,7 @@  package body Sem_Ch12 is
       procedure Process_Default (Formal : Node_Id);
       --  Add a copy of the declaration of a generic formal to the list of
       --  associations, and add an explicit box association for its entity
-      --  if there is none yet, and the default comes from an Others_Choice.
+      --  if there is none yet, and the default comes from an N_Others_Choice.
 
       function Renames_Standard_Subprogram (Subp : Entity_Id) return Boolean;
       --  Determine whether Subp renames one of the subprograms defined in the
@@ -1314,14 +1314,8 @@  package body Sem_Ch12 is
                   Error_Msg_N
                     ("named association not allowed for overloaded formal",
                      Found_Assoc);
-
-               else
-                  Error_Msg_N
-                    ("named association not allowed for overloaded formal",
-                     Others_Choice);
+                  Abandon_Instantiation (Instantiation_Node);
                end if;
-
-               Abandon_Instantiation (Instantiation_Node);
             end if;
 
             Next (Temp_Formal);
@@ -1592,7 +1586,7 @@  package body Sem_Ch12 is
 
          Append (Decl, Assoc_List);
 
-         if No (Found_Assoc) then
+         if No (Found_Assoc) then -- i.e. 'others'
             Default :=
                Make_Generic_Association (Loc,
                  Selector_Name                     =>
@@ -1686,7 +1680,6 @@  package body Sem_Ch12 is
          while Present (Actual) loop
             if Nkind (Actual) = N_Others_Choice then
                Others_Present := True;
-               Others_Choice  := Actual;
 
                if Present (Next (Actual)) then
                   Error_Msg_N ("OTHERS must be last association", Actual);
@@ -2311,7 +2304,7 @@  package body Sem_Ch12 is
 
       --  If this is a formal package, normalize the parameter list by adding
       --  explicit box associations for the formals that are covered by an
-      --  Others_Choice.
+      --  N_Others_Choice.
 
       Append_List (Default_Formals, Formals);
 
diff --git a/gcc/ada/sinput.ads b/gcc/ada/sinput.ads
index b22314770bd..1045acd3e2d 100644
--- a/gcc/ada/sinput.ads
+++ b/gcc/ada/sinput.ads
@@ -804,7 +804,7 @@  private
       --  The following fields are for internal use only (i.e. only in the
       --  body of Sinput or its children, with no direct access by clients).
 
-      Sloc_Adjust : Source_Ptr;
+      Sloc_Adjust : Source_Ptr'Base; -- can be (very) negative
       --  A value to be added to Sloc values for this file to reference the
       --  corresponding lines table. This is zero for the non-instantiation
       --  case, and set so that the addition references the ultimate template
diff --git a/gcc/ada/types.ads b/gcc/ada/types.ads
index 8a1d9054261..4fd75d46787 100644
--- a/gcc/ada/types.ads
+++ b/gcc/ada/types.ads
@@ -145,9 +145,8 @@  package Types is
    --  standard 32-bit integer as an index value, since we count on all index
    --  values being the same size.
 
-   type Text_Ptr is new Int;
-   --  Type used for subscripts in text buffer
-
+   type Text_Ptr is new Int range -4 .. Int'Last;
+   --  -4 .. -1 are special; see constants below
    type Text_Buffer is array (Text_Ptr range <>) of Character;
    --  Text buffer used to hold source file or library information file
 
@@ -265,7 +264,7 @@  package Types is
    --  the location is in System, but we don't know exactly what line.
 
    First_Source_Ptr : constant Source_Ptr := 0;
-   --  Starting source pointer index value for first source program
+   --  Starting source pointer index value for first source file
 
    -------------------------------------
    -- Range Definitions for Tree Data --