From 847b053dd214c6e26a2025bf29422457cb50143d Mon Sep 17 00:00:00 2001 From: Paul Thomas Date: Fri, 11 May 2007 11:42:56 +0000 Subject: re PR fortran/30878 (Rejects function f1; namelist /nml/ f1) 2007-05-11 Paul Thomas 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 PR fortran/30878 * gfortran.dg/namelist_29.f90: New test. From-SVN: r124615 --- gcc/fortran/ChangeLog | 13 +++++++++++++ gcc/fortran/resolve.c | 15 ++++++++++----- gcc/fortran/symbol.c | 1 + gcc/fortran/trans-io.c | 7 +++++++ gcc/testsuite/ChangeLog | 5 +++++ gcc/testsuite/gfortran.dg/namelist_29.f90 | 20 ++++++++++++++++++++ 6 files changed, 56 insertions(+), 5 deletions(-) create mode 100644 gcc/testsuite/gfortran.dg/namelist_29.f90 diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog index 342864b..01eb910 100644 --- a/gcc/fortran/ChangeLog +++ b/gcc/fortran/ChangeLog @@ -1,3 +1,16 @@ +2007-05-11 Paul Thomas + + 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 PR fortran/31474 diff --git a/gcc/fortran/resolve.c b/gcc/fortran/resolve.c index 5c5d40b..dbb36d3 100644 --- a/gcc/fortran/resolve.c +++ b/gcc/fortran/resolve.c @@ -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 " diff --git a/gcc/fortran/symbol.c b/gcc/fortran/symbol.c index 0388e54e9..2fef9d5 100644 --- a/gcc/fortran/symbol.c +++ b/gcc/fortran/symbol.c @@ -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) { diff --git a/gcc/fortran/trans-io.c b/gcc/fortran/trans-io.c index 4b87bcb..e543f4c 100644 --- a/gcc/fortran/trans-io.c +++ b/gcc/fortran/trans-io.c @@ -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; diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 641c050..0ca48c0 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2007-05-11 Paul Thomas + + PR fortran/30878 + * gfortran.dg/namelist_29.f90: New test. + 2007-05-11 Paul Thomas PR fortran/31474 diff --git a/gcc/testsuite/gfortran.dg/namelist_29.f90 b/gcc/testsuite/gfortran.dg/namelist_29.f90 new file mode 100644 index 0000000..55bff0c --- /dev/null +++ b/gcc/testsuite/gfortran.dg/namelist_29.f90 @@ -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 +! + 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 -- cgit v1.1