Patchwork [C++,Pubnames] Anonymous namespaces enclosed in named namespaces. (issue6343052)

login
register
mail settings
Submitter Sterling Augustine
Date June 28, 2012, 5:50 p.m.
Message ID <20120628175006.8D7301607F6@sterling.mtv.corp.google.com>
Download mbox | patch
Permalink /patch/167932/
State New
Headers show

Comments

Sterling Augustine - June 28, 2012, 5:50 p.m.
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?

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.


--
This patch is available for review at http://codereview.appspot.com/6343052
Gabriel Dos Reis - July 1, 2012, 2:33 p.m.
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
Sterling Augustine - July 9, 2012, 9:45 p.m.
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
Jack Howarth - Aug. 12, 2012, 7:46 p.m.
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
Sterling Augustine - Aug. 13, 2012, 4:07 p.m.
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
Sterling Augustine - Aug. 13, 2012, 11:56 p.m.
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.
Mike Stump - Aug. 14, 2012, 1:18 a.m.
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.
Sterling Augustine - Aug. 14, 2012, 3:11 p.m.
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

Patch

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;
+}