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

commit r16-1335-gff89e55497f1a36b6a37a43c5837d89d30fe9601
Author: Gary Dismukes <dismu...@adacore.com>
Date:   Sat Mar 8 01:05:35 2025 +0000

    ada: Missing discriminant check on assignment of Bounded_Vector aggregate
    
    When a container aggregate for a Bounded_Vector type involves an iterated
    association that is assigned to a vector object whose capacity (as defined
    by the Capacity discriminant) is less than the number of elements of the
    aggregate, Constraint_Error should be raised due to failing a discriminant
    check on the assignment. But the compiler fails to do proper expansion,
    plus omits the check, and instead creates a temporary whose capacity is
    bounded by that of the target vector of the assignment. It attempts to
    assign all elements of the aggregate to the temporary, resulting in
    a failure on a call to the Replace_Element operation that assigns past
    the length of the temporary vector (which can result in a Storage_Error
    due to a segment violation).
    
    This is fixed by ensuring that the temporary object is declared with
    an unconstrained base subtype rather than the assignment target's
    constrained subtype.
    
    gcc/ada/ChangeLog:
    
            * exp_aggr.adb (Expand_Container_Aggregate): Use the Base_Type of 
the
            subtype provided by the context as the subtype of the temporary 
object
            initialized by the aggregate.

Diff:
---
 gcc/ada/exp_aggr.adb | 11 ++++++++++-
 1 file changed, 10 insertions(+), 1 deletion(-)

diff --git a/gcc/ada/exp_aggr.adb b/gcc/ada/exp_aggr.adb
index 5450402f4749..8db15fa6a11d 100644
--- a/gcc/ada/exp_aggr.adb
+++ b/gcc/ada/exp_aggr.adb
@@ -7503,10 +7503,19 @@ package body Exp_Aggr is
          Set_Assignment_OK (Lhs);
 
          Aggr_Code := Build_Container_Aggr_Code (N, Typ, Lhs, Init);
+
+         --  Use the unconstrained base subtype of the subtype provided by
+         --  the context for declaring the temporary object (which may come
+         --  from a constrained assignment target), to ensure that the
+         --  aggregate can be successfully expanded and assigned to the
+         --  temporary without exceeding its capacity. (Later assignment
+         --  of the temporary to a target object may result in failing
+         --  a discriminant check.)
+
          Prepend_To (Aggr_Code,
            Make_Object_Declaration (Loc,
              Defining_Identifier => Obj_Id,
-             Object_Definition   => New_Occurrence_Of (Typ, Loc),
+             Object_Definition   => New_Occurrence_Of (Base_Type (Typ), Loc),
              Expression          => Init));
 
          Insert_Actions (N, Aggr_Code);

Reply via email to