From: Jason Merrill Date: Sat, 5 Jun 2010 04:52:07 +0000 (-0400) Subject: typeck2.c (merge_exception_specifiers): Adjust merging of throw() and noexcept(true). X-Git-Tag: releases/gcc-4.6.0~6749 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=247078ec4ddf45f168329c23187f480355b43f90;p=thirdparty%2Fgcc.git 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 --- diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index a67de73c802e..b0510792fcf7 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,5 +1,8 @@ 2010-06-04 Jason Merrill + * 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 93ea70d3808f..e7b97c4d5c78 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 7fe8c5010cd0..0998820f7d0b 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,5 +1,8 @@ 2010-06-04 Jason Merrill + * 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 000000000000..b0135ac5319a --- /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 +#include + +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 000000000000..0a5773fc86b3 --- /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 +#include + +void my_unexpected () +{ + std::exit (0); +} + +void f() noexcept; +void f() throw() +{ + throw 1; +} + +int main() +{ + std::set_unexpected (my_unexpected); + f(); + return 1; +}