From 9723778490b9963e98658dc82a5f48b291cfe67a Mon Sep 17 00:00:00 2001 From: Olivier Hainque Date: Fri, 21 Sep 2007 14:14:45 +0000 Subject: [PATCH] utils.c (type_for_nonaliased_component_p): Return false for all AGGREGATE_TYPEs. 2007-09-21 Olivier Hainque 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 --- gcc/ada/ChangeLog | 5 ++++ gcc/ada/utils.c | 20 ++++++++++++---- gcc/testsuite/ChangeLog | 5 ++++ .../gnat.dg/nested_subtype_byref.adb | 23 +++++++++++++++++++ .../gnat.dg/nested_subtype_byref.ads | 4 ++++ .../gnat.dg/test_nested_subtype_byref.adb | 8 +++++++ 6 files changed, 61 insertions(+), 4 deletions(-) create mode 100644 gcc/testsuite/gnat.dg/nested_subtype_byref.adb create mode 100644 gcc/testsuite/gnat.dg/nested_subtype_byref.ads create mode 100644 gcc/testsuite/gnat.dg/test_nested_subtype_byref.adb diff --git a/gcc/ada/ChangeLog b/gcc/ada/ChangeLog index 695d4485de3..bd2560cfcac 100644 --- a/gcc/ada/ChangeLog +++ b/gcc/ada/ChangeLog @@ -1,3 +1,8 @@ +2007-09-21 Olivier Hainque + + * utils.c (type_for_nonaliased_component_p): Return false for + all AGGREGATE_TYPEs. + 2007-09-17 Eric Botcazou * decl.c (gnat_to_gnu_entity) : Make again the type of an diff --git a/gcc/ada/utils.c b/gcc/ada/utils.c index 0db4e78dc9f..e9adfa649a0 100644 --- a/gcc/ada/utils.c +++ b/gcc/ada/utils.c @@ -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; diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 70ec4b7805d..3b95f1d8833 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2007-09-21 Olivier Hainque + + * 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 PR fortran/33439 diff --git a/gcc/testsuite/gnat.dg/nested_subtype_byref.adb b/gcc/testsuite/gnat.dg/nested_subtype_byref.adb new file mode 100644 index 00000000000..b232aa36da2 --- /dev/null +++ b/gcc/testsuite/gnat.dg/nested_subtype_byref.adb @@ -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; + diff --git a/gcc/testsuite/gnat.dg/nested_subtype_byref.ads b/gcc/testsuite/gnat.dg/nested_subtype_byref.ads new file mode 100644 index 00000000000..24e3f1eaaf8 --- /dev/null +++ b/gcc/testsuite/gnat.dg/nested_subtype_byref.ads @@ -0,0 +1,4 @@ + +package Nested_Subtype_Byref is + procedure Check; +end; diff --git a/gcc/testsuite/gnat.dg/test_nested_subtype_byref.adb b/gcc/testsuite/gnat.dg/test_nested_subtype_byref.adb new file mode 100644 index 00000000000..282aefd1a29 --- /dev/null +++ b/gcc/testsuite/gnat.dg/test_nested_subtype_byref.adb @@ -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;