re PR c++/37719 (incorrect type on warning of mismatched exception specification...
authorPaolo Carlini <paolo.carlini@oracle.com>
Fri, 3 Oct 2008 16:29:07 +0000 (16:29 +0000)
committerPaolo Carlini <paolo@gcc.gnu.org>
Fri, 3 Oct 2008 16:29:07 +0000 (16:29 +0000)
/cp
2008-10-03  Paolo Carlini  <paolo.carlini@oracle.com>

PR c++/37719
* error.c (dump_function_decl): Save the exceptions in case of
error about incompatible specifications in a specialization.

/testsuite
2008-10-03  Paolo Carlini  <paolo.carlini@oracle.com>

PR c++/37719
* g++.dg/template/error36.C: New.

From-SVN: r140855

gcc/cp/ChangeLog
gcc/cp/error.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/template/error36.C [new file with mode: 0644]

index ea319f31aaa0d2be4e6589ea07479ee7c6686455..acb766f7124e45936d3cff513741cf52d5f98638 100644 (file)
@@ -1,3 +1,9 @@
+2008-10-03  Paolo Carlini  <paolo.carlini@oracle.com>
+
+       PR c++/37719
+       * error.c (dump_function_decl): Save the exceptions in case of
+       error about incompatible specifications in a specialization.
+
 2008-10-01  Andrew Pinski  <andrew_pinski@playstation.sony.com>
 
        * tree.c (lvalue_p_1): COMPOUND_LITERAL_EXPR is also an lvalue.
index b8330c3d0fce1b0247f93450e6f2acdf7ccf25b7..4064ad400e2482e6512c0572acb9f6f2f915db3c 100644 (file)
@@ -1084,11 +1084,16 @@ dump_function_decl (tree t, int flags)
   tree template_parms = NULL_TREE;
   int show_return = flags & TFF_RETURN_TYPE || flags & TFF_DECL_SPECIFIERS;
   int do_outer_scope = ! (flags & TFF_UNQUALIFIED_NAME);
+  tree exceptions;
 
   flags &= ~TFF_UNQUALIFIED_NAME;
   if (TREE_CODE (t) == TEMPLATE_DECL)
     t = DECL_TEMPLATE_RESULT (t);
 
+  /* Save the exceptions, in case t is a specialization and we are
+     emitting an error about incompatible specifications.  */
+  exceptions = TYPE_RAISES_EXCEPTIONS (TREE_TYPE (t));
+
   /* Pretty print template instantiations only.  */
   if (DECL_USE_TEMPLATE (t) && DECL_TEMPLATE_INFO (t))
     {
@@ -1153,7 +1158,7 @@ dump_function_decl (tree t, int flags)
       if (flags & TFF_EXCEPTION_SPECIFICATION)
        {
          pp_base (cxx_pp)->padding = pp_before;
-         dump_exception_spec (TYPE_RAISES_EXCEPTIONS (fntype), flags);
+         dump_exception_spec (exceptions, flags);
        }
 
       if (show_return)
index 7894386318cb8080021ce5da2cd89d97d7568919..f2c8bf235d21b39ceb7d1d6927906a5d4a032893 100644 (file)
@@ -1,3 +1,8 @@
+2008-10-03  Paolo Carlini  <paolo.carlini@oracle.com>
+
+       PR c++/37719
+       * g++.dg/template/error36.C: New.
+
 2008-10-02  Steven Bosscher  <steven@gcc.gnu.org>
 
        PR fortran/37635
diff --git a/gcc/testsuite/g++.dg/template/error36.C b/gcc/testsuite/g++.dg/template/error36.C
new file mode 100644 (file)
index 0000000..b16b976
--- /dev/null
@@ -0,0 +1,9 @@
+// PR c++/37719.C
+
+template <typename T>
+class foo {
+    void bar() throw(int); // { dg-error "throw \\(int\\)" }
+};
+
+template <>
+void foo<int>::bar() throw(float) {} // { dg-error "throw \\(float\\)" }