+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
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);
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;
}
}
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
--- /dev/null
+-- { 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" } }
--- /dev/null
+-- { dg-do run }
+
+with Aggr14_Pkg; use Aggr14_Pkg;
+
+procedure Aggr14 is
+begin
+ Proc;
+end;
--- /dev/null
+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;
--- /dev/null
+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;