[Ada] Copy index expression trees rather than relocating them
authorEd Schonberg <schonberg@adacore.com>
Mon, 28 May 2018 08:54:18 +0000 (08:54 +0000)
committerPierre-Marie de Rodat <pmderodat@gcc.gnu.org>
Mon, 28 May 2018 08:54:18 +0000 (08:54 +0000)
2018-05-28  Ed Schonberg  <schonberg@adacore.com>

gcc/ada/

* exp_aggr.adb (Flatten): Copy tree of expression in a component
association with a range or a set of discrete choices, rather than
relocating the node. This avoids inconsistencies in the tree when
handling nested subprograms with uplevel references for LLVM.

From-SVN: r260829

gcc/ada/ChangeLog
gcc/ada/exp_aggr.adb

index a9f89f5..95e4822 100644 (file)
@@ -1,3 +1,10 @@
+2018-05-28  Ed Schonberg  <schonberg@adacore.com>
+
+       * exp_aggr.adb (Flatten): Copy tree of expression in a component
+       association with a range or a set of discrete choices, rather than
+       relocating the node. This avoids inconsistencies in the tree when
+       handling nested subprograms with uplevel references for LLVM.
+
 2018-05-28  Arnaud Charlet  <charlet@adacore.com>
 
        * exp_util.adb (Possible_Bit_Aligned_Component): Always return False in
index c7158a3..cedc722 100644 (file)
@@ -4490,7 +4490,9 @@ package body Exp_Aggr is
                      return False;
                   end if;
 
-                  Vals (Num) := Relocate_Node (Elmt);
+                  --  Duplicate expression for each index it covers.
+
+                  Vals (Num) := New_Copy_Tree (Elmt);
                   Num := Num + 1;
 
                   Next (Elmt);