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
This commit is contained in:
parent
35dd9a0e6d
commit
847b053dd2
6 changed files with 56 additions and 5 deletions
|
@ -1,3 +1,16 @@
|
|||
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/31474
|
||||
|
|
|
@ -6070,16 +6070,21 @@ resolve_fl_namelist (gfc_symbol *sym)
|
|||
}
|
||||
|
||||
/* 14.1.2 A module or internal procedure represent local entities
|
||||
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. */
|
||||
of the same type as a namelist member and so are not allowed. */
|
||||
for (nl = sym->namelist; nl; nl = nl->next)
|
||||
{
|
||||
if (nl->sym->ts.kind != 0 && nl->sym->attr.flavor == FL_VARIABLE)
|
||||
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;
|
||||
if (sym->ns->parent && nl->sym && nl->sym->name)
|
||||
gfc_find_symbol (nl->sym->name, sym->ns->parent, 0, &nlsym);
|
||||
if (nl->sym && nl->sym->name)
|
||||
gfc_find_symbol (nl->sym->name, sym->ns, 1, &nlsym);
|
||||
if (nlsym && nlsym->attr.flavor == FL_PROCEDURE)
|
||||
{
|
||||
gfc_error ("PROCEDURE attribute conflicts with NAMELIST "
|
||||
|
|
|
@ -477,6 +477,7 @@ check_conflict (symbol_attribute * attr, const char * name, locus * where)
|
|||
|
||||
if (attr->in_namelist
|
||||
&& attr->flavor != FL_VARIABLE
|
||||
&& attr->flavor != FL_PROCEDURE
|
||||
&& attr->flavor != FL_UNKNOWN)
|
||||
{
|
||||
|
||||
|
|
|
@ -1297,6 +1297,13 @@ nml_get_addr_expr (gfc_symbol * sym, gfc_component * c,
|
|||
{
|
||||
sym->attr.referenced = 1;
|
||||
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
|
||||
decl = c->backend_decl;
|
||||
|
|
|
@ -1,3 +1,8 @@
|
|||
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>
|
||||
|
||||
PR fortran/31474
|
||||
|
|
20
gcc/testsuite/gfortran.dg/namelist_29.f90
Normal file
20
gcc/testsuite/gfortran.dg/namelist_29.f90
Normal file
|
@ -0,0 +1,20 @@
|
|||
! { 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
|
Loading…
Add table
Reference in a new issue