]> git.ipfire.org Git - thirdparty/gcc.git/commit
ada: Missing discriminant check on assignment of Bounded_Vector aggregate
authorGary Dismukes <dismukes@adacore.com>
Sat, 8 Mar 2025 01:05:35 +0000 (01:05 +0000)
committerEric Botcazou <ebotcazou@adacore.com>
Mon, 9 Jun 2025 08:22:52 +0000 (10:22 +0200)
commitf59c4d4a6a30c655afb53236eee2bda9e2d2cbb2
treee2e747f01822ef2f7f9f34df66687a23a4912825
parente68026cd01d87a89d52c74238d4c1bff8764f9fc
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.
gcc/ada/exp_aggr.adb