re PR fortran/78739 (ICE in gfc_get_symbol_decl, at fortran/trans-decl.c:1477)
authorSteven G. Kargl <kargl@gcc.gnu.org>
Sat, 17 Aug 2019 14:39:51 +0000 (14:39 +0000)
committerSteven G. Kargl <kargl@gcc.gnu.org>
Sat, 17 Aug 2019 14:39:51 +0000 (14:39 +0000)
2019-08-17  Steven G. Kargl  <kargl@gcc.gnu.org>

PR fortran/78739
* match.c (gfc_match_st_function):  When matching a statement function,
need to check if the statement function name shadows the function
name.

2019-08-17  Steven G. Kargl  <kargl@gcc.gnu.org>

PR fortran/78739
* fortran.dg/pr78739.f90: New test.

From-SVN: r274605

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

index 2de3532f3f0b6b0693afc94cf0f914d2ceeb0189..21593de0179468bcf8c4533dc1bf520092aaca5d 100644 (file)
@@ -1,3 +1,10 @@
+2019-08-17  Steven G. Kargl  <kargl@gcc.gnu.org>
+
+       PR fortran/78739
+       * match.c (gfc_match_st_function):  When matching a statement function,
+       need to check if the statement function name shadows the function
+       name.
+
 2019-08-17  Steven G. Kargl  <kargl@gcc.gnu.org>
 
        PR fortran/78719
index 5377e93871ea33b13201e879160793c76b554d8e..f148a02eb5059c450388cd361a8ab6dff2471713 100644 (file)
@@ -5751,7 +5751,29 @@ gfc_match_st_function (void)
   gfc_symbol *sym;
   gfc_expr *expr;
   match m;
+  char name[GFC_MAX_SYMBOL_LEN + 1];
+  locus old_locus;
+  bool fcn;
+  gfc_formal_arglist *ptr;
+
+  /* Read the possible statement function name, and then check to see if
+     a symbol is already present in the namespace.  Record if it is a
+     function and whether it has been referenced.  */
+  fcn = false;
+  ptr = NULL;
+  old_locus = gfc_current_locus;
+  m = gfc_match_name (name);
+  if (m == MATCH_YES)
+    {
+      gfc_find_symbol (name, NULL, 1, &sym);
+      if (sym && sym->attr.function && !sym->attr.referenced)
+       {
+         fcn = true;
+         ptr = sym->formal;
+       }
+    }
 
+  gfc_current_locus = old_locus;
   m = gfc_match_symbol (&sym, 0);
   if (m != MATCH_YES)
     return m;
@@ -5779,6 +5801,13 @@ gfc_match_st_function (void)
       return MATCH_ERROR;
     }
 
+  if (fcn && ptr != sym->formal)
+    {
+      gfc_error ("Statement function %qs at %L conflicts with function name",
+                sym->name, &expr->where);
+      return MATCH_ERROR;
+    }
+
   sym->value = expr;
 
   if ((gfc_current_state () == COMP_FUNCTION
index 1ab8b9e0ab035637b5d06efab13b94b8959b1a71..8eecb3b96a480e80fd4b067666c81deead8e5a42 100644 (file)
@@ -1,3 +1,8 @@
+2019-08-17  Steven G. Kargl  <kargl@gcc.gnu.org>
+
+       PR fortran/78739
+       * fortran.dg/pr78739.f90: New test.
+
 2019-08-17  Steven G. Kargl  <kargl@gcc.gnu.org>
 
        PR fortran/78719
diff --git a/gcc/testsuite/gfortran.dg/pr78739.f90 b/gcc/testsuite/gfortran.dg/pr78739.f90
new file mode 100644 (file)
index 0000000..4b36b76
--- /dev/null
@@ -0,0 +1,15 @@
+! { dg-do compile }
+! { dg-options "-w" }
+! PR fortran/78739
+! Code contributed Gerhard Steinmetz
+function f(n)
+   f() = n    ! { dg-error "conflicts with function name" }
+end
+
+function g()
+   g(x) = x   ! { dg-error "conflicts with function name" }
+end
+
+function a()  ! This should cause an error, but cannot be easily detected!
+   a() = x
+end