re PR fortran/45827 ([OOP] mio_component_ref(): Component not found)
authorJanus Weil <janus@gcc.gnu.org>
Tue, 28 Dec 2010 21:21:53 +0000 (22:21 +0100)
committerJanus Weil <janus@gcc.gnu.org>
Tue, 28 Dec 2010 21:21:53 +0000 (22:21 +0100)
2010-12-28  Janus Weil  <janus@gcc.gnu.org>
    Daniel Franke  <dfranke@gcc.gnu.org>

PR fortran/45827
* module.c (mio_component_ref): Handle components of CLASS variables.

2010-12-28  Janus Weil  <janus@gcc.gnu.org>

PR fortran/45827
* gfortran.dg/class_32.f90: New.

Co-Authored-By: Daniel Franke <dfranke@gcc.gnu.org>
From-SVN: r168302

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

index 450d1df..e998899 100644 (file)
@@ -1,3 +1,9 @@
+2010-12-28  Janus Weil  <janus@gcc.gnu.org>
+           Daniel Franke  <dfranke@gcc.gnu.org>
+
+       PR fortran/45827
+       * module.c (mio_component_ref): Handle components of CLASS variables.
+
 2010-12-27  Thomas Koenig  <tkoenig@gcc.gnu.org>
 
        * dump-parse-tree.c (show_typespec):  Also show character kind.
index f10e43b..f75e3fd 100644 (file)
@@ -2311,6 +2311,9 @@ mio_component_ref (gfc_component **cp, gfc_symbol *sym)
     {
       mio_internal_string (name);
 
+      if (sym && sym->attr.is_class)
+       sym = sym->components->ts.u.derived;
+
       /* It can happen that a component reference can be read before the
         associated derived type symbol has been loaded. Return now and
         wait for a later iteration of load_needed.  */
index 91d1c11..29ffa84 100644 (file)
@@ -1,3 +1,8 @@
+2010-12-28  Janus Weil  <janus@gcc.gnu.org>
+
+       PR fortran/45827
+       * gfortran.dg/class_32.f90: New.
+
 2010-12-28  H.J. Lu  <hongjiu.lu@intel.com>
 
        * gcc.target/i386/rdrand-1.c: Updated.
diff --git a/gcc/testsuite/gfortran.dg/class_32.f90 b/gcc/testsuite/gfortran.dg/class_32.f90
new file mode 100644 (file)
index 0000000..b5857c1
--- /dev/null
@@ -0,0 +1,41 @@
+! { dg-do compile }
+!
+! PR 45827: [4.6 Regression] [OOP] mio_component_ref(): Component not found
+!
+! Contributed by Daniel Franke <dfranke@gcc.gnu.org>
+
+MODULE m
+
+  TYPE, ABSTRACT :: t
+    PRIVATE
+    INTEGER   :: n
+  CONTAINS
+    PROCEDURE :: get
+  END TYPE
+
+  ABSTRACT INTERFACE
+    SUBROUTINE create(this)
+      IMPORT t
+      CLASS(t) :: this
+    END SUBROUTINE
+  END INTERFACE
+
+CONTAINS
+
+  FUNCTION get(this)
+    CLASS(t) :: this
+    REAL, DIMENSION(this%n) :: get
+  END FUNCTION
+
+  SUBROUTINE destroy(this)
+    CLASS(t) :: this
+  END SUBROUTINE
+
+END MODULE
+
+
+PROGRAM p
+  USE m
+END
+
+! { dg-final { cleanup-modules "m" } }