diff options
author | Thomas Koenig <tkoenig@gcc.gnu.org> | 2011-12-31 08:18:52 +0000 |
---|---|---|
committer | Thomas Koenig <tkoenig@gcc.gnu.org> | 2011-12-31 08:18:52 +0000 |
commit | f29041dd8eefb8de8aa710fb15460af024f0dc6d (patch) | |
tree | 68b7fd1b2d1494a99a6c86ebfda5a6211ca412d7 /gcc/fortran/resolve.c | |
parent | a78873e4f39e57309c21669e480fc73c39fc68c2 (diff) | |
download | gcc-f29041dd8eefb8de8aa710fb15460af024f0dc6d.zip gcc-f29041dd8eefb8de8aa710fb15460af024f0dc6d.tar.gz gcc-f29041dd8eefb8de8aa710fb15460af024f0dc6d.tar.bz2 |
re PR fortran/51502 (Potentially wrong code generation due to wrong implict_pure check)
2011-12-31 Thomas König <tkoenig@gcc.gnu.org>
PR fortran/51502
* expr.c (gfc_check_vardef_context): When determining
implicit pure status, also check for variable definition
context. Walk up namespaces until a procedure is
found to reset the implict pure attribute.
* resolve.c (gfc_implicit_pure): Walk up namespaces
until a procedure is found.
2011-12-31 Thomas König <tkoenig@gcc.gnu.org>
PR fortran/51502
* lib/gcc-dg.exp (scan-module-absence): New function.
* gfortran.dg/implicit_pure_2.f90: New test.
From-SVN: r182754
Diffstat (limited to 'gcc/fortran/resolve.c')
-rw-r--r-- | gcc/fortran/resolve.c | 29 |
1 files changed, 15 insertions, 14 deletions
diff --git a/gcc/fortran/resolve.c b/gcc/fortran/resolve.c index 4bfdb79..0c27b23 100644 --- a/gcc/fortran/resolve.c +++ b/gcc/fortran/resolve.c @@ -13103,24 +13103,25 @@ gfc_pure (gfc_symbol *sym) int gfc_implicit_pure (gfc_symbol *sym) { - symbol_attribute attr; + gfc_namespace *ns; if (sym == NULL) { - /* Check if the current namespace is implicit_pure. */ - sym = gfc_current_ns->proc_name; - if (sym == NULL) - return 0; - attr = sym->attr; - if (attr.flavor == FL_PROCEDURE - && attr.implicit_pure && !attr.pure) - return 1; - return 0; + /* Check if the current procedure is implicit_pure. Walk up + the procedure list until we find a procedure. */ + for (ns = gfc_current_ns; ns; ns = ns->parent) + { + sym = ns->proc_name; + if (sym == NULL) + return 0; + + if (sym->attr.flavor == FL_PROCEDURE) + break; + } } - - attr = sym->attr; - - return attr.flavor == FL_PROCEDURE && attr.implicit_pure && !attr.pure; + + return sym->attr.flavor == FL_PROCEDURE && sym->attr.implicit_pure + && !sym->attr.pure; } |