This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: [C++ Pubnames Patch] Anonymous namespaces enclosed in named namespaces. (issue6343052)


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


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]