aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorThomas Koenig <Thomas.Koenig@online.de>2006-05-10 18:26:51 +0000
committerThomas Koenig <tkoenig@gcc.gnu.org>2006-05-10 18:26:51 +0000
commit3a7e3b6994153f59697d1ab2bc3e251daa63a4d7 (patch)
tree33ede0b0a98f6e88dc6d67b29051b2c929405f93
parent0e2df6898a99a0a0f08ae8439e738049f8134293 (diff)
downloadgcc-3a7e3b6994153f59697d1ab2bc3e251daa63a4d7.zip
gcc-3a7e3b6994153f59697d1ab2bc3e251daa63a4d7.tar.gz
gcc-3a7e3b6994153f59697d1ab2bc3e251daa63a4d7.tar.bz2
re PR fortran/27470 (wrong memory allocator for derived types)
2005-05-10 Thomas Koenig <Thomas.Koenig@online.de> PR fortran/27470 * trans-array.c(gfc_array_allocate): If ref->next exists that is if there is a statement like ALLOCATE(foo%bar(2)), F95 rules require that bar should be a pointer. 2005-05-10 Thomas Koenig <Thomas.Koenig@online.de> PR fortran/27470 * gfortran.dg/multiple_allocation_2.f90: New test case. From-SVN: r113680
-rw-r--r--gcc/fortran/ChangeLog7
-rw-r--r--gcc/fortran/trans-array.c16
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gfortran.dg/multiple_allocation_2.f9016
4 files changed, 43 insertions, 1 deletions
diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog
index 32cadb2..9fbde4d 100644
--- a/gcc/fortran/ChangeLog
+++ b/gcc/fortran/ChangeLog
@@ -1,3 +1,10 @@
+2005-05-10 Thomas Koenig <Thomas.Koenig@online.de>
+
+ PR fortran/27470
+ * trans-array.c(gfc_array_allocate): If ref->next exists
+ that is if there is a statement like ALLOCATE(foo%bar(2)),
+ F95 rules require that bar should be a pointer.
+
2006-05-10 Francois-Xavier Coudert <coudert@clipper.ens.fr>
PR fortran/20460
diff --git a/gcc/fortran/trans-array.c b/gcc/fortran/trans-array.c
index a620bff..7e9d5a6 100644
--- a/gcc/fortran/trans-array.c
+++ b/gcc/fortran/trans-array.c
@@ -3068,9 +3068,20 @@ gfc_array_allocate (gfc_se * se, gfc_expr * expr, tree pstat)
gfc_expr **upper;
gfc_ref *ref;
int allocatable_array;
+ int must_be_pointer;
ref = expr->ref;
+ /* In Fortran 95, components can only contain pointers, so that,
+ in ALLOCATE (foo%bar(2)), bar must be a pointer component.
+ We test this by checking for ref->next.
+ An implementation of TR 15581 would need to change this. */
+
+ if (ref)
+ must_be_pointer = ref->next != NULL;
+ else
+ must_be_pointer = 0;
+
/* Find the last reference in the chain. */
while (ref && ref->next != NULL)
{
@@ -3113,7 +3124,10 @@ gfc_array_allocate (gfc_se * se, gfc_expr * expr, tree pstat)
tmp = gfc_conv_descriptor_data_addr (se->expr);
pointer = gfc_evaluate_now (tmp, &se->pre);
- allocatable_array = expr->symtree->n.sym->attr.allocatable;
+ if (must_be_pointer)
+ allocatable_array = 0;
+ else
+ allocatable_array = expr->symtree->n.sym->attr.allocatable;
if (TYPE_PRECISION (gfc_array_index_type) == 32)
{
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index a7eace8..872070d 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2005-05-10 Thomas Koenig <Thomas.Koenig@online.de>
+
+ PR fortran/27470
+ * gfortran.dg/multiple_allocation_2.f90: New test case.
+
2006-05-10 Kazu Hirata <kazu@codesourcery.com>
* gcc.target/arm/pr27387.C: Fix a comment typo.
diff --git a/gcc/testsuite/gfortran.dg/multiple_allocation_2.f90 b/gcc/testsuite/gfortran.dg/multiple_allocation_2.f90
new file mode 100644
index 0000000..617405b
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/multiple_allocation_2.f90
@@ -0,0 +1,16 @@
+! { dg-do run }
+! PR 27470: This used fail because of confusion between
+! mol (allocatable) and mol(1)%array(:) (pointer).
+! Derived from a test case by FX Coudert.
+PROGRAM MAIN
+ TYPE foo
+ INTEGER, DIMENSION(:), POINTER :: array
+ END TYPE foo
+
+ type(foo),allocatable,dimension(:) :: mol
+
+ ALLOCATE (mol(1))
+ ALLOCATE (mol(1)%array(5))
+ ALLOCATE (mol(1)%array(5))
+
+ END