This is the mail archive of the fortran@gcc.gnu.org mailing list for the GNU Fortran project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: [PATCH, Fortran] ABSTRACT INTERFACE


Hi all,
I think I found a bug in the implementation of abstract interfaces.
Consider the following code:

program p
  abstract interface
    subroutine s()
    end subroutine
  end interface
contains
  subroutine x() bind(c,name="xyz")
  end subroutine
end program

This fails with:

subroutine x() bind(c,name="xyz")
                                  1
Error: NAME not allowed on BIND(C) for ABSTRACT INTERFACE at (1)

which clearly shouldn't happen, since the subroutine is not inside the
interface, but below it. Therefore I propose the attached patch, which
should fix this, and which also makes a small modification to
match_attr_spec to pass on any errors it gets from gfc_match_bind_c.
Cheers,
Janus


2007-08-22  Janus Weil  <jaydub66@gmail.com>

       * decl.c (match_attr_spec): Pass on errors from gfc_match_bind_c.
       (gfc_match_bind_c): Bugfix in check for NAME= with abstract interfaces.
Index: gcc/fortran/decl.c
===================================================================
--- gcc/fortran/decl.c	(revision 127658)
+++ gcc/fortran/decl.c	(working copy)
@@ -2549,8 +2549,11 @@ match_attr_spec (void)
 	      /* Chomp the comma.  */
 	      peek_char = gfc_next_char ();
 	      /* Try and match the bind(c).  */
-	      if (gfc_match_bind_c (NULL) == MATCH_YES)
+	      m = gfc_match_bind_c (NULL);
+	      if (m == MATCH_YES)
 		d = DECL_IS_BIND_C;
+	      else if (m == MATCH_ERROR)
+		goto cleanup;
 	    }
 	}
 
@@ -4183,7 +4186,8 @@ gfc_match_bind_c (gfc_symbol *sym)
 	strncpy (sym->binding_label, sym->name, strlen (sym->name) + 1);
     }
 
-  if (has_name_equals && current_interface.type == INTERFACE_ABSTRACT)
+  if (has_name_equals && gfc_current_state () == COMP_INTERFACE
+      && current_interface.type == INTERFACE_ABSTRACT)
     {
       gfc_error ("NAME not allowed on BIND(C) for ABSTRACT INTERFACE at %C");
       return MATCH_ERROR;

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]