gimplify.c (gimplify_init_constructor): Arrange for the temporary captures of components overlapping the lhs to happen...
* gimplify.c (gimplify_init_constructor) <RECORD,UNION,ARRAY types>: Arrange for the temporary captures of components overlapping the lhs to happen before the lhs is possibly cleared. testsuite/ * gnat.dg/self_aggregate_with_zeros.adb: New test. * gnat.dg/self_aggregate_with_array.adb: New test. From-SVN: r116300
This commit is contained in:
parent
c5d4341770
commit
85d89e767b
5 changed files with 66 additions and 10 deletions
|
@ -1,3 +1,9 @@
|
||||||
|
2006-08-21 Olivier Hainque <hainque@adacore.com>
|
||||||
|
|
||||||
|
* gimplify.c (gimplify_init_constructor) <RECORD,UNION,ARRAY types>:
|
||||||
|
Arrange for the temporary captures of components overlapping the lhs
|
||||||
|
to happen before the lhs is possibly cleared.
|
||||||
|
|
||||||
2006-08-21 Mark Shinwell <shinwell@codesourcery.com>
|
2006-08-21 Mark Shinwell <shinwell@codesourcery.com>
|
||||||
|
|
||||||
* config/arm/pr-support.c (__gnu_unwind_execute): Insert " + 1" in
|
* config/arm/pr-support.c (__gnu_unwind_execute): Insert " + 1" in
|
||||||
|
|
|
@ -3061,6 +3061,20 @@ gimplify_init_constructor (tree *expr_p, tree *pre_p,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* 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)
|
||||||
|
{
|
||||||
|
preeval_data.lhs_base_decl = get_base_address (object);
|
||||||
|
if (!DECL_P (preeval_data.lhs_base_decl))
|
||||||
|
preeval_data.lhs_base_decl = NULL;
|
||||||
|
preeval_data.lhs_alias_set = get_alias_set (object);
|
||||||
|
|
||||||
|
gimplify_init_ctor_preeval (&TREE_OPERAND (*expr_p, 1),
|
||||||
|
pre_p, post_p, &preeval_data);
|
||||||
|
}
|
||||||
|
|
||||||
if (cleared)
|
if (cleared)
|
||||||
{
|
{
|
||||||
/* Zap the CONSTRUCTOR element list, which simplifies this case.
|
/* Zap the CONSTRUCTOR element list, which simplifies this case.
|
||||||
|
@ -3076,16 +3090,7 @@ gimplify_init_constructor (tree *expr_p, tree *pre_p,
|
||||||
elements in the constructor, add assignments to the individual
|
elements in the constructor, add assignments to the individual
|
||||||
scalar fields of the object. */
|
scalar fields of the object. */
|
||||||
if (!cleared || num_nonzero_elements > 0)
|
if (!cleared || num_nonzero_elements > 0)
|
||||||
{
|
gimplify_init_ctor_eval (object, elts, pre_p, cleared);
|
||||||
preeval_data.lhs_base_decl = get_base_address (object);
|
|
||||||
if (!DECL_P (preeval_data.lhs_base_decl))
|
|
||||||
preeval_data.lhs_base_decl = NULL;
|
|
||||||
preeval_data.lhs_alias_set = get_alias_set (object);
|
|
||||||
|
|
||||||
gimplify_init_ctor_preeval (&TREE_OPERAND (*expr_p, 1),
|
|
||||||
pre_p, post_p, &preeval_data);
|
|
||||||
gimplify_init_ctor_eval (object, elts, pre_p, cleared);
|
|
||||||
}
|
|
||||||
|
|
||||||
*expr_p = NULL_TREE;
|
*expr_p = NULL_TREE;
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,3 +1,8 @@
|
||||||
|
2006-08-21 Olivier Hainque <hainque@adacore.com>
|
||||||
|
|
||||||
|
* gnat.dg/self_aggregate_with_zeros.adb: New test.
|
||||||
|
* gnat.dg/self_aggregate_with_array.adb: New test.
|
||||||
|
|
||||||
2006-08-21 Mark Shinwell <shinwell@codesourcery.com>
|
2006-08-21 Mark Shinwell <shinwell@codesourcery.com>
|
||||||
|
|
||||||
* g++.dg/eh/arm-vfp-unwind.C: New test.
|
* g++.dg/eh/arm-vfp-unwind.C: New test.
|
||||||
|
|
21
gcc/testsuite/gnat.dg/self_aggregate_with_array.adb
Normal file
21
gcc/testsuite/gnat.dg/self_aggregate_with_array.adb
Normal file
|
@ -0,0 +1,21 @@
|
||||||
|
-- { dg-do run }
|
||||||
|
|
||||||
|
procedure self_aggregate_with_array is
|
||||||
|
|
||||||
|
type Value_Bounds is array (1 .. 2) of Natural;
|
||||||
|
|
||||||
|
type Sensor is record
|
||||||
|
Value : Natural;
|
||||||
|
Bounds : Value_Bounds;
|
||||||
|
end record;
|
||||||
|
|
||||||
|
Pressure : Sensor;
|
||||||
|
|
||||||
|
begin
|
||||||
|
Pressure.Value := 256;
|
||||||
|
Pressure := (Value => Pressure.Value, Bounds => (1, 2));
|
||||||
|
|
||||||
|
if Pressure.Value /= 256 then
|
||||||
|
raise Program_Error;
|
||||||
|
end if;
|
||||||
|
end;
|
19
gcc/testsuite/gnat.dg/self_aggregate_with_zeros.adb
Normal file
19
gcc/testsuite/gnat.dg/self_aggregate_with_zeros.adb
Normal file
|
@ -0,0 +1,19 @@
|
||||||
|
-- { dg-do run }
|
||||||
|
|
||||||
|
procedure self_aggregate_with_zeros is
|
||||||
|
|
||||||
|
type Sensor is record
|
||||||
|
Value : Natural;
|
||||||
|
A, B, C, D, E, F, G, H, I, J, K, L, M : Natural;
|
||||||
|
end record;
|
||||||
|
|
||||||
|
Pressure : Sensor;
|
||||||
|
|
||||||
|
begin
|
||||||
|
Pressure.Value := 256;
|
||||||
|
Pressure := (Pressure.Value, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);
|
||||||
|
|
||||||
|
if Pressure.Value /= 256 then
|
||||||
|
raise Program_Error;
|
||||||
|
end if;
|
||||||
|
end;
|
Loading…
Add table
Reference in a new issue