]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
re PR fortran/30476 ([Regression 4.2, 4.3] Via other module imported generic interfac...
authorPaul Thomas <pault@gcc.gnu.org>
Wed, 17 Jan 2007 17:33:35 +0000 (17:33 +0000)
committerPaul Thomas <pault@gcc.gnu.org>
Wed, 17 Jan 2007 17:33:35 +0000 (17:33 +0000)
2007-01-17  Paul Thomas  <pault@gcc.gnu.org>

PR fortran/30476
* module.c (load_generic_interfaces): Make the marking of the
symbol as ambiguous conditional on the module names being
different.
(write_generic): Ensure that the generic interface has a
non-NULL module field.

2007-01-17  Paul Thomas  <pault@gcc.gnu.org>

PR fortran/30476
* gfortran.dg/generic_12.f90: New test.

From-SVN: r120860

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

index cba3de897de805f2d46cff72d236dac8709d4ac3..9dcead3472ee94b13c683d2c4d72b72b3f1c00c4 100644 (file)
@@ -1,3 +1,12 @@
+2007-01-17  Paul Thomas  <pault@gcc.gnu.org>
+
+       PR fortran/30476
+       * module.c (load_generic_interfaces): Make the marking of the
+       symbol as ambiguous conditional on the module names being
+       different.
+       (write_generic): Ensure that the generic interface has a
+       non-NULL module field.
+
 2007-01-16  Roger Sayle  <roger@eyesopen.com>
 
        PR fortran/30404
index 05056a5cb44154b29ae033248ddcc488df6eb20b..1613a740046c59ad27543a179932511b3e309748 100644 (file)
@@ -3097,9 +3097,11 @@ load_generic_interfaces (void)
              gfc_symtree *st;
              p = p ? p : name;
              st = gfc_find_symtree (gfc_current_ns->sym_root, p);
-             st->ambiguous = sym->attr.generic ? 0 : 1;
+             if (!sym->attr.generic
+                   && sym->module != NULL
+                   && strcmp(module, sym->module) != 0)
+               st->ambiguous = 1;
            }
-
          if (i == 1)
            {
              mio_interface_rest (&sym->generic);
@@ -3748,6 +3750,9 @@ write_generic (gfc_symbol * sym)
       || !gfc_check_access (sym->attr.access, sym->ns->default_access))
     return;
 
+  if (sym->module == NULL)
+    sym->module = gfc_get_string (module_name);
+
   mio_symbol_interface (&sym->name, &sym->module, &sym->generic);
 }
 
index b8072de9a7a1ac0ba7f466f417b903982359fcf2..e5724aee2167a5bf3b96742f5ee9cde224403b5a 100644 (file)
@@ -1,3 +1,8 @@
+2007-01-17  Paul Thomas  <pault@gcc.gnu.org>
+
+       PR fortran/30476
+       * gfortran.dg/generic_12.f90: New test.
+
 2007-01-17  Dorit Nuzman  <dorit@il.ibm.com>
 
        * gcc.target/i386/vectorize1.c: Add cleanup-tree-dump.
diff --git a/gcc/testsuite/gfortran.dg/generic_12.f90 b/gcc/testsuite/gfortran.dg/generic_12.f90
new file mode 100644 (file)
index 0000000..59c3c96
--- /dev/null
@@ -0,0 +1,32 @@
+! { dg-do compile }
+! Test the fix for PR30476 in which the generic interface hello
+! was found incorrectly to be ambiguous.
+!
+!Contributed by Tobias Burnus <burnus@gcc.gnu.org>
+!
+SUBROUTINE hello_x(dum)
+   IMPLICIT NONE
+   INTEGER :: dum
+   WRITE(0,*) "Hello world: ", dum
+END SUBROUTINE hello_x
+
+MODULE interfaces
+IMPLICIT NONE
+INTERFACE hello
+   SUBROUTINE hello_x(dum)
+      IMPLICIT NONE
+      INTEGER :: dum
+   END SUBROUTINE hello_x
+END INTERFACE
+END MODULE interfaces
+
+MODULE global_module
+  USE interfaces
+END MODULE global_module
+
+PROGRAM main
+  USE global_module
+  IMPLICIT NONE
+  CALL hello(10)
+END PROGRAM main
+! { dg-final { cleanup-modules "interfaces global_module" } }