1// Copyright 2018 Peter Dimov
2//
3// Distributed under the Boost Software License, Version 1.0.
4//
5// See accompanying file LICENSE_1_0.txt or copy at
6// http://www.boost.org/LICENSE_1_0.txt
7
8#if defined(_MSC_VER)
9# pragma warning(disable: 4702) // unreachable code
10#endif
11
12#if defined(__clang__)
13# pragma clang diagnostic ignored "-Wunknown-pragmas"
14# pragma clang diagnostic ignored "-Wunknown-warning-option"
15# pragma clang diagnostic ignored "-Wpotentially-evaluated-expression"
16# pragma clang diagnostic ignored "-Wdelete-non-abstract-non-virtual-dtor"
17# pragma clang diagnostic ignored "-Wunused-parameter"
18#endif
19
20#include <boost/throw_exception.hpp>
21#include <boost/exception_ptr.hpp>
22#include <boost/core/lightweight_test.hpp>
23
24class my_exception: public std::exception
25{
26};
27
28class my_exception2: public std::exception, public boost::exception
29{
30};
31
32class my_exception3: public std::exception, public virtual boost::exception
33{
34};
35
36int main()
37{
38 try
39 {
40 boost::throw_exception( e: my_exception() );
41 }
42 catch( ... )
43 {
44 boost::exception_ptr p = boost::current_exception();
45
46 BOOST_TEST_THROWS( boost::rethrow_exception( p ), my_exception );
47 BOOST_TEST_THROWS( boost::rethrow_exception( p ), boost::exception );
48 }
49
50 try
51 {
52 boost::throw_exception( e: my_exception2() );
53 }
54 catch( ... )
55 {
56 boost::exception_ptr p = boost::current_exception();
57
58 BOOST_TEST_THROWS( boost::rethrow_exception( p ), my_exception2 );
59 BOOST_TEST_THROWS( boost::rethrow_exception( p ), boost::exception );
60 }
61
62 try
63 {
64 boost::throw_exception( e: my_exception3() );
65 }
66 catch( ... )
67 {
68 boost::exception_ptr p = boost::current_exception();
69
70 BOOST_TEST_THROWS( boost::rethrow_exception( p ), my_exception3 );
71 BOOST_TEST_THROWS( boost::rethrow_exception( p ), boost::exception );
72 }
73
74 try
75 {
76 BOOST_THROW_EXCEPTION( my_exception() );
77 }
78 catch( ... )
79 {
80 boost::exception_ptr p = boost::current_exception();
81
82 BOOST_TEST_THROWS( boost::rethrow_exception( p ), my_exception );
83 BOOST_TEST_THROWS( boost::rethrow_exception( p ), boost::exception );
84 }
85
86 try
87 {
88 BOOST_THROW_EXCEPTION( my_exception2() );
89 }
90 catch( ... )
91 {
92 boost::exception_ptr p = boost::current_exception();
93
94 BOOST_TEST_THROWS( boost::rethrow_exception( p ), my_exception2 );
95 BOOST_TEST_THROWS( boost::rethrow_exception( p ), boost::exception );
96 }
97
98 try
99 {
100 BOOST_THROW_EXCEPTION( my_exception3() );
101 }
102 catch( ... )
103 {
104 boost::exception_ptr p = boost::current_exception();
105
106 BOOST_TEST_THROWS( boost::rethrow_exception( p ), my_exception3 );
107 BOOST_TEST_THROWS( boost::rethrow_exception( p ), boost::exception );
108 }
109
110 return boost::report_errors();
111}
112

source code of boost/libs/throw_exception/test/throw_exception_test3.cpp