Commit 431cfac1 by Eric Botcazou Committed by Eric Botcazou

utils.c (convert): When converting to a padded type with an inner type of self-referential size...

	* gcc-interface/utils.c (convert): When converting to a padded type
	with an inner type of self-referential size, pad the expression before
	doing the unchecked conversion.

From-SVN: r152935
parent 3f273c8a
2009-10-17 Eric Botcazou <ebotcazou@adacore.com> 2009-10-17 Eric Botcazou <ebotcazou@adacore.com>
* gcc-interface/utils.c (convert): When converting to a padded type
with an inner type of self-referential size, pad the expression before
doing the unchecked conversion.
2009-10-17 Eric Botcazou <ebotcazou@adacore.com>
* gcc-interface/utils2.c (build_binary_op) <ARRAY_RANGE_REF>: Mak * gcc-interface/utils2.c (build_binary_op) <ARRAY_RANGE_REF>: Mak
sure the element type is consistent. sure the element type is consistent.
......
...@@ -3856,12 +3856,17 @@ convert (tree type, tree expr) ...@@ -3856,12 +3856,17 @@ convert (tree type, tree expr)
== TYPE_NAME (TREE_TYPE (TYPE_FIELDS (type)))))) == TYPE_NAME (TREE_TYPE (TYPE_FIELDS (type))))))
return convert (type, TREE_OPERAND (expr, 0)); return convert (type, TREE_OPERAND (expr, 0));
/* If the result type is a padded type with a self-referentially-sized /* If the inner type is of self-referential size and the expression type
field and the expression type is a record, do this as an unchecked is a record, do this as an unchecked conversion. But first pad the
conversion. */ expression if possible to have the same size on both sides. */
if (TREE_CODE (etype) == RECORD_TYPE if (TREE_CODE (etype) == RECORD_TYPE
&& CONTAINS_PLACEHOLDER_P (DECL_SIZE (TYPE_FIELDS (type)))) && CONTAINS_PLACEHOLDER_P (DECL_SIZE (TYPE_FIELDS (type))))
return unchecked_convert (type, expr, false); {
if (TREE_CONSTANT (TYPE_SIZE (etype)))
expr = convert (maybe_pad_type (etype, TYPE_SIZE (type), 0, Empty,
false, false, false, true), expr);
return unchecked_convert (type, expr, false);
}
/* If we are converting between array types with variable size, do the /* If we are converting between array types with variable size, do the
final conversion as an unchecked conversion, again to avoid the need final conversion as an unchecked conversion, again to avoid the need
......
2009-10-17 Eric Botcazou <ebotcazou@adacore.com> 2009-10-17 Eric Botcazou <ebotcazou@adacore.com>
* gnat.dg/aggr11.adb: New test.
* gnat.dg/aggr11_pkg.ads: New helper.
2009-10-17 Eric Botcazou <ebotcazou@adacore.com>
* gnat.dg/slice8.adb: New test. * gnat.dg/slice8.adb: New test.
* gnat.dg/slice8_pkg1.ads: New helper. * gnat.dg/slice8_pkg1.ads: New helper.
* gnat.dg/slice8_pkg2.ads: Likewise. * gnat.dg/slice8_pkg2.ads: Likewise.
......
-- { dg-do compile }
-- { dg-options "-O" }
with Aggr11_Pkg; use Aggr11_Pkg;
procedure Aggr11 is
A : Arr := ((1 => (Kind => No_Error, B => True),
2 => (Kind => Error),
3 => (Kind => Error),
4 => (Kind => No_Error, B => True),
5 => (Kind => No_Error, B => True),
6 => (Kind => No_Error, B => True)));
begin
null;
end;
package Aggr11_Pkg is
type Error_Type is (No_Error, Error);
type Rec (Kind : Error_Type := No_Error) is record
case Kind is
when Error => null;
when others => B : Boolean;
end case;
end record;
type Arr is array (1..6) of Rec;
end Aggr11_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