aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPaul Thomas <pault@gcc.gnu.org>2007-05-11 11:42:56 +0000
committerPaul Thomas <pault@gcc.gnu.org>2007-05-11 11:42:56 +0000
commit847b053dd214c6e26a2025bf29422457cb50143d (patch)
treeeb28e776bc0b0ddb2c8cd9a8a1ef194444373808
parent35dd9a0e6d9491ee708c2d75ecf8d74aa40cbb39 (diff)
downloadgcc-847b053dd214c6e26a2025bf29422457cb50143d.zip
gcc-847b053dd214c6e26a2025bf29422457cb50143d.tar.gz
gcc-847b053dd214c6e26a2025bf29422457cb50143d.tar.bz2
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
-rw-r--r--gcc/fortran/ChangeLog13
-rw-r--r--gcc/fortran/resolve.c15
-rw-r--r--gcc/fortran/symbol.c1
-rw-r--r--gcc/fortran/trans-io.c7
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gfortran.dg/namelist_29.f9020
6 files changed, 56 insertions, 5 deletions
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 <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
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 <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
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 <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