Fix corner case issue with discriminated record type
authorEric Botcazou <ebotcazou@adacore.com>
Mon, 7 Dec 2020 09:30:05 +0000 (10:30 +0100)
committerEric Botcazou <ebotcazou@adacore.com>
Mon, 7 Dec 2020 09:30:05 +0000 (10:30 +0100)
commit02221bed3c4912d59a865fa69bf12f54c980f957
tree67907c13a70d472e0899f65b4528d0a27de2b127
parent090abb0f51b5cf8ce46fb686bc4b968f6e2055be
Fix corner case issue with discriminated record type

The compiler generates code that writes too much data into a component
of a record subject to a representation clause, when the source of the
assignment is a call to a function that returns a discriminated record
type with default discriminants, variable size and a statically known
upper bound for this size, and the size of the component given by the
representation clause is lower than the value of this bound rounded up
to the alignment.

gcc/ada/ChangeLog:
* gcc-interface/trans.c (Call_to_gnu): Also create a temporary for
the return value if the LHS is a bit-field and the return type is
a type padding a self-referential type.
(gnat_to_gnu): Do not remove the padding on the result if it is too
small with regard to the natural padding size.
gcc/ada/gcc-interface/trans.c