aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJason Merrill <jason@redhat.com>2010-06-05 00:52:07 -0400
committerJason Merrill <jason@gcc.gnu.org>2010-06-05 00:52:07 -0400
commit247078ec4ddf45f168329c23187f480355b43f90 (patch)
tree288fa8d0d2d21f3c56feed6c85b284ab687e7616
parent4af89b884ccffe321856e11dc1a9f5f3e9fe2f60 (diff)
downloadgcc-247078ec4ddf45f168329c23187f480355b43f90.zip
gcc-247078ec4ddf45f168329c23187f480355b43f90.tar.gz
gcc-247078ec4ddf45f168329c23187f480355b43f90.tar.bz2
typeck2.c (merge_exception_specifiers): Adjust merging of throw() and noexcept(true).
* typeck2.c (merge_exception_specifiers): Adjust merging of throw() and noexcept(true). From-SVN: r160308
-rw-r--r--gcc/cp/ChangeLog3
-rw-r--r--gcc/cp/typeck2.c11
-rw-r--r--gcc/testsuite/ChangeLog3
-rw-r--r--gcc/testsuite/g++.dg/cpp0x/noexcept06.C29
-rw-r--r--gcc/testsuite/g++.dg/cpp0x/noexcept07.C25
5 files changed, 64 insertions, 7 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index a67de73..b051079 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -1,5 +1,8 @@
2010-06-04 Jason Merrill <jason@redhat.com>
+ * typeck2.c (merge_exception_specifiers): Adjust merging of
+ throw() and noexcept(true).
+
* pt.c (value_dependent_expression_p) [NOEXCEPT_EXPR]: Avoid
using an uninitialized variable.
diff --git a/gcc/cp/typeck2.c b/gcc/cp/typeck2.c
index 93ea70d..e7b97c4 100644
--- a/gcc/cp/typeck2.c
+++ b/gcc/cp/typeck2.c
@@ -1721,17 +1721,14 @@ merge_exception_specifiers (tree list, tree add)
{
if (!list || !add)
return NULL_TREE;
- /* A noexcept(true) spec takes precedence over a throw() spec.
+ /* For merging noexcept(true) and throw(), take the more recent one (LIST).
A throw(type-list) spec takes precedence over a noexcept(false) spec.
Any other noexcept-spec should only be merged with an equivalent one.
- So the !TREE_VALUE code is correct for the latter two cases. */
- else if (list == noexcept_true_spec
- || add == noexcept_true_spec)
- return noexcept_true_spec;
- else if (!TREE_VALUE (list))
- return add;
+ So the !TREE_VALUE code below is correct for all cases. */
else if (!TREE_VALUE (add))
return list;
+ else if (!TREE_VALUE (list))
+ return add;
else
{
tree orig_list = list;
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 7fe8c50..0998820 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,5 +1,8 @@
2010-06-04 Jason Merrill <jason@redhat.com>
+ * g++.dg/cpp0x/noexcept06.C: New.
+ * g++.dg/cpp0x/noexcept07.C: New.
+
* g++.dg/cpp0x/noexcept01.C: New.
* g++.dg/cpp0x/noexcept02.C: New.
* g++.dg/cpp0x/noexcept03.C: New.
diff --git a/gcc/testsuite/g++.dg/cpp0x/noexcept06.C b/gcc/testsuite/g++.dg/cpp0x/noexcept06.C
new file mode 100644
index 0000000..b0135ac
--- /dev/null
+++ b/gcc/testsuite/g++.dg/cpp0x/noexcept06.C
@@ -0,0 +1,29 @@
+// Test that checking of a nothrow specification uses the one on the
+// definition.
+// { dg-options "-std=c++0x" }
+// { dg-do run }
+
+#include <exception>
+#include <cstdlib>
+
+void my_unexpected ()
+{
+ std::abort ();
+}
+void my_terminate ()
+{
+ std::exit (0);
+}
+
+void f() throw();
+void f() noexcept
+{
+ throw 1;
+}
+
+int main()
+{
+ std::set_terminate (my_terminate);
+ f();
+ return 1;
+}
diff --git a/gcc/testsuite/g++.dg/cpp0x/noexcept07.C b/gcc/testsuite/g++.dg/cpp0x/noexcept07.C
new file mode 100644
index 0000000..0a5773f
--- /dev/null
+++ b/gcc/testsuite/g++.dg/cpp0x/noexcept07.C
@@ -0,0 +1,25 @@
+// Test that checking of a nothrow specification uses the one on the
+// definition.
+// { dg-options "-std=c++0x" }
+// { dg-do run }
+
+#include <exception>
+#include <cstdlib>
+
+void my_unexpected ()
+{
+ std::exit (0);
+}
+
+void f() noexcept;
+void f() throw()
+{
+ throw 1;
+}
+
+int main()
+{
+ std::set_unexpected (my_unexpected);
+ f();
+ return 1;
+}