Index: gcc/dwarf2out.c
===================================================================
--- gcc/dwarf2out.c	(revision 198068)
+++ gcc/dwarf2out.c	(working copy)
@@ -9005,11 +9005,13 @@ output_pubnames (vec<pubname_entry, va_g
       /* Enumerator names are part of the pubname table, but the parent
          DW_TAG_enumeration_type die may have been pruned.  Don't output
          them if that is the case.  */
-      if (pub->die->die_tag == DW_TAG_enumerator && !pub->die->die_mark)
+      if (pub->die->die_tag == DW_TAG_enumerator &&
+          (pub->die->die_parent == NULL
+	   || !pub->die->die_parent->die_perennial_p))
         continue;
 
       /* We shouldn't see pubnames for DIEs outside of the main CU.  */
-      if (names == pubname_table)
+      if (names == pubname_table && pub->die->die_tag != DW_TAG_enumerator)
 	gcc_assert (pub->die->die_mark);
 
       if (names != pubtype_table
Index: gcc/testsuite/g++.dg/debug/dwarf2/explicit-constructor.C
===================================================================
--- gcc/testsuite/g++.dg/debug/dwarf2/explicit-constructor.C	(revision 198068)
+++ gcc/testsuite/g++.dg/debug/dwarf2/explicit-constructor.C	(working copy)
@@ -1,7 +1,7 @@
 // Contributed by Dodji Seketeli <dodji@redhat.com>
 // Origin: PR c++
 // { dg-do compile }
-// { dg-options "-O -g -dA -gno-strict-dwarf" }
+// { dg-options "-O -g -dA -gno-strict-dwarf -fno-debug-types-section" }
 // { dg-final { scan-assembler-times "DW_AT_explicit" 2 } }
 
 struct Foo
Index: gcc/testsuite/g++.dg/debug/dwarf2/pubnames-2.C
===================================================================
--- gcc/testsuite/g++.dg/debug/dwarf2/pubnames-2.C	(revision 198068)
+++ gcc/testsuite/g++.dg/debug/dwarf2/pubnames-2.C	(working copy)
@@ -1,5 +1,5 @@
 // { dg-do compile }
-// { dg-options "-gpubnames -gdwarf-4 -std=c++0x -dA" }
+// { dg-options "-gpubnames -gdwarf-4 -fno-debug-types-section -std=c++0x -dA" }
 // { dg-final { scan-assembler-times "\.section\[\t \]\[^\n\]*debug_pubnames" 1 } }
 // { dg-final { scan-assembler "\"\\(anonymous namespace\\)\\\\0\"+\[ \t\]+\[#;/|@!]+\[ \t\]+external name" } }
 // { dg-final { scan-assembler "\"one\\\\0\"+\[ \t\]+\[#;/|@!]+\[ \t\]+external name" } }
Index: gcc/testsuite/g++.dg/debug/dwarf2/typedef2.C
===================================================================
--- gcc/testsuite/g++.dg/debug/dwarf2/typedef2.C	(revision 198068)
+++ gcc/testsuite/g++.dg/debug/dwarf2/typedef2.C	(working copy)
@@ -1,5 +1,5 @@
 // Origin: PR debug/43628
-// { dg-options "-g -dA" }
+// { dg-options "-g -dA -fno-debug-types-section" }
 // { dg-do compile }
 
 // { dg-final { scan-assembler-times "\[^\n\r\]*\\(DIE\[^\n\r\]*DW_TAG_formal_parameter\\)\[\n\r\]{1,2}\[^\n\r\]*DW_AT_type\[\n\r\]{1,2}" 1 } }
Index: gcc/testsuite/g++.dg/debug/dwarf2/typedef4.C
===================================================================
--- gcc/testsuite/g++.dg/debug/dwarf2/typedef4.C	(revision 198068)
+++ gcc/testsuite/g++.dg/debug/dwarf2/typedef4.C	(working copy)
@@ -1,5 +1,5 @@
 // Origin: PR debug/45171
-// { dg-options "-g -dA -fno-eliminate-unused-debug-types" }
+// { dg-options "-g -dA -fno-eliminate-unused-debug-types -fno-debug-types-section" }
 // { dg-do compile }
 
 // There should be 2 real instances of byte_size -- one for the
Index: gcc/testsuite/g++.dg/debug/dwarf2/static-data-member1.C
===================================================================
--- gcc/testsuite/g++.dg/debug/dwarf2/static-data-member1.C	(revision 198068)
+++ gcc/testsuite/g++.dg/debug/dwarf2/static-data-member1.C	(working copy)
@@ -1,5 +1,5 @@
 // { dg-do compile }
-// { dg-options "-g -dA -fno-merge-debug-strings" }
+// { dg-options "-g -dA -fno-merge-debug-strings -fno-debug-types-section" }
 
 struct A
 {
Index: gcc/testsuite/g++.dg/debug/dwarf2/global-used-types-1.C
===================================================================
--- gcc/testsuite/g++.dg/debug/dwarf2/global-used-types-1.C	(revision 198068)
+++ gcc/testsuite/g++.dg/debug/dwarf2/global-used-types-1.C	(working copy)
@@ -1,5 +1,5 @@
 // Contributed by Dodji Seketeli <dodji@redhat.com>
-// { dg-options "-g -dA -fno-merge-debug-strings" }
+// { dg-options "-g -dA -fno-merge-debug-strings -fno-debug-types-section" }
 // { dg-do compile }
 // { dg-final { scan-assembler-times "DIE \\(0x\[^\n\]*\\) DW_TAG_enumeration_type" 1 } }
 // { dg-final { scan-assembler-times "DIE \\(0x\[^\n\]*\\) DW_TAG_enumerator" 2 } }
Index: gcc/testsuite/g++.dg/debug/dwarf2/self-ref-1.C
===================================================================
--- gcc/testsuite/g++.dg/debug/dwarf2/self-ref-1.C	(revision 198068)
+++ gcc/testsuite/g++.dg/debug/dwarf2/self-ref-1.C	(working copy)
@@ -1,6 +1,6 @@
 // Origin: PR debug/45088
 // { dg-do compile }
-// { dg-options "-g -dA" }
+// { dg-options "-g -dA -fno-debug-types-section" }
 // { dg-final { scan-assembler-times "\[^\n\r\]*\\(DIE\[^\n\r\]*DW_TAG_pointer_type\\)\[\n\r\]{1,2}\[^\n\r\]*DW_AT_byte_size\[\n\r\]{1,2}\[^\n\r\]*DW_AT_type" 4 } }
 
 struct A
Index: gcc/testsuite/g++.dg/debug/dwarf2/nested-2.C
===================================================================
--- gcc/testsuite/g++.dg/debug/dwarf2/nested-2.C	(revision 198068)
+++ gcc/testsuite/g++.dg/debug/dwarf2/nested-2.C	(working copy)
@@ -1,6 +1,6 @@
 /*
   Origin: PR debug/45024
-  { dg-options "-g -dA -fno-merge-debug-strings" }
+  { dg-options "-g -dA -fno-merge-debug-strings -fno-debug-types-section" }
   { dg-do compile }
 */
 
Index: gcc/testsuite/g++.dg/debug/dwarf2/pubnames-3.C
===================================================================
--- gcc/testsuite/g++.dg/debug/dwarf2/pubnames-3.C	(revision 0)
+++ gcc/testsuite/g++.dg/debug/dwarf2/pubnames-3.C	(revision 0)
@@ -0,0 +1,193 @@
+// { dg-do compile }
+// { dg-options "-gpubnames -gdwarf-4 -fdebug-types-section -std=c++0x -dA" }
+// { dg-final { scan-assembler-times "\.section\[\t \]\[^\n\]*debug_pubnames" 1 } }
+// { 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 "\"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-times "\.section\[\t \]\[^\n\]*debug_pubtypes" 1 } }
+// { 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;
+}
Index: gcc/testsuite/g++.dg/debug/dwarf2/typedef1.C
===================================================================
--- gcc/testsuite/g++.dg/debug/dwarf2/typedef1.C	(revision 198068)
+++ gcc/testsuite/g++.dg/debug/dwarf2/typedef1.C	(working copy)
@@ -1,6 +1,6 @@
 // Contributed by Dodji Seketeli <dodji@redhat.com>
 // Origin: PR c++/40705
-// { dg-options "-g -dA" }
+// { dg-options "-g -dA -fno-debug-types-section" }
 // { dg-do compile }
 // { dg-final { scan-assembler-times "DW_TAG_structure_type" 2 } }
 // { dg-final { scan-assembler-times "DW_AT_name: \"foo<1u>\"|\"foo<1u>..\"\[^\n\]*DW_AT_name" 1 } }
Index: gcc/testsuite/g++.dg/debug/dwarf2/namespace-2.C
===================================================================
--- gcc/testsuite/g++.dg/debug/dwarf2/namespace-2.C	(revision 198068)
+++ gcc/testsuite/g++.dg/debug/dwarf2/namespace-2.C	(working copy)
@@ -1,6 +1,6 @@
 // Test that we define A inside the namespace rather than declaring it
 // there and then defining it at CU scope.
-// { dg-options "-g -dA" }
+// { dg-options "-g -dA -fno-debug-types-section" }
 // { dg-final { scan-assembler-not "DW_AT_declaration" } }
 
 namespace N {
Index: gcc/testsuite/g++.dg/debug/dwarf2/integer-typedef.C
===================================================================
--- gcc/testsuite/g++.dg/debug/dwarf2/integer-typedef.C	(revision 198068)
+++ gcc/testsuite/g++.dg/debug/dwarf2/integer-typedef.C	(working copy)
@@ -1,5 +1,5 @@
 // Origin: PR debug/49130
-// { dg-options "-g -dA -fno-merge-debug-strings" }
+// { dg-options "-g -dA -fno-merge-debug-strings -fno-debug-types-section" }
 
 typedef long unsigned int size_t;
 static const size_t foo = 2048;
Index: gcc/testsuite/g++.dg/debug/dwarf2/self-ref-2.C
===================================================================
--- gcc/testsuite/g++.dg/debug/dwarf2/self-ref-2.C	(revision 198068)
+++ gcc/testsuite/g++.dg/debug/dwarf2/self-ref-2.C	(working copy)
@@ -1,6 +1,6 @@
 // Origin: PR debug/45088
 // { dg-do compile }
-// { dg-options "-g -dA" }
+// { dg-options "-g -dA -fno-debug-types-section" }
 // { dg-final { scan-assembler-times "\[^\n\r\]*\\(DIE\[^\n\r\]*DW_TAG_pointer_type\\)\[\n\r\]{1,2}\[^\n\r\]*DW_AT_byte_size\[\n\r\]{1,2}\[^\n\r\]*DW_AT_type" 4 } }
 
 template<class T>
