Commit d3e4cd01 by Jason Merrill Committed by Jason Merrill

re PR c++/22489 (ICE in dwarf2out_finish with using namespace in a local class…

re PR c++/22489 (ICE in dwarf2out_finish with using namespace in a local class and compiler built constructors)

        PR c++/22489
        * dwarf2out.c (gen_subprogram_die): Force a declaration die for
        lazily declared methods.
        (force_decl_die): Stop if forcing out the context already make a
        DIE for the decl.
        (force_type_die): Likewise.

From-SVN: r106853
parent 646c38e9
2005-11-13 Jason Merrill <jason@redhat.com>
PR c++/22489
* dwarf2out.c (gen_subprogram_die): Force a declaration die for
lazily declared methods.
(force_decl_die): Stop if forcing out the context already make a
DIE for the decl.
(force_type_die): Likewise.
2005-11-13 Andrew Pinski <pinskia@physics.uc.edu> 2005-11-13 Andrew Pinski <pinskia@physics.uc.edu>
PR middle-end/24820 PR middle-end/24820
......
...@@ -11478,6 +11478,14 @@ gen_subprogram_die (tree decl, dw_die_ref context_die) ...@@ -11478,6 +11478,14 @@ gen_subprogram_die (tree decl, dw_die_ref context_die)
gcc_assert (!old_die); gcc_assert (!old_die);
} }
/* Now that the C++ front end lazily declares artificial member fns, we
might need to retrofit the declaration into its class. */
if (!declaration && !origin && !old_die
&& DECL_CONTEXT (decl) && TYPE_P (DECL_CONTEXT (decl))
&& !class_or_namespace_scope_p (context_die)
&& debug_info_level > DINFO_LEVEL_TERSE)
old_die = force_decl_die (decl);
if (origin != NULL) if (origin != NULL)
{ {
gcc_assert (!declaration || local_scope_p (context_die)); gcc_assert (!declaration || local_scope_p (context_die));
...@@ -11579,7 +11587,7 @@ gen_subprogram_die (tree decl, dw_die_ref context_die) ...@@ -11579,7 +11587,7 @@ gen_subprogram_die (tree decl, dw_die_ref context_die)
Note that force_decl_die() forces function declaration die. It is Note that force_decl_die() forces function declaration die. It is
later reused to represent definition. */ later reused to represent definition. */
equate_decl_number_to_die (decl, subr_die); equate_decl_number_to_die (decl, subr_die);
} }
} }
else if (DECL_ABSTRACT (decl)) else if (DECL_ABSTRACT (decl))
...@@ -12790,6 +12798,10 @@ force_decl_die (tree decl) ...@@ -12790,6 +12798,10 @@ force_decl_die (tree decl)
else else
context_die = comp_unit_die; context_die = comp_unit_die;
decl_die = lookup_decl_die (decl);
if (decl_die)
return decl_die;
switch (TREE_CODE (decl)) switch (TREE_CODE (decl))
{ {
case FUNCTION_DECL: case FUNCTION_DECL:
...@@ -12840,13 +12852,18 @@ force_type_die (tree type) ...@@ -12840,13 +12852,18 @@ force_type_die (tree type)
{ {
dw_die_ref context_die; dw_die_ref context_die;
if (TYPE_CONTEXT (type)) if (TYPE_CONTEXT (type))
if (TYPE_P (TYPE_CONTEXT (type))) {
context_die = force_type_die (TYPE_CONTEXT (type)); if (TYPE_P (TYPE_CONTEXT (type)))
else context_die = force_type_die (TYPE_CONTEXT (type));
context_die = force_decl_die (TYPE_CONTEXT (type)); else
context_die = force_decl_die (TYPE_CONTEXT (type));
}
else else
context_die = comp_unit_die; context_die = comp_unit_die;
type_die = lookup_type_die (type);
if (type_die)
return type_die;
gen_type_die (type, context_die); gen_type_die (type, context_die);
type_die = lookup_type_die (type); type_die = lookup_type_die (type);
gcc_assert (type_die); gcc_assert (type_die);
......
// PR c++/22489
namespace N { }
struct T
{
T () { }
};
void
bar ()
{
struct U : public T
{
void baz ()
{
using namespace N;
}
} u;
u.baz();
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment