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.
This commit is contained in:
Eric Botcazou 2020-05-09 22:56:14 +02:00
parent e92f85c792
commit 2448ee85a8
2 changed files with 14 additions and 2 deletions

View 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

View 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. */