1 /* 2 * Copyright Andrey Semashev 2018. 3 * Distributed under the Boost Software License, Version 1.0. 4 * (See accompanying file LICENSE_1_0.txt or copy at 5 * https://www.boost.org/LICENSE_1_0.txt) 6 */ 7 /*! 8 * \file uncaught_exceptions_np.cpp 9 * \author Andrey Semashev 10 * \date 2018-11-10 11 * 12 * \brief This file contains tests for the uncaught_exceptions function. 13 * 14 * This file contains checks that are compiler specific and not quite portable or require C++17. 15 */ 16 17 #include <boost/core/uncaught_exceptions.hpp> 18 19 #if !defined(BOOST_CORE_UNCAUGHT_EXCEPTIONS_EMULATED) 20 21 #include <boost/core/lightweight_test.hpp> 22 23 struct my_exception1 {}; 24 struct my_exception2 {}; 25 26 class exception_watcher2 27 { 28 unsigned int& m_count; 29 30 public: exception_watcher2(unsigned int & count)31 explicit exception_watcher2(unsigned int& count) : m_count(count) {} ~exception_watcher2()32 ~exception_watcher2() { m_count = boost::core::uncaught_exceptions(); } 33 }; 34 35 class exception_watcher1 36 { 37 unsigned int& m_count1; 38 unsigned int& m_count2; 39 40 public: exception_watcher1(unsigned int & count1,unsigned int & count2)41 exception_watcher1(unsigned int& count1, unsigned int& count2) : m_count1(count1), m_count2(count2) {} ~exception_watcher1()42 ~exception_watcher1() 43 { 44 m_count1 = boost::core::uncaught_exceptions(); 45 try 46 { 47 exception_watcher2 watcher2(m_count2); 48 throw my_exception2(); 49 } 50 catch (...) 51 { 52 } 53 } 54 }; 55 56 // Tests for uncaught_exceptions when used in nested destructors while an exception propagates test_in_nested_destructors()57 void test_in_nested_destructors() 58 { 59 const unsigned int root_count = boost::core::uncaught_exceptions(); 60 61 unsigned int level1_count = root_count, level2_count = root_count; 62 try 63 { 64 exception_watcher1 watcher1(level1_count, level2_count); 65 throw my_exception1(); 66 } 67 catch (...) 68 { 69 } 70 71 BOOST_TEST_NE(root_count, level1_count); 72 BOOST_TEST_NE(root_count, level2_count); 73 BOOST_TEST_NE(level1_count, level2_count); 74 } 75 main()76 int main() 77 { 78 test_in_nested_destructors(); 79 80 return boost::report_errors(); 81 } 82 83 #else 84 main()85 int main() 86 { 87 return 0; 88 } 89 90 #endif 91