Commit f29041dd by Thomas Koenig

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
parent a78873e4
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-29 Thomas Koenig <tkoenig@gcc.gnu.org> 2011-12-29 Thomas Koenig <tkoenig@gcc.gnu.org>
* dependency.c (gfc_dep_compare_functions): Document * dependency.c (gfc_dep_compare_functions): Document
......
...@@ -4690,9 +4690,24 @@ gfc_check_vardef_context (gfc_expr* e, bool pointer, bool alloc_obj, ...@@ -4690,9 +4690,24 @@ gfc_check_vardef_context (gfc_expr* e, bool pointer, bool alloc_obj,
return FAILURE; return FAILURE;
} }
if (!pointer && gfc_implicit_pure (NULL) && gfc_impure_variable (sym)) if (!pointer && context && gfc_implicit_pure (NULL)
gfc_current_ns->proc_name->attr.implicit_pure = 0; && gfc_impure_variable (sym))
{
gfc_namespace *ns;
gfc_symbol *sym;
for (ns = gfc_current_ns; ns; ns = ns->parent)
{
sym = ns->proc_name;
if (sym == NULL)
break;
if (sym->attr.flavor == FL_PROCEDURE)
{
sym->attr.implicit_pure = 0;
break;
}
}
}
/* Check variable definition context for associate-names. */ /* Check variable definition context for associate-names. */
if (!pointer && sym->assoc) if (!pointer && sym->assoc)
{ {
......
...@@ -13103,24 +13103,25 @@ gfc_pure (gfc_symbol *sym) ...@@ -13103,24 +13103,25 @@ gfc_pure (gfc_symbol *sym)
int int
gfc_implicit_pure (gfc_symbol *sym) gfc_implicit_pure (gfc_symbol *sym)
{ {
symbol_attribute attr; gfc_namespace *ns;
if (sym == NULL) if (sym == NULL)
{ {
/* Check if the current namespace is implicit_pure. */ /* Check if the current procedure is implicit_pure. Walk up
sym = gfc_current_ns->proc_name; the procedure list until we find a procedure. */
if (sym == NULL) for (ns = gfc_current_ns; ns; ns = ns->parent)
return 0; {
attr = sym->attr; sym = ns->proc_name;
if (attr.flavor == FL_PROCEDURE if (sym == NULL)
&& attr.implicit_pure && !attr.pure) return 0;
return 1;
return 0; if (sym->attr.flavor == FL_PROCEDURE)
break;
}
} }
attr = sym->attr; return sym->attr.flavor == FL_PROCEDURE && sym->attr.implicit_pure
&& !sym->attr.pure;
return attr.flavor == FL_PROCEDURE && attr.implicit_pure && !attr.pure;
} }
......
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.
2011-12-30 Paolo Carlini <paolo.carlini@oracle.com> 2011-12-30 Paolo Carlini <paolo.carlini@oracle.com>
PR c++/51316 PR c++/51316
......
! { dg-do compile }
! PR 51502 - this was wrongly detected to be implicit pure.
module m
integer :: i
contains
subroutine foo(x)
integer, intent(inout) :: x
outer: block
block
i = 5
end block
end block outer
end subroutine foo
end module m
! { dg-final { scan-module-absence "m" "IMPLICIT_PURE" } }
! { dg-final { cleanup-modules "m" } }
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