gimplify.c (gimplify_modify_expr_to_memset): Assert our documented assumptions.
authorOlivier Hainque <hainque@adacore.com>
Fri, 27 Jun 2008 07:35:33 +0000 (07:35 +0000)
committerOlivier Hainque <hainque@gcc.gnu.org>
Fri, 27 Jun 2008 07:35:33 +0000 (07:35 +0000)
2008-06-26  Olivier Hainque  <hainque@adacore.com>

gcc/
* gimplify.c (gimplify_modify_expr_to_memset): Assert our
documented assumptions.

testsuite/
* gnat.dg/aligned_vla.adb: New test.

From-SVN: r137171

gcc/ChangeLog
gcc/gimplify.c
gcc/testsuite/ChangeLog
gcc/testsuite/gnat.dg/aligned_vla.adb [new file with mode: 0644]

index d16198ef85bbc1b14f9cda28ddad6f4228856b34..35b4818e7959313ab72a8cf95dc522d37c1d30eb 100644 (file)
@@ -1,3 +1,8 @@
+2008-06-26  Olivier Hainque  <hainque@adacore.com>
+
+       * gimplify.c (gimplify_modify_expr_to_memset): Assert our
+       documented assumptions.
+
 2008-06-26  H.J. Lu  <hongjiu.lu@intel.com>
 
        * dwarf2out.c: Remove trailing white spaces.  Break long line
index bf81bb0c09a0d494d7ff36e6d8ffe6221fb4b41c..799ccbee52cad769f53c1a5f9822231d8fad31f2 100644 (file)
@@ -2809,8 +2809,19 @@ gimplify_modify_expr_to_memcpy (tree *expr_p, tree size, bool want_value)
 static enum gimplify_status
 gimplify_modify_expr_to_memset (tree *expr_p, tree size, bool want_value)
 {
-  tree t, to, to_ptr;
+  tree t, from, to, to_ptr;
 
+  /* Assert our assumptions, to abort instead of producing wrong code
+     silently if they are not met.  Beware that the RHS CONSTRUCTOR might
+     not be immediately exposed.  */
+  from = GENERIC_TREE_OPERAND (*expr_p, 1);  
+  if (TREE_CODE (from) == WITH_SIZE_EXPR)
+    from = TREE_OPERAND (from, 0);
+
+  gcc_assert (TREE_CODE (from) == CONSTRUCTOR
+             && VEC_empty (constructor_elt, CONSTRUCTOR_ELTS (from)));
+
+  /* Now proceed.  */
   to = GENERIC_TREE_OPERAND (*expr_p, 0);
 
   to_ptr = build_fold_addr_expr (to);
index 475416283eb9845bbbdb4295ff94d337b614b689..ed8f15bd6e40feb1a79fc337457053689fa83e2d 100644 (file)
@@ -1,3 +1,7 @@
+2008-06-27  Olivier Hainque  <hainque@adacore.com>
+
+       * gnat.dg/aligned_vla.adb: New test.
+
 2008-06-26  Joseph Myers  <joseph@codesourcery.com>
 
        * gcc.dg/inline-32.c, gcc.dg/inline-32a.c: New tests.
diff --git a/gcc/testsuite/gnat.dg/aligned_vla.adb b/gcc/testsuite/gnat.dg/aligned_vla.adb
new file mode 100644 (file)
index 0000000..bd3eb71
--- /dev/null
@@ -0,0 +1,23 @@
+--  { dg-do run }
+
+procedure Aligned_Vla is
+
+   type Table is array (Integer range <>) of Integer;
+   for Table'Alignment use Long_Float'Alignment;
+
+   K : constant := 1;
+   Konstants : Table (1 .. 4) := (others => K);
+
+   procedure Check_Copy (Len : Integer) is
+      My_Konstants : Table (1 .. Len) := Konstants (1 .. 1 + Len - 1);
+   begin
+      for I in My_Konstants'Range loop
+         if My_Konstants (I) /= K then
+            raise Program_Error;
+         end if;
+      end loop;
+   end;
+
+begin
+   Check_Copy (Len => 4);
+end;