Commit 847b053d by Paul Thomas

re PR fortran/30878 (Rejects function f1; namelist /nml/ f1)

2007-05-11 Paul Thomas <pault@gcc.gnu.org>

	PR fortran/30878
	* resolve.c (resolve_fl_namelist): It is not an error if the
	namelist element is the result variable of the enclosing
	function.  Search for the symbol in current and all parent
	namespaces for a potential conflict.
	* symbol.c (check_conflict): Remove the conflict between
	'in_namelist' and 'FL_PROCEDURE' because the symbol info
	is not available to exclude function result variables.
	* trans-io.c (nml_get_addr_expr): Use the fake result decl
	if the symbol is an implicit result variable.

2007-05-11 Paul Thomas <pault@gcc.gnu.org>

	PR fortran/30878
	* gfortran.dg/namelist_29.f90: New test.

From-SVN: r124615
parent 35dd9a0e
2007-05-11 Paul Thomas <pault@gcc.gnu.org>
PR fortran/30878
* resolve.c (resolve_fl_namelist): It is not an error if the
namelist element is the result variable of the enclosing
function. Search for the symbol in current and all parent
namespaces for a potential conflict.
* symbol.c (check_conflict): Remove the conflict between
'in_namelist' and 'FL_PROCEDURE' because the symbol info
is not available to exclude function result variables.
* trans-io.c (nml_get_addr_expr): Use the fake result decl
if the symbol is an implicit result variable.
2007-05-11 Paul Thomas <pault@gcc.gnu.org> 2007-05-11 Paul Thomas <pault@gcc.gnu.org>
PR fortran/31474 PR fortran/31474
......
...@@ -6070,16 +6070,21 @@ resolve_fl_namelist (gfc_symbol *sym) ...@@ -6070,16 +6070,21 @@ resolve_fl_namelist (gfc_symbol *sym)
} }
/* 14.1.2 A module or internal procedure represent local entities /* 14.1.2 A module or internal procedure represent local entities
of the same type as a namelist member and so are not allowed. of the same type as a namelist member and so are not allowed. */
Note that this is sometimes caught by check_conflict so the
same message has been used. */
for (nl = sym->namelist; nl; nl = nl->next) for (nl = sym->namelist; nl; nl = nl->next)
{ {
if (nl->sym->ts.kind != 0 && nl->sym->attr.flavor == FL_VARIABLE) if (nl->sym->ts.kind != 0 && nl->sym->attr.flavor == FL_VARIABLE)
continue; continue;
if (nl->sym->attr.function && nl->sym == nl->sym->result)
if ((nl->sym == sym->ns->proc_name)
||
(sym->ns->parent && nl->sym == sym->ns->parent->proc_name))
continue;
nlsym = NULL; nlsym = NULL;
if (sym->ns->parent && nl->sym && nl->sym->name) if (nl->sym && nl->sym->name)
gfc_find_symbol (nl->sym->name, sym->ns->parent, 0, &nlsym); gfc_find_symbol (nl->sym->name, sym->ns, 1, &nlsym);
if (nlsym && nlsym->attr.flavor == FL_PROCEDURE) if (nlsym && nlsym->attr.flavor == FL_PROCEDURE)
{ {
gfc_error ("PROCEDURE attribute conflicts with NAMELIST " gfc_error ("PROCEDURE attribute conflicts with NAMELIST "
......
...@@ -477,6 +477,7 @@ check_conflict (symbol_attribute * attr, const char * name, locus * where) ...@@ -477,6 +477,7 @@ check_conflict (symbol_attribute * attr, const char * name, locus * where)
if (attr->in_namelist if (attr->in_namelist
&& attr->flavor != FL_VARIABLE && attr->flavor != FL_VARIABLE
&& attr->flavor != FL_PROCEDURE
&& attr->flavor != FL_UNKNOWN) && attr->flavor != FL_UNKNOWN)
{ {
......
...@@ -1297,6 +1297,13 @@ nml_get_addr_expr (gfc_symbol * sym, gfc_component * c, ...@@ -1297,6 +1297,13 @@ nml_get_addr_expr (gfc_symbol * sym, gfc_component * c,
{ {
sym->attr.referenced = 1; sym->attr.referenced = 1;
decl = gfc_get_symbol_decl (sym); decl = gfc_get_symbol_decl (sym);
/* If this is the enclosing function declaration, use
the fake result instead. */
if (decl == current_function_decl)
decl = gfc_get_fake_result_decl (sym, 0);
else if (decl == DECL_CONTEXT (current_function_decl))
decl = gfc_get_fake_result_decl (sym, 1);
} }
else else
decl = c->backend_decl; decl = c->backend_decl;
......
2007-05-11 Paul Thomas <pault@gcc.gnu.org>
PR fortran/30878
* gfortran.dg/namelist_29.f90: New test.
2007-05-11 Paul Thomas <pault@gcc.gnu.org> 2007-05-11 Paul Thomas <pault@gcc.gnu.org>
PR fortran/31474 PR fortran/31474
! { dg-do run }
! Checks the fix for PR30878, in which the inclusion
! of an implicit function result variable in a namelist
! would cause an error.
!
! Contributed by Joost VandeVondele <jv244@cam.ac.uk>
!
character(80) :: buffer
if (f1 (buffer) .ne. 42) call abort ()
CONTAINS
INTEGER FUNCTION F1 (buffer)
NAMELIST /mynml/ F1
integer :: check
character(80) :: buffer
F1 = 42
write (buffer, nml = mynml)
F1 = 0
READ (buffer, nml = mynml)
end function
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