From f28c46cdb85172eb0e267b97e7a9d3befac30a2e Mon Sep 17 00:00:00 2001 From: "Steven G. Kargl" Date: Fri, 25 Jan 2019 17:55:25 +0000 Subject: [PATCH] re PR fortran/85780 (ICE in resolve_fl_procedure, at fortran/resolve.c:12504) 2019-01-25 Steven G. Kargl PR fortran/85780 * decl.c (gfc_match_subroutine): Check for conflict between BIND(C) and alternative return. 2019-01-25 Steven G. Kargl PR fortran/85780 * gfortran.dg/pr85780.f90: Update testcase for error message. From-SVN: r268277 --- gcc/fortran/ChangeLog | 6 ++++++ gcc/fortran/decl.c | 18 ++++++++++++++++-- gcc/testsuite/ChangeLog | 5 +++++ gcc/testsuite/gfortran.dg/pr85780.f90 | 5 +++-- 4 files changed, 30 insertions(+), 4 deletions(-) diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog index d728c27ffa7..5ee82a69365 100644 --- a/gcc/fortran/ChangeLog +++ b/gcc/fortran/ChangeLog @@ -1,3 +1,9 @@ +2019-01-25 Steven G. Kargl + + PR fortran/85780 + * decl.c (gfc_match_subroutine): Check for conflict between BIND(C) + and alternative return. + 2019-01-24 Paul Thomas PR fortran/88929 diff --git a/gcc/fortran/decl.c b/gcc/fortran/decl.c index 3314e176881..e798381467d 100644 --- a/gcc/fortran/decl.c +++ b/gcc/fortran/decl.c @@ -7558,6 +7558,7 @@ gfc_match_subroutine (void) match is_bind_c; char peek_char; bool allow_binding_name; + locus loc; if (gfc_current_state () != COMP_NONE && gfc_current_state () != COMP_INTERFACE @@ -7623,6 +7624,8 @@ gfc_match_subroutine (void) /* Here, we are just checking if it has the bind(c) attribute, and if so, then we need to make sure it's all correct. If it doesn't, we still need to continue matching the rest of the subroutine line. */ + gfc_gobble_whitespace (); + loc = gfc_current_locus; is_bind_c = gfc_match_bind_c (sym, allow_binding_name); if (is_bind_c == MATCH_ERROR) { @@ -7634,6 +7637,8 @@ gfc_match_subroutine (void) if (is_bind_c == MATCH_YES) { + gfc_formal_arglist *arg; + /* The following is allowed in the Fortran 2008 draft. */ if (gfc_current_state () == COMP_CONTAINS && sym->ns->proc_name->attr.flavor != FL_MODULE @@ -7647,8 +7652,17 @@ gfc_match_subroutine (void) gfc_error ("Missing required parentheses before BIND(C) at %C"); return MATCH_ERROR; } - if (!gfc_add_is_bind_c (&(sym->attr), sym->name, - &(sym->declared_at), 1)) + + /* Scan the dummy arguments for an alternate return. */ + for (arg = sym->formal; arg; arg = arg->next) + if (!arg->sym) + { + gfc_error ("Alternate return dummy argument cannot appear in a " + "SUBROUTINE with the BIND(C) attribute at %L", &loc); + return MATCH_ERROR; + } + + if (!gfc_add_is_bind_c (&(sym->attr), sym->name, &(sym->declared_at), 1)) return MATCH_ERROR; } diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index cdb816e9066..75ce51ad837 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2019-01-25 Steven G. Kargl + + PR fortran/85780 + * gfortran.dg/pr85780.f90: Update testcase for error message. + 2019-01-25 Richard Earnshaw PR target/88469 diff --git a/gcc/testsuite/gfortran.dg/pr85780.f90 b/gcc/testsuite/gfortran.dg/pr85780.f90 index ad6b27fc4db..b9432e8814e 100644 --- a/gcc/testsuite/gfortran.dg/pr85780.f90 +++ b/gcc/testsuite/gfortran.dg/pr85780.f90 @@ -1,5 +1,6 @@ ! { dg-do compile } -! { dg-options "-std=legacy" } +! { dg-options "-fmax-errors=1" } ! PR fortran/85780 -subroutine s(*) bind(c) +subroutine s(*) bind(c) ! { dg-error "Alternate return dummy argument" } end +! { dg-prune-output "compilation terminated" } -- 2.11.4.GIT