re PR fortran/85780 (ICE in resolve_fl_procedure, at fortran/resolve.c:12504)

2019-01-25  Steven G. Kargl  <kargl@gcc.gnu.org>

	PR fortran/85780
	* decl.c (gfc_match_subroutine): Check for conflict between BIND(C)
	and alternative return.

2019-01-25  Steven G. Kargl  <kargl@gcc.gnu.org>

	PR fortran/85780
	* gfortran.dg/pr85780.f90: Update testcase for error message.

From-SVN: r268277
This commit is contained in:
Steven G. Kargl 2019-01-25 17:55:25 +00:00
parent 1009e9a2e4
commit f28c46cdb8
4 changed files with 30 additions and 4 deletions

View File

@ -1,3 +1,9 @@
2019-01-25 Steven G. Kargl <kargl@gcc.gnu.org>
PR fortran/85780
* decl.c (gfc_match_subroutine): Check for conflict between BIND(C)
and alternative return.
2019-01-24 Paul Thomas <pault@gcc.gnu.org>
PR fortran/88929

View File

@ -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;
}

View File

@ -1,3 +1,8 @@
2019-01-25 Steven G. Kargl <kargl@gcc.gnu.org>
PR fortran/85780
* gfortran.dg/pr85780.f90: Update testcase for error message.
2019-01-25 Richard Earnshaw <rearnsha@arm.com>
PR target/88469

View File

@ -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" }