utils.c (convert): Add comment and do not fall through to the next case.
authorEric Botcazou <ebotcazou@adacore.com>
Fri, 10 Nov 2017 08:21:05 +0000 (08:21 +0000)
committerEric Botcazou <ebotcazou@gcc.gnu.org>
Fri, 10 Nov 2017 08:21:05 +0000 (08:21 +0000)
* gcc-interface/utils.c (convert) <RECORD_TYPE>: Add comment and do
not fall through to the next case.
<ARRAY_TYPE>: Deal specially with a dereference from another array
type with the same element type.

From-SVN: r254618

gcc/ada/ChangeLog
gcc/ada/gcc-interface/utils.c
gcc/testsuite/ChangeLog
gcc/testsuite/gnat.dg/opt69.adb [new file with mode: 0644]

index 0c9332a581bf740fdae3feb3d0c00968710836a3..35062ddc50fa3c70bab7407bfe35d5a7118f0688 100644 (file)
@@ -1,3 +1,10 @@
+2017-11-10  Eric Botcazou  <ebotcazou@adacore.com>
+
+       * gcc-interface/utils.c (convert) <RECORD_TYPE>: Add comment and do
+       not fall through to the next case.
+       <ARRAY_TYPE>: Deal specially with a dereference from another array
+       type with the same element type.
+
 2017-11-09  Gary Dismukes  <dismukes@adacore.com>
 
        * exp_util.adb, freeze.adb: Minor reformatting.
index bfd3388c56a09938876560f894f3ebef74b47dab..2c80a612b1fb1eb955a33db4de90b095aa3f9bf2 100644 (file)
@@ -4706,6 +4706,7 @@ convert (tree type, tree expr)
       return fold (convert_to_real (type, expr));
 
     case RECORD_TYPE:
+      /* Do a normal conversion between scalar and justified modular type.  */
       if (TYPE_JUSTIFIED_MODULAR_P (type) && !AGGREGATE_TYPE_P (etype))
        {
          vec<constructor_elt, va_gc> *v;
@@ -4717,9 +4718,27 @@ convert (tree type, tree expr)
          return gnat_build_constructor (type, v);
        }
 
-      /* ... fall through ... */
+      /* In these cases, assume the front-end has validated the conversion.
+        If the conversion is valid, it will be a bit-wise conversion, so
+        it can be viewed as an unchecked conversion.  */
+      return unchecked_convert (type, expr, false);
 
     case ARRAY_TYPE:
+      /* Do a normal conversion between unconstrained and constrained array
+        type, assuming the latter is a constrained version of the former.  */
+      if (TREE_CODE (expr) == INDIRECT_REF
+         && ecode == ARRAY_TYPE
+         && TREE_TYPE (etype) == TREE_TYPE (type))
+       {
+         tree ptr_type = build_pointer_type (type);
+         tree t = build_unary_op (INDIRECT_REF, NULL_TREE,
+                                  fold_convert (ptr_type,
+                                                TREE_OPERAND (expr, 0)));
+         TREE_READONLY (t) = TREE_READONLY (expr);
+         TREE_THIS_NOTRAP (t) = TREE_THIS_NOTRAP (expr);
+         return t;
+       }
+
       /* In these cases, assume the front-end has validated the conversion.
         If the conversion is valid, it will be a bit-wise conversion, so
         it can be viewed as an unchecked conversion.  */
index f50bee7ad5fa40f2ea11062a178eb3d5d277e123..0de4f7b2e6cf8f0305610ed7193fd56a937f8f0e 100644 (file)
@@ -1,3 +1,7 @@
+2017-11-10  Eric Botcazou  <ebotcazou@adacore.com>
+
+       * gnat.dg/opt69.adb: New test.
+
 2017-11-10  Jakub Jelinek  <jakub@redhat.com>
 
        PR rtl-optimization/82913
diff --git a/gcc/testsuite/gnat.dg/opt69.adb b/gcc/testsuite/gnat.dg/opt69.adb
new file mode 100644 (file)
index 0000000..e8c94da
--- /dev/null
@@ -0,0 +1,28 @@
+-- { dg-do compile }
+-- { dg-options "-O" }
+
+with Ada.Text_IO;
+
+procedure Opt69 is
+
+   procedure Inner
+     (A : String := (1 .. 15 => ASCII.NUL);
+      B : String := (1 .. 5 => ASCII.NUL);
+      C : String := (1 .. 5 => ASCII.NUL))
+   is
+      Aa : String (1 .. 15);
+      Bb : String (1 .. 5);
+      Cc : String (1 .. 5);
+   begin
+      Aa := A;
+      Bb := B;
+      Cc := C;
+
+      Ada.Text_IO.Put_Line (Aa);
+      Ada.Text_IO.Put_Line (Bb);
+      Ada.Text_IO.Put_Line (Cc);
+   end;
+
+begin
+   Inner;
+end;