trans.c (gnat_to_gnu): Use DECL_SIZE_UNIT instead of TYPE_SIZE_UNIT for the size to be assigned by a...
* gcc-interface/trans.c (gnat_to_gnu) <N_Assignment_Statement>: Use DECL_SIZE_UNIT instead of TYPE_SIZE_UNIT for the size to be assigned by a call to memset if the LHS is a DECL. From-SVN: r268296
This commit is contained in:
parent
685ae5b871
commit
e54b62687a
|
@ -1,3 +1,9 @@
|
|||
2019-01-26 Eric Botcazou <ebotcazou@adacore.com>
|
||||
|
||||
* gcc-interface/trans.c (gnat_to_gnu) <N_Assignment_Statement>: Use
|
||||
DECL_SIZE_UNIT instead of TYPE_SIZE_UNIT for the size to be assigned
|
||||
by a call to memset if the LHS is a DECL.
|
||||
|
||||
2019-01-26 Eric Botcazou <ebotcazou@adacore.com>
|
||||
|
||||
* gcc-interface/trans.c (struct loop_info_d): Remove artificial field.
|
||||
|
|
|
@ -7742,12 +7742,17 @@ gnat_to_gnu (Node_Id gnat_node)
|
|||
= real_zerop (gnu_rhs)
|
||||
? integer_zero_node
|
||||
: fold_convert (integer_type_node, gnu_rhs);
|
||||
tree to = gnu_lhs;
|
||||
tree type = TREE_TYPE (to);
|
||||
tree size
|
||||
= SUBSTITUTE_PLACEHOLDER_IN_EXPR (TYPE_SIZE_UNIT (type), to);
|
||||
tree to_ptr = build_fold_addr_expr (to);
|
||||
tree dest = build_fold_addr_expr (gnu_lhs);
|
||||
tree t = builtin_decl_explicit (BUILT_IN_MEMSET);
|
||||
/* Be extra careful not to write too much data. */
|
||||
tree size;
|
||||
if (TREE_CODE (gnu_lhs) == COMPONENT_REF)
|
||||
size = DECL_SIZE_UNIT (TREE_OPERAND (gnu_lhs, 1));
|
||||
else if (DECL_P (gnu_lhs))
|
||||
size = DECL_SIZE_UNIT (gnu_lhs);
|
||||
else
|
||||
size = TYPE_SIZE_UNIT (TREE_TYPE (gnu_lhs));
|
||||
size = SUBSTITUTE_PLACEHOLDER_IN_EXPR (size, gnu_lhs);
|
||||
if (TREE_CODE (value) == INTEGER_CST && !integer_zerop (value))
|
||||
{
|
||||
tree mask
|
||||
|
@ -7755,7 +7760,7 @@ gnat_to_gnu (Node_Id gnat_node)
|
|||
((HOST_WIDE_INT) 1 << BITS_PER_UNIT) - 1);
|
||||
value = int_const_binop (BIT_AND_EXPR, value, mask);
|
||||
}
|
||||
gnu_result = build_call_expr (t, 3, to_ptr, value, size);
|
||||
gnu_result = build_call_expr (t, 3, dest, value, size);
|
||||
}
|
||||
|
||||
/* Otherwise build a regular assignment. */
|
||||
|
|
|
@ -1,3 +1,7 @@
|
|||
2019-01-26 Eric Botcazou <ebotcazou@adacore.com>
|
||||
|
||||
* gnat.dg/array34.adb: New test.
|
||||
|
||||
2019-01-26 Jakub Jelinek <jakub@redhat.com>
|
||||
|
||||
PR preprocessor/88974
|
||||
|
|
|
@ -0,0 +1,22 @@
|
|||
-- { dg-do run }
|
||||
|
||||
procedure Array34 is
|
||||
|
||||
type Arr is array (1 .. 6) of Short_Short_Integer;
|
||||
for Arr'Alignment use 4;
|
||||
|
||||
type Rec is record
|
||||
A : Arr;
|
||||
B: Short_Integer;
|
||||
end record;
|
||||
pragma Pack (Rec);
|
||||
|
||||
R : Rec;
|
||||
|
||||
begin
|
||||
R.B := 31415;
|
||||
R.A := (others => 0);
|
||||
if R.B /= 31415 then
|
||||
raise Program_Error;
|
||||
end if;
|
||||
end;
|
Loading…
Reference in New Issue