]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
utils.c (convert): Add comment and do not fall through to the next case.
authorEric Botcazou <ebotcazou@adacore.com>
Fri, 10 Nov 2017 08:24:40 +0000 (08:24 +0000)
committerEric Botcazou <ebotcazou@gcc.gnu.org>
Fri, 10 Nov 2017 08:24:40 +0000 (08:24 +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: r254620

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

index e41237114c126891db56a60699d389f7bcdbda06..17b72d620ea6d7f2e863d01cbd6ccfdaaeee6656 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-09-15  Martin Liska  <mliska@suse.cz>
 
        Backport from mainline
index d1c6da4e30cd81cb02467199faa670be50d64869..3543567b365707ca2466d0e22eb9e9d6280eff03 100644 (file)
@@ -4642,6 +4642,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;
@@ -4653,9 +4654,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 e41932554cda670d9bf2d6dcd774328b40d3412c..4584af5a152c5b34d9c6271c1bf5f355566343bb 100644 (file)
@@ -1,3 +1,7 @@
+2017-11-10  Eric Botcazou  <ebotcazou@adacore.com>
+
+       * gnat.dg/opt69.adb: New test.
+
 2017-11-06  Paul Thomas  <pault@gcc.gnu.org>
 
        Backported from trunk
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;