re PR c++/26965 (Unnecessary debug info for unused consts in C++)

PR debug/26965
	* dwarf2out.c (gen_variable_die): Don't worry about DECL_COMDAT.
	Don't emit a second declaration at any scope.

From-SVN: r154157
This commit is contained in:
Jason Merrill 2009-11-13 12:59:26 -05:00 committed by Jason Merrill
parent a3119b91dc
commit d7f1df66b2
4 changed files with 22 additions and 22 deletions

View file

@ -1,3 +1,9 @@
2009-11-13 Jason Merrill <jason@redhat.com>
PR debug/26965
* dwarf2out.c (gen_variable_die): Don't worry about DECL_COMDAT.
Don't emit a second declaration at any scope.
2009-11-13 Andrey Belevantsev <abel@ispras.ru>
PR rtl-optimization/41697

View file

@ -17926,26 +17926,6 @@ gen_variable_die (tree decl, tree origin, dw_die_ref context_die)
dw_die_ref old_die = decl ? lookup_decl_die (decl) : NULL;
dw_die_ref origin_die;
int declaration = (DECL_EXTERNAL (decl_or_origin)
/* If DECL is COMDAT and has not actually been
emitted, we cannot take its address; there
might end up being no definition anywhere in
the program. For example, consider the C++
test case:
template <class T>
struct S { static const int i = 7; };
template <class T>
const int S<T>::i;
int f() { return S<int>::i; }
Here, S<int>::i is not DECL_EXTERNAL, but no
definition is required, so the compiler will
not emit a definition. */
|| (TREE_CODE (decl_or_origin) == VAR_DECL
&& DECL_COMDAT (decl_or_origin)
&& !TREE_ASM_WRITTEN (decl_or_origin))
|| class_or_namespace_scope_p (context_die));
if (!origin)
@ -18059,8 +18039,7 @@ gen_variable_die (tree decl, tree origin, dw_die_ref context_die)
and if we already emitted a DIE for it, don't emit a second
DIE for it again. */
if (old_die
&& declaration
&& old_die->die_parent == context_die)
&& declaration)
return;
/* For static data members, the declaration in the class is supposed

View file

@ -1,5 +1,8 @@
2009-11-13 Jason Merrill <jason@redhat.com>
PR debug/26965
* g++.dg/debug/dwarf2/static-data-member2.C: New.
PR c++/35075
* g++.dg/template/ref5.C: New.

View file

@ -0,0 +1,12 @@
// PR debug/26965
// { dg-options "-gdwarf-2 -dA" }
// { dg-final { scan-assembler-not "DW_TAG_variable" } }
// { dg-final { scan-assembler-not "DW_TAG_enumerator" } }
// { dg-final { scan-assembler-not "DW_TAG_enumeration_type" } }
enum x { i = 1 };
class c {
static const x beg = i;
int foo () { return (int) beg; }
};
void bar () { }