[gcc/devel/gccgo] Fix tree sharing issue with slices
Ian Lance Taylor
ian@gcc.gnu.org
Sun Jul 12 18:03:57 GMT 2020
https://gcc.gnu.org/g:2448ee85a89f313e48ee40eaed0d645c4c027944
commit 2448ee85a89f313e48ee40eaed0d645c4c027944
Author: Eric Botcazou <ebotcazou@gcc.gnu.org>
Date: Sat May 9 22:56:14 2020 +0200
Fix tree sharing issue with slices
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.
Diff:
---
gcc/ada/ChangeLog | 5 +++++
gcc/ada/gcc-interface/utils2.c | 11 +++++++++--
2 files changed, 14 insertions(+), 2 deletions(-)
diff --git a/gcc/ada/ChangeLog b/gcc/ada/ChangeLog
index 6ee4942add5..81108bf1b70 100644
--- a/gcc/ada/ChangeLog
+++ b/gcc/ada/ChangeLog
@@ -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
diff --git a/gcc/ada/gcc-interface/utils2.c b/gcc/ada/gcc-interface/utils2.c
index 2ff865434b9..0d612056384 100644
--- a/gcc/ada/gcc-interface/utils2.c
+++ b/gcc/ada/gcc-interface/utils2.c
@@ -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. */
More information about the Gcc-cvs
mailing list