utils.c (type_for_nonaliased_component_p): Return false for all AGGREGATE_TYPEs.

2007-09-21  Olivier Hainque  <hainque@adacore.com>

	ada/
        * utils.c (type_for_nonaliased_component_p): Return false for
        all AGGREGATE_TYPEs.

	testsuite/
        * gnat.dg/nested_subtype_byref.ad[bs]: Part of new test.
        * gnat.dg/test_nested_subtype_byref.adb: New test.

From-SVN: r128650
This commit is contained in:
Olivier Hainque 2007-09-21 14:14:45 +00:00 committed by Olivier Hainque
parent 5bc31e4207
commit 9723778490
6 changed files with 61 additions and 4 deletions

View file

@ -1,3 +1,8 @@
2007-09-21 Olivier Hainque <hainque@adacore.com>
* utils.c (type_for_nonaliased_component_p): Return false for
all AGGREGATE_TYPEs.
2007-09-17 Eric Botcazou <ebotcazou@adacore.com>
* decl.c (gnat_to_gnu_entity) <object>: Make again the type of an

View file

@ -4005,10 +4005,22 @@ type_for_nonaliased_component_p (tree gnu_type)
if (must_pass_by_ref (gnu_type) || default_pass_by_ref (gnu_type))
return false;
/* We might need the address for any array type, even if normally
passed by copy, to construct a fat pointer if the component is
used as an actual for an unconstrained formal. */
if (TREE_CODE (gnu_type) == ARRAY_TYPE)
/* We used to say that any component of aggregate type is aliased
because the front-end may take 'Reference of it. The front-end
has been enhanced in the meantime so as to use a renaming instead
in most cases, but the back-end can probably take the address of
such a component too so we go for the conservative stance.
For instance, we might need the address of any array type, even
if normally passed by copy, to construct a fat pointer if the
component is used as an actual for an unconstrained formal.
Likewise for record types: even if a specific record subtype is
passed by copy, the parent type might be passed by ref (e.g. if
it's of variable size) and we might take the address of a child
component to pass to a parent formal. We have no way to check
for such conditions here. */
if (AGGREGATE_TYPE_P (gnu_type))
return false;
return true;

View file

@ -1,3 +1,8 @@
2007-09-21 Olivier Hainque <hainque@adacore.com>
* gnat.dg/nested_subtype_byref.ad[bs]: Part of new test.
* gnat.dg/test_nested_subtype_byref.adb: New test.
2007-09-21 Jakub Jelinek <jakub@redhat.com>
PR fortran/33439

View file

@ -0,0 +1,23 @@
package body Nested_Subtype_Byref is
type Data (Stamped : Boolean) is record
case Stamped is
when True => Valid : Boolean;
when others => null;
end case;
end record;
type Message is record
F : Integer := 1;
D : Data (Stamped => True);
end record;
procedure Check is
M : Message;
begin
M.D.Valid := True;
end;
end;

View file

@ -0,0 +1,4 @@
package Nested_Subtype_Byref is
procedure Check;
end;

View file

@ -0,0 +1,8 @@
-- { dg-do run }
-- { dg-options "-O2" }
with Nested_Subtype_Byref;
procedure Test_Nested_Subtype_Byref is
begin
Nested_Subtype_Byref.Check;
end;