re PR fortran/32926 (ICE with external function as argument)
authorPaul Thomas <pault@gcc.gnu.org>
Mon, 13 Aug 2007 21:02:00 +0000 (21:02 +0000)
committerPaul Thomas <pault@gcc.gnu.org>
Mon, 13 Aug 2007 21:02:00 +0000 (21:02 +0000)
2007-08-13  Paul Thomas  <pault@gcc.gnu.org>

PR fortran/32926
* match.c (gfc_match_call): Do not create a new symtree in the
case where the existing symbol is external and not referenced.

2007-08-13  Paul Thomas  <pault@gcc.gnu.org>

PR fortran/32926
* gfortran.dg/external_procedures_3.f90: New test.

From-SVN: r127398

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

index 26a0cd2b7f26f4351fca0066e085d1fa09141a8e..b6edba44b407380fbdf067be7601c02b1f7b0b36 100644 (file)
@@ -1,3 +1,9 @@
+2007-08-13  Paul Thomas  <pault@gcc.gnu.org>
+
+       PR fortran/32926
+       * match.c (gfc_match_call): Do not create a new symtree in the
+       case where the existing symbol is external and not referenced.
+
 2007-08-13  Paul Thomas  <pault@gcc.gnu.org>
 
        PR fortran/32827
index 39e39af29a6a209473c7583dc8ddbfbb0bde3751..5f56948e0f6137202567eef4dd3a45925231e219 100644 (file)
@@ -2333,13 +2333,16 @@ gfc_match_call (void)
   if (!sym->attr.generic
        && !sym->attr.subroutine)
     {
-      /* ...create a symbol in this scope...  */
-      if (sym->ns != gfc_current_ns
-           && gfc_get_sym_tree (name, NULL, &st) == 1)
-        return MATCH_ERROR;
+      if (!(sym->attr.external && !sym->attr.referenced))
+       {
+         /* ...create a symbol in this scope...  */
+         if (sym->ns != gfc_current_ns
+               && gfc_get_sym_tree (name, NULL, &st) == 1)
+            return MATCH_ERROR;
 
-      if (sym != st->n.sym)
-       sym = st->n.sym;
+         if (sym != st->n.sym)
+           sym = st->n.sym;
+       }
 
       /* ...and then to try to make the symbol into a subroutine.  */
       if (gfc_add_subroutine (&sym->attr, sym->name, NULL) == FAILURE)
index 2235cff60fe2a491787c51772908b3313e775777..9595f222548fa79d2420d99fecff7c5a60193519 100644 (file)
@@ -1,3 +1,8 @@
+2007-08-13  Paul Thomas  <pault@gcc.gnu.org>
+
+       PR fortran/32926
+       * gfortran.dg/external_procedures_3.f90: New test.
+
 2007-08-13  Paul Thomas  <pault@gcc.gnu.org>
 
        PR fortran/32827
diff --git a/gcc/testsuite/gfortran.dg/external_procedures_3.f90 b/gcc/testsuite/gfortran.dg/external_procedures_3.f90
new file mode 100644 (file)
index 0000000..987ba79
--- /dev/null
@@ -0,0 +1,35 @@
+! { dg-do run }
+! Tests the fix for PR32926, in which the call to fcn
+! in bar would cause an ICE because it had not been referenced
+! in the namespace where it was declared.
+!
+! Contributed by Ralph Baker Kearfott <rbk@louisiana.edu>
+!
+subroutine foobar1
+  common // chr
+  character(8) :: chr
+  chr = "foobar1"
+end subroutine
+subroutine foobar2
+  common // chr
+  character(8) :: chr
+  chr = "foobar2"
+end subroutine
+
+subroutine foo (fcn)
+  external fcn
+  call bar
+contains
+  subroutine bar
+    call fcn
+  end subroutine bar
+end subroutine foo
+
+  external foo, foobar1, foobar2
+  common // chr
+  character(8) :: chr
+  call foo (foobar1)
+  if (chr .ne. "foobar1") call abort ()
+  call foo (foobar2)
+  if (chr .ne. "foobar2") call abort ()
+end