[Ada] Fix sharing of expression in array aggregate with others choice
authorEric Botcazou <ebotcazou@adacore.com>
Wed, 18 Sep 2019 08:33:12 +0000 (08:33 +0000)
committerPierre-Marie de Rodat <pmderodat@gcc.gnu.org>
Wed, 18 Sep 2019 08:33:12 +0000 (08:33 +0000)
commit6951cbc9e7646bca1c99c973815e6838a6e1fe25
tree8dfe7973960559f51dccdec8f4e2cb72721875f7
parent43b264110f5581af0cc93308f9433fe8053f01cc
[Ada] Fix sharing of expression in array aggregate with others choice

This change fixes a long-standing issue in the compiler that is
generally silent but may lead to wrong code generation in specific
circumstances.  When an others choice in an array aggregate spans
multiple ranges, the compiler may generate multiple (groups of)
assignments for the ranges.

The problem is that it internally reuses the original expression for all
the ranges, which is problematic if this expression gets rewritten
during the processing of one of the ranges and typically causes a new
temporary to be shared between different ranges.

The solution is to duplicate the original expression for each range.

2019-09-18  Eric Botcazou  <ebotcazou@adacore.com>

gcc/ada/

* exp_aggr.adb (Build_Array_Aggr_Code): In STEP 1 (c), duplicate
the expression and reset the Loop_Actions for each loop
generated for an others choice.

gcc/testsuite/

* gnat.dg/aggr28.adb: New testcase.

From-SVN: r275859
gcc/ada/ChangeLog
gcc/ada/exp_aggr.adb
gcc/testsuite/ChangeLog
gcc/testsuite/gnat.dg/aggr28.adb [new file with mode: 0644]