re PR fortran/77501 ([F03] ICE in gfc_match_generic, at fortran/decl.c:9429)
authorJanus Weil <janus@gcc.gnu.org>
Sat, 12 Nov 2016 09:25:47 +0000 (10:25 +0100)
committerJanus Weil <janus@gcc.gnu.org>
Sat, 12 Nov 2016 09:25:47 +0000 (10:25 +0100)
2016-11-12  Janus Weil  <janus@gcc.gnu.org>

PR fortran/77501
* class.c (gfc_find_typebound_intrinsic_op): Remove an unnecessary
assert and nullification.
* decl.c (gfc_match_decl_type_spec): Use gfc_get_tbp_symtree,
fix indentation.
(gfc_match_generic): Remove an unnecessary assert.
Use gfc_get_tbp_symtree to avoid ICE.

2016-11-12  Janus Weil  <janus@gcc.gnu.org>

PR fortran/77501
* gfortran.dg/typebound_generic_16.f90: New test.

From-SVN: r242335

gcc/fortran/ChangeLog
gcc/fortran/class.c
gcc/fortran/decl.c
gcc/testsuite/ChangeLog
gcc/testsuite/gfortran.dg/typebound_generic_16.f90 [new file with mode: 0644]

index ae8f661ff534376b1d6617a24a1b234149be369d..6e0b654eb0e32125b1fdaef97d803cb38de72c32 100644 (file)
@@ -1,3 +1,13 @@
+2016-11-12  Janus Weil  <janus@gcc.gnu.org>
+
+       PR fortran/77501
+       * class.c (gfc_find_typebound_intrinsic_op): Remove an unnecessary
+       assert and nullification.
+       * decl.c (gfc_match_decl_type_spec): Use gfc_get_tbp_symtree,
+       fix indentation.
+       (gfc_match_generic): Remove an unnecessary assert.
+       Use gfc_get_tbp_symtree to avoid ICE.
+
 2016-11-10  Fritz O. Reese <fritzoreese@gmail.com>
 
        PR fortran/78277
index b7f68d2f19a5240ebab4a2b5d935b64e59b2e3c7..b42ec40578f065868e8a61477b6622a01b7ca722 100644 (file)
@@ -2963,15 +2963,6 @@ gfc_find_typebound_intrinsic_op (gfc_symbol* derived, bool* t,
 gfc_symtree*
 gfc_get_tbp_symtree (gfc_symtree **root, const char *name)
 {
-  gfc_symtree *result;
-
-  result = gfc_find_symtree (*root, name);
-  if (!result)
-    {
-      result = gfc_new_symtree (root, name);
-      gcc_assert (result);
-      result->n.tb = NULL;
-    }
-
-  return result;
+  gfc_symtree *result = gfc_find_symtree (*root, name);
+  return result ? result : gfc_new_symtree (root, name);
 }
index bf6bc2467098558054cd58aaa07267164bd9b5b2..b17a8aa7da242cde3d0d4f454d4f989115c64bfa 100644 (file)
@@ -3198,13 +3198,11 @@ gfc_match_decl_type_spec (gfc_typespec *ts, int implicit_flag)
              upe->attr.zero_comp = 1;
              if (!gfc_add_flavor (&upe->attr, FL_DERIVED, NULL,
                                   &gfc_current_locus))
-         return MATCH_ERROR;
-       }
+             return MATCH_ERROR;
+           }
          else
            {
-             st = gfc_find_symtree (gfc_current_ns->sym_root, "STAR");
-             if (st == NULL)
-               st = gfc_new_symtree (&gfc_current_ns->sym_root, "STAR");
+             st = gfc_get_tbp_symtree (&gfc_current_ns->sym_root, "STAR");
              st->n.sym = upe;
              upe->refs++;
            }
@@ -9731,14 +9729,7 @@ gfc_match_generic (void)
        gfc_symtree* st;
 
        st = gfc_find_symtree (is_op ? ns->tb_uop_root : ns->tb_sym_root, name);
-       if (st)
-         {
-           tb = st->n.tb;
-           gcc_assert (tb);
-         }
-       else
-         tb = NULL;
-
+       tb = st ? st->n.tb : NULL;
        break;
       }
 
@@ -9783,10 +9774,8 @@ gfc_match_generic (void)
        case INTERFACE_USER_OP:
          {
            const bool is_op = (op_type == INTERFACE_USER_OP);
-           gfc_symtree* st;
-
-           st = gfc_new_symtree (is_op ? &ns->tb_uop_root : &ns->tb_sym_root,
-                                 name);
+           gfc_symtree* st = gfc_get_tbp_symtree (is_op ? &ns->tb_uop_root :
+                                                  &ns->tb_sym_root, name);
            gcc_assert (st);
            st->n.tb = tb;
 
index 21d11935bc5568d847da24381c3c0451206c2620..dc6198a4d24cbc4106a1c3cf637b87dac7173cc9 100644 (file)
@@ -1,3 +1,8 @@
+2016-11-12  Janus Weil  <janus@gcc.gnu.org>
+
+       PR fortran/77501
+       * gfortran.dg/typebound_generic_16.f90: New test.
+
 2016-11-12  Jakub Jelinek  <jakub@redhat.com>
 
        PR c++/71225
diff --git a/gcc/testsuite/gfortran.dg/typebound_generic_16.f90 b/gcc/testsuite/gfortran.dg/typebound_generic_16.f90
new file mode 100644 (file)
index 0000000..0043fbb
--- /dev/null
@@ -0,0 +1,21 @@
+! { dg-do compile }
+!
+! PR 77501: [F03] ICE in gfc_match_generic, at fortran/decl.c:9429
+!
+! Contributed by Gerhard Steinmetz <gerhard.steinmetz.fortran@t-online.de>
+
+module m1
+  type t
+  contains
+    generic :: f => g  ! { dg-error "must target a specific binding" }
+    generic :: g => h  ! { dg-error "Undefined specific binding" }
+  end type
+end
+
+module m2
+  type t
+  contains
+    generic :: f => g  ! { dg-error "must target a specific binding" }
+    generic :: g => f  ! { dg-error "Undefined specific binding" }
+  end type
+end