]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
re PR fortran/59440 (ICE in force_decl_die, at dwarf2out.c:20111 with -g)
authorJakub Jelinek <jakub@redhat.com>
Fri, 17 Jan 2014 14:42:58 +0000 (15:42 +0100)
committerJakub Jelinek <jakub@gcc.gnu.org>
Fri, 17 Jan 2014 14:42:58 +0000 (15:42 +0100)
PR fortran/59440
* tree-nested.c (convert_nonlocal_reference_stmt,
convert_local_reference_stmt): For NAMELIST_DECLs in gimple_bind_vars
of GIMPLE_BIND stmts, adjust associated decls.

* gfortran.dg/pr59440-1.f90: New test.
* gfortran.dg/pr59440-2.f90: New test.
* gfortran.dg/pr59440-3.f90: New test.

From-SVN: r206711

gcc/ChangeLog
gcc/testsuite/ChangeLog
gcc/testsuite/gfortran.dg/pr59440-1.f90 [new file with mode: 0644]
gcc/testsuite/gfortran.dg/pr59440-2.f90 [new file with mode: 0644]
gcc/testsuite/gfortran.dg/pr59440-3.f90 [new file with mode: 0644]
gcc/tree-nested.c

index 0402a4d30e25ea23362a5ce6e30da885ba34f8b0..d583762712a5dafab113ba75a55b7e665d1e0498 100644 (file)
@@ -1,3 +1,10 @@
+2014-01-17  Jakub Jelinek  <jakub@redhat.com>
+
+       PR fortran/59440
+       * tree-nested.c (convert_nonlocal_reference_stmt,
+       convert_local_reference_stmt): For NAMELIST_DECLs in gimple_bind_vars
+       of GIMPLE_BIND stmts, adjust associated decls.
+
 2014-01-17  Richard Biener  <rguenther@suse.de>
 
        PR tree-optimization/46590
index cf0c3c891cd038c489d9f10353bfa2d789573210..1d7dcf7c313f50968b210a9d41d21f87558c25d6 100644 (file)
@@ -1,5 +1,10 @@
 2014-01-17  Jakub Jelinek  <jakub@redhat.com>
 
+       PR fortran/59440
+       * gfortran.dg/pr59440-1.f90: New test.
+       * gfortran.dg/pr59440-2.f90: New test.
+       * gfortran.dg/pr59440-3.f90: New test.
+
        PR testsuite/59064
        * gcc.dg/vect/vect-ivdep-1.c: Replace two dg-bogus lines separately
        testing for " version" and " alias" with one testing for
diff --git a/gcc/testsuite/gfortran.dg/pr59440-1.f90 b/gcc/testsuite/gfortran.dg/pr59440-1.f90
new file mode 100644 (file)
index 0000000..d874c6d
--- /dev/null
@@ -0,0 +1,23 @@
+! PR fortran/59440
+! { dg-do compile }
+! { dg-options "-O2 -g" }
+
+module pr59440
+  implicit none
+  type t
+     integer :: grid = 0
+  end type t
+contains
+  subroutine read_nml (nnml, s)
+    integer, intent(in)  :: nnml
+    type(t), intent(out) :: s
+    integer              :: grid
+    namelist /N/ grid
+    call read_nml_type_2
+    s%grid = grid
+  contains
+    subroutine read_nml_type_2
+      read (nnml, nml=N)
+    end subroutine read_nml_type_2
+  end subroutine read_nml
+end module pr59440
diff --git a/gcc/testsuite/gfortran.dg/pr59440-2.f90 b/gcc/testsuite/gfortran.dg/pr59440-2.f90
new file mode 100644 (file)
index 0000000..a9f027c
--- /dev/null
@@ -0,0 +1,16 @@
+! PR fortran/59440
+! { dg-do compile }
+! { dg-options "-O2 -g" }
+
+subroutine foo (nnml, outv)
+  integer, intent(in) :: nnml
+  integer, intent(out) :: outv
+  integer :: grid
+  namelist /N/ grid
+  read (nnml, nml=N)
+  call bar
+contains
+  subroutine bar
+    outv = grid
+  end subroutine bar
+end subroutine foo
diff --git a/gcc/testsuite/gfortran.dg/pr59440-3.f90 b/gcc/testsuite/gfortran.dg/pr59440-3.f90
new file mode 100644 (file)
index 0000000..70fe6a5
--- /dev/null
@@ -0,0 +1,16 @@
+! PR fortran/59440
+! { dg-do compile }
+! { dg-options "-O2 -g" }
+
+subroutine foo (nnml, outv)
+  integer, intent(in) :: nnml
+  integer, intent(out) :: outv
+  integer :: grid
+  call bar
+  outv = grid
+contains
+  subroutine bar
+    namelist /N/ grid
+    read (nnml, nml=N)
+  end subroutine bar
+end subroutine foo
index 6d1b501dccd14ef673b622cdbae47a88ed0a0add..df6923f76ef3317bd67cc8c8acade1d1a03ea656 100644 (file)
@@ -1331,6 +1331,25 @@ convert_nonlocal_reference_stmt (gimple_stmt_iterator *gsi, bool *handled_ops_p,
       if (!optimize && gimple_bind_block (stmt))
        note_nonlocal_block_vlas (info, gimple_bind_block (stmt));
 
+      for (tree var = gimple_bind_vars (stmt); var; var = DECL_CHAIN (var))
+       if (TREE_CODE (var) == NAMELIST_DECL)
+         {
+           /* Adjust decls mentioned in NAMELIST_DECL.  */
+           tree decls = NAMELIST_DECL_ASSOCIATED_DECL (var);
+           tree decl;
+           unsigned int i;
+
+           FOR_EACH_CONSTRUCTOR_VALUE (CONSTRUCTOR_ELTS (decls), i, decl)
+             {
+               if (TREE_CODE (decl) == VAR_DECL
+                   && (TREE_STATIC (decl) || DECL_EXTERNAL (decl)))
+                 continue;
+               if (decl_function_context (decl) != info->context)
+                 CONSTRUCTOR_ELT (decls, i)->value
+                   = get_nonlocal_debug_decl (info, decl);
+             }
+         }
+
       *handled_ops_p = false;
       return NULL_TREE;
 
@@ -1787,6 +1806,36 @@ convert_local_reference_stmt (gimple_stmt_iterator *gsi, bool *handled_ops_p,
       *handled_ops_p = false;
       return NULL_TREE;
 
+    case GIMPLE_BIND:
+      for (tree var = gimple_bind_vars (stmt); var; var = DECL_CHAIN (var))
+       if (TREE_CODE (var) == NAMELIST_DECL)
+         {
+           /* Adjust decls mentioned in NAMELIST_DECL.  */
+           tree decls = NAMELIST_DECL_ASSOCIATED_DECL (var);
+           tree decl;
+           unsigned int i;
+
+           FOR_EACH_CONSTRUCTOR_VALUE (CONSTRUCTOR_ELTS (decls), i, decl)
+             {
+               if (TREE_CODE (decl) == VAR_DECL
+                   && (TREE_STATIC (decl) || DECL_EXTERNAL (decl)))
+                 continue;
+               if (decl_function_context (decl) == info->context
+                   && !use_pointer_in_frame (decl))
+                 {
+                   tree field = lookup_field_for_decl (info, decl, NO_INSERT);
+                   if (field)
+                     {
+                       CONSTRUCTOR_ELT (decls, i)->value
+                         = get_local_debug_decl (info, decl, field);
+                     }
+                 }
+             }
+         }
+
+      *handled_ops_p = false;
+      return NULL_TREE;
+
     default:
       /* For every other statement that we are not interested in
         handling here, let the walker traverse the operands.  */