From 716ac0fc6c0ef0f1bf3a295f1338eeb697cddb43 Mon Sep 17 00:00:00 2001 From: "Steven G. Kargl" Date: Sat, 17 Aug 2019 14:39:51 +0000 Subject: [PATCH] re PR fortran/78739 (ICE in gfc_get_symbol_decl, at fortran/trans-decl.c:1477) 2019-08-17 Steven G. Kargl 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 PR fortran/78739 * fortran.dg/pr78739.f90: New test. From-SVN: r274605 --- gcc/fortran/ChangeLog | 7 +++++++ gcc/fortran/match.c | 29 +++++++++++++++++++++++++++ gcc/testsuite/ChangeLog | 5 +++++ gcc/testsuite/gfortran.dg/pr78739.f90 | 15 ++++++++++++++ 4 files changed, 56 insertions(+) create mode 100644 gcc/testsuite/gfortran.dg/pr78739.f90 diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog index 2de3532f3f0..21593de0179 100644 --- a/gcc/fortran/ChangeLog +++ b/gcc/fortran/ChangeLog @@ -1,3 +1,10 @@ +2019-08-17 Steven G. Kargl + + 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 PR fortran/78719 diff --git a/gcc/fortran/match.c b/gcc/fortran/match.c index 5377e93871e..f148a02eb50 100644 --- a/gcc/fortran/match.c +++ b/gcc/fortran/match.c @@ -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 diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 1ab8b9e0ab0..8eecb3b96a4 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2019-08-17 Steven G. Kargl + + PR fortran/78739 + * fortran.dg/pr78739.f90: New test. + 2019-08-17 Steven G. Kargl PR fortran/78719 diff --git a/gcc/testsuite/gfortran.dg/pr78739.f90 b/gcc/testsuite/gfortran.dg/pr78739.f90 new file mode 100644 index 00000000000..4b36b76ab21 --- /dev/null +++ b/gcc/testsuite/gfortran.dg/pr78739.f90 @@ -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 -- 2.30.2