diff options
author | Janus Weil <janus@gcc.gnu.org> | 2014-02-18 08:45:39 +0100 |
---|---|---|
committer | Janus Weil <janus@gcc.gnu.org> | 2014-02-18 08:45:39 +0100 |
commit | 2a144f64c934939d1b484dc2b285231cb2f3d0cf (patch) | |
tree | 0d86b47536439ae6ffa8db8f9a96f27836dc8101 /gcc/fortran/resolve.c | |
parent | d0b50387bcfac86cf270194aacc4a7677e621708 (diff) | |
download | gcc-2a144f64c934939d1b484dc2b285231cb2f3d0cf.zip gcc-2a144f64c934939d1b484dc2b285231cb2f3d0cf.tar.gz gcc-2a144f64c934939d1b484dc2b285231cb2f3d0cf.tar.bz2 |
re PR fortran/60231 (ICE on undefined generic)
2014-02-18 Janus Weil <janus@gcc.gnu.org>
PR fortran/60231
* resolve.c (check_generic_tbp_ambiguity): Check for presence of dummy
arguments to prevent ICE.
2014-02-18 Janus Weil <janus@gcc.gnu.org>
PR fortran/60231
* gfortran.dg/typebound_generic_15.f90: New.
From-SVN: r207836
Diffstat (limited to 'gcc/fortran/resolve.c')
-rw-r--r-- | gcc/fortran/resolve.c | 21 |
1 files changed, 18 insertions, 3 deletions
diff --git a/gcc/fortran/resolve.c b/gcc/fortran/resolve.c index b756fe2..8d5ca1b 100644 --- a/gcc/fortran/resolve.c +++ b/gcc/fortran/resolve.c @@ -11362,6 +11362,7 @@ check_generic_tbp_ambiguity (gfc_tbp_generic* t1, gfc_tbp_generic* t2, { gfc_symbol *sym1, *sym2; const char *pass1, *pass2; + gfc_formal_arglist *dummy_args; gcc_assert (t1->specific && t2->specific); gcc_assert (!t1->specific->is_generic); @@ -11384,19 +11385,33 @@ check_generic_tbp_ambiguity (gfc_tbp_generic* t1, gfc_tbp_generic* t2, return false; } - /* Compare the interfaces. */ + /* Determine PASS arguments. */ if (t1->specific->nopass) pass1 = NULL; else if (t1->specific->pass_arg) pass1 = t1->specific->pass_arg; else - pass1 = gfc_sym_get_dummy_args (t1->specific->u.specific->n.sym)->sym->name; + { + dummy_args = gfc_sym_get_dummy_args (t1->specific->u.specific->n.sym); + if (dummy_args) + pass1 = dummy_args->sym->name; + else + pass1 = NULL; + } if (t2->specific->nopass) pass2 = NULL; else if (t2->specific->pass_arg) pass2 = t2->specific->pass_arg; else - pass2 = gfc_sym_get_dummy_args (t2->specific->u.specific->n.sym)->sym->name; + { + dummy_args = gfc_sym_get_dummy_args (t2->specific->u.specific->n.sym); + if (dummy_args) + pass2 = dummy_args->sym->name; + else + pass2 = NULL; + } + + /* Compare the interfaces. */ if (gfc_compare_interfaces (sym1, sym2, sym2->name, !t1->is_operator, 0, NULL, 0, pass1, pass2)) { |