Commit 7f1387e0 by Eric Botcazou Committed by Eric Botcazou

gimplify.c (gimplify_init_constructor): Really never clear for an incomplete…

gimplify.c (gimplify_init_constructor): Really never clear for an incomplete constructor if CONSTRUCTOR_NO_CLEARING is set.

	* gimplify.c (gimplify_init_constructor): Really never clear for an
	incomplete constructor if CONSTRUCTOR_NO_CLEARING is set.

From-SVN: r261735
parent 1724941e
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> 2018-06-19 Richard Biener <rguenther@suse.de>
PR tree-optimization/86179 PR tree-optimization/86179
......
...@@ -4795,7 +4795,7 @@ gimplify_init_constructor (tree *expr_p, gimple_seq *pre_p, gimple_seq *post_p, ...@@ -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 objects. Initializers for such objects must explicitly set
every field that needs to be set. */ every field that needs to be set. */
cleared = false; cleared = false;
else if (!complete_p && !CONSTRUCTOR_NO_CLEARING (ctor)) else if (!complete_p)
/* If the constructor isn't complete, clear the whole object /* If the constructor isn't complete, clear the whole object
beforehand, unless CONSTRUCTOR_NO_CLEARING is set on it. 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, ...@@ -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 we'd need to *find* the elements that are not present, and that
requires trickery to avoid quadratic compile-time behavior in requires trickery to avoid quadratic compile-time behavior in
large cases or excessive memory use in small cases. */ large cases or excessive memory use in small cases. */
cleared = true; cleared = !CONSTRUCTOR_NO_CLEARING (ctor);
else if (num_ctor_elements - num_nonzero_elements else if (num_ctor_elements - num_nonzero_elements
> CLEAR_RATIO (optimize_function_for_speed_p (cfun)) > CLEAR_RATIO (optimize_function_for_speed_p (cfun))
&& num_nonzero_elements < num_ctor_elements / 4) && num_nonzero_elements < num_ctor_elements / 4)
......
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> 2018-06-19 Richard Biener <rguenther@suse.de>
PR tree-optimization/86179 PR tree-optimization/86179
......
-- { 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;
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;
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;
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment