OSDN Git Service

2010-08-29 Janus Weil <janus@gcc.gnu.org>
authorjanus <janus@138bc75d-0d04-0410-961f-82ee72b054a4>
Sun, 29 Aug 2010 21:29:38 +0000 (21:29 +0000)
committerjanus <janus@138bc75d-0d04-0410-961f-82ee72b054a4>
Sun, 29 Aug 2010 21:29:38 +0000 (21:29 +0000)
PR fortran/42769
* resolve.c (resolve_structure_cons): For derived types, make sure the
type has been resolved.
(resolve_typebound_procedures): Make sure the vtab has been generated.

2010-08-29  Janus Weil  <janus@gcc.gnu.org>

PR fortran/42769
* gfortran.dg/dynamic_dispatch_11.f03: New.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@163631 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/fortran/ChangeLog
gcc/fortran/resolve.c
gcc/testsuite/ChangeLog
gcc/testsuite/gfortran.dg/dynamic_dispatch_11.f03 [new file with mode: 0644]

index 9dab697..c91663f 100644 (file)
@@ -1,10 +1,17 @@
 2010-08-29  Janus Weil  <janus@gcc.gnu.org>
 
+       PR fortran/42769
+       * resolve.c (resolve_structure_cons): For derived types, make sure the
+       type has been resolved.
+       (resolve_typebound_procedures): Make sure the vtab has been generated.
+
+2010-08-29  Janus Weil  <janus@gcc.gnu.org>
+
        PR fortran/45439
        * match.c (gfc_match_select_type): Give the associate-name the
        FL_VARIABLE attribute.
 
-2010-07-28  Steven G. Kargl  <kargl@gcc.gnu.org>
+2010-08-28  Steven G. Kargl  <kargl@gcc.gnu.org>
 
        * simplify.c (gfc_simplify_bessel_n2): Fix indention
        and argument type.
index 68faf8b..b9fea23 100644 (file)
@@ -930,6 +930,10 @@ resolve_structure_cons (gfc_expr *expr, int init)
   symbol_attribute a;
 
   t = SUCCESS;
+
+  if (expr->ts.type == BT_DERIVED)
+    resolve_symbol (expr->ts.u.derived);
+
   cons = gfc_constructor_first (expr->value.constructor);
   /* A constructor may have references if it is the result of substituting a
      parameter variable.  In this case we just pull out the component we
@@ -11039,6 +11043,7 @@ error:
   stree->n.tb->error = 1;
 }
 
+
 static gfc_try
 resolve_typebound_procedures (gfc_symbol* derived)
 {
@@ -11050,6 +11055,9 @@ resolve_typebound_procedures (gfc_symbol* derived)
   resolve_bindings_derived = derived;
   resolve_bindings_result = SUCCESS;
 
+  /* Make sure the vtab has been generated.  */
+  gfc_find_derived_vtab (derived);
+
   if (derived->f2k_derived->tb_sym_root)
     gfc_traverse_symtree (derived->f2k_derived->tb_sym_root,
                          &resolve_typebound_procedure);
index 3ef4c0e..fe9f024 100644 (file)
@@ -1,3 +1,8 @@
+2010-08-29  Janus Weil  <janus@gcc.gnu.org>
+
+       PR fortran/42769
+       * gfortran.dg/dynamic_dispatch_11.f03: New.
+
 2010-08-29  Jason Merrill  <jason@redhat.com>
 
        PR c++/44991
@@ -8,7 +13,7 @@
        PR fortran/45439
        * gfortran.dg/select_type_16.f03: New.
 
-2010-07-28  Steven G. Kargl  <kargl@gcc.gnu.org>
+2010-08-28  Steven G. Kargl  <kargl@gcc.gnu.org>
            Tobias Burnus  <burnus@net-b.de>
 
        * gfortran.dg/bessel_7.f90: Decrease required precision.
diff --git a/gcc/testsuite/gfortran.dg/dynamic_dispatch_11.f03 b/gcc/testsuite/gfortran.dg/dynamic_dispatch_11.f03
new file mode 100644 (file)
index 0000000..e4abcb2
--- /dev/null
@@ -0,0 +1,35 @@
+! { dg-do run }
+!
+! PR 42769: [OOP] ICE in resolve_typebound_procedure
+! comment #27
+!
+! Contributed by Janus Weil <janus@gcc.gnu.org>
+
+
+module mod1
+  type :: t1
+  contains
+    procedure, nopass :: get => my_get
+  end type
+contains 
+  integer function my_get()
+    my_get = 1
+  end function
+end module
+
+module mod2
+contains 
+  integer function my_get()   ! must have the same name as the function in mod1
+    my_get = 2
+  end function
+end module
+
+  use mod2
+  use mod1              ! order of use statements is important
+  class(t1),allocatable :: a
+  allocate(a)
+  if (a%get()/=1) call abort()
+end
+
+
+! { dg-final { cleanup-modules "mod1 mod2" } }