Message ID | 20120628175006.8D7301607F6@sterling.mtv.corp.google.com |
---|---|
State | New |
Headers | show |
On Thu, Jun 28, 2012 at 12:50 PM, Sterling Augustine <saugustine@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 <saugustine@google.com> > > * error.c (lang_decl_name): Use TFF_UNQUALIFIED_NAME flag. > > gcc/testsuite/ChangeLog > > 2012-06-28 Sterling Augustine <saugustine@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
Committed as posted. Thanks. On Sun, Jul 1, 2012 at 7:33 AM, Gabriel Dos Reis <gdr@integrable-solutions.net> wrote: > On Thu, Jun 28, 2012 at 12:50 PM, Sterling Augustine > <saugustine@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 <saugustine@google.com> >> >> * error.c (lang_decl_name): Use TFF_UNQUALIFIED_NAME flag. >> >> gcc/testsuite/ChangeLog >> >> 2012-06-28 Sterling Augustine <saugustine@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
On Sun, Jul 01, 2012 at 09:33:06AM -0500, Gabriel Dos Reis wrote: > On Thu, Jun 28, 2012 at 12:50 PM, Sterling Augustine > <saugustine@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. This patch introduces the regressions... FAIL: g++.dg/debug/dwarf2/pubnames-2.C scan-assembler .section\t.debug_pubnames FAIL: g++.dg/debug/dwarf2/pubnames-2.C scan-assembler "_GLOBAL__sub_I__ZN3one3c1vE\\\\0"+[ \t]+[#;]+[ \t]+external name FAIL: g++.dg/debug/dwarf2/pubnames-2.C scan-assembler .section\t.debug_pubtypes at -m32/-m64 on x86_64-apple-darwin12... http://gcc.gnu.org/bugzilla/show_bug.cgi?id=54230 I have attached the -m32 assembly generated for the g++.dg/debug/dwarf2/pubnames-2.C to PR54230 but haven't been able to add Sterling to the PR as none of his email addresses are recognized by bugzilla. Jack > > > > > Sterling > > > > > > gcc/cp/ChangeLog > > > > 2012-06-28 Sterling Augustine <saugustine@google.com> > > > > * error.c (lang_decl_name): Use TFF_UNQUALIFIED_NAME flag. > > > > gcc/testsuite/ChangeLog > > > > 2012-06-28 Sterling Augustine <saugustine@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
On Sun, Aug 12, 2012 at 12:46 PM, Jack Howarth <howarth@bromo.med.uc.edu> wrote: > This patch introduces the regressions... > > FAIL: g++.dg/debug/dwarf2/pubnames-2.C scan-assembler .section\t.debug_pubnames > FAIL: g++.dg/debug/dwarf2/pubnames-2.C scan-assembler > "_GLOBAL__sub_I__ZN3one3c1vE\\\\0"+[ \t]+[#;]+[ \t]+external name > FAIL: g++.dg/debug/dwarf2/pubnames-2.C scan-assembler .section\t.debug_pubtypes > > at -m32/-m64 on x86_64-apple-darwin12... > > http://gcc.gnu.org/bugzilla/show_bug.cgi?id=54230 > > I have attached the -m32 assembly generated for the g++.dg/debug/dwarf2/pubnames-2.C > to PR54230 but haven't been able to add Sterling to the PR as none of his email > addresses are recognized by bugzilla. I will look at this and figure it out. The problem is quite likely that the test is erroneous, rather than the patch. Sterling
On Sun, Aug 12, 2012 at 12:46 PM, Jack Howarth <howarth@bromo.med.uc.edu> wrote: > On Sun, Jul 01, 2012 at 09:33:06AM -0500, Gabriel Dos Reis wrote: >> On Thu, Jun 28, 2012 at 12:50 PM, Sterling Augustine >> <saugustine@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. > > This patch introduces the regressions... > > FAIL: g++.dg/debug/dwarf2/pubnames-2.C scan-assembler .section\t.debug_pubnames > FAIL: g++.dg/debug/dwarf2/pubnames-2.C scan-assembler > "_GLOBAL__sub_I__ZN3one3c1vE\\\\0"+[ \t]+[#;]+[ \t]+external name > FAIL: g++.dg/debug/dwarf2/pubnames-2.C scan-assembler .section\t.debug_pubtypes > > at -m32/-m64 on x86_64-apple-darwin12... > > http://gcc.gnu.org/bugzilla/show_bug.cgi?id=54230 > > I have attached the -m32 assembly generated for the g++.dg/debug/dwarf2/pubnames-2.C > to PR54230 but haven't been able to add Sterling to the PR as none of his email > addresses are recognized by bugzilla. > Jack The enclosed patch adjusts the test so it will pass on darwin. The issue was that it looked for some elf-specific assembly directives, which it shouldn't. OK for mainline? Sterling 2012-08-13 Sterling Augustine <saugustine@google.com> * g++.dg/debug/dwarf2/pubnames-2.C: Adjust.
On Aug 13, 2012, at 4:56 PM, Sterling Augustine wrote: > The enclosed patch adjusts the test so it will pass on darwin. The > issue was that it looked for some elf-specific assembly directives, > which it shouldn't. > > OK for mainline? Ok.
On Mon, Aug 13, 2012 at 6:18 PM, Mike Stump <mikestump@comcast.net> wrote: > On Aug 13, 2012, at 4:56 PM, Sterling Augustine wrote: >> The enclosed patch adjusts the test so it will pass on darwin. The >> issue was that it looked for some elf-specific assembly directives, >> which it shouldn't. >> >> OK for mainline? > > Ok. Committed as posted. Sterling
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; +}