Commit bb9de0c4 by Janus Weil

re PR fortran/50073 (gfortran must not accept function name when result name is present)

2011-08-14  Janus Weil  <janus@gcc.gnu.org>

	PR fortran/50073
	* decl.c (check_function_name): New function, separated off from
	'variable_decl' and slightly extended.
	(variable_decl,attr_decl1): Call it.


2011-08-14  Janus Weil  <janus@gcc.gnu.org>

	PR fortran/50073
	* gfortran.dg/func_result_7.f90: New.

From-SVN: r177745
parent f3713778
2011-08-14 Janus Weil <janus@gcc.gnu.org>
PR fortran/50073
* decl.c (check_function_name): New function, separated off from
'variable_decl' and slightly extended.
(variable_decl,attr_decl1): Call it.
2011-08-08 Rainer Orth <ro@CeBiTec.Uni-Bielefeld.DE> 2011-08-08 Rainer Orth <ro@CeBiTec.Uni-Bielefeld.DE>
* Make-lang.in (gfortran$(exeext)): Add $(EXTRA_GCC_LIBS). * Make-lang.in (gfortran$(exeext)): Add $(EXTRA_GCC_LIBS).
......
...@@ -1729,6 +1729,30 @@ match_pointer_init (gfc_expr **init, int procptr) ...@@ -1729,6 +1729,30 @@ match_pointer_init (gfc_expr **init, int procptr)
} }
static gfc_try
check_function_name (char *name)
{
/* In functions that have a RESULT variable defined, the function name always
refers to function calls. Therefore, the name is not allowed to appear in
specification statements. When checking this, be careful about
'hidden' procedure pointer results ('ppr@'). */
if (gfc_current_state () == COMP_FUNCTION)
{
gfc_symbol *block = gfc_current_block ();
if (block && block->result && block->result != block
&& strcmp (block->result->name, "ppr@") != 0
&& strcmp (block->name, name) == 0)
{
gfc_error ("Function name '%s' not allowed at %C", name);
return FAILURE;
}
}
return SUCCESS;
}
/* Match a variable name with an optional initializer. When this /* Match a variable name with an optional initializer. When this
subroutine is called, a variable is expected to be parsed next. subroutine is called, a variable is expected to be parsed next.
Depending on what is happening at the moment, updates either the Depending on what is happening at the moment, updates either the
...@@ -1935,17 +1959,9 @@ variable_decl (int elem) ...@@ -1935,17 +1959,9 @@ variable_decl (int elem)
goto cleanup; goto cleanup;
} }
} }
/* In functions that have a RESULT variable defined, the function if (check_function_name (name) == FAILURE)
name always refers to function calls. Therefore, the name is
not allowed to appear in specification statements. */
if (gfc_current_state () == COMP_FUNCTION
&& gfc_current_block () != NULL
&& gfc_current_block ()->result != NULL
&& gfc_current_block ()->result != gfc_current_block ()
&& strcmp (gfc_current_block ()->name, name) == 0)
{ {
gfc_error ("Function name '%s' not allowed at %C", name);
m = MATCH_ERROR; m = MATCH_ERROR;
goto cleanup; goto cleanup;
} }
...@@ -5995,6 +6011,12 @@ attr_decl1 (void) ...@@ -5995,6 +6011,12 @@ attr_decl1 (void)
if (find_special (name, &sym, false)) if (find_special (name, &sym, false))
return MATCH_ERROR; return MATCH_ERROR;
if (check_function_name (name) == FAILURE)
{
m = MATCH_ERROR;
goto cleanup;
}
var_locus = gfc_current_locus; var_locus = gfc_current_locus;
/* Deal with possible array specification for certain attributes. */ /* Deal with possible array specification for certain attributes. */
......
2011-08-14 Janus Weil <janus@gcc.gnu.org>
PR fortran/50073
* gfortran.dg/func_result_7.f90: New.
2011-08-13 Jason Merrill <jason@redhat.com> 2011-08-13 Jason Merrill <jason@redhat.com>
PR c++/50075 PR c++/50075
......
! { dg-do compile }
!
! PR 50073: gfortran must not accept function name when result name is present
!
! Contributed by Vittorio Zecca <zeccav@gmail.com>
function fun() result(f)
pointer fun ! { dg-error "not allowed" }
dimension fun(1) ! { dg-error "not allowed" }
f=0
end
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment