re PR fortran/36251 (PUBLIC and PRIVATE abuse)
authorTobias Burnus <burnus@gcc.gnu.org>
Sun, 18 May 2008 11:10:11 +0000 (13:10 +0200)
committerTobias Burnus <burnus@gcc.gnu.org>
Sun, 18 May 2008 11:10:11 +0000 (13:10 +0200)
2008-05-18  Steven G. Kargl  <kargls@comcast.net>

        PR fortran/36251
        * symbol.c (check_conflict): Issue errors for abuse of PUBLIC,
        * PRIVATE,
        and BIND(C).
        * resolve.c (gfc_verify_binding_labels): Fix NULL pointer
        * dereference.

2008-05-18  Steven G. Kargl  <kargls@comcast.net>

        PR fortran/36251
        gfortran.dg/public_private_module.f90: new test.
        gfortran.dg/bind_c_module.f90: new test.

From-SVN: r135495

gcc/fortran/ChangeLog
gcc/fortran/resolve.c
gcc/fortran/symbol.c
gcc/testsuite/ChangeLog
gcc/testsuite/gfortran.dg/bind_c_module.f90 [new file with mode: 0644]
gcc/testsuite/gfortran.dg/public_private_module.f90 [new file with mode: 0644]

index 38cdafc..35c564c 100644 (file)
@@ -1,11 +1,18 @@
-2008-05-16  Tobias Burnus  <burnus@net-b.de>
+2008-05-18  Steven G. Kargl  <kargls@comcast.net>
+
+       PR fortran/36251
+       * symbol.c (check_conflict): Issue errors for abuse of PUBLIC, PRIVATE,
+       and BIND(C).
+       * resolve.c (gfc_verify_binding_labels): Fix NULL pointer dereference.
+
+2008-05-17  Tobias Burnus  <burnus@net-b.de>
 
        * intrinsic.texi: Correct description of GET_COMMAND_ARGUMENT
        and GET_ENVIRONMENT_VARIABLE; fix keyword= name for GETENV,
        GETLOG, GMTIME, HOSTNM, IRAND, ITIME, KILL.
        Move LOG_GAMMA after LOG10.
 
-2008-05-16  Tobias Burnus  <burnus@net-b.de>
+2008-05-17  Tobias Burnus  <burnus@net-b.de>
 
        * intrinsic.c (add_functions): Change FLUSH(C) to FLUSH(UNIT).
        * intrinsic.texi: Change INTEGER(*) to INTEGER; fix keyword= name for
index bf88624..dd251af 100644 (file)
@@ -6612,10 +6612,10 @@ gfc_verify_binding_labels (gfc_symbol *sym)
               has_error = 1;
             }
           else if (sym->attr.contained == 0 
-                   && (sym->attr.if_source == IFSRC_UNKNOWN))
-            if ((sym->attr.use_assoc 
-                 && (strcmp (bind_c_sym->mod_name, sym->module) != 0)
-                || sym->attr.use_assoc == 0)
+                   && sym->attr.if_source == IFSRC_UNKNOWN)
+           if ((sym->attr.use_assoc && bind_c_sym->mod_name
+                && strcmp (bind_c_sym->mod_name, sym->module) != 0
+               || sym->attr.use_assoc == 0)
               {
                 gfc_error ("Binding label '%s' at %L collides with global "
                            "entity '%s' at %L", sym->binding_label,
index 7f79ee3..431b651 100644 (file)
@@ -595,6 +595,21 @@ check_conflict (symbol_attribute *attr, const char *name, locus *where)
       conf2 (function);
       conf2 (subroutine);
       conf2 (threadprivate);
+
+      if (attr->access == ACCESS_PUBLIC || attr->access == ACCESS_PRIVATE)
+       {
+         a2 = attr->access == ACCESS_PUBLIC ? public : private;
+         gfc_error ("%s attribute applied to %s %s at %L", a2, a1,
+           name, where);
+         return FAILURE;
+       }
+
+      if (attr->is_bind_c)
+       {
+         gfc_error_now ("BIND(C) applied to %s %s at %L", a1, name, where);
+         return FAILURE;
+       }
+
       break;
 
     case FL_VARIABLE:
@@ -3625,7 +3640,8 @@ add_proc_interface (gfc_symbol *sym, ifsrc source,
    declaration statement (see match_proc_decl()) to create the formal
    args based on the args of a given named interface.  */
 
-void copy_formal_args (gfc_symbol *dest, gfc_symbol *src)
+void
+copy_formal_args (gfc_symbol *dest, gfc_symbol *src)
 {
   gfc_formal_arglist *head = NULL;
   gfc_formal_arglist *tail = NULL;
index 65aa1e2..d7ad2ec 100644 (file)
@@ -1,3 +1,9 @@
+2008-05-18  Steven G. Kargl  <kargls@comcast.net>
+
+       PR fortran/36251
+       gfortran.dg/public_private_module.f90: new test.
+       gfortran.dg/bind_c_module.f90: new test.
+
 2008-05-17  Xinliang David Li <davidxl@google.com>
 
        * gcc.dg/cdce1.c: New test
diff --git a/gcc/testsuite/gfortran.dg/bind_c_module.f90 b/gcc/testsuite/gfortran.dg/bind_c_module.f90
new file mode 100644 (file)
index 0000000..58aba2b
--- /dev/null
@@ -0,0 +1,22 @@
+! { dg-do compile }
+! See PR fortran/36251.
+module a
+  implicit none
+  integer :: i = 42
+end module a
+
+! Causes ICE
+module b
+  use iso_c_binding
+  use a
+  implicit none
+  bind(c) :: a  ! { dg-error "attribute applied to" }
+end module b
+
+! Causes ICE
+module d
+  use a
+  implicit none
+  bind(c) :: a  ! { dg-error "attribute applied to" }
+end module d
+! { dg-final { cleanup-modules "a" } }
diff --git a/gcc/testsuite/gfortran.dg/public_private_module.f90 b/gcc/testsuite/gfortran.dg/public_private_module.f90
new file mode 100644 (file)
index 0000000..ca1ab48
--- /dev/null
@@ -0,0 +1,19 @@
+! { dg-do compile }
+! See PR fortran/36251.
+module a
+  implicit none
+  integer :: i = 42
+end module a
+
+module b
+  use a
+  implicit none
+  public a  ! { dg-warning "attribute applied to" }
+end module b
+
+module d
+  use a
+  implicit none
+  private a  ! { dg-warning "attribute applied to" }
+end module d
+! { dg-final { cleanup-modules "a" } }