https://gcc.gnu.org/g:e8b53a5263946be717169e2549eabf67e6a227ad

commit r12-10881-ge8b53a5263946be717169e2549eabf67e6a227ad
Author: Marc Poulhiès <poulh...@adacore.com>
Date:   Mon Mar 27 16:47:04 2023 +0200

    ada: Fix crash on vector initialization
    
    Initializing a vector using
    
     Vec : V.Vector := [Some_Type'(Some_Abstract_Type with F => 0)];
    
    may crash the compiler. The expander marks the N_Extension_Aggregate for
    delayed expansion which never happens and incorrectly ends up in gigi.
    
    The delayed expansion is needed for nested aggregates, which the
    original code is testing for, but container aggregates are handled
    differently.
    
    Such assignments to container aggregates are later transformed into
    procedure calls to the procedures named in the Aggregate aspect
    definition, for which the delayed expansion is not required/expected.
    
    gcc/ada/
            PR ada/118234
            * exp_aggr.adb (Convert_To_Assignments): Do not mark node for
            delayed expansion if parent type has the Aggregate aspect.
            * sem_util.adb (Is_Container_Aggregate): Move...
            * sem_util.ads (Is_Container_Aggregate): ... here and make it
            public.

Diff:
---
 gcc/ada/exp_aggr.adb | 7 +++++--
 gcc/ada/sem_util.adb | 3 ---
 gcc/ada/sem_util.ads | 3 +++
 3 files changed, 8 insertions(+), 5 deletions(-)

diff --git a/gcc/ada/exp_aggr.adb b/gcc/ada/exp_aggr.adb
index e360baa6683a..a97882dba73a 100644
--- a/gcc/ada/exp_aggr.adb
+++ b/gcc/ada/exp_aggr.adb
@@ -4930,9 +4930,12 @@ package body Exp_Aggr is
 
       if
          --  Internal aggregate (transformed when expanding the parent)
+         --  excluding the Container aggregate as these are transformed to
+         --  procedure call later.
 
-         Parent_Kind in
-           N_Aggregate | N_Extension_Aggregate | N_Component_Association
+         (Parent_Kind in
+            N_Component_Association | N_Aggregate | N_Extension_Aggregate
+            and then not Is_Container_Aggregate (Parent_Node))
 
          --  Allocator (see Convert_Aggr_In_Allocator)
 
diff --git a/gcc/ada/sem_util.adb b/gcc/ada/sem_util.adb
index 3c55dda5a856..cbe19cbeeb2a 100644
--- a/gcc/ada/sem_util.adb
+++ b/gcc/ada/sem_util.adb
@@ -130,9 +130,6 @@ package body Sem_Util is
    --  Determine whether arbitrary entity Id denotes an atomic object as per
    --  RM C.6(7).
 
-   function Is_Container_Aggregate (Exp : Node_Id) return Boolean;
-   --  Is the given expression a container aggregate?
-
    generic
       with function Is_Effectively_Volatile_Entity
         (Id : Entity_Id) return Boolean;
diff --git a/gcc/ada/sem_util.ads b/gcc/ada/sem_util.ads
index 695158a34f35..28dcefd71fb7 100644
--- a/gcc/ada/sem_util.ads
+++ b/gcc/ada/sem_util.ads
@@ -1531,6 +1531,9 @@ package Sem_Util is
    --  integer for use in compile-time checking. Note: Level is restricted to
    --  be non-dynamic.
 
+   function Is_Container_Aggregate (Exp : Node_Id) return Boolean;
+   --  Is the given expression a container aggregate?
+
    function Is_Newly_Constructed
      (Exp : Node_Id; Context_Requires_NC : Boolean) return Boolean;
    --  Indicates whether a given expression is "newly constructed" (RM 4.4).

Reply via email to