diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 28490849eb4c5ce63cfa4fc9a567717fbc6dff83..a8095d881bb7a530131a6d8eefae35db001f6288 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,21 @@
+2002-02-05  Jason Merrill  <jason@redhat.com>
+
+	* c-typeck.c (convert_for_assignment): Don't allow conversions
+	between pointers and references.  Only allow lvalues to convert to
+	reference.
+
+	* c-decl.c (finish_function): Warn about a non-void function with
+	no return statement and no abnormal exit.
+	(current_function_returns_abnormally): New variable.
+	(start_function): Clear it.
+	(struct c_language_function): Add returns_abnormally.
+	(push_c_function_context): Save it.
+	(pop_c_function_context): Restore it.
+	* c-tree.h: Declare current_function_returns_abnormally.
+	* c-typeck.c (build_function_call): Set it.
+
+	* collect2.c (dump_file): Pass DMGL_VERBOSE to cplus_demangle.
+
 2002-02-05  Andreas Jaeger  <aj@suse.de>
 
 	* crtstuff.c: Fix comments.
@@ -14,12 +32,12 @@
 
 2002-02-05  Aldy Hernandez  <aldyh@redhat.com>
 
-        * config/rs6000/altivec.h (vec_step_help): Rename to
-        __vec_step_help.
+	* config/rs6000/altivec.h (vec_step_help): Rename to
+	__vec_step_help.
 
 2002-02-05  Aldy Hernandez  <aldyh@redhat.com>
 
-        * config/rs6000/altivec.h: Fix typos.
+	* config/rs6000/altivec.h: Fix typos.
 
 2002-02-05  Jason Thorpe  <thorpej@wasabisystems.com>
 
@@ -27,13 +45,13 @@
 
 2002-02-05  Aldy Hernandez  <aldyh@redhat.com>
 
-        * config/rs6000/rs6000.c (altivec_init_builtins): Fix typo
-        building void typed builtins.
+	* config/rs6000/rs6000.c (altivec_init_builtins): Fix typo
+	building void typed builtins.
 
-        * config/rs6000/altivec.h (vec_ld*): Fix typos.
-        (vec_step): Implement for C++.
+	* config/rs6000/altivec.h (vec_ld*): Fix typos.
+	(vec_step): Implement for C++.
 
-Mon Feb  4 19:23:19 2002  Richard Kenner  <kenner@vlsi1.ultra.nyu.edu>
+Mon Feb	 4 19:23:19 2002  Richard Kenner  <kenner@vlsi1.ultra.nyu.edu>
 
 	* final.c (final_scan_insn): Add case for NOTE_INSN_LOOP_END_TOP_COND.
 
@@ -44,20 +62,20 @@ Mon Feb  4 19:23:19 2002  Richard Kenner  <kenner@vlsi1.ultra.nyu.edu>
 
 2002-02-05  Aldy Hernandez  <aldyh@redhat.com>
 
-        * doc/extend.texi: Warn about unsupported usage of altivec
-        builtins.
+	* doc/extend.texi: Warn about unsupported usage of altivec
+	builtins.
 
-        * config/rs6000/rs6000.md (altivec_vcmp*_p): Remove.
-        (altivec_predicate_*): New.
+	* config/rs6000/rs6000.md (altivec_vcmp*_p): Remove.
+	(altivec_predicate_*): New.
 
-        * config/rs6000/altivec.h: Rewrite predicates to use new builtins.
-        Add C++ version of vec_*() functions.
+	* config/rs6000/altivec.h: Rewrite predicates to use new builtins.
+	Add C++ version of vec_*() functions.
 
-        * config/rs6000/rs6000.c (bdesc_altivec_preds): New.
-        (bdesc_2arg): Remove altivec predicates.
-        (altivec_expand_builtin): Handle predicates.
-        (altivec_init_builtins): Handle predicates.
-        (altivec_expand_predicate_builtin): New.
+	* config/rs6000/rs6000.c (bdesc_altivec_preds): New.
+	(bdesc_2arg): Remove altivec predicates.
+	(altivec_expand_builtin): Handle predicates.
+	(altivec_init_builtins): Handle predicates.
+	(altivec_expand_predicate_builtin): New.
 
 2002-02-04  John David Anglin  <dave@hiauly1.hia.nrc.ca>
 
