dwarf2out.c (declare_in_namespace): Only emit external declarations in the local scope once.

* dwarf2out.c (declare_in_namespace): Only emit external
	declarations in the local scope once.

From-SVN: r216683
This commit is contained in:
Aldy Hernandez 2014-10-25 00:08:41 +00:00 committed by Aldy Hernandez
parent fbee6d3164
commit c22354fd69
2 changed files with 25 additions and 0 deletions

View File

@ -1,3 +1,8 @@
2014-10-24 Aldy Hernandez <aldyh@redhat.com>
* dwarf2out.c (declare_in_namespace): Only emit external
declarations in the local scope once.
2014-10-24 Jonathan Wakely <jwakely@redhat.com> 2014-10-24 Jonathan Wakely <jwakely@redhat.com>
* ginclude/stdbool.h: Do not define bool, true or false in C++11. * ginclude/stdbool.h: Do not define bool, true or false in C++11.

View File

@ -20476,6 +20476,26 @@ declare_in_namespace (tree thing, dw_die_ref context_die)
if (debug_info_level <= DINFO_LEVEL_TERSE) if (debug_info_level <= DINFO_LEVEL_TERSE)
return context_die; return context_die;
/* External declarations in the local scope only need to be emitted
once, not once in the namespace and once in the scope.
This avoids declaring the `extern' below in the
namespace DIE as well as in the innermost scope:
namespace S
{
int i=5;
int foo()
{
int i=8;
extern int i;
return i;
}
}
*/
if (DECL_P (thing) && DECL_EXTERNAL (thing) && local_scope_p (context_die))
return context_die;
/* If this decl is from an inlined function, then don't try to emit it in its /* If this decl is from an inlined function, then don't try to emit it in its
namespace, as we will get confused. It would have already been emitted namespace, as we will get confused. It would have already been emitted
when the abstract instance of the inline function was emitted anyways. */ when the abstract instance of the inline function was emitted anyways. */