[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