re PR fortran/47601 ([OOP] Internal Error: mio_component_ref(): Component not found)
authorJanus Weil <janus@gcc.gnu.org>
Sun, 29 May 2011 20:32:11 +0000 (22:32 +0200)
committerJanus Weil <janus@gcc.gnu.org>
Sun, 29 May 2011 20:32:11 +0000 (22:32 +0200)
2011-05-29  Janus Weil  <janus@gcc.gnu.org>

PR fortran/47601
* module.c (mio_component_ref): Handle components of extended types.
* symbol.c (gfc_find_component): Return is sym is NULL.

2011-05-29  Janus Weil  <janus@gcc.gnu.org>

PR fortran/47601
* gfortran.dg/extends_13.f03: New.

From-SVN: r174416

gcc/fortran/ChangeLog
gcc/fortran/module.c
gcc/fortran/symbol.c
gcc/testsuite/ChangeLog
gcc/testsuite/gfortran.dg/extends_13.f03 [new file with mode: 0644]

index 5ffa5f673f9de2b2e0f4bccaa036d4ae83a6c5fd..da086438ab572d2ef7381b9ad14be908b46cb0e8 100644 (file)
@@ -1,3 +1,9 @@
+2011-05-29  Janus Weil  <janus@gcc.gnu.org>
+
+       PR fortran/47601
+       * module.c (mio_component_ref): Handle components of extended types.
+       * symbol.c (gfc_find_component): Return is sym is NULL.
+
 2011-05-29  Tobias Burnus  <burnus@net-b.de>
 
        PR fortran/18918
index b6acca3a5f13b05b36db296b36b13467aa297914..533246d0c8df078d01728e64e922257f2aadaf78 100644 (file)
@@ -2356,14 +2356,10 @@ mio_component_ref (gfc_component **cp, gfc_symbol *sym)
       if (sym->components != NULL && p->u.pointer == NULL)
        {
          /* Symbol already loaded, so search by name.  */
-         for (q = sym->components; q; q = q->next)
-           if (strcmp (q->name, name) == 0)
-             break;
-
-         if (q == NULL)
-           gfc_internal_error ("mio_component_ref(): Component not found");
+         q = gfc_find_component (sym, name, true, true);
 
-         associate_integer_pointer (p, q);
+         if (q)
+           associate_integer_pointer (p, q);
        }
 
       /* Make sure this symbol will eventually be loaded.  */
index 4b4f75fe827f19c6ecbbcaa1d85765bf72fa6468..b761cdd47e8011b2de22ad4ded6fc212150ff312 100644 (file)
@@ -1996,7 +1996,7 @@ gfc_find_component (gfc_symbol *sym, const char *name,
 {
   gfc_component *p;
 
-  if (name == NULL)
+  if (name == NULL || sym == NULL)
     return NULL;
 
   sym = gfc_use_derived (sym);
index 0f2b1dc1fe2540fe3ac835c7fc5272454769a99c..9c9b6fb470e0ea95a1998931e862d47421d3fa64 100644 (file)
@@ -1,3 +1,8 @@
+2011-05-29  Janus Weil  <janus@gcc.gnu.org>
+
+       PR fortran/47601
+       * gfortran.dg/extends_13.f03: New.
+
 2011-05-29  Jakub Jelinek  <jakub@redhat.com>
 
        PR rtl-optimization/49095
diff --git a/gcc/testsuite/gfortran.dg/extends_13.f03 b/gcc/testsuite/gfortran.dg/extends_13.f03
new file mode 100644 (file)
index 0000000..5d98687
--- /dev/null
@@ -0,0 +1,30 @@
+! { dg-do compile }
+!
+! PR 47601: [OOP] Internal Error: mio_component_ref(): Component not found
+!
+! Contributed by Rich Townsend <townsend@astro.wisc.edu>
+
+module type_definitions
+  implicit none
+  type :: matching 
+     integer :: n = -999
+  end type
+  type, extends(matching) :: ellipse
+  end type
+end module type_definitions
+
+module elliptical_elements
+  implicit none
+contains
+  function line(e) result(a2n)
+    use type_definitions
+    type(ellipse), intent(in) :: e
+    complex, dimension(e%N) :: a2n   ! <- change "e%N" to "10" 
+  end function line
+end module
+
+  use type_definitions
+  use elliptical_elements
+end
+
+! { dg-final { cleanup-modules "type_definitions elliptical_elements" } }