]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
re PR fortran/39519 (bad assignment to type with allocatable component)
authorPaul Thomas <pault@gcc.gnu.org>
Sat, 4 Apr 2009 14:47:23 +0000 (14:47 +0000)
committerPaul Thomas <pault@gcc.gnu.org>
Sat, 4 Apr 2009 14:47:23 +0000 (14:47 +0000)
2009-04-04  Paul Thomas  <pault@gcc.gnu.org>

PR fortran/39519
* parse.c (parse_derived): Do not break on finding pointer,
allocatable or private components.

2009-04-04  Paul Thomas  <pault@gcc.gnu.org>

PR fortran/39519
* gfortran.dg/alloc_comp_assign_9.f90: New test.

From-SVN: r145540

gcc/fortran/ChangeLog
gcc/fortran/parse.c
gcc/testsuite/ChangeLog
gcc/testsuite/gfortran.dg/alloc_comp_assign_9.f90 [new file with mode: 0644]

index 9063d51ad8cef8aa903260b599eaa9c00bb45041..f85b1d7e3ad31fd594715a279d89b9127ee485cc 100644 (file)
@@ -1,3 +1,9 @@
+2009-04-04  Paul Thomas  <pault@gcc.gnu.org>
+
+       PR fortran/39519
+       * parse.c (parse_derived): Do not break on finding pointer,
+       allocatable or private components.
+
 2009-03-07  Paul Thomas  <pault@gcc.gnu.org>
 
        PR fortran/39295
index e21dc4f15430ed999612c911a5231dd7a324d5ba..fcaeb2389662079c055218d215c5f12e946b653c 100644 (file)
@@ -1788,27 +1788,18 @@ parse_derived (void)
       /* Look for allocatable components.  */
       if (c->allocatable
          || (c->ts.type == BT_DERIVED && c->ts.derived->attr.alloc_comp))
-       {
-         sym->attr.alloc_comp = 1;
-         break;
-       }
+       sym->attr.alloc_comp = 1;
 
       /* Look for pointer components.  */
       if (c->pointer
          || (c->ts.type == BT_DERIVED && c->ts.derived->attr.pointer_comp))
-       {
-         sym->attr.pointer_comp = 1;
-         break;
-       }
+       sym->attr.pointer_comp = 1;
 
       /* Look for private components.  */
       if (sym->component_access == ACCESS_PRIVATE
          || c->access == ACCESS_PRIVATE
          || (c->ts.type == BT_DERIVED && c->ts.derived->attr.private_comp))
-       {
-         sym->attr.private_comp = 1;
-         break;
-       }
+       sym->attr.private_comp = 1;
     }
 
   if (!seen_component)
index 91d19668de88fbade1edbc9da31dcf4806790e5f..890ac47d339c490a4b9e509a2f3cdafa6696c1bd 100644 (file)
@@ -1,3 +1,8 @@
+2009-04-04  Paul Thomas  <pault@gcc.gnu.org>
+
+       PR fortran/39519
+       * gfortran.dg/alloc_comp_assign_9.f90: New test.
+
 2009-04-02  David Ayers  <ayers@fsfe.org>
 
        PR objc/18456
diff --git a/gcc/testsuite/gfortran.dg/alloc_comp_assign_9.f90 b/gcc/testsuite/gfortran.dg/alloc_comp_assign_9.f90
new file mode 100644 (file)
index 0000000..9051baf
--- /dev/null
@@ -0,0 +1,20 @@
+! { dg-do run }
+! Test the fix for PR39519, where the presence of the pointer
+! as the first component was preventing the second from passing
+! the "alloc_comp" attribute to the derived type.
+!
+! Contributed by Gilbert Scott <gilbert.scott@easynet.co.uk>
+!
+PROGRAM X
+  TYPE T
+    INTEGER, POINTER :: P
+    INTEGER, ALLOCATABLE :: A(:)
+  END TYPE T
+  TYPE(T) :: T1,T2
+  ALLOCATE ( T1%A(1) )
+  ALLOCATE ( T2%A(1) )
+  T1%A = 23
+  T2 = T1
+  T1%A = 42
+  if (T2%A(1) .NE. 23) CALL ABORT
+END PROGRAM X