mirror of git://gcc.gnu.org/git/gcc.git
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
This commit is contained in:
parent
a78873e4f3
commit
f29041dd8e
|
|
@ -1,3 +1,13 @@
|
||||||
|
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,
|
||||||
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)
|
||||||
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;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,3 +1,9 @@
|
||||||
|
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
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,17 @@
|
||||||
|
! { 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" } }
|
||||||
Loading…
Reference in New Issue