diff --git a/gcc/collect2.c b/gcc/collect2.c
index 23e4606a1fddcf0757d0e485b1bfcf146ab5e380..6fb2efd76b10b16ab2ea064c0f763a9aabce3855 100644
--- a/gcc/collect2.c
+++ b/gcc/collect2.c
@@ -532,7 +532,7 @@ dump_file (name)
 	  if (no_demangle)
 	    result = 0;
 	  else
-	    result = cplus_demangle (p, DMGL_PARAMS | DMGL_ANSI);
+	    result = cplus_demangle (p, DMGL_PARAMS | DMGL_ANSI | DMGL_VERBOSE);
 
 	  if (result)
 	    {
diff --git a/include/ChangeLog b/include/ChangeLog
index 1661b07944c487d9969d5f61142147f742027352..599adbaa1f736589e2f04cc55fbe13fbba15730d 100644
--- a/include/ChangeLog
+++ b/include/ChangeLog
@@ -1,3 +1,10 @@
+2002-02-05  Jason Merrill  <jason@redhat.com>
+
+	* demangle.h (cplus_demangle_v3): Add "options" parm.
+	(cplus_demangle_v3_type): Remove prototype.
+	(DMGL_VERBOSE): New macro.
+	(DMGL_TYPES): New macro.
+
 2002-02-02  H.J. Lu  (hjl@gnu.org)
 
 	* demangle.h (cplus_demangle_v3_type): New prototype.
diff --git a/include/demangle.h b/include/demangle.h
index cbe28041301ddfb7c57d41f684741d79dd6e2d29..ad0569a0d572cf01487d7c6e0ca0bad3b0ccfc41 100644
--- a/include/demangle.h
+++ b/include/demangle.h
@@ -29,6 +29,8 @@
 #define DMGL_PARAMS	 (1 << 0)	/* Include function args */
 #define DMGL_ANSI	 (1 << 1)	/* Include const, volatile, etc */
 #define DMGL_JAVA	 (1 << 2)	/* Demangle as Java rather than C++. */
+#define DMGL_VERBOSE	 (1 << 3)	/* Include implementation details.  */
+#define DMGL_TYPES	 (1 << 4)	/* Also try to demangle type encodings.  */
 
 #define DMGL_AUTO	 (1 << 8)
 #define DMGL_GNU	 (1 << 9)
@@ -125,12 +127,7 @@ cplus_demangle_name_to_style PARAMS ((const char *name));
 
 /* V3 ABI demangling entry points, defined in cp-demangle.c.  */
 extern char*
-cplus_demangle_v3 PARAMS ((const char* mangled));
-
-/* V3 ABI demangling entry points, defined in cp-demangle.c. Also
-   demagle types. */
-extern char*
-cplus_demangle_v3_type PARAMS ((const char* mangled));
+cplus_demangle_v3 PARAMS ((const char* mangled, int options));
 
 extern char*
 java_demangle_v3 PARAMS ((const char* mangled));
diff --git a/libiberty/ChangeLog b/libiberty/ChangeLog
index a2638236e7588a3a53f5dee76568b7e9186d22e5..08cf00d048cbbb7737d736cbc1a62e88c5154a32 100644
--- a/libiberty/ChangeLog
+++ b/libiberty/ChangeLog
@@ -1,3 +1,12 @@
+2002-02-05  Jason Merrill  <jason@redhat.com>
+
+	* cplus-dem.c (flags): Add DMGL_VERBOSE
+	(cplus_demangle_v3_p): Remove.
+	(demangle_it): Add DMGL_TYPES to passed flags.
+	* cp-demangle.c (cplus_demangle_v3_all): Remove.
+	(cplus_demangle_v3_type): Remove.
+	(cplus_demangle_v3): Add options parm.
+
 2002-02-02  H.J. Lu  (hjl@gnu.org)
 
 	* cp-demangle.c (cp_demangle_type): Do not protect with
diff --git a/libiberty/cp-demangle.c b/libiberty/cp-demangle.c
index 26e20107b19e752c60c7d54c0281ebb621ac3db5..136dc723d2ed15f7075e513c84d8ff4aa1a09c8c 100644
--- a/libiberty/cp-demangle.c
+++ b/libiberty/cp-demangle.c
@@ -940,8 +940,6 @@ static status_t cp_demangle
   PARAMS ((const char *, dyn_string_t, int));
 static status_t cp_demangle_type
   PARAMS ((const char*, dyn_string_t));
-static char* cplus_demangle_v3_all
-  PARAMS ((const char*, int));
 
 /* When passed to demangle_bare_function_type, indicates that the
    function's return type is not encoded before its parameter types.  */
@@ -3687,26 +3685,13 @@ __cxa_demangle (mangled_name, output_buffer, length, status)
    If the demangling failes, returns NULL.  */
 
 char *
-cplus_demangle_v3 (mangled)
+cplus_demangle_v3 (mangled, options)
      const char* mangled;
-{
-  return cplus_demangle_v3_all (mangled, 0);
-}
-
-char *
-cplus_demangle_v3_type (mangled)
-     const char* mangled;
-{
-  return cplus_demangle_v3_all (mangled, 1);
-}
-
-static char *
-cplus_demangle_v3_all (mangled, type)
-     const char* mangled;
-     int type;
+     int options;
 {
   dyn_string_t demangled;
   status_t status;
+  int type = !!(options & DMGL_TYPES);
 
   if (mangled[0] == '_' && mangled[1] == 'Z')
     /* It is not a type.  */
@@ -3718,6 +3703,8 @@ cplus_demangle_v3_all (mangled, type)
 	return NULL;
     }
 
+  flag_verbose = !!(options & DMGL_VERBOSE);
+
   /* Create a dyn_string to hold the demangled name.  */
   demangled = dyn_string_new (0);
   /* Attempt the demangling.  */
diff --git a/libiberty/cplus-dem.c b/libiberty/cplus-dem.c
index b66d26de6a113c669249e5b9337539a34b97c9d2..4e60b2cfcbd11436685825f77410d04535ef666d 100644
--- a/libiberty/cplus-dem.c
+++ b/libiberty/cplus-dem.c
@@ -478,9 +478,6 @@ do_hpacc_template_literal PARAMS ((struct work_stuff *, const char **, string *)
 static int
 snarf_numeric_literal PARAMS ((const char **, string *));
 
-static char* (*cplus_demangle_v3_p) PARAMS ((const char* mangled))
-  = cplus_demangle_v3;
-
 /* There is a TYPE_QUAL value for each type qualifier.  They can be
    combined by bitwise-or to form the complete set of qualifiers for a
    type.  */
@@ -914,7 +911,7 @@ cplus_demangle (mangled, options)
   /* The V3 ABI demangling is implemented elsewhere.  */
   if (GNU_V3_DEMANGLING || AUTO_DEMANGLING)
     {
-      ret = cplus_demangle_v3_p (mangled);
+      ret = cplus_demangle_v3 (mangled, work->options);
       if (ret || GNU_V3_DEMANGLING)
 	return ret;
     }
@@ -4877,7 +4874,7 @@ string_append_template_idx (s, idx)
 
 static const char *program_name;
 static const char *program_version = VERSION;
-static int flags = DMGL_PARAMS | DMGL_ANSI;
+static int flags = DMGL_PARAMS | DMGL_ANSI | DMGL_VERBOSE;
 
 static void demangle_it PARAMS ((char *));
 static void usage PARAMS ((FILE *, int)) ATTRIBUTE_NORETURN;
@@ -4890,7 +4887,8 @@ demangle_it (mangled_name)
 {
   char *result;
 
-  result = cplus_demangle (mangled_name, flags);
+  /* For command line args, also try to demangle type encodings.  */
+  result = cplus_demangle (mangled_name, flags | DMGL_TYPES);
   if (result == NULL)
     {
       printf ("%s\n", mangled_name);
@@ -5089,7 +5087,6 @@ main (argc, argv)
 
   if (optind < argc)
     {
-      cplus_demangle_v3_p = cplus_demangle_v3_type;
       for ( ; optind < argc; optind++)
 	{
 	  demangle_it (argv[optind]);