• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Copyright 2018, 2019 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(__clang__)
9 # pragma clang diagnostic ignored "-Wunknown-pragmas"
10 # pragma clang diagnostic ignored "-Wunknown-warning-option"
11 # pragma clang diagnostic ignored "-Wpotentially-evaluated-expression"
12 # pragma clang diagnostic ignored "-Wdelete-non-abstract-non-virtual-dtor"
13 #endif
14 
15 #include <boost/throw_exception.hpp>
16 #include <boost/exception/get_error_info.hpp>
17 #include <boost/exception/info.hpp>
18 #include <boost/detail/lightweight_test.hpp>
19 #include <string>
20 
21 typedef boost::error_info<struct tag_error_code, int> error_code;
22 typedef boost::error_info<struct tag_error_string, std::string> error_string;
23 
24 class my_exception: public std::exception, public boost::exception
25 {
26 };
27 
28 class my_exception2: public std::exception, public virtual boost::exception
29 {
30 };
31 
main()32 int main()
33 {
34     try
35     {
36         boost::throw_exception( my_exception() << error_code( 123 ) << error_string( "error%%string" ) );
37     }
38     catch( boost::exception const & x )
39     {
40         {
41             int const * code = boost::get_error_info<error_code>( x );
42 
43             BOOST_TEST( code != 0 );
44             BOOST_TEST_EQ( *code, 123 );
45         }
46 
47         {
48             std::string const * str = boost::get_error_info<error_string>( x );
49 
50             BOOST_TEST( str != 0 );
51             BOOST_TEST_EQ( *str, "error%%string" );
52         }
53     }
54 
55     try
56     {
57         BOOST_THROW_EXCEPTION( my_exception() << error_code( 123 ) << error_string( "error%%string" ) );
58     }
59     catch( boost::exception const & x )
60     {
61         {
62             int const * code = boost::get_error_info<error_code>( x );
63 
64             BOOST_TEST( code != 0 );
65             BOOST_TEST_EQ( *code, 123 );
66         }
67 
68         {
69             std::string const * str = boost::get_error_info<error_string>( x );
70 
71             BOOST_TEST( str != 0 );
72             BOOST_TEST_EQ( *str, "error%%string" );
73         }
74     }
75 
76     try
77     {
78         boost::throw_exception( my_exception2() << error_code( 123 ) << error_string( "error%%string" ) );
79     }
80     catch( boost::exception const & x )
81     {
82         {
83             int const * code = boost::get_error_info<error_code>( x );
84 
85             BOOST_TEST( code != 0 );
86             BOOST_TEST_EQ( *code, 123 );
87         }
88 
89         {
90             std::string const * str = boost::get_error_info<error_string>( x );
91 
92             BOOST_TEST( str != 0 );
93             BOOST_TEST_EQ( *str, "error%%string" );
94         }
95     }
96 
97     try
98     {
99         BOOST_THROW_EXCEPTION( my_exception2() << error_code( 123 ) << error_string( "error%%string" ) );
100     }
101     catch( boost::exception const & x )
102     {
103         {
104             int const * code = boost::get_error_info<error_code>( x );
105 
106             BOOST_TEST( code != 0 );
107             BOOST_TEST_EQ( *code, 123 );
108         }
109 
110         {
111             std::string const * str = boost::get_error_info<error_string>( x );
112 
113             BOOST_TEST( str != 0 );
114             BOOST_TEST_EQ( *str, "error%%string" );
115         }
116     }
117 
118     return boost::report_errors();
119 }
120