aboutsummaryrefslogtreecommitdiff
path: root/gcc/tree-nested.c
diff options
context:
space:
mode:
authorJakub Jelinek <jakub@redhat.com>2014-01-17 15:42:58 +0100
committerJakub Jelinek <jakub@gcc.gnu.org>2014-01-17 15:42:58 +0100
commitf7d594d251bfc8adc3fff439fd67d343bd7f1981 (patch)
treeea2e9512771f68f8e5de0cc651b70f1871f1e0f8 /gcc/tree-nested.c
parentdfc7b927f3bb5ed8cc8c9dbeba3405ff4e89f543 (diff)
downloadgcc-f7d594d251bfc8adc3fff439fd67d343bd7f1981.zip
gcc-f7d594d251bfc8adc3fff439fd67d343bd7f1981.tar.gz
gcc-f7d594d251bfc8adc3fff439fd67d343bd7f1981.tar.bz2
re PR fortran/59440 (ICE in force_decl_die, at dwarf2out.c:20111 with -g)
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
Diffstat (limited to 'gcc/tree-nested.c')
-rw-r--r--gcc/tree-nested.c49
1 files changed, 49 insertions, 0 deletions
diff --git a/gcc/tree-nested.c b/gcc/tree-nested.c
index 6d1b501..df6923f 100644
--- a/gcc/tree-nested.c
+++ b/gcc/tree-nested.c
@@ -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. */