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:
parent
5bc31e4207
commit
9723778490
6 changed files with 61 additions and 4 deletions
|
@ -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
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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
|
||||
|
|
23
gcc/testsuite/gnat.dg/nested_subtype_byref.adb
Normal file
23
gcc/testsuite/gnat.dg/nested_subtype_byref.adb
Normal 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;
|
||||
|
4
gcc/testsuite/gnat.dg/nested_subtype_byref.ads
Normal file
4
gcc/testsuite/gnat.dg/nested_subtype_byref.ads
Normal file
|
@ -0,0 +1,4 @@
|
|||
|
||||
package Nested_Subtype_Byref is
|
||||
procedure Check;
|
||||
end;
|
8
gcc/testsuite/gnat.dg/test_nested_subtype_byref.adb
Normal file
8
gcc/testsuite/gnat.dg/test_nested_subtype_byref.adb
Normal 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;
|
Loading…
Add table
Reference in a new issue