From 2448ee85a89f313e48ee40eaed0d645c4c027944 Mon Sep 17 00:00:00 2001 From: Eric Botcazou Date: Sat, 9 May 2020 22:56:14 +0200 Subject: 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/gcc-interface/utils2.c | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) (limited to 'gcc/ada/gcc-interface/utils2.c') diff --git a/gcc/ada/gcc-interface/utils2.c b/gcc/ada/gcc-interface/utils2.c index 2ff8654..0d61205 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. */ -- cgit v1.1