Fix tree sharing issue with slices
authorEric Botcazou <ebotcazou@gcc.gnu.org>
Sat, 9 May 2020 20:56:14 +0000 (22:56 +0200)
committerEric Botcazou <ebotcazou@gcc.gnu.org>
Sat, 9 May 2020 20:56:14 +0000 (22:56 +0200)
This can happen because we build an array type on the fly in case there
is an apparent type inconsistency in the construct.

* gcc-interface/utils2.c (build_binary_op) <ARRAY_RANGE_REF>: Use
build_nonshared_array_type to build the common type and declare it.

gcc/ada/ChangeLog
gcc/ada/gcc-interface/utils2.c

index 6ee4942add5377d46326f3b89b163e468508e437..81108bf1b70082419407d22ebdd0d34d02ab39e8 100644 (file)
@@ -1,3 +1,8 @@
+2020-05-09  Eric Botcazou  <ebotcazou@adacore.com>
+
+       * gcc-interface/utils2.c (build_binary_op) <ARRAY_RANGE_REF>: Use
+       build_nonshared_array_type to build the common type and declare it.
+
 2020-05-09  Eric Botcazou  <ebotcazou@adacore.com>
 
        * gcc-interface/misc.c (gnat_init_gcc_eh): Do not override the user
index 2ff865434b97f37b79ea5b5db2e8f496ace09cef..0d61205638404a110377377cf6ea0993459c3868 100644 (file)
@@ -1040,8 +1040,15 @@ build_binary_op (enum tree_code op_code, tree result_type,
       /* For a range, make sure the element type is consistent.  */
       if (op_code == ARRAY_RANGE_REF
          && TREE_TYPE (operation_type) != TREE_TYPE (left_type))
-       operation_type = build_array_type (TREE_TYPE (left_type),
-                                          TYPE_DOMAIN (operation_type));
+       {
+         operation_type
+           = build_nonshared_array_type (TREE_TYPE (left_type),
+                                         TYPE_DOMAIN (operation_type));
+         /* Declare it now since it will never be declared otherwise.  This
+            is necessary to ensure that its subtrees are properly marked.  */
+         create_type_decl (TYPE_NAME (operation_type), operation_type, true,
+                           false, Empty);
+       }
 
       /* Then convert the right operand to its base type.  This will prevent
         unneeded sign conversions when sizetype is wider than integer.  */