re PR fortran/27470 (wrong memory allocator for derived types)
authorThomas Koenig <Thomas.Koenig@online.de>
Wed, 10 May 2006 18:26:51 +0000 (18:26 +0000)
committerThomas Koenig <tkoenig@gcc.gnu.org>
Wed, 10 May 2006 18:26:51 +0000 (18:26 +0000)
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

gcc/fortran/ChangeLog
gcc/fortran/trans-array.c
gcc/testsuite/ChangeLog
gcc/testsuite/gfortran.dg/multiple_allocation_2.f90 [new file with mode: 0644]

index 32cadb2f52c3dddf330d09971f65a56ebcac5696..9fbde4d3b2249263fa6e62113d2970a73492916f 100644 (file)
@@ -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
index a620bff67f063937cd381db44b93898c5fb4a240..7e9d5a65ef0503f80e30c13d1f2f2b311c5728ee 100644 (file)
@@ -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)
     {
index a7eace8726ff0a66264a36945eea6f92a1813a96..872070dccdf3854e3be20ef60545e0ebc138d13d 100644 (file)
@@ -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 (file)
index 0000000..617405b
--- /dev/null
@@ -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