On Thu, Dec 06, 2018 at 05:21:32PM -0800, Steve Kargl wrote: > > Here's an alternative patch that would reject a subroutine > with an alternate return dummy argument with the bind(c) > attributes. I'm still trying to determine if the code > should be legal. The c.l.f thread I started isn't helping :(
I think I have found the restriction. In F2018, C1554 If proc-language-binding-spec is specified for a procedure, each of its dummy arguments shall be an interoperable procedure (18.3.7) or a variable that is interoperable (18.3.5, 18.3.6), assumed-shape, assumed-rank, assumed-type, of type CHARACTER with assumed length, or that has the ALLOCATABLE or POINTER attribute. > > Index: decl.c > =================================================================== > --- decl.c (revision 266766) > +++ decl.c (working copy) > @@ -7467,6 +7467,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 > @@ -7532,6 +7533,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) > { > @@ -7543,6 +7546,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 > @@ -7556,8 +7561,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; > } > > -- > steve -- Steve 20170425 https://www.youtube.com/watch?v=VWUpyCsUKR4 20161221 https://www.youtube.com/watch?v=IbCHE-hONow