summaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorOlivier Hainque <hainque@adacore.com>2007-09-21 14:14:45 +0000
committerOlivier Hainque <hainque@gcc.gnu.org>2007-09-21 14:14:45 +0000
commit9723778490b9963e98658dc82a5f48b291cfe67a (patch)
tree2e798ccdee0816b4a2dc1b1ce10530fe5848a6ea /gcc
parent5bc31e42071e1cc19560dab58d5e574c44b464f9 (diff)
downloadgcc-9723778490b9963e98658dc82a5f48b291cfe67a.tar.gz
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
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ada/ChangeLog5
-rw-r--r--gcc/ada/utils.c20
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gnat.dg/nested_subtype_byref.adb23
-rw-r--r--gcc/testsuite/gnat.dg/nested_subtype_byref.ads4
-rw-r--r--gcc/testsuite/gnat.dg/test_nested_subtype_byref.adb8
6 files changed, 61 insertions, 4 deletions
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 <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
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 <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
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;