Committed as posted. Thanks.
On Sun, Jul 1, 2012 at 7:33 AM, Gabriel Dos Reis <g...@integrable-solutions.net> wrote: > On Thu, Jun 28, 2012 at 12:50 PM, Sterling Augustine > <saugust...@google.com> wrote: >> The enclosed patch adds a fix for the pubnames anonymous namespaces contained >> within named namespaces, and adds an extensive test for the various pubnames. >> >> The bug is that when printing at verbosity level 1, and lang_decl_name sees a >> namespace decl in not in the global namespace, it prints the namespace's >> enclosing scopes--so far so good. However, the code I added earlier this >> month >> to handle anonymous namespaces also prints the enclosing scopes, so one would >> get foo::foo::(anonymous namespace) instead of foo::(anonymous namespace). >> >> The solution is to stop the added code from printing the enclosing scope, >> which >> is correct for both verbosity levels 0 and 1. Level 2 is handled elsewhere >> and >> so not relevant. >> >> I have formalized the tests I have been using to be sure pubnames are correct >> and include that in this patch. It is based on ccoutant's gdb_index_test.cc >> from >> the gold test suite. >> >> OK for mainline? > > OK. > >> >> Sterling >> >> >> gcc/cp/ChangeLog >> >> 2012-06-28 Sterling Augustine <saugust...@google.com> >> >> * error.c (lang_decl_name): Use TFF_UNQUALIFIED_NAME flag. >> >> gcc/testsuite/ChangeLog >> >> 2012-06-28 Sterling Augustine <saugust...@google.com> >> >> * g++.dg/debug/dwarf2/pubnames-2.C: New. >> >> Index: cp/error.c >> =================================================================== >> --- cp/error.c (revision 189025) >> +++ cp/error.c (working copy) >> @@ -2633,7 +2633,7 @@ >> dump_function_name (decl, TFF_PLAIN_IDENTIFIER); >> else if ((DECL_NAME (decl) == NULL_TREE) >> && TREE_CODE (decl) == NAMESPACE_DECL) >> - dump_decl (decl, TFF_PLAIN_IDENTIFIER); >> + dump_decl (decl, TFF_PLAIN_IDENTIFIER | TFF_UNQUALIFIED_NAME); >> else >> dump_decl (DECL_NAME (decl), TFF_PLAIN_IDENTIFIER); >> >> Index: testsuite/g++.dg/debug/dwarf2/pubnames-2.C >> =================================================================== >> --- testsuite/g++.dg/debug/dwarf2/pubnames-2.C (revision 0) >> +++ testsuite/g++.dg/debug/dwarf2/pubnames-2.C (revision 0) >> @@ -0,0 +1,194 @@ >> +// { dg-do compile } >> +// { dg-options "-gpubnames -gdwarf-4 -std=c++0x -dA" } >> +// { dg-final { scan-assembler ".section\t.debug_pubnames" } } >> +// { dg-final { scan-assembler "\"\\(anonymous namespace\\)\\\\0\"+\[ >> \t\]+\[#;]+\[ \t\]+external name" } } >> +// { dg-final { scan-assembler "\"one\\\\0\"+\[ \t\]+\[#;]+\[ \t\]+external >> name" } } >> +// { dg-final { scan-assembler "\"one::G_A\\\\0\"+\[ \t\]+\[#;]+\[ >> \t\]+external name" } } >> +// { dg-final { scan-assembler "\"one::G_B\\\\0\"+\[ \t\]+\[#;]+\[ >> \t\]+external name" } } >> +// { dg-final { scan-assembler "\"one::G_C\\\\0\"+\[ \t\]+\[#;]+\[ >> \t\]+external name" } } >> +// { dg-final { scan-assembler "\"one::\\(anonymous namespace\\)\\\\0\"+\[ >> \t\]+\[#;]+\[ \t\]+external name" } } >> +// { dg-final { scan-assembler "\"two\\\\0\"+\[ \t\]+\[#;]+\[ \t\]+external >> name" } } >> +// { dg-final { scan-assembler "\"F_A\\\\0\"+\[ \t\]+\[#;]+\[ \t\]+external >> name" } } >> +// { dg-final { scan-assembler "\"F_B\\\\0\"+\[ \t\]+\[#;]+\[ \t\]+external >> name" } } >> +// { dg-final { scan-assembler "\"F_C\\\\0\"+\[ \t\]+\[#;]+\[ \t\]+external >> name" } } >> +// { dg-final { scan-assembler "\"inline_func_1\\\\0\"+\[ \t\]+\[#;]+\[ >> \t\]+external name" } } >> +// { dg-final { scan-assembler "\"one::c1::c1\\\\0\"+\[ \t\]+\[#;]+\[ >> \t\]+external name" } } >> +// { dg-final { scan-assembler "\"one::c1::~c1\\\\0\"+\[ \t\]+\[#;]+\[ >> \t\]+external name" } } >> +// { dg-final { scan-assembler "\"one::c1::val\\\\0\"+\[ \t\]+\[#;]+\[ >> \t\]+external name" } } >> +// { dg-final { scan-assembler "\"check_enum\\\\0\"+\[ \t\]+\[#;]+\[ >> \t\]+external name" } } >> +// { dg-final { scan-assembler "\"main\\\\0\"+\[ \t\]+\[#;]+\[ >> \t\]+external name" } } >> +// { dg-final { scan-assembler "\"two::c2<int>::c2\\\\0\"+\[ \t\]+\[#;]+\[ >> \t\]+external name" } } >> +// { dg-final { scan-assembler "\"two::c2<double>::c2\\\\0\"+\[ >> \t\]+\[#;]+\[ \t\]+external name" } } >> +// { dg-final { scan-assembler "\"two::c2<int const\\\*>::c2\\\\0\"+\[ >> \t\]+\[#;]+\[ \t\]+external name" } } >> +// { dg-final { scan-assembler "\"check<one::c1>\\\\0\"+\[ \t\]+\[#;]+\[ >> \t\]+external name" } } >> +// { dg-final { scan-assembler "\"check<two::c2<int> \\>\\\\0\"+\[ >> \t\]+\[#;]+\[ \t\]+external name" } } >> +// { dg-final { scan-assembler "\"check<two::c2<double> \\>\\\\0\"+\[ >> \t\]+\[#;]+\[ \t\]+external name" } } >> +// { dg-final { scan-assembler "\"check<two::c2<int const\\\*> >> \\>\\\\0\"+\[ \t\]+\[#;]+\[ \t\]+external name" } } >> +// { dg-final { scan-assembler "\"two::c2<int>::val\\\\0\"+\[ \t\]+\[#;]+\[ >> \t\]+external name" } } >> +// { dg-final { scan-assembler "\"two::c2<double>::val\\\\0\"+\[ >> \t\]+\[#;]+\[ \t\]+external name" } } >> +// { dg-final { scan-assembler "\"two::c2<int const\\\*>::val\\\\0\"+\[ >> \t\]+\[#;]+\[ \t\]+external name" } } >> +// { dg-final { scan-assembler >> "\"__static_initialization_and_destruction_0\\\\0\"+\[ \t\]+\[#;]+\[ >> \t\]+external name" } } >> +// { dg-final { scan-assembler "\"two::c2<int>::~c2\\\\0\"+\[ \t\]+\[#;]+\[ >> \t\]+external name" } } >> +// { dg-final { scan-assembler "\"two::c2<double>::~c2\\\\0\"+\[ >> \t\]+\[#;]+\[ \t\]+external name" } } >> +// { dg-final { scan-assembler "\"two::c2<int const\\\*>::~c2\\\\0\"+\[ >> \t\]+\[#;]+\[ \t\]+external name" } } >> +// { dg-final { scan-assembler "\"_GLOBAL__sub_I__ZN3one3c1vE\\\\0\"+\[ >> \t\]+\[#;]+\[ \t\]+external name" } } >> +// { dg-final { scan-assembler "\"anonymous_union_var\\\\0\"+\[ >> \t\]+\[#;]+\[ \t\]+external name" } } >> +// { dg-final { scan-assembler "\"two::ci\\\\0\"+\[ \t\]+\[#;]+\[ >> \t\]+external name" } } >> +// { dg-final { scan-assembler "\"two::c2v1\\\\0\"+\[ \t\]+\[#;]+\[ >> \t\]+external name" } } >> +// { dg-final { scan-assembler "\"two::c2v2\\\\0\"+\[ \t\]+\[#;]+\[ >> \t\]+external name" } } >> +// { dg-final { scan-assembler "\"two::c2v3\\\\0\"+\[ \t\]+\[#;]+\[ >> \t\]+external name" } } >> +// { dg-final { scan-assembler "\"one::c1v\\\\0\"+\[ \t\]+\[#;]+\[ >> \t\]+external name" } } >> +// { dg-final { scan-assembler "\"one::\\(anonymous >> namespace\\)::one_anonymous_var\\\\0\"+\[ \t\]+\[#;]+\[ \t\]+external name" >> } } >> +// { dg-final { scan-assembler "\"\\(anonymous >> namespace\\)::c1_count\\\\0\"+\[ \t\]+\[#;]+\[ \t\]+external name" } } >> +// { dg-final { scan-assembler "\"\\(anonymous >> namespace\\)::c2_count\\\\0\"+\[ \t\]+\[#;]+\[ \t\]+external name" } } >> +// { dg-final { scan-assembler "\"\\(anonymous >> namespace\\)::three\\\\0\"+\[ \t\]+\[#;]+\[ \t\]+external name" } } >> +// { dg-final { scan-assembler "\"\\(anonymous >> namespace\\)::three::anonymous_three_var\\\\0\"+\[ \t\]+\[#;]+\[ >> \t\]+external name" } } >> +// { dg-final { scan-assembler ".section\t.debug_pubtypes" } } >> +// { dg-final { scan-assembler "\"one::G\\\\0\"+\[ \t\]+\[#;]+\[ >> \t\]+external name" } } >> +// { dg-final { scan-assembler "\"one::c1\\\\0\"+\[ \t\]+\[#;]+\[ >> \t\]+external name" } } >> +// { dg-final { scan-assembler "\"int\\\\0\"+\[ \t\]+\[#;]+\[ \t\]+external >> name" } } >> +// { dg-final { scan-assembler "\"one::c1\\\\0\"+\[ \t\]+\[#;]+\[ >> \t\]+external name" } } >> +// { dg-final { scan-assembler "\"two::c2<int>\\\\0\"+\[ \t\]+\[#;]+\[ >> \t\]+external name" } } >> +// { dg-final { scan-assembler "\"two::c2<int>\\\\0\"+\[ \t\]+\[#;]+\[ >> \t\]+external name" } } >> +// { dg-final { scan-assembler "\"two::c2<double>\\\\0\"+\[ \t\]+\[#;]+\[ >> \t\]+external name" } } >> +// { dg-final { scan-assembler "\"double\\\\0\"+\[ \t\]+\[#;]+\[ >> \t\]+external name" } } >> +// { dg-final { scan-assembler "\"two::c2<double>\\\\0\"+\[ \t\]+\[#;]+\[ >> \t\]+external name" } } >> +// { dg-final { scan-assembler "\"two::c2<int const\\\*>\\\\0\"+\[ >> \t\]+\[#;]+\[ \t\]+external name" } } >> +// { dg-final { scan-assembler "\"two::c2<int const\\\*>\\\\0\"+\[ >> \t\]+\[#;]+\[ \t\]+external name" } } >> +// { dg-final { scan-assembler "\"F\\\\0\"+\[ \t\]+\[#;]+\[ \t\]+external >> name" } } >> +// { dg-final { scan-assembler "\"anonymous_union_container\\\\0\"+\[ >> \t\]+\[#;]+\[ \t\]+external name" } } >> +// { dg-final { scan-assembler "\"bool\\\\0\"+\[ \t\]+\[#;]+\[ >> \t\]+external name" } } >> + >> +namespace >> +{ >> +int c1_count; >> +int c2_count; >> + >> +namespace three >> +{ >> +int anonymous_three_var; >> +} >> +}; >> + >> +namespace one >> +{ >> + >> +enum G >> +{ >> + G_A, >> + G_B, >> + G_C >> +}; >> + >> +namespace { >> +int one_anonymous_var; >> +} >> + >> +class c1 >> +{ >> + public: >> + static int count; >> + >> + c1() >> + { ++c1_count; } >> + >> + ~c1() >> + { >> + --c1_count; >> + } >> + >> + enum E >> + { >> + E_A, >> + E_B, >> + E_C, >> + }; >> + >> + int >> + val() >> + { return E_A; } >> +}; >> + >> +c1 c1v; >> +}; >> + >> +namespace two >> +{ >> +const int ci = 3; >> + >> +template <typename T> >> +class c2 >> +{ >> + public: >> + c2(T t) >> + : t_(t) >> + { >> + ++c2_count; >> + } >> + >> + ~c2() >> + { --c2_count; } >> + >> + T >> + val() >> + { return this->t_; } >> + >> + T t_; >> +}; >> + >> +c2<int> c2v1(1); >> +c2<double> c2v2(2.0); >> +c2<int const*> c2v3(&ci); >> +}; >> + >> +enum F >> +{ >> + F_A, >> + F_B, >> + F_C >> +}; >> + >> +template <class C> >> +bool >> +check(C* c) >> +{ return c->val() == 0; } >> + >> +bool >> +check_enum(int i) >> +{ return i > 0; } >> + >> +struct anonymous_union_container { >> + union { >> + struct astruct { >> + int a; >> + }; >> + int b; >> + } u; >> +}; >> + >> +anonymous_union_container anonymous_union_var; >> + >> +#ifdef __GNUC__ >> +#define ALWAYS_INLINE __attribute__((always_inline)) >> +#else >> +#define ALWAYS_INLINE >> +#endif >> + >> +static inline ALWAYS_INLINE int >> +inline_func_1(int i) >> +{ return i * 17; } >> + >> +int >> +main() >> +{ >> + F f = F_A; >> + one::G g = one::G_A; >> + check_enum(f); >> + check_enum(g); >> + check(&one::c1v); >> + check(&two::c2v1); >> + check(&two::c2v2); >> + check(&two::c2v3); >> + anonymous_union_var.u.b = inline_func_1(3) - 51; >> + return anonymous_union_var.u.b; >> +} >> >> -- >> This patch is available for review at http://codereview.appspot.com/6343052