Index: gcc/c-family/c-pretty-print.c
===================================================================
--- gcc/c-family/c-pretty-print.c	(revision 188679)
+++ gcc/c-family/c-pretty-print.c	(working copy)
@@ -446,6 +446,8 @@ pp_c_specifier_qualifier_list (c_pretty_
 {
   const enum tree_code code = TREE_CODE (t);
 
+  if (TREE_CODE (t) != POINTER_TYPE)
+    pp_c_type_qualifier_list (pp, t);
   switch (code)
     {
     case REFERENCE_TYPE:
@@ -492,8 +494,6 @@ pp_c_specifier_qualifier_list (c_pretty_
       pp_simple_type_specifier (pp, t);
       break;
     }
-  if (TREE_CODE (t) != POINTER_TYPE)
-    pp_c_type_qualifier_list (pp, t);
 }
 
 /* parameter-type-list:
Index: gcc/target.def
===================================================================
--- gcc/target.def	(revision 188679)
+++ gcc/target.def	(working copy)
@@ -2813,7 +2813,7 @@ DEFHOOKPOD
  "True if the @code{.debug_pubtypes} and @code{.debug_pubnames} sections\
  should be emitted.  These sections are not used on most platforms, and\
  in particular GDB does not use them.",
- bool, true)
+ bool, false)
 
 DEFHOOKPOD
 (delay_sched2, "True if sched2 is not to be run at its normal place.  \
Index: gcc/testsuite/g++.old-deja/g++.pt/memtemp77.C
===================================================================
--- gcc/testsuite/g++.old-deja/g++.pt/memtemp77.C	(revision 188679)
+++ gcc/testsuite/g++.old-deja/g++.pt/memtemp77.C	(working copy)
@@ -19,7 +19,7 @@ const char* S3<char>::h(int) { return __
 int main()
 {
   if (strcmp (S3<double>::h(7), 
-	      "static char const* S3<T>::h(U) [with U = int; T = double]") == 0)
+	      "static const char* S3<T>::h(U) [with U = int; T = double]") == 0)
     return 0;
   else 
     return 1;
Index: gcc/testsuite/g++.dg/ext/pretty3.C
===================================================================
--- gcc/testsuite/g++.dg/ext/pretty3.C	(revision 188679)
+++ gcc/testsuite/g++.dg/ext/pretty3.C	(working copy)
@@ -16,4 +16,4 @@ int main ()
 {
   printf ("%s\n", D<int>().foo (0));
 }
-// { dg-final { scan-assembler "char const\\* D<U>::foo\\(typename B<U>::X\\)" } }
+// { dg-final { scan-assembler "const char\\* D<U>::foo\\(typename B<U>::X\\)" } }
Index: gcc/testsuite/g++.dg/diagnostic/bindings1.C
===================================================================
--- gcc/testsuite/g++.dg/diagnostic/bindings1.C	(revision 188679)
+++ gcc/testsuite/g++.dg/diagnostic/bindings1.C	(working copy)
@@ -10,7 +10,7 @@ struct x {typedef int type;};
 
 int main()
 {
-  if (strcmp (foo(x(), 3), "char const* foo(T, typename T::type) "
+  if (strcmp (foo(x(), 3), "const char* foo(T, typename T::type) "
 	      "[with T = x; typename T::type = int]") == 0)
     return 0;
   else 
Index: gcc/testsuite/g++.dg/warn/Wuninitializable-member.C
===================================================================
--- gcc/testsuite/g++.dg/warn/Wuninitializable-member.C	(revision 188679)
+++ gcc/testsuite/g++.dg/warn/Wuninitializable-member.C	(working copy)
@@ -8,7 +8,7 @@ public:
 };
 
 class Y {
-  const int var;// { dg-warning "non-static const member 'int const Y::var' in class without a constructor" }
+  const int var;// { dg-warning "non-static const member 'const int Y::var' in class without a constructor" }
 public:
   int g(){ return 2*var; }
 };
Index: gcc/testsuite/g++.dg/warn/pr35711.C
===================================================================
--- gcc/testsuite/g++.dg/warn/pr35711.C	(revision 188679)
+++ gcc/testsuite/g++.dg/warn/pr35711.C	(working copy)
@@ -4,5 +4,5 @@
 
 int* foo (volatile int *p)
 {
-  return (int*)p; // { dg-warning "cast from type 'int volatile\\*' to type 'int\\*' casts away qualifiers" }
+  return (int*)p; // { dg-warning "cast from type 'volatile int\\*' to type 'int\\*' casts away qualifiers" }
 }
Index: gcc/testsuite/g++.dg/pr44486.C
===================================================================
--- gcc/testsuite/g++.dg/pr44486.C	(revision 188679)
+++ gcc/testsuite/g++.dg/pr44486.C	(working copy)
@@ -7,4 +7,4 @@ namespace { S f() { const char * s = __P
 
 int main() { f(); }
 
-// { dg-final { scan-assembler "S \\(anonymous namespace\\)::f" } }
+// { dg-final { scan-assembler "S \{anonymous\}::f" } }
Index: gcc/cp/error.c
===================================================================
--- gcc/cp/error.c	(revision 188679)
+++ gcc/cp/error.c	(working copy)
@@ -1028,7 +1028,7 @@ dump_decl (tree t, int flags)
 	    dump_scope (CP_DECL_CONTEXT (t), flags);
 	  flags &= ~TFF_UNQUALIFIED_NAME;
 	  if (DECL_NAME (t) == NULL_TREE)
-	    pp_cxx_ws_string (cxx_pp, M_("(anonymous namespace)"));
+	    pp_cxx_ws_string (cxx_pp, M_("{anonymous}"));
 	  else
 	    pp_cxx_tree_identifier (cxx_pp, DECL_NAME (t));
 	}
@@ -2595,8 +2595,6 @@ lang_decl_name (tree decl, int v, bool t
 
   if (TREE_CODE (decl) == FUNCTION_DECL)
     dump_function_name (decl, TFF_PLAIN_IDENTIFIER);
-  else if (DECL_NAME (decl) == NULL && TREE_CODE (decl) == NAMESPACE_DECL)
-    pp_string (cxx_pp, M_("(anonymous namespace)"));
   else
     dump_decl (DECL_NAME (decl), TFF_PLAIN_IDENTIFIER);
 
Index: gcc/dwarf2out.c
===================================================================
--- gcc/dwarf2out.c	(revision 188679)
+++ gcc/dwarf2out.c	(working copy)
@@ -3353,7 +3353,6 @@ static void output_comp_unit (dw_die_ref
 static void output_comdat_type_unit (comdat_type_node *);
 static const char *dwarf2_name (tree, int);
 static void add_pubname (tree, dw_die_ref);
-static void add_enumerator_pubname (const char *, const char *, dw_die_ref);
 static void add_pubname_string (const char *, dw_die_ref);
 static void add_pubtype (tree, dw_die_ref);
 static void output_pubnames (VEC (pubname_entry,gc) *);
@@ -3557,12 +3556,6 @@ static void gen_scheduled_generic_parms_
 #ifndef COLD_TEXT_SECTION_LABEL
 #define COLD_TEXT_SECTION_LABEL         "Ltext_cold"
 #endif
-#ifndef DEBUG_PUBNAMES_SECTION_LABEL
-#define DEBUG_PUBNAMES_SECTION_LABEL	"Ldebug_pubnames"
-#endif
-#ifndef DEBUG_PUBTYPES_SECTION_LABEL
-#define DEBUG_PUBTYPES_SECTION_LABEL	"Ldebug_pubtypes"
-#endif
 #ifndef DEBUG_LINE_SECTION_LABEL
 #define DEBUG_LINE_SECTION_LABEL	"Ldebug_line"
 #endif
@@ -3599,8 +3592,6 @@ static char cold_end_label[MAX_ARTIFICIA
 static char abbrev_section_label[MAX_ARTIFICIAL_LABEL_BYTES];
 static char debug_info_section_label[MAX_ARTIFICIAL_LABEL_BYTES];
 static char debug_line_section_label[MAX_ARTIFICIAL_LABEL_BYTES];
-static char debug_pubnames_section_label[MAX_ARTIFICIAL_LABEL_BYTES];
-static char debug_pubtypes_section_label[MAX_ARTIFICIAL_LABEL_BYTES];
 static char macinfo_section_label[MAX_ARTIFICIAL_LABEL_BYTES];
 static char loc_section_label[MAX_ARTIFICIAL_LABEL_BYTES];
 static char ranges_section_label[2 * MAX_ARTIFICIAL_LABEL_BYTES];
@@ -6735,22 +6726,6 @@ is_cu_die (dw_die_ref c)
   return c && c->die_tag == DW_TAG_compile_unit;
 }
 
-/* Returns true iff C is a namespace DIE.  */
-
-static inline bool
-is_namespace_die (dw_die_ref c)
-{
-  return c && c->die_tag == DW_TAG_namespace;
-}
-
-/* Returns true iff C is a class DIE.  */
-
-static inline bool
-is_class_die (dw_die_ref c)
-{
-  return c && c->die_tag == DW_TAG_class_type;
-}
-
 static char *
 gen_internal_sym (const char *prefix)
 {
@@ -7323,15 +7298,6 @@ break_out_comdat_types (dw_die_ref die)
         type_node->root_die = unit;
         type_node->next = comdat_type_list;
         comdat_type_list = type_node;
-        if (targetm.want_debug_pub_sections)
-        {
-          /* FIXME: Should use add_AT_pubnamesptr.  This works because most
-             targets don't care what the base section is.  */
-          add_AT_lineptr (unit, DW_AT_GNU_pubnames,
-                          debug_pubnames_section_label);
-          add_AT_lineptr (unit, DW_AT_GNU_pubtypes,
-                          debug_pubtypes_section_label);
-        }
 
         /* Generate the type signature.  */
         generate_type_signature (c, type_node);
@@ -8738,35 +8704,16 @@ add_pubname_string (const char *str, dw_
 static void
 add_pubname (tree decl, dw_die_ref die)
 {
-  if (!GENERATE_MINIMUM_LINE_TABLE && targetm.want_debug_pub_sections)
+  if (!GENERATE_MINIMUM_LINE_TABLE
+      && targetm.want_debug_pub_sections
+      && TREE_PUBLIC (decl))
     {
-      if ((TREE_PUBLIC (decl) && !is_class_die (die->die_parent))
-          || is_cu_die (die->die_parent) || is_namespace_die (die->die_parent))
-        {
-          const char *name = dwarf2_name (decl, 1);
-          if (name)
-            add_pubname_string (name, die);
-        }
+      const char *name = dwarf2_name (decl, 1);
+      if (name)
+	add_pubname_string (name, die);
     }
 }
 
-/* Add an enumerator to the pubnames section.  */
-
-static void
-add_enumerator_pubname (const char *scope_name, const char *sep, dw_die_ref die)
-{
-  const char *name;
-  pubname_entry e;
-
-  if (scope_name)
-    name = concat (scope_name, sep, get_AT_string (die, DW_AT_name), NULL);
-  else
-    name = xstrdup (get_AT_string (die, DW_AT_name));
-  e.name = name;
-  e.die = die;
-  VEC_safe_push (pubname_entry, gc, pubtype_table, &e);
-}
-
 /* Add a new entry to .debug_pubtypes if appropriate.  */
 
 static void
@@ -8779,47 +8726,34 @@ add_pubtype (tree decl, dw_die_ref die)
 
   e.name = NULL;
   if ((TREE_PUBLIC (decl)
-       || is_cu_die (die->die_parent) || is_namespace_die (die->die_parent))
+       || is_cu_die (die->die_parent))
       && (die->die_tag == DW_TAG_typedef || COMPLETE_TYPE_P (decl)))
     {
-      tree scope = NULL;
-      const char *scope_name = NULL;
-      const char *sep = is_cxx () ? "::" : ".";
-      const char *name = NULL;
-
+      e.die = die;
       if (TYPE_P (decl))
-        name = type_tag (decl);
+	{
+	  if (TYPE_NAME (decl))
+	    {
+	      if (TREE_CODE (TYPE_NAME (decl)) == IDENTIFIER_NODE)
+		e.name = IDENTIFIER_POINTER (TYPE_NAME (decl));
+	      else if (TREE_CODE (TYPE_NAME (decl)) == TYPE_DECL
+		       && DECL_NAME (TYPE_NAME (decl)))
+		e.name = IDENTIFIER_POINTER (DECL_NAME (TYPE_NAME (decl)));
+	      else
+	       e.name = xstrdup ((const char *) get_AT_string (die, DW_AT_name));
+	    }
+	}
       else
-        name = lang_hooks.dwarf_name (decl, 1);
+	{
+	  e.name = dwarf2_name (decl, 1);
+	  if (e.name)
+	    e.name = xstrdup (e.name);
+	}
 
       /* If we don't have a name for the type, there's no point in adding
 	 it to the table.  */
-      if (name == NULL || name[0] == '\0')
-        return;
-
-      e.die = die;
-      e.name = xstrdup (name);
-
-      scope = TYPE_P (decl) ? TYPE_CONTEXT (decl) : NULL;
-      if (scope && TREE_CODE (scope) == NAMESPACE_DECL)
-        {
-          scope_name = lang_hooks.dwarf_name (scope, 1);
-          if (scope_name != NULL)
-            e.name = concat (scope_name, sep, e.name, NULL);
-        }
-      VEC_safe_push (pubname_entry, gc, pubtype_table, &e);
-
-      /* Although it might be more consistent to add the pubinfo for the
-         enumerators as their dies are created, they should only be added if the
-         enum type meets the criteria above.  So rather than re-check the parent
-         enum type whenever an enumerator die is created, just output them all
-         here.  */
-      if (die->die_tag == DW_TAG_enumeration_type)
-        {
-          dw_die_ref c;
-
-          FOR_EACH_CHILD (die, c, add_enumerator_pubname (scope_name, sep, c));
-        }
+      if (e.name && e.name[0] != '\0')
+	VEC_safe_push (pubname_entry, gc, pubtype_table, &e);
     }
 }
 
@@ -8833,18 +8767,6 @@ output_pubnames (VEC (pubname_entry, gc)
   unsigned long pubnames_length = size_of_pubnames (names);
   pubname_ref pub;
 
-  if (!targetm.want_debug_pub_sections || !info_section_emitted)
-    return;
-  if (names == pubname_table)
-    {
-      switch_to_section (debug_pubnames_section);
-      ASM_OUTPUT_LABEL (asm_out_file, debug_pubnames_section_label);
-    }
-  else
-    {
-      switch_to_section (debug_pubtypes_section);
-      ASM_OUTPUT_LABEL (asm_out_file, debug_pubtypes_section_label);
-    }
   if (DWARF_INITIAL_LENGTH_SIZE - DWARF_OFFSET_SIZE == 4)
     dw2_asm_output_data (4, 0xffffffff,
       "Initial length escape value indicating 64-bit DWARF extension");
@@ -9756,7 +9678,6 @@ base_type_die (tree type)
   add_AT_unsigned (base_type_result, DW_AT_byte_size,
 		   int_size_in_bytes (type));
   add_AT_unsigned (base_type_result, DW_AT_encoding, encoding);
-  add_pubtype (type, base_type_result);
 
   return base_type_result;
 }
@@ -19562,8 +19483,6 @@ gen_namespace_die (tree decl, dw_die_ref
       add_AT_die_ref (namespace_die, DW_AT_import, origin_die);
       equate_decl_number_to_die (decl, namespace_die);
     }
-  /* Bypass dwarf2_name's check for DECL_NAMELESS.  */
-  add_pubname_string (lang_hooks.dwarf_name (decl, 1), namespace_die);
 }
 
 /* Generate Dwarf debug information for a decl described by DECL.
@@ -21267,10 +21186,6 @@ dwarf2out_init (const char *filename ATT
 
   ASM_GENERATE_INTERNAL_LABEL (debug_info_section_label,
 			       DEBUG_INFO_SECTION_LABEL, 0);
-  ASM_GENERATE_INTERNAL_LABEL (debug_pubnames_section_label,
-			       DEBUG_PUBNAMES_SECTION_LABEL, 0);
-  ASM_GENERATE_INTERNAL_LABEL (debug_pubtypes_section_label,
-			       DEBUG_PUBTYPES_SECTION_LABEL, 0);
   ASM_GENERATE_INTERNAL_LABEL (debug_line_section_label,
 			       DEBUG_LINE_SECTION_LABEL, 0);
   ASM_GENERATE_INTERNAL_LABEL (ranges_section_label,
@@ -22613,7 +22528,6 @@ optimize_location_lists (dw_die_ref die)
   htab_delete (htab);
 }
 
-
 /* Output stuff that dwarf requires at the end of every file,
    and generate the DWARF-2 debugging info.  */
 
@@ -22874,17 +22788,6 @@ dwarf2out_finish (const char *filename)
     }
   htab_delete (comdat_type_table);
 
-  /* Add the DW_AT_GNU_pubnames and DW_AT_GNU_pubtypes attributes.  */
-  if (targetm.want_debug_pub_sections)
-    {
-      /* FIXME: Should use add_AT_pubnamesptr.  This works because most targets
-         don't care what the base section is.  */
-      add_AT_lineptr (comp_unit_die (), DW_AT_GNU_pubnames,
-                      debug_pubnames_section_label);
-      add_AT_lineptr (comp_unit_die (), DW_AT_GNU_pubtypes,
-                      debug_pubtypes_section_label);
-    }
-
   /* Output the main compilation unit if non-empty or if .debug_macinfo
      or .debug_macro will be emitted.  */
   output_comp_unit (comp_unit_die (), have_macinfo);
@@ -22908,12 +22811,42 @@ dwarf2out_finish (const char *filename)
       output_location_lists (comp_unit_die ());
     }
 
-  /* Output public names and types tables if necessary.  */
-  output_pubnames (pubname_table);
+  /* Output public names table if necessary.  */
+  if (!VEC_empty (pubname_entry, pubname_table))
+    {
+      gcc_assert (info_section_emitted);
+      switch_to_section (debug_pubnames_section);
+      output_pubnames (pubname_table);
+    }
+
+  /* Output public types table if necessary.  */
   /* ??? Only defined by DWARF3, but emitted by Darwin for DWARF2.
      It shouldn't hurt to emit it always, since pure DWARF2 consumers
      simply won't look for the section.  */
-  output_pubnames (pubtype_table);
+  if (!VEC_empty (pubname_entry, pubtype_table))
+    {
+      bool empty = false;
+      
+      if (flag_eliminate_unused_debug_types)
+	{
+	  /* The pubtypes table might be emptied by pruning unused items.  */
+	  unsigned i;
+	  pubname_ref p;
+	  empty = true;
+	  FOR_EACH_VEC_ELT (pubname_entry, pubtype_table, i, p)
+	    if (p->die->die_offset != 0)
+	      {
+		empty = false;
+		break;
+	      }
+	}
+      if (!empty)
+	{
+	  gcc_assert (info_section_emitted);
+	  switch_to_section (debug_pubtypes_section);
+	  output_pubnames (pubtype_table);
+	}
+    }
 
   /* Output the address range information if a CU (.debug_info section)
      was emitted.  We output an empty table even if we had no functions
