re PR fortran/85780 (ICE in resolve_fl_procedure, at fortran/resolve.c:12504)
authorSteven G. Kargl <kargl@gcc.gnu.org>
Fri, 25 Jan 2019 17:55:25 +0000 (17:55 +0000)
committerSteven G. Kargl <kargl@gcc.gnu.org>
Fri, 25 Jan 2019 17:55:25 +0000 (17:55 +0000)
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

gcc/fortran/ChangeLog
gcc/fortran/decl.c
gcc/testsuite/ChangeLog
gcc/testsuite/gfortran.dg/pr85780.f90

index d728c27ffa7a4f8e1208875645e392c71dd1838f..5ee82a6936596aa4394a536c4d975162d551ccc7 100644 (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
index 3314e176881e422ab951e6fa51bd8ec061eb1461..e798381467ddb01e985d8eef30f0b48ab419e2fe 100644 (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;
     }
 
index cdb816e9066c02b921759d0d4492ef48239ed8b3..75ce51ad837e0e777c5242001796245e7881e115 100644 (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
index ad6b27fc4db47f5b3e8f492cebcbe98a902c4869..b9432e8814edcda738f76a8e083398c1b4d5f51d 100644 (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" }