http://gcc.gnu.org/bugzilla/show_bug.cgi?id=54267
--- Comment #2 from David Keller <david.keller at litchis dot fr> 2012-08-15
02:58:33 UTC ---
1 #include <iostream>
2 #include <boost/system/error_code.hpp>
3 #include <boost/system/system_error.hpp>
4
5
6 namespace detail {
7
8 inline void throw_error(const boost::system::error_code& err)
9 {
10 /**
11 * If this condition is removed, (i.e. always throw)
12 * Then the exception will be caught!!
13 */
14 if ( err )
15 {
16 boost::system::system_error e(err);
17 throw e;
18 }
19 }
20
21 } // namespace detail
22
23 /**
24 * This exception is not catchable !
25 */
26 void
27 do_throw_bad
28 ( void )
29 {
30 // Simulate a boost::asio::error
31 detail::throw_error( boost::system::errc::make_error_code(
boost::system::errc::address_in_use ));
32 }
33
34 /**
35 * Now the exceptions thrown becomes catchable.
36 * When the function lives in an anonymous namespace.
37 */
38 namespace {
39
40 void
41 do_throw_ok
42 ( void )
43 {
44 // Simulate a boost::asio::error
45 detail::throw_error( boost::system::errc::make_error_code(
boost::system::errc::address_in_use ));
46 }
47
48 } // anonymous namespace
49 [...]
When the if condition is removed from the throw_error function, the exception
is caught!
I'll continue to simplify the case.