diff options
author | Gary Dismukes <dismukes@adacore.com> | 2025-03-08 01:05:35 +0000 |
---|---|---|
committer | Eric Botcazou <ebotcazou@adacore.com> | 2025-06-09 10:22:52 +0200 |
commit | f59c4d4a6a30c655afb53236eee2bda9e2d2cbb2 (patch) | |
tree | e2e747f01822ef2f7f9f34df66687a23a4912825 | |
parent | e68026cd01d87a89d52c74238d4c1bff8764f9fc (diff) | |
download | gcc-f59c4d4a6a30c655afb53236eee2bda9e2d2cbb2.zip gcc-f59c4d4a6a30c655afb53236eee2bda9e2d2cbb2.tar.gz gcc-f59c4d4a6a30c655afb53236eee2bda9e2d2cbb2.tar.bz2 |
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.
-rw-r--r-- | gcc/ada/exp_aggr.adb | 11 |
1 files changed, 10 insertions, 1 deletions
diff --git a/gcc/ada/exp_aggr.adb b/gcc/ada/exp_aggr.adb index 8f1869c..f4674f5 100644 --- a/gcc/ada/exp_aggr.adb +++ b/gcc/ada/exp_aggr.adb @@ -7496,10 +7496,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); |