]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
gimplify.c (gimplify_init_constructor): Really never clear for an incomplete construc...
authorEric Botcazou <ebotcazou@adacore.com>
Tue, 19 Jun 2018 09:46:40 +0000 (09:46 +0000)
committerEric Botcazou <ebotcazou@gcc.gnu.org>
Tue, 19 Jun 2018 09:46:40 +0000 (09:46 +0000)
* gimplify.c (gimplify_init_constructor): Really never clear for an
incomplete constructor if CONSTRUCTOR_NO_CLEARING is set.

From-SVN: r261737

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

index 7be04b62b29774c2af3727e960a44218b70317f5..a3fee2c7d7dc2ddf83a6f62fd375d5fb22ac70dd 100644 (file)
@@ -1,3 +1,8 @@
+2018-06-19  Eric Botcazou  <ebotcazou@adacore.com>
+
+       * gimplify.c (gimplify_init_constructor): Really never clear for an
+       incomplete constructor if CONSTRUCTOR_NO_CLEARING is set.
+
 2018-06-18  Martin Sebor  <msebor@redhat.com>
 
         PR middle-end/82063
index 5535604d8373fe53700b7a4ba9f3ee741d513fe3..2a7951f16b3a0b80596d8875c35620b2c3b54693 100644 (file)
@@ -4681,7 +4681,7 @@ gimplify_init_constructor (tree *expr_p, gimple_seq *pre_p, gimple_seq *post_p,
             objects.  Initializers for such objects must explicitly set
             every field that needs to be set.  */
          cleared = false;
-       else if (!complete_p && !CONSTRUCTOR_NO_CLEARING (ctor))
+       else if (!complete_p)
          /* If the constructor isn't complete, clear the whole object
             beforehand, unless CONSTRUCTOR_NO_CLEARING is set on it.
 
@@ -4690,7 +4690,7 @@ gimplify_init_constructor (tree *expr_p, gimple_seq *pre_p, gimple_seq *post_p,
             we'd need to *find* the elements that are not present, and that
             requires trickery to avoid quadratic compile-time behavior in
             large cases or excessive memory use in small cases.  */
-         cleared = true;
+         cleared = !CONSTRUCTOR_NO_CLEARING (ctor);
        else if (num_ctor_elements - num_nonzero_elements
                 > CLEAR_RATIO (optimize_function_for_speed_p (cfun))
                 && num_nonzero_elements < num_ctor_elements / 4)
index 48b4f0f7a471d72a157608045a67aad692337121..4a5dc418479423474f76f86e7c61df25e8e18d05 100644 (file)
@@ -1,3 +1,8 @@
+2018-06-19  Eric Botcazou  <ebotcazou@adacore.com>
+
+       * gnat.dg/aggr24.adb: New test.
+       * gnat.dg/aggr24_pkg.ad[sb]: New helper.
+
 2018-06-18  Martin Sebor  <msebor@redhat.com>
 
         PR middle-end/82063
diff --git a/gcc/testsuite/gnat.dg/aggr24.adb b/gcc/testsuite/gnat.dg/aggr24.adb
new file mode 100644 (file)
index 0000000..b739c54
--- /dev/null
@@ -0,0 +1,13 @@
+-- { dg-do run }
+
+with Aggr24_Pkg; use Aggr24_Pkg;
+
+procedure Aggr24 is
+  V : Rec;
+begin
+  V.S := "Hello";
+  Init (V);
+  if V.S /= "Hello" then
+    raise Program_Error;
+  end if;
+end;
diff --git a/gcc/testsuite/gnat.dg/aggr24_pkg.adb b/gcc/testsuite/gnat.dg/aggr24_pkg.adb
new file mode 100644 (file)
index 0000000..2ae3e79
--- /dev/null
@@ -0,0 +1,15 @@
+package body Aggr24_Pkg is
+
+   procedure Init (R : out Rec) is
+   begin
+      R := (I1 => 0,
+            I2 => 0,
+            I3 => 0,
+            I4 => 0,
+            I5 => 0,
+            I6 => 0,
+            I7 => 0,
+            S => <>);
+   end;
+   
+end Aggr24_Pkg;
diff --git a/gcc/testsuite/gnat.dg/aggr24_pkg.ads b/gcc/testsuite/gnat.dg/aggr24_pkg.ads
new file mode 100644 (file)
index 0000000..5918f5e
--- /dev/null
@@ -0,0 +1,16 @@
+package Aggr24_Pkg is
+
+   type Rec is record
+      I1 : Integer;
+      I2 : Integer;
+      I3 : Integer;
+      I4 : Integer;
+      I5 : Integer;
+      I6 : Integer;
+      I7 : Integer;
+      S : String (1 .. 5);
+   end record;
+
+   procedure Init (R : out Rec);
+
+end Aggr24_Pkg;