utils.c (convert): When converting to the packable version of the type...
ada/ * gcc-interface/utils.c (convert) <CONSTRUCTOR case>: When converting to the packable version of the type, clear TREE_STATIC/TREE_CONSTANT on the result if at least one of the input fields couldn't be output as a static constant any more. testsuite/ * gnat.dg/nested_float_packed.ads: New test. Co-Authored-By: Eric Botcazou <ebotcazou@adacore.com> From-SVN: r148049
This commit is contained in:
parent
62295314f0
commit
db868e1edf
4 changed files with 55 additions and 0 deletions
|
@ -1,3 +1,11 @@
|
|||
2009-06-01 Olivier Hainque <hainque@adacore.com>
|
||||
Eric Botcazou <botcazou@adacore.com>
|
||||
|
||||
* gcc-interface/utils.c (convert) <CONSTRUCTOR case>: When converting
|
||||
to the packable version of the type, clear TREE_STATIC/TREE_CONSTANT
|
||||
on the result if at least one of the input fields couldn't be output
|
||||
as a static constant any more.
|
||||
|
||||
2009-06-01 Olivier Hainque <hainque@adacore.com>
|
||||
Eric Botcazou <botcazou@adacore.com>
|
||||
|
||||
|
|
|
@ -3979,6 +3979,10 @@ convert (tree type, tree expr)
|
|||
unsigned HOST_WIDE_INT idx;
|
||||
tree index, value;
|
||||
|
||||
/* Whether we need to clear TREE_CONSTANT et al. on the output
|
||||
constructor when we convert in place. */
|
||||
bool clear_constant = false;
|
||||
|
||||
FOR_EACH_CONSTRUCTOR_ELT(e, idx, index, value)
|
||||
{
|
||||
constructor_elt *elt = VEC_quick_push (constructor_elt, v, NULL);
|
||||
|
@ -3987,15 +3991,30 @@ convert (tree type, tree expr)
|
|||
break;
|
||||
elt->index = field;
|
||||
elt->value = convert (TREE_TYPE (field), value);
|
||||
|
||||
/* If packing has made this field a bitfield and the input
|
||||
value couldn't be emitted statically any more, we need to
|
||||
clear TREE_CONSTANT on our output. */
|
||||
if (!clear_constant && TREE_CONSTANT (expr)
|
||||
&& !CONSTRUCTOR_BITFIELD_P (efield)
|
||||
&& CONSTRUCTOR_BITFIELD_P (field)
|
||||
&& !initializer_constant_valid_for_bitfield_p (value))
|
||||
clear_constant = true;
|
||||
|
||||
efield = TREE_CHAIN (efield);
|
||||
field = TREE_CHAIN (field);
|
||||
}
|
||||
|
||||
/* If we have been able to match and convert all the input fields
|
||||
to their output type, convert in place now. We'll fallback to a
|
||||
view conversion downstream otherwise. */
|
||||
if (idx == len)
|
||||
{
|
||||
expr = copy_node (expr);
|
||||
TREE_TYPE (expr) = type;
|
||||
CONSTRUCTOR_ELTS (expr) = v;
|
||||
if (clear_constant)
|
||||
TREE_CONSTANT (expr) = TREE_STATIC (expr) = false;
|
||||
return expr;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,3 +1,7 @@
|
|||
2009-06-01 Olivier Hainque <hainque@adacore.com>
|
||||
|
||||
* gnat.dg/nested_float_packed.ads: New test.
|
||||
|
||||
2009-06-01 Olivier Hainque <hainque@adacore.com>
|
||||
Eric Botcazou <botcazou@adacore.com>
|
||||
|
||||
|
|
24
gcc/testsuite/gnat.dg/nested_float_packed.ads
Normal file
24
gcc/testsuite/gnat.dg/nested_float_packed.ads
Normal file
|
@ -0,0 +1,24 @@
|
|||
-- { dg-do compile }
|
||||
|
||||
package Nested_Float_Packed is
|
||||
|
||||
type Float_Type is record
|
||||
Value : Float;
|
||||
Valid : Boolean;
|
||||
end record;
|
||||
|
||||
type Data_Type is record
|
||||
Data : Float_Type;
|
||||
end record;
|
||||
|
||||
Default_Data : constant Data_Type :=
|
||||
(Data => (Value => 1.0, Valid => False));
|
||||
|
||||
type Range_Type is (RV1, RV2, RV3);
|
||||
for Range_Type use (1, 2, 3);
|
||||
|
||||
Data_Block : array (Range_Type)
|
||||
of Data_Type := (others => Default_Data);
|
||||
end;
|
||||
|
||||
|
Loading…
Add table
Reference in a new issue