From: Jakub Jelinek Date: Fri, 1 Apr 2005 07:47:27 +0000 (+0200) Subject: re PR debug/19406 (ICE: in force_decl_die, at dwarf2out.c:12442) X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=a288c5cd8c7b0201e0cfbbaba19193c7782969b4;p=gcc.git re PR debug/19406 (ICE: in force_decl_die, at dwarf2out.c:12442) PR c++/19406 * dwarf2out.c (gen_type_die_for_member): Handle FIELD_DECL. (dwarf2out_imported_module_or_decl): Use gen_type_die_for_member for FIELD_DECLs. * g++.dg/debug/using1.C: New test. From-SVN: r97373 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index dce673830de..e3902558415 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,10 @@ +2005-04-01 Jakub Jelinek + + PR c++/19406 + * dwarf2out.c (gen_type_die_for_member): Handle FIELD_DECL. + (dwarf2out_imported_module_or_decl): Use gen_type_die_for_member + for FIELD_DECLs. + 2005-04-01 Kazu Hirata * doc/contrib.texi, doc/invoke.texi, doc/tm.texi: Fix typos. diff --git a/gcc/dwarf2out.c b/gcc/dwarf2out.c index 5f1d6313f4c..bf761130e6a 100644 --- a/gcc/dwarf2out.c +++ b/gcc/dwarf2out.c @@ -11222,13 +11222,27 @@ gen_type_die_for_member (tree type, tree member, dw_die_ref context_die) if (TYPE_DECL_SUPPRESS_DEBUG (TYPE_STUB_DECL (type)) && ! lookup_decl_die (member)) { + dw_die_ref type_die; gcc_assert (!decl_ultimate_origin (member)); push_decl_scope (type); + type_die = lookup_type_die (type); if (TREE_CODE (member) == FUNCTION_DECL) - gen_subprogram_die (member, lookup_type_die (type)); + gen_subprogram_die (member, type_die); + else if (TREE_CODE (member) == FIELD_DECL) + { + /* Ignore the nameless fields that are used to skip bits but handle + C++ anonymous unions and structs. */ + if (DECL_NAME (member) != NULL_TREE + || TREE_CODE (TREE_TYPE (member)) == UNION_TYPE + || TREE_CODE (TREE_TYPE (member)) == RECORD_TYPE) + { + gen_type_die (member_declared_type (member), type_die); + gen_field_die (member, type_die); + } + } else - gen_variable_die (member, lookup_type_die (type)); + gen_variable_die (member, type_die); pop_decl_scope (); } @@ -12935,7 +12949,29 @@ dwarf2out_imported_module_or_decl (tree decl, tree context) if (TREE_CODE (decl) == TYPE_DECL || TREE_CODE (decl) == CONST_DECL) at_import_die = force_type_die (TREE_TYPE (decl)); else - at_import_die = force_decl_die (decl); + { + at_import_die = lookup_decl_die (decl); + if (!at_import_die) + { + /* If we're trying to avoid duplicate debug info, we may not have + emitted the member decl for this field. Emit it now. */ + if (TREE_CODE (decl) == FIELD_DECL) + { + tree type = DECL_CONTEXT (decl); + dw_die_ref type_context_die; + + if (TYPE_CONTEXT (type)) + if (TYPE_P (TYPE_CONTEXT (type))) + type_context_die = force_type_die (TYPE_CONTEXT (type)); + else + type_context_die = force_decl_die (TYPE_CONTEXT (type)); + else + type_context_die = comp_unit_die; + gen_type_die_for_member (type, decl, type_context_die); + } + at_import_die = force_decl_die (decl); + } + } /* OK, now we have DIEs for decl as well as scope. Emit imported die. */ if (TREE_CODE (decl) == NAMESPACE_DECL) diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 8de0c4426ae..a08f51c35db 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2005-04-01 Jakub Jelinek + + PR c++/19406 + * g++.dg/debug/using1.C: New test. + 2005-04-01 Hans-Peter Nilsson PR middle-end/20524 diff --git a/gcc/testsuite/g++.dg/debug/using1.C b/gcc/testsuite/g++.dg/debug/using1.C new file mode 100644 index 00000000000..d3168fc6c1c --- /dev/null +++ b/gcc/testsuite/g++.dg/debug/using1.C @@ -0,0 +1,15 @@ +// PR c++/19406 +// { dg-do compile } + +struct A +{ + virtual int foo(); + double d; +}; + +struct B : public A +{ + A::d; +}; + +B b;