From ad6b1795b1171d94d24abb31dfe515d311531794 Mon Sep 17 00:00:00 2001
From: Jason Merrill <jason@redhat.com>
Date: Thu, 17 Jan 2002 07:54:36 -0500
Subject: [PATCH] error.c (dump_type_suffix): Print the exception specs before
 recursing.

        * error.c (dump_type_suffix): Print the exception specs before
        recursing.
        (dump_function_decl): Here, too.

        * cp-tree.h (TMPL_PARMS_DEPTH): Cast to signed HOST_WIDE_INT.

From-SVN: r48947
---
 gcc/cp/ChangeLog                    | 8 ++++++++
 gcc/cp/cp-tree.h                    | 2 +-
 gcc/cp/error.c                      | 8 ++++----
 gcc/testsuite/g++.dg/other/error3.C | 5 +++++
 4 files changed, 18 insertions(+), 5 deletions(-)
 create mode 100644 gcc/testsuite/g++.dg/other/error3.C

diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index 3764b85c63b8..793af6d5367e 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -1,3 +1,11 @@
+2002-01-16  Jason Merrill  <jason@redhat.com>
+
+	* error.c (dump_type_suffix): Print the exception specs before
+	recursing.
+	(dump_function_decl): Here, too.
+
+	* cp-tree.h (TMPL_PARMS_DEPTH): Cast to signed HOST_WIDE_INT.
+
 2002-01-10  Ira Ruben	<ira@apple.com>
 
 	* decl.c (start_method): Handle attrlist.
diff --git a/gcc/cp/cp-tree.h b/gcc/cp/cp-tree.h
index c157466a5726..88b4cdbfd506 100644
--- a/gcc/cp/cp-tree.h
+++ b/gcc/cp/cp-tree.h
@@ -2286,7 +2286,7 @@ struct lang_decl
 
 /* The number of levels of template parameters given by NODE.  */
 #define TMPL_PARMS_DEPTH(NODE) \
-  (TREE_INT_CST_LOW (TREE_PURPOSE (NODE)))
+  ((HOST_WIDE_INT) TREE_INT_CST_LOW (TREE_PURPOSE (NODE)))
 
 /* The TEMPLATE_DECL instantiated or specialized by NODE.  This
    TEMPLATE_DECL will be the immediate parent, not the most general
diff --git a/gcc/cp/error.c b/gcc/cp/error.c
index 21a171f874d1..de6221507ebf 100644
--- a/gcc/cp/error.c
+++ b/gcc/cp/error.c
@@ -737,8 +737,8 @@ dump_type_suffix (t, flags)
 	if (TREE_CODE (t) == METHOD_TYPE)
 	  dump_qualifiers
 	    (TREE_TYPE (TREE_VALUE (TYPE_ARG_TYPES (t))), before);
-	dump_type_suffix (TREE_TYPE (t), flags);
 	dump_exception_spec (TYPE_RAISES_EXCEPTIONS (t), flags);
+	dump_type_suffix (TREE_TYPE (t), flags);
 	break;
       }
 
@@ -1141,15 +1141,15 @@ dump_function_decl (t, flags)
     {
       dump_parameters (parmtypes, flags);
 
-      if (show_return)
-	dump_type_suffix (TREE_TYPE (fntype), flags);
-
       if (TREE_CODE (fntype) == METHOD_TYPE)
 	dump_qualifiers (TREE_TYPE (TREE_VALUE (TYPE_ARG_TYPES (fntype))),
 			 before);
 
       if (flags & TFF_EXCEPTION_SPECIFICATION)
 	dump_exception_spec (TYPE_RAISES_EXCEPTIONS (fntype), flags);
+
+      if (show_return)
+	dump_type_suffix (TREE_TYPE (fntype), flags);
     }
 
   /* If T is a template instantiation, dump the parameter binding.  */
diff --git a/gcc/testsuite/g++.dg/other/error3.C b/gcc/testsuite/g++.dg/other/error3.C
new file mode 100644
index 000000000000..bd5d70109457
--- /dev/null
+++ b/gcc/testsuite/g++.dg/other/error3.C
@@ -0,0 +1,5 @@
+// Test for proper error message formatting; the throw() should go inside
+// the parens, as below.
+
+void (*g() throw())();		// { dg-error "g\\(\\) throw" "" }
+void (*g())();			// { dg-error "" "" }
-- 
GitLab