https://gcc.gnu.org/g:7e29e1a0a1d38c61e9b0d298940d9517e30460ac

commit r16-4018-g7e29e1a0a1d38c61e9b0d298940d9517e30460ac
Author: Eric Botcazou <[email protected]>
Date:   Mon Sep 22 11:08:34 2025 +0200

    Ada: Fix internal error on use clause present in generic formal part
    
    This is a regression present on the mainline and 15 branch: the compiler
    aborts on a use clause present in the formal part of a generic unit because
    of an oversight in the new inference code for generic actual parameters.
    
    The fix also adds a missing test to Analyze_Dimension_Array_Aggregate.
    
    gcc/ada/
            PR ada/121968
            * sem_ch12.adb (Associations.Find_Assoc): Add guard for clauses.
            * sem_dim.adb (Analyze_Dimension_Array_Aggregate): Add test for
            N_Iterated_Component_Association nodes.

Diff:
---
 gcc/ada/sem_ch12.adb | 12 +++++++++---
 gcc/ada/sem_dim.adb  |  4 +++-
 2 files changed, 12 insertions(+), 4 deletions(-)

diff --git a/gcc/ada/sem_ch12.adb b/gcc/ada/sem_ch12.adb
index fbf2bfca1f89..de9cff14246e 100644
--- a/gcc/ada/sem_ch12.adb
+++ b/gcc/ada/sem_ch12.adb
@@ -2073,9 +2073,15 @@ package body Sem_Ch12 is
       is
       begin
          for Index in Match.Assocs'Range loop
-            if Defining_Entity (Match.Assocs (Index).An_Formal) = F then
-               return Index;
-            end if;
+            declare
+               An_F : constant Node_Id := Match.Assocs (Index).An_Formal;
+            begin
+               if Nkind (An_F) not in N_Use_Package_Clause | N_Use_Type_Clause
+                 and then Defining_Entity (An_F) = F
+               then
+                  return Index;
+               end if;
+            end;
          end loop;
 
          raise Program_Error; -- it must be present
diff --git a/gcc/ada/sem_dim.adb b/gcc/ada/sem_dim.adb
index 139ed661f901..822c1284d539 100644
--- a/gcc/ada/sem_dim.adb
+++ b/gcc/ada/sem_dim.adb
@@ -1273,7 +1273,9 @@ package body Sem_Dim is
 
          --  Get the expression from the component
 
-         if Nkind (Comp) = N_Component_Association then
+         if Nkind (Comp) in N_Component_Association
+                          | N_Iterated_Component_Association
+         then
             Expr := Expression (Comp);
          else
             Expr := Comp;

Reply via email to