re PR fortran/25094 (Procedure with public generic identifier allowed to have argumen...
authorDaniel Franke <franke.daniel@gmail.com>
Sun, 8 Jul 2007 20:38:58 +0000 (16:38 -0400)
committerDaniel Franke <dfranke@gcc.gnu.org>
Sun, 8 Jul 2007 20:38:58 +0000 (16:38 -0400)
gcc/fortran:
2007-07-08  Daniel Franke  <franke.daniel@gmail.com>

PR fortran/25094
* resolve.c (resolve_fl_procedure): Added check for PRIVATE types
in PUBLIC interfaces.

gcc/testsuite:
2007-07-08  Daniel Franke  <franke.daniel@gmail.com>

        PR fortran/25094
* gfortran.dg/interface_15.f90: New test.

From-SVN: r126466

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

index 0705ab89f039bc38157b692538128bf145f2356c..bda3726b24152c4b1a4d0ea66bd44c10c795d54f 100644 (file)
@@ -1,3 +1,9 @@
+2007-07-08  Daniel Franke  <franke.daniel@gmail.com>
+
+       PR fortran/25094
+       * resolve.c (resolve_fl_procedure): Added check for PRIVATE types 
+       in PUBLIC interfaces.
+
 2007-07-07  Jerry DeLisle  <jvdelisle@gcc.gnu.org>
 
        PR fortran/32644
index 16a782ad6030e7c12d52231f8f3127953f52ee18..b887d82e8c9802459fc5ebffba4ec9023f2c69c8 100644 (file)
@@ -6649,6 +6649,8 @@ resolve_fl_procedure (gfc_symbol *sym, int mp_flag)
        && sym->ns->parent->proc_name->attr.flavor == FL_MODULE)
       && gfc_check_access(sym->attr.access, sym->ns->default_access))
     {
+      gfc_interface *iface;
+
       for (arg = sym->formal; arg; arg = arg->next)
        {
          if (arg->sym
@@ -6666,6 +6668,29 @@ resolve_fl_procedure (gfc_symbol *sym, int mp_flag)
              return FAILURE;
            }
        }
+
+      /* PUBLIC interfaces may expose PRIVATE procedures that take types
+        PRIVATE to the containing module.  */
+      for (iface = sym->generic; iface; iface = iface->next)
+       {
+         for (arg = iface->sym->formal; arg; arg = arg->next)
+           {
+             if (arg->sym
+                 && arg->sym->ts.type == BT_DERIVED
+                 && !arg->sym->ts.derived->attr.use_assoc
+                 && !gfc_check_access (arg->sym->ts.derived->attr.access,
+                                       arg->sym->ts.derived->ns->default_access))
+               {
+                 gfc_error_now ("Procedure '%s' in PUBLIC interface '%s' at %L takes "
+                                "dummy arguments of '%s' which is PRIVATE",
+                                iface->sym->name, sym->name, &iface->sym->declared_at,
+                                gfc_typename(&arg->sym->ts));
+                 /* Stop this message from recurring.  */
+                 arg->sym->ts.derived->attr.access = ACCESS_PUBLIC;
+                 return FAILURE;
+               }
+            }
+       }
     }
 
   /* An external symbol may not have an initializer because it is taken to be
index 0800359460b64c4e107c363cfde7740162b4ce98..0aec398b7f998d9af64d669b301c21bb13ef42ee 100644 (file)
@@ -1,3 +1,8 @@
+2007-07-08  Daniel Franke  <franke.daniel@gmail.com>
+
+       PR fortran/25094
+       * gfortran.dg/interface_155555.f90: New test.
+
 2007-07-08  Kaveh R. Ghazi  <ghazi@caip.rutgers.edu>
 
        * gcc.dg/c99-math-double-1.c, gcc.dg/c99-math-float-1.c,
diff --git a/gcc/testsuite/gfortran.dg/interface_15.f90 b/gcc/testsuite/gfortran.dg/interface_15.f90
new file mode 100644 (file)
index 0000000..c9a3add
--- /dev/null
@@ -0,0 +1,22 @@
+! { dg-do compile }
+! { dg-options "-c" }
+! Testcase from PR fortran/25094
+! Contributed by Joost VandeVondele <jv244@cam.ac.uk>
+
+MODULE M1
+  TYPE T1
+    INTEGER :: I
+  END TYPE T1
+  INTERFACE I
+    MODULE PROCEDURE F1        ! { dg-error "PUBLIC interface" }
+  END INTERFACE
+  PRIVATE ! :: T1,F1
+  PUBLIC  :: I
+CONTAINS
+  INTEGER FUNCTION F1(D)
+    TYPE(T1) :: D
+    F1 = D%I
+  END FUNCTION
+END MODULE
+
+! { dg-final { cleanup-modules "M1" } }