]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
ada: Unbounded recursion on character aggregates with predicated component subtype
authorGary Dismukes <dismukes@adacore.com>
Wed, 8 Jan 2025 22:51:41 +0000 (22:51 +0000)
committerMarc Poulhiès <dkm@gcc.gnu.org>
Mon, 13 Jan 2025 10:52:58 +0000 (11:52 +0100)
The compiler was recursing endlessly when analyzing an aggregate of
an array type whose component subtype has a static predicate and the
component expressions are static, repeatedly transforming the aggregate
first into a string literal and then back into an aggregate. This is fixed
by suppressing the transformation to a string literal in the case where
the component subtype has predicates.

gcc/ada/ChangeLog:

* sem_aggr.adb (Resolve_Aggregate): Add another condition to prevent rewriting
an aggregate whose type is an array of characters, testing for the presence of
predicates on the component type.

gcc/ada/sem_aggr.adb

index 095093cc76bdf610f8f4c293f56e2fbfebae34d5..f6db5cb97a4a39a3f31841fb2ff02ba60d12a2f4 100644 (file)
@@ -1382,11 +1382,11 @@ package body Sem_Aggr is
 
          --  Do not perform this transformation if this was a string literal
          --  to start with, whose components needed constraint checks, or if
-         --  the component type is non-static, because it will require those
-         --  checks and be transformed back into an aggregate. If the index
-         --  type is not Integer the aggregate may represent a user-defined
-         --  string type but the context might need the original type so we
-         --  do not perform the transformation at this point.
+         --  the component type is nonstatic or has predicates, because it will
+         --  require those checks and be transformed back into an aggregate.
+         --  If the index type is not Integer, then the aggregate may represent
+         --  a user-defined string type but the context might need the original
+         --  type, so we do not perform the transformation at this point.
 
          if Number_Dimensions (Typ) = 1
            and then Is_Standard_Character_Type (Component_Type (Typ))
@@ -1396,6 +1396,7 @@ package body Sem_Aggr is
            and then not Is_Bit_Packed_Array (Typ)
            and then Nkind (Original_Node (Parent (N))) /= N_String_Literal
            and then Is_OK_Static_Subtype (Component_Type (Typ))
+           and then not Has_Predicates (Component_Type (Typ))
            and then Base_Type (Etype (First_Index (Typ))) =
                       Base_Type (Standard_Integer)
            and then not Has_Static_Empty_Array_Bounds (Typ)