As I wrote in the PR, the standard doesn't require that std::rethrow_exception can be found by ADL, because exception_ptr is not necessarily defined in namespace std. This ensures it will be found.
Tested powerpc64le-linux, committed to trunk.
commit 920a18f991d3604bf2dfdf9679411b012964f23d Author: Jonathan Wakely <jwak...@redhat.com> Date: Wed Nov 11 09:56:22 2015 +0000 PR libstdc++/64651 * libsupc++/exception_ptr.h (rethrow_exception): Add using-declaration to __exception_ptr namespace. * testsuite/18_support/exception_ptr/rethrow_exception.cc: Test ADL. Remove unnecessary test variables. diff --git a/libstdc++-v3/libsupc++/exception_ptr.h b/libstdc++-v3/libsupc++/exception_ptr.h index 8fbad1c..7821c14 100644 --- a/libstdc++-v3/libsupc++/exception_ptr.h +++ b/libstdc++-v3/libsupc++/exception_ptr.h @@ -68,6 +68,8 @@ namespace std namespace __exception_ptr { + using std::rethrow_exception; + /** * @brief An opaque pointer to an arbitrary exception. * @ingroup exceptions diff --git a/libstdc++-v3/testsuite/18_support/exception_ptr/rethrow_exception.cc b/libstdc++-v3/testsuite/18_support/exception_ptr/rethrow_exception.cc index 31da2ec..7d39892 100644 --- a/libstdc++-v3/testsuite/18_support/exception_ptr/rethrow_exception.cc +++ b/libstdc++-v3/testsuite/18_support/exception_ptr/rethrow_exception.cc @@ -30,7 +30,6 @@ void test01() { - bool test __attribute__((unused)) = true; using namespace std; try { @@ -54,7 +53,6 @@ void test02() void test03() { - bool test __attribute__((unused)) = true; using namespace std; exception_ptr ep; @@ -71,7 +69,6 @@ void test03() void test04() { - bool test __attribute__((unused)) = true; using namespace std; // Weave the exceptions in an attempt to confuse the machinery. @@ -103,12 +100,23 @@ void test04() } } +void test05() +{ + // libstdc++/64651 std::rethrow_exception not found by ADL + // This is not required to work but is a conforming extension. + try { + rethrow_exception(std::make_exception_ptr(0)); + } catch(...) { + } +} + int main() { test01(); test02(); test03(); test04(); + test05(); return 0; }