Commit 675c873b by Eric Botcazou Committed by Eric Botcazou

expr.c (categorize_ctor_elements_1): Properly count sub-elements of non-constant…

expr.c (categorize_ctor_elements_1): Properly count sub-elements of non-constant aggregate elements.

	* expr.c (categorize_ctor_elements_1): Properly count sub-elements of
	non-constant aggregate elements.

	* gimplify.c (gimplify_init_constructor): Do not pre-evaluate if this
	is a real initialization.

From-SVN: r158219
parent 3fc20697
2010-04-12 Eric Botcazou <ebotcazou@adacore.com>
* expr.c (categorize_ctor_elements_1): Properly count sub-elements of
non-constant aggregate elements.
* gimplify.c (gimplify_init_constructor): Do not pre-evaluate if this
is a real initialization.
2010-04-12 Shujing Zhao <pearly.zhao@oracle.com>
PR c/36774
......
......@@ -4861,9 +4861,8 @@ categorize_ctor_elements_1 (const_tree ctor, HOST_WIDE_INT *p_nz_elts,
FOR_EACH_CONSTRUCTOR_ELT (CONSTRUCTOR_ELTS (ctor), idx, purpose, value)
{
HOST_WIDE_INT mult;
HOST_WIDE_INT mult = 1;
mult = 1;
if (TREE_CODE (purpose) == RANGE_EXPR)
{
tree lo_index = TREE_OPERAND (purpose, 0);
......@@ -4925,12 +4924,17 @@ categorize_ctor_elements_1 (const_tree ctor, HOST_WIDE_INT *p_nz_elts,
break;
default:
nz_elts += mult;
elt_count += mult;
{
HOST_WIDE_INT tc = count_type_elements (TREE_TYPE (value), true);
if (tc < 1)
tc = 1;
nz_elts += mult * tc;
elt_count += mult * tc;
if (const_from_elts_p && const_p)
const_p = initializer_constant_valid_p (value, TREE_TYPE (value))
!= NULL_TREE;
if (const_from_elts_p && const_p)
const_p = initializer_constant_valid_p (value, TREE_TYPE (value))
!= NULL_TREE;
}
break;
}
}
......
......@@ -3793,10 +3793,10 @@ gimplify_init_constructor (tree *expr_p, gimple_seq *pre_p, gimple_seq *post_p,
if (notify_temp_creation)
return GS_OK;
/* If there are nonzero elements, pre-evaluate to capture elements
overlapping with the lhs into temporaries. We must do this before
clearing to fetch the values before they are zeroed-out. */
if (num_nonzero_elements > 0)
/* If there are nonzero elements and if needed, pre-evaluate to capture
elements overlapping with the lhs into temporaries. We must do this
before clearing to fetch the values before they are zeroed-out. */
if (num_nonzero_elements > 0 && TREE_CODE (*expr_p) != INIT_EXPR)
{
preeval_data.lhs_base_decl = get_base_address (object);
if (!DECL_P (preeval_data.lhs_base_decl))
......
2010-04-12 Eric Botcazou <ebotcazou@adacore.com>
* gnat.dg/aggr13.adb: New test.
* gnat.dg/aggr14.adb: Likewise.
* gnat.dg/aggr14_pkg.ad[sb]: New helper.
2010-04-12 Richard Guenther <rguenther@suse.de>
PR c++/43611
......
-- { dg-do compile }
-- { dg-options "-fdump-tree-gimple" }
procedure Aggr13 is
type A is array (Integer range 1 .. 3) of Short_Short_Integer;
X : A := (1, 2, 3);
function F return A is
begin
if X /= (1, 2, 3) then
raise Program_Error;
end if;
return (1, 1, 1);
end;
begin
X := F;
end;
-- { dg-final { scan-tree-dump-not "= {}" "gimple" } }
-- { dg-final { cleanup-tree-dump "gimple" } }
-- { dg-do run }
with Aggr14_Pkg; use Aggr14_Pkg;
procedure Aggr14 is
begin
Proc;
end;
package body Aggr14_Pkg is
function F return A is
begin
if X /= (1, 2, 3) then
raise Program_Error;
end if;
return (1, 1, 1);
end;
procedure Proc is
begin
X := F;
end;
end Aggr14_Pkg;
package Aggr14_Pkg is
type A is array (Integer range 1 .. 3) of Short_Short_Integer;
X : A := (1, 2, 3);
procedure Proc;
end Aggr14_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