Commit f28c46cd by Steven G. Kargl

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
parent 1009e9a2
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> 2019-01-24 Paul Thomas <pault@gcc.gnu.org>
PR fortran/88929 PR fortran/88929
......
...@@ -7558,6 +7558,7 @@ gfc_match_subroutine (void) ...@@ -7558,6 +7558,7 @@ gfc_match_subroutine (void)
match is_bind_c; match is_bind_c;
char peek_char; char peek_char;
bool allow_binding_name; bool allow_binding_name;
locus loc;
if (gfc_current_state () != COMP_NONE if (gfc_current_state () != COMP_NONE
&& gfc_current_state () != COMP_INTERFACE && gfc_current_state () != COMP_INTERFACE
...@@ -7623,6 +7624,8 @@ gfc_match_subroutine (void) ...@@ -7623,6 +7624,8 @@ gfc_match_subroutine (void)
/* Here, we are just checking if it has the bind(c) attribute, and if /* 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, 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. */ 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); is_bind_c = gfc_match_bind_c (sym, allow_binding_name);
if (is_bind_c == MATCH_ERROR) if (is_bind_c == MATCH_ERROR)
{ {
...@@ -7634,6 +7637,8 @@ gfc_match_subroutine (void) ...@@ -7634,6 +7637,8 @@ gfc_match_subroutine (void)
if (is_bind_c == MATCH_YES) if (is_bind_c == MATCH_YES)
{ {
gfc_formal_arglist *arg;
/* The following is allowed in the Fortran 2008 draft. */ /* The following is allowed in the Fortran 2008 draft. */
if (gfc_current_state () == COMP_CONTAINS if (gfc_current_state () == COMP_CONTAINS
&& sym->ns->proc_name->attr.flavor != FL_MODULE && sym->ns->proc_name->attr.flavor != FL_MODULE
...@@ -7647,8 +7652,17 @@ gfc_match_subroutine (void) ...@@ -7647,8 +7652,17 @@ gfc_match_subroutine (void)
gfc_error ("Missing required parentheses before BIND(C) at %C"); gfc_error ("Missing required parentheses before BIND(C) at %C");
return MATCH_ERROR; 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; return MATCH_ERROR;
} }
......
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> 2019-01-25 Richard Earnshaw <rearnsha@arm.com>
PR target/88469 PR target/88469
......
! { dg-do compile } ! { dg-do compile }
! { dg-options "-std=legacy" } ! { dg-options "-fmax-errors=1" }
! PR fortran/85780 ! PR fortran/85780
subroutine s(*) bind(c) subroutine s(*) bind(c) ! { dg-error "Alternate return dummy argument" }
end end
! { dg-prune-output "compilation terminated" }
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment