re PR fortran/78739 (ICE in gfc_get_symbol_decl, at fortran/trans-decl.c:1477)
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
This commit is contained in:
parent
1c3925e32a
commit
716ac0fc6c
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
Loading…
Reference in New Issue