This is a regression present on the mainline and 15 branch, although the root 
cause has been present for years: the Sem_Type.Covers predicate returns true 
for the type of an aggregate (Any_Composite) and any type declared with the 
Aggregate aspect (when invoked in Ada 2022 or later), but its companion 
function Sem_Type.Specific_Type punts when it is called on the combination.

Tested on x86-64/Linux, applied on the mainline and 15 branch.


2026-01-29  Eric Botcazou  <[email protected]>

        PR ada/123861
        * sem_type.adb (Covers): Fix couple of typos in comment.
        (Specific_Type): Adjust to Covers' handling of types declared
        with the Aggregate aspect in Ada 2022.


2026-01-29  Eric Botcazou  <[email protected]>

        * gnat.dg/specs/aggr11.ads: New test.

-- 
Eric Botcazou
diff --git a/gcc/ada/sem_type.adb b/gcc/ada/sem_type.adb
index 67aa7822c50..d4e7569c543 100644
--- a/gcc/ada/sem_type.adb
+++ b/gcc/ada/sem_type.adb
@@ -1013,8 +1013,8 @@ package body Sem_Type is
       elsif T2 = Any_Composite and then Is_Aggregate_Type (T1) then
          return True;
 
-      --  In Ada_2022, an aggregate is compatible with the type that
-      --  as the corresponding aspect.
+      --  In Ada 2022, an aggregate is compatible with the type that
+      --  has the corresponding aspect.
 
       elsif Ada_Version >= Ada_2022
         and then T2 = Any_Composite
@@ -3377,6 +3377,9 @@ package body Sem_Type is
         or else (T1 = Any_Character     and then Is_Character_Type (T2))
         or else (T1 = Any_String        and then Is_String_Type (T2))
         or else (T1 = Any_Composite     and then Is_Aggregate_Type (T2))
+        or else (Ada_Version >= Ada_2022
+                  and then T1 = Any_Composite
+                  and then Has_Aspect (T2, Aspect_Aggregate))
       then
          return B2;
 
@@ -3397,6 +3400,9 @@ package body Sem_Type is
         or else (T2 = Any_Character     and then Is_Character_Type (T1))
         or else (T2 = Any_String        and then Is_String_Type (T1))
         or else (T2 = Any_Composite     and then Is_Aggregate_Type (T1))
+        or else (Ada_Version >= Ada_2022
+                  and then T2 = Any_Composite
+                  and then Has_Aspect (T1, Aspect_Aggregate))
       then
          return B1;
 
-- PR ada/123861
-- { dg-do compile }
-- { dg-options "-gnat2022" }

with Ada.Containers.Vectors;

package Aggr11 is

  package Vectors is new Ada.Containers.Vectors (Positive, Integer);
  use Vectors;

  A : constant Vector  := [];
  B : constant Boolean := [] = A;        -- ICE
  C : constant Boolean := Vector'[] = A; -- Works
  D : constant Boolean := A = [];        -- Works

end Aggr11;

Reply via email to