diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index e1b5d2a00b97958406b3771b447fbe65721d386a..3d3707d44e8de4e90ff5ab24dd72e8e6be01cb55 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -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-19  Richard Biener  <rguenther@suse.de>
 
 	PR tree-optimization/86179
diff --git a/gcc/gimplify.c b/gcc/gimplify.c
index 4bcdf440d7677552af10df93752b3422e86f50d2..1523a27e828569f815852bddcfb29ff9342f8ef9 100644
--- a/gcc/gimplify.c
+++ b/gcc/gimplify.c
@@ -4795,7 +4795,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.
 
@@ -4804,7 +4804,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)
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 67835408169b53a7699d510a47f3ce9bae7bc6c7..ca846009c6ff7b88c9efbee03277c70269569355 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -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-19  Richard Biener  <rguenther@suse.de>
 
 	PR tree-optimization/86179
diff --git a/gcc/testsuite/gnat.dg/aggr24.adb b/gcc/testsuite/gnat.dg/aggr24.adb
new file mode 100644
index 0000000000000000000000000000000000000000..b739c54fdc4a657b62da29d4ed75de6edaa67041
--- /dev/null
+++ b/gcc/testsuite/gnat.dg/aggr24.adb
@@ -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
index 0000000000000000000000000000000000000000..2ae3e79e322725f3392aebb01b03b750d0eae774
--- /dev/null
+++ b/gcc/testsuite/gnat.dg/aggr24_pkg.adb
@@ -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
index 0000000000000000000000000000000000000000..5918f5e8bd4d7d1e7e29d7dac70cc2220402be70
--- /dev/null
+++ b/gcc/testsuite/gnat.dg/aggr24_pkg.ads
@@ -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;