http://gcc.gnu.org/bugzilla/show_bug.cgi?id=54267
--- Comment #5 from David Keller <david.keller at litchis dot fr> 2012-08-15 03:16:30 UTC --- 1 #include <iostream> 2 #include <stdexcept> 3 4 namespace detail { 5 6 inline void throw_error(bool t) 7 { 8 /** 9 * If this condition is removed, (i.e. always throw) 10 * Then the exception will be catched !! 11 */ 12 if ( t ) 13 { 14 std::runtime_error e("failed"); 15 throw e; 16 } 17 } 18 19 inline void this_function_is_required ( void ) 20 { 21 std::cout << "do not remove on optimization" << std::endl; 22 } 23 24 } // namespace detail 25 26 /** 27 * This exception is not catchable ! 28 */ 29 void 30 do_throw_bad 31 ( bool b ) 32 { 33 // Simulate a boost::asio::error 34 //boost::system::errc::make_error_code( boost::system::errc::address_in_use ); 35 detail::this_function_is_required(); 36 detail::throw_error( b ); 37 } 38 39 /** 40 * Expect: 41 * ############# 42 * catched bad 43 * ############ 44 * 45 * But see: 46 * ############# 47 * terminate called after throwing an instance of 'boost::exception_detail::clone_impl<boost::exception_detail::error_info_injector<boost::system::system_error> >' 48 * what(): asio: End of file 49 * Abort trap (core dumped) 50 * ############# 51 */ 52 int 53 main 54 ( int argc 55 , char* argv[] ) 56 { 57 try 58 { 59 do_throw_bad( argc == 1 ); 60 } 61 catch ( std::exception const& ) 62 { 63 std::cout << "catched" << std::endl; 64 } 65 66 return 0; 67 } 68 Et voilĂ