On 08.03.21 08:45, Richard Biener wrote:
On Fri, 5 Mar 2021, Tobias Burnus wrote:
Nested functions are permitted for C but not C++ as extension.
They are also permitted for Fortran, which generates DECL_CONTEXT
== NAMESPACE_DECL for module variables.
That causes the gcc_assert (decl_function_context (decl) == info->context)
to fail in tree-nested.c's lookup_field_for_decl. [...]
I think the bug is elsewhere. We're not expecting non-local
(non-auto) variables to be queried with lookup_field_for_decl. [...]
Now changed by doing the
'decl_function_context (decl) == info->context'
check in the caller's condition, which matches the rest of the file.
Thanks for the suggestion.
OK for mainline? GCC 10?
Tobias
-----------------
Mentor Graphics (Deutschland) GmbH, Arnulfstrasse 201, 80634 München
Registergericht München HRB 106955, Geschäftsführer: Thomas Heurung, Frank
Thürauf
tree-nested: Update assert for Fortran module vars [PR97927]
gcc/ChangeLog:
PR fortran/97927
* tree-nested.c (convert_local_reference_stmt): Avoid calling
lookup_field_for_decl for Fortran module (= namespace context).
gcc/testsuite/ChangeLog:
PR fortran/97927
* gfortran.dg/module_variable_3.f90: New test.
gcc/testsuite/gfortran.dg/module_variable_3.f90 | 37 +++++++++++++++++++++++++
gcc/tree-nested.c | 1 +
2 files changed, 38 insertions(+)
diff --git a/gcc/testsuite/gfortran.dg/module_variable_3.f90 b/gcc/testsuite/gfortran.dg/module_variable_3.f90
new file mode 100644
index 00000000000..0dae6d5bdd5
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/module_variable_3.f90
@@ -0,0 +1,37 @@
+! { dg-do compile }
+! { dg-additional-options "-fdump-tree-original" }
+!
+! PR fortran/97927
+!
+! Did ICE due to the in tree-nested.c due to {clobber}
+!
+
+module mpi2
+ interface
+ subroutine MPI_Allreduce(i)
+ implicit none
+ INTEGER, OPTIONAL, INTENT(OUT) :: i
+ end subroutine MPI_Allreduce
+ end interface
+end module
+
+module modmpi
+ implicit none
+ integer ierror ! module variable = context NAMESPACE_DECL
+end module
+
+subroutine exxengy
+ use modmpi
+ use mpi2, only: mpi_allreduce
+ implicit none
+
+ ! intent(out) implies: ierror = {clobber}
+ call mpi_allreduce(ierror)
+
+contains
+ subroutine zrho2
+ return
+ end subroutine
+end subroutine
+
+! { dg-final { scan-tree-dump "ierror = {CLOBBER};" "original" } }
diff --git a/gcc/tree-nested.c b/gcc/tree-nested.c
index addd6eef9ab..cea917a4d58 100644
--- a/gcc/tree-nested.c
+++ b/gcc/tree-nested.c
@@ -2526,6 +2526,7 @@ convert_local_reference_stmt (gimple_stmt_iterator *gsi, bool *handled_ops_p,
{
tree lhs = gimple_assign_lhs (stmt);
if (DECL_P (lhs)
+ && decl_function_context (lhs) == info->context
&& !use_pointer_in_frame (lhs)
&& lookup_field_for_decl (info, lhs, NO_INSERT))
{