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:
parent
1009e9a2e4
commit
f28c46cdb8
@ -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
|
||||
|
@ -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;
|
||||
}
|
||||
|
||||
|
@ -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
|
||||
|
@ -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" }
|
||||
|
Loading…
Reference in New Issue
Block a user