From 2448ee85a89f313e48ee40eaed0d645c4c027944 Mon Sep 17 00:00:00 2001 From: Eric Botcazou Date: Sat, 9 May 2020 22:56:14 +0200 Subject: [PATCH] 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) : Use build_nonshared_array_type to build the common type and declare it. --- 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 + + * gcc-interface/utils2.c (build_binary_op) : Use + build_nonshared_array_type to build the common type and declare it. + 2020-05-09 Eric Botcazou * 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. */ -- 2.30.2