decl.c (match_attr_spec): Pass on errors from gfc_match_bind_c.
authorJanus Weil <jaydub66@gmail.com>
Wed, 22 Aug 2007 21:11:13 +0000 (21:11 +0000)
committerTobias Burnus <burnus@gcc.gnu.org>
Wed, 22 Aug 2007 21:11:13 +0000 (23:11 +0200)
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.
(gfc_match_mopdproc): Bugfix to reject module procedures in
abstract interfaces.

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

* interface_abstract_1.f90: Extended test case.
* interface_abstract_3.f90: New test.

From-SVN: r127718

gcc/fortran/ChangeLog
gcc/fortran/decl.c
gcc/testsuite/ChangeLog
gcc/testsuite/gfortran.dg/interface_abstract_1.f90
gcc/testsuite/gfortran.dg/interface_abstract_3.f90 [new file with mode: 0644]

index 85e39038c8b478c4bd5640ecc8be21b809b46469..346e81197e9da8d38a168cfaa87e4c5ba6361644 100644 (file)
@@ -1,3 +1,10 @@
+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.
+       (gfc_match_mopdproc): Bugfix to reject module procedures in
+       abstract interfaces.
+
 2007-08-22  Kai Tietz  <kai.tietz@onevision.com>
 
        * f95-lang.c: (gfc_init_decl_processing): Choose sizetype by using
index eb1e4236a3b500980fb58556f98fa78f02c02ddd..2a80841d5dff3fe0771f6dd1e2a58deac957dfd5 100644 (file)
@@ -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;
@@ -5327,7 +5331,8 @@ gfc_match_modproc (void)
 
   if (gfc_state_stack->state != COMP_INTERFACE
       || gfc_state_stack->previous == NULL
-      || current_interface.type == INTERFACE_NAMELESS)
+      || current_interface.type == INTERFACE_NAMELESS
+      || current_interface.type == INTERFACE_ABSTRACT)
     {
       gfc_error ("MODULE PROCEDURE at %C must be in a generic module "
                 "interface");
index 6068fa9db9ba27313826d318d41698c9e62b7d15..cf9b7edb91e566ddb787bf46ad80016a254c42dc 100644 (file)
@@ -1,3 +1,8 @@
+2007-08-22  Janus Weil  <jaydub66@gmail.com>
+
+       * interface_abstract_1.f90: Extended test case.
+       * interface_abstract_3.f90: New test.
+
 2007-08-21  Christian Bruel  <christian.bruel@st.com>
 
        * gcc.dg/fold-sub.c: New test.
index afb3d6a2aac515c32adb3117348f70ceba9c3827..ab816bff7a147dcef175ec4909ee09c26c5a7074 100644 (file)
@@ -12,4 +12,10 @@ abstract interface
   subroutine real() ! { dg-error "cannot be the same as an intrinsic type" }
   end subroutine real
 end interface
+
+contains
+
+  subroutine sub() bind(C,name="subC")
+  end subroutine
+
 end
diff --git a/gcc/testsuite/gfortran.dg/interface_abstract_3.f90 b/gcc/testsuite/gfortran.dg/interface_abstract_3.f90
new file mode 100644 (file)
index 0000000..3008d10
--- /dev/null
@@ -0,0 +1,11 @@
+! { dg-do compile }
+! test for C1204 of Fortran 2003 standard:
+! module procedure not allowed in abstract interface
+module m
+  abstract interface
+     module procedure p        ! { dg-error "must be in a generic module interface" }
+  end interface
+contains
+  subroutine p()
+  end subroutine
+end module m