diff --git a/.travis.yml b/.travis.yml new file mode 100644 index 0000000..f0387fc --- /dev/null +++ b/.travis.yml @@ -0,0 +1,281 @@ +# Copyright 2016-2018 Peter Dimov +# Distributed under the Boost Software License, Version 1.0. +# (See accompanying file LICENSE_1_0.txt or copy at http://boost.org/LICENSE_1_0.txt) + +language: cpp + +sudo: false + +python: "2.7" + +branches: + only: + - master + - develop + - /feature\/.*/ + +env: + matrix: + - BOGUS_JOB=true + +matrix: + + exclude: + - env: BOGUS_JOB=true + + include: + - os: linux + compiler: g++ + env: TOOLSET=gcc COMPILER=g++ CXXSTD=03,11 + + - os: linux + compiler: g++-4.4 + env: TOOLSET=gcc COMPILER=g++-4.4 CXXSTD=98,0x + addons: + apt: + packages: + - g++-4.4 + sources: + - ubuntu-toolchain-r-test + + - os: linux + compiler: g++-4.6 + env: TOOLSET=gcc COMPILER=g++-4.6 CXXSTD=03,0x + addons: + apt: + packages: + - g++-4.6 + sources: + - ubuntu-toolchain-r-test + + - os: linux + compiler: g++-4.7 + env: TOOLSET=gcc COMPILER=g++-4.7 CXXSTD=03,11 + addons: + apt: + packages: + - g++-4.7 + sources: + - ubuntu-toolchain-r-test + + - os: linux + compiler: g++-4.8 + env: TOOLSET=gcc COMPILER=g++-4.8 CXXSTD=03,11 + addons: + apt: + packages: + - g++-4.8 + sources: + - ubuntu-toolchain-r-test + + - os: linux + compiler: g++-4.9 + env: TOOLSET=gcc COMPILER=g++-4.9 CXXSTD=03,11 + addons: + apt: + packages: + - g++-4.9 + sources: + - ubuntu-toolchain-r-test + + - os: linux + compiler: g++-5 + env: TOOLSET=gcc COMPILER=g++-5 CXXSTD=03,11,14,1z + addons: + apt: + packages: + - g++-5 + sources: + - ubuntu-toolchain-r-test + + - os: linux + compiler: g++-6 + env: TOOLSET=gcc COMPILER=g++-6 CXXSTD=03,11,14,1z + addons: + apt: + packages: + - g++-6 + sources: + - ubuntu-toolchain-r-test + + - os: linux + compiler: g++-7 + env: TOOLSET=gcc COMPILER=g++-7 CXXSTD=03,11,14,17 + addons: + apt: + packages: + - g++-7 + sources: + - ubuntu-toolchain-r-test + + - os: linux + compiler: g++-8 + env: TOOLSET=gcc COMPILER=g++-8 CXXSTD=03,11,14,17 + addons: + apt: + packages: + - g++-8 + sources: + - ubuntu-toolchain-r-test + + - os: linux + compiler: g++-8 + env: UBSAN=1 TOOLSET=gcc COMPILER=g++-8 CXXSTD=03,11,14,17 UBSAN_OPTIONS=print_stacktrace=1 LINKFLAGS=-fuse-ld=gold + addons: + apt: + packages: + - g++-8 + sources: + - ubuntu-toolchain-r-test + + - os: linux + compiler: clang++ + env: TOOLSET=clang COMPILER=clang++ CXXSTD=03,11 + + - os: linux + compiler: /usr/bin/clang++ + env: TOOLSET=clang COMPILER=/usr/bin/clang++ CXXSTD=03,11 + addons: + apt: + packages: + - clang-3.3 + + - os: linux + compiler: /usr/bin/clang++ + env: TOOLSET=clang COMPILER=/usr/bin/clang++ CXXSTD=03,11 + addons: + apt: + packages: + - clang-3.4 + + - os: linux + compiler: clang++-3.5 + env: TOOLSET=clang COMPILER=clang++-3.5 CXXSTD=03,11,14,1z + addons: + apt: + packages: + - clang-3.5 + - libstdc++-4.9-dev + sources: + - ubuntu-toolchain-r-test + + - os: linux + compiler: clang++-3.6 + env: TOOLSET=clang COMPILER=clang++-3.6 CXXSTD=03,11,14,1z + addons: + apt: + packages: + - clang-3.6 + - libstdc++-4.9-dev + sources: + - ubuntu-toolchain-r-test + + - os: linux + compiler: clang++-3.8 + env: TOOLSET=clang COMPILER=clang++-3.8 CXXSTD=03,11,14,1z + addons: + apt: + packages: + - clang-3.8 + - libstdc++-4.9-dev + sources: + - ubuntu-toolchain-r-test + + - os: linux + compiler: clang++-3.9 + env: TOOLSET=clang COMPILER=clang++-3.9 CXXSTD=03,11,14,1z + addons: + apt: + packages: + - clang-3.9 + - libstdc++-4.9-dev + sources: + - ubuntu-toolchain-r-test + + - os: linux + compiler: clang++-4.0 + env: TOOLSET=clang COMPILER=clang++-4.0 CXXSTD=03,11,14,1z + addons: + apt: + packages: + - clang-4.0 + - libstdc++-4.9-dev + sources: + - ubuntu-toolchain-r-test + - llvm-toolchain-trusty-4.0 + + - os: linux + compiler: clang++-5.0 + env: TOOLSET=clang COMPILER=clang++-5.0 CXXSTD=03,11,14,1z + addons: + apt: + packages: + - clang-5.0 + - libstdc++-4.9-dev + sources: + - ubuntu-toolchain-r-test + - llvm-toolchain-trusty-5.0 + + - os: linux + compiler: clang++-6.0 + env: TOOLSET=clang COMPILER=clang++-6.0 CXXSTD=03,11,14,17 + addons: + apt: + packages: + - clang-6.0 + sources: + - ubuntu-toolchain-r-test + - llvm-toolchain-trusty-6.0 + + - os: linux + compiler: clang++-6.0 + env: UBSAN=1 TOOLSET=clang COMPILER=clang++-6.0 CXXSTD=03,11,14,17 UBSAN_OPTIONS=print_stacktrace=1 + addons: + apt: + packages: + - clang-6.0 + sources: + - ubuntu-toolchain-r-test + - llvm-toolchain-trusty-6.0 + + - os: linux + compiler: clang++-libc++ + env: TOOLSET=clang COMPILER=clang++-libc++ CXXSTD=03,11,14,1z + addons: + apt: + packages: + - libc++-dev + + - os: linux + compiler: clang++-libc++ + env: UBSAN=1 TOOLSET=clang COMPILER=clang++-libc++ CXXSTD=03,11,14,1z UBSAN_OPTIONS=print_stacktrace=1 + addons: + apt: + packages: + - libc++-dev + + - os: osx + compiler: clang++ + env: TOOLSET=clang COMPILER=clang++ CXXSTD=03,11,14,1z + +install: + - BOOST_BRANCH=develop && [ "$TRAVIS_BRANCH" == "master" ] && BOOST_BRANCH=master || true + - cd .. + - git clone -b $BOOST_BRANCH --depth 1 https://github.com/boostorg/boost.git boost-root + - cd boost-root + - git submodule update --init tools/build + - git submodule update --init libs/config + - git submodule update --init tools/boostdep + - cp -r $TRAVIS_BUILD_DIR/* libs/throw_exception + - python tools/boostdep/depinst/depinst.py throw_exception + - ./bootstrap.sh + - ./b2 headers + +script: + - |- + echo "using $TOOLSET : : $COMPILER ;" > ~/user-config.jam + - ./b2 -j 3 libs/throw_exception/test toolset=$TOOLSET cxxstd=$CXXSTD variant=debug,release ${UBSAN:+cxxflags=-fsanitize=undefined cxxflags=-fno-sanitize-recover=undefined linkflags=-fsanitize=undefined define=UBSAN=1 debug-symbols=on} ${LINKFLAGS:+linkflags=$LINKFLAGS} + +notifications: + email: + on_success: always diff --git a/CMakeLists.txt b/CMakeLists.txt new file mode 100644 index 0000000..c44ceba --- /dev/null +++ b/CMakeLists.txt @@ -0,0 +1,20 @@ +# Copyright 2018 Mike Dev +# Distributed under the Boost Software License, Version 1.0. +# See accompanying file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt + +# Partial (add_subdirectory only) and experimental CMake support +# Subject to change; please do not rely on the contents of this file yet + +cmake_minimum_required(VERSION 3.5) +project(BoostThrowException LANGUAGES CXX) + +add_library(boost_throw_exception INTERFACE) +add_library(Boost::throw_exception ALIAS boost_throw_exception) + +target_include_directories(boost_throw_exception INTERFACE include) + +target_link_libraries(boost_throw_exception + INTERFACE + Boost::assert + Boost::config +) diff --git a/appveyor.yml b/appveyor.yml new file mode 100644 index 0000000..15fb16c --- /dev/null +++ b/appveyor.yml @@ -0,0 +1,60 @@ +# Copyright 2016-2018 Peter Dimov +# Distributed under the Boost Software License, Version 1.0. +# (See accompanying file LICENSE_1_0.txt or copy at http://boost.org/LICENSE_1_0.txt) + +version: 1.0.{build}-{branch} + +shallow_clone: true + +branches: + only: + - master + - develop + - /feature\/.*/ + +environment: + matrix: + - APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2013 + TOOLSET: msvc-9.0,msvc-10.0,msvc-11.0,msvc-12.0 + - APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2015 + TOOLSET: msvc-14.0 + - APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2017 + TOOLSET: msvc-14.1 + CXXSTD: 14,17 + - APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2013 + ADDPATH: C:\cygwin\bin; + TOOLSET: gcc + CXXSTD: 03,11,14,1z + - APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2013 + ADDPATH: C:\cygwin64\bin; + TOOLSET: gcc + CXXSTD: 03,11,14,1z + - APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2013 + ADDPATH: C:\mingw\bin; + TOOLSET: gcc + CXXSTD: 03,11,14,1z + - APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2013 + ADDPATH: C:\mingw-w64\x86_64-6.3.0-posix-seh-rt_v5-rev1\mingw64\bin; + TOOLSET: gcc + CXXSTD: 03,11,14,1z + +install: + - set BOOST_BRANCH=develop + - if "%APPVEYOR_REPO_BRANCH%" == "master" set BOOST_BRANCH=master + - cd .. + - git clone -b %BOOST_BRANCH% --depth 1 https://github.com/boostorg/boost.git boost-root + - cd boost-root + - git submodule update --init tools/build + - git submodule update --init libs/config + - git submodule update --init tools/boostdep + - xcopy /s /e /q %APPVEYOR_BUILD_FOLDER% libs\throw_exception + - python tools/boostdep/depinst/depinst.py throw_exception + - cmd /c bootstrap + - b2 -d0 headers + +build: off + +test_script: + - PATH=%ADDPATH%%PATH% + - if not "%CXXSTD%" == "" set CXXSTD=cxxstd=%CXXSTD% + - b2 -j 3 libs/throw_exception/test toolset=%TOOLSET% %CXXSTD% diff --git a/include/boost/exception/exception.hpp b/include/boost/exception/exception.hpp index c0fdaf9..be70b3c 100644 --- a/include/boost/exception/exception.hpp +++ b/include/boost/exception/exception.hpp @@ -5,21 +5,24 @@ #ifndef UUID_274DA366004E11DCB1DDFE2E56D89593 #define UUID_274DA366004E11DCB1DDFE2E56D89593 -#if (__GNUC__*100+__GNUC_MINOR__>301) && !defined(BOOST_EXCEPTION_ENABLE_WARNINGS) -#pragma GCC system_header -#endif -#if defined(_MSC_VER) && !defined(BOOST_EXCEPTION_ENABLE_WARNINGS) -#pragma warning(push,1) -#endif + +#include #ifdef BOOST_EXCEPTION_MINI_BOOST #include namespace boost { namespace exception_detail { using std::shared_ptr; } } #else -namespace boost { template class shared_ptr; }; +namespace boost { template class shared_ptr; } namespace boost { namespace exception_detail { using boost::shared_ptr; } } #endif +#if defined(__GNUC__) && (__GNUC__*100+__GNUC_MINOR__>301) && !defined(BOOST_EXCEPTION_ENABLE_WARNINGS) +#pragma GCC system_header +#endif +#if defined(_MSC_VER) && !defined(BOOST_EXCEPTION_ENABLE_WARNINGS) +#pragma warning(push,1) +#endif + namespace boost { @@ -140,17 +143,9 @@ boost } }; -#if defined(__GNUC__) -# if (__GNUC__ == 4 && __GNUC_MINOR__ >= 1) || (__GNUC__ > 4) -# pragma GCC visibility push (default) -# endif -#endif - class exception; -#if defined(__GNUC__) -# if (__GNUC__ == 4 && __GNUC_MINOR__ >= 1) || (__GNUC__ > 4) -# pragma GCC visibility pop -# endif -#endif + class + BOOST_SYMBOL_VISIBLE + exception; namespace exception_detail @@ -216,12 +211,8 @@ boost E const & set_info( E const &, throw_line const & ); } -#if defined(__GNUC__) -# if (__GNUC__ == 4 && __GNUC_MINOR__ >= 1) || (__GNUC__ > 4) -# pragma GCC visibility push (default) -# endif -#endif class + BOOST_SYMBOL_VISIBLE exception { // @@ -293,11 +284,6 @@ boost mutable char const * throw_file_; mutable int throw_line_; }; -#if defined(__GNUC__) -# if (__GNUC__ == 4 && __GNUC_MINOR__ >= 1) || (__GNUC__ > 4) -# pragma GCC visibility pop -# endif -#endif inline exception:: @@ -338,13 +324,9 @@ boost namespace exception_detail { -#if defined(__GNUC__) -# if (__GNUC__ == 4 && __GNUC_MINOR__ >= 1) || (__GNUC__ > 4) -# pragma GCC visibility push (default) -# endif -#endif template struct + BOOST_SYMBOL_VISIBLE error_info_injector: public T, public exception @@ -359,11 +341,6 @@ boost { } }; -#if defined(__GNUC__) -# if (__GNUC__ == 4 && __GNUC_MINOR__ >= 1) || (__GNUC__ > 4) -# pragma GCC visibility pop -# endif -#endif struct large_size { char c[256]; }; large_size dispatch_boost_exception( exception const * ); @@ -411,12 +388,8 @@ boost namespace exception_detail { -#if defined(__GNUC__) -# if (__GNUC__ == 4 && __GNUC_MINOR__ >= 1) || (__GNUC__ > 4) -# pragma GCC visibility push (default) -# endif -#endif class + BOOST_SYMBOL_VISIBLE clone_base { public: @@ -429,11 +402,6 @@ boost { } }; -#if defined(__GNUC__) -# if (__GNUC__ == 4 && __GNUC_MINOR__ >= 1) || (__GNUC__ > 4) -# pragma GCC visibility pop -# endif -#endif inline void @@ -454,13 +422,9 @@ boost { } -#if defined(__GNUC__) -# if (__GNUC__ == 4 && __GNUC_MINOR__ >= 1) || (__GNUC__ > 4) -# pragma GCC visibility push (default) -# endif -#endif template class + BOOST_SYMBOL_VISIBLE clone_impl: public T, public virtual clone_base @@ -500,11 +464,6 @@ boost } }; } -#if defined(__GNUC__) -# if (__GNUC__ == 4 && __GNUC_MINOR__ >= 1) || (__GNUC__ > 4) -# pragma GCC visibility pop -# endif -#endif template inline diff --git a/include/boost/throw_exception.hpp b/include/boost/throw_exception.hpp index d45306c..a96dded 100644 --- a/include/boost/throw_exception.hpp +++ b/include/boost/throw_exception.hpp @@ -1,15 +1,6 @@ #ifndef UUID_AA15E74A856F11E08B8D93F24824019B #define UUID_AA15E74A856F11E08B8D93F24824019B -#include - -#if (__GNUC__*100+__GNUC_MINOR__>301) && !defined(BOOST_EXCEPTION_ENABLE_WARNINGS) -#pragma GCC system_header -#endif -#if defined(_MSC_VER) && !defined(BOOST_EXCEPTION_ENABLE_WARNINGS) -#pragma warning(push,1) -#endif - // MS compatible compilers support #pragma once #if defined(_MSC_VER) && (_MSC_VER >= 1020) @@ -29,6 +20,7 @@ // http://www.boost.org/libs/utility/throw_exception.html // +#include #include #include @@ -51,6 +43,13 @@ # define BOOST_THROW_EXCEPTION(x) ::boost::throw_exception(x) #endif +#if defined(__GNUC__) && (__GNUC__*100+__GNUC_MINOR__>301) && !defined(BOOST_EXCEPTION_ENABLE_WARNINGS) +#pragma GCC system_header +#endif +#if defined(_MSC_VER) && !defined(BOOST_EXCEPTION_ENABLE_WARNINGS) +#pragma warning(push,1) +#endif + namespace boost { #ifdef BOOST_NO_EXCEPTIONS diff --git a/test/Jamfile.v2 b/test/Jamfile.v2 index 39782fd..e28308d 100644 --- a/test/Jamfile.v2 +++ b/test/Jamfile.v2 @@ -7,15 +7,20 @@ import testing ; -project - : requirements - static - on - ; - run throw_exception_test.cpp ; run throw_exception_no_exceptions_test.cpp ; run throw_exception_no_integration_test.cpp ; run throw_exception_no_both_test.cpp ; compile-fail throw_exception_fail.cpp ; + +run throw_exception_test2.cpp ; +run throw_exception_test3.cpp ; +run throw_exception_test4.cpp ; + +lib lib1_throw : lib1_throw.cpp : LIB1_SOURCE=1 shared:LIB1_DYN_LINK=1 : : shared:LIB1_DYN_LINK=1 ; +lib lib2_throw : lib2_throw.cpp : LIB2_SOURCE=1 shared:LIB2_DYN_LINK=1 : : shared:LIB2_DYN_LINK=1 ; +lib lib3_throw : lib3_throw.cpp : LIB3_SOURCE=1 shared:LIB3_DYN_LINK=1 : : shared:LIB3_DYN_LINK=1 ; + +run throw_from_library_test.cpp lib1_throw lib2_throw lib3_throw : : : static : throw_from_library_static ; +run throw_from_library_test.cpp lib1_throw lib2_throw lib3_throw : : : shared : throw_from_library_shared ; diff --git a/test/lib1_throw.cpp b/test/lib1_throw.cpp new file mode 100644 index 0000000..4dadd17 --- /dev/null +++ b/test/lib1_throw.cpp @@ -0,0 +1,13 @@ +// Copyright 2018 Peter Dimov +// +// Distributed under the Boost Software License, Version 1.0. +// +// See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt + +#include "lib1_throw.hpp" + +void lib1::f() +{ + throw lib1::exception(); +} diff --git a/test/lib1_throw.hpp b/test/lib1_throw.hpp new file mode 100644 index 0000000..f3d169b --- /dev/null +++ b/test/lib1_throw.hpp @@ -0,0 +1,35 @@ +#ifndef LIB1_THROW_HPP_INCLUDED +#define LIB1_THROW_HPP_INCLUDED + +// Copyright 2018 Peter Dimov +// +// Distributed under the Boost Software License, Version 1.0. +// +// See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt + +#include +#include + +#if defined(LIB1_DYN_LINK) +# if defined(LIB1_SOURCE) +# define LIB1_DECL BOOST_SYMBOL_EXPORT +# else +# define LIB1_DECL BOOST_SYMBOL_IMPORT +# endif +#else +# define LIB1_DECL +#endif + +namespace lib1 +{ + +struct BOOST_SYMBOL_VISIBLE exception: public std::exception +{ +}; + +LIB1_DECL void f(); + +} // namespace lib1 + +#endif // #ifndef LIB1_THROW_HPP_INCLUDED diff --git a/test/lib2_throw.cpp b/test/lib2_throw.cpp new file mode 100644 index 0000000..fc1e442 --- /dev/null +++ b/test/lib2_throw.cpp @@ -0,0 +1,14 @@ +// Copyright 2018 Peter Dimov +// +// Distributed under the Boost Software License, Version 1.0. +// +// See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt + +#include "lib2_throw.hpp" +#include + +void lib2::f() +{ + boost::throw_exception( lib2::exception() ); +} diff --git a/test/lib2_throw.hpp b/test/lib2_throw.hpp new file mode 100644 index 0000000..59e8dc2 --- /dev/null +++ b/test/lib2_throw.hpp @@ -0,0 +1,35 @@ +#ifndef LIB2_THROW_HPP_INCLUDED +#define LIB2_THROW_HPP_INCLUDED + +// Copyright 2018 Peter Dimov +// +// Distributed under the Boost Software License, Version 1.0. +// +// See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt + +#include +#include + +#if defined(LIB2_DYN_LINK) +# if defined(LIB2_SOURCE) +# define LIB2_DECL BOOST_SYMBOL_EXPORT +# else +# define LIB2_DECL BOOST_SYMBOL_IMPORT +# endif +#else +# define LIB2_DECL +#endif + +namespace lib2 +{ + +struct BOOST_SYMBOL_VISIBLE exception: public std::exception +{ +}; + +LIB2_DECL void f(); + +} // namespace lib2 + +#endif // #ifndef LIB2_THROW_HPP_INCLUDED diff --git a/test/lib3_throw.cpp b/test/lib3_throw.cpp new file mode 100644 index 0000000..eb7d348 --- /dev/null +++ b/test/lib3_throw.cpp @@ -0,0 +1,14 @@ +// Copyright 2018 Peter Dimov +// +// Distributed under the Boost Software License, Version 1.0. +// +// See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt + +#include "lib3_throw.hpp" +#include + +void lib3::f() +{ + BOOST_THROW_EXCEPTION( lib3::exception() ); +} diff --git a/test/lib3_throw.hpp b/test/lib3_throw.hpp new file mode 100644 index 0000000..da280ab --- /dev/null +++ b/test/lib3_throw.hpp @@ -0,0 +1,35 @@ +#ifndef LIB3_THROW_HPP_INCLUDED +#define LIB3_THROW_HPP_INCLUDED + +// Copyright 2018 Peter Dimov +// +// Distributed under the Boost Software License, Version 1.0. +// +// See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt + +#include +#include + +#if defined(LIB3_DYN_LINK) +# if defined(LIB3_SOURCE) +# define LIB3_DECL BOOST_SYMBOL_EXPORT +# else +# define LIB3_DECL BOOST_SYMBOL_IMPORT +# endif +#else +# define LIB3_DECL +#endif + +namespace lib3 +{ + +struct BOOST_SYMBOL_VISIBLE exception: public std::exception +{ +}; + +LIB3_DECL void f(); + +} // namespace lib3 + +#endif // #ifndef LIB3_THROW_HPP_INCLUDED diff --git a/test/throw_exception_test2.cpp b/test/throw_exception_test2.cpp new file mode 100644 index 0000000..c9d35de --- /dev/null +++ b/test/throw_exception_test2.cpp @@ -0,0 +1,28 @@ +// Copyright 2018 Peter Dimov +// +// Distributed under the Boost Software License, Version 1.0. +// +// See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt + +#include +#include + +class my_exception: public std::exception +{ +}; + +class my_exception2: public std::exception, public boost::exception +{ +}; + +int main() +{ + BOOST_TEST_THROWS( boost::throw_exception( my_exception() ), boost::exception ); + BOOST_TEST_THROWS( boost::throw_exception( my_exception2() ), boost::exception ); + + BOOST_TEST_THROWS( BOOST_THROW_EXCEPTION( my_exception() ), boost::exception ); + BOOST_TEST_THROWS( BOOST_THROW_EXCEPTION( my_exception2() ), boost::exception ); + + return boost::report_errors(); +} diff --git a/test/throw_exception_test3.cpp b/test/throw_exception_test3.cpp new file mode 100644 index 0000000..7f20420 --- /dev/null +++ b/test/throw_exception_test3.cpp @@ -0,0 +1,71 @@ +// Copyright 2018 Peter Dimov +// +// Distributed under the Boost Software License, Version 1.0. +// +// See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt + +#include +#include +#include + +class my_exception: public std::exception +{ +}; + +class my_exception2: public std::exception, public boost::exception +{ +}; + +int main() +{ + try + { + boost::throw_exception( my_exception() ); + } + catch( ... ) + { + boost::exception_ptr p = boost::current_exception(); + + BOOST_TEST_THROWS( boost::rethrow_exception( p ), my_exception ); + BOOST_TEST_THROWS( boost::rethrow_exception( p ), boost::exception ); + } + + try + { + boost::throw_exception( my_exception2() ); + } + catch( ... ) + { + boost::exception_ptr p = boost::current_exception(); + + BOOST_TEST_THROWS( boost::rethrow_exception( p ), my_exception2 ); + BOOST_TEST_THROWS( boost::rethrow_exception( p ), boost::exception ); + } + + try + { + BOOST_THROW_EXCEPTION( my_exception() ); + } + catch( ... ) + { + boost::exception_ptr p = boost::current_exception(); + + BOOST_TEST_THROWS( boost::rethrow_exception( p ), my_exception ); + BOOST_TEST_THROWS( boost::rethrow_exception( p ), boost::exception ); + } + + try + { + BOOST_THROW_EXCEPTION( my_exception2() ); + } + catch( ... ) + { + boost::exception_ptr p = boost::current_exception(); + + BOOST_TEST_THROWS( boost::rethrow_exception( p ), my_exception2 ); + BOOST_TEST_THROWS( boost::rethrow_exception( p ), boost::exception ); + } + + return boost::report_errors(); +} diff --git a/test/throw_exception_test4.cpp b/test/throw_exception_test4.cpp new file mode 100644 index 0000000..5b8e303 --- /dev/null +++ b/test/throw_exception_test4.cpp @@ -0,0 +1,47 @@ +// Copyright 2018 Peter Dimov +// +// Distributed under the Boost Software License, Version 1.0. +// +// See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt + +#include +#include +#include + +class my_exception: public std::exception +{ +}; + +class my_exception2: public std::exception, public boost::exception +{ +}; + +int main() +{ + try + { + BOOST_THROW_EXCEPTION( my_exception() ); + } + catch( boost::exception const & x ) + { + int const * line = boost::get_error_info( x ); + + BOOST_TEST( line != 0 ); + BOOST_TEST_EQ( *line, 24 ); + } + + try + { + BOOST_THROW_EXCEPTION( my_exception2() ); + } + catch( boost::exception const & x ) + { + int const * line = boost::get_error_info( x ); + + BOOST_TEST( line != 0 ); + BOOST_TEST_EQ( *line, 36 ); + } + + return boost::report_errors(); +} diff --git a/test/throw_from_library_test.cpp b/test/throw_from_library_test.cpp new file mode 100644 index 0000000..22a89da --- /dev/null +++ b/test/throw_from_library_test.cpp @@ -0,0 +1,79 @@ +// Copyright 2018 Peter Dimov +// +// Distributed under the Boost Software License, Version 1.0. +// +// See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt + +#include "lib1_throw.hpp" +#include "lib2_throw.hpp" +#include "lib3_throw.hpp" +#include +#include +#include +#include + +void test_catch_by_type() +{ + BOOST_TEST_THROWS( lib1::f(), lib1::exception ); + BOOST_TEST_THROWS( lib2::f(), lib2::exception ); + BOOST_TEST_THROWS( lib3::f(), lib3::exception ); +} + +void test_catch_by_exception() +{ + BOOST_TEST_THROWS( lib2::f(), boost::exception ); + BOOST_TEST_THROWS( lib3::f(), boost::exception ); +} + +void test_exception_ptr() +{ + try + { + lib2::f(); + } + catch( ... ) + { + boost::exception_ptr p = boost::current_exception(); + + BOOST_TEST_THROWS( boost::rethrow_exception( p ), lib2::exception ); + BOOST_TEST_THROWS( boost::rethrow_exception( p ), boost::exception ); + } + + try + { + lib3::f(); + } + catch( ... ) + { + boost::exception_ptr p = boost::current_exception(); + + BOOST_TEST_THROWS( boost::rethrow_exception( p ), lib3::exception ); + BOOST_TEST_THROWS( boost::rethrow_exception( p ), boost::exception ); + } +} + +void test_throw_line() +{ + try + { + lib3::f(); + } + catch( boost::exception const & x ) + { + int const * line = boost::get_error_info( x ); + + BOOST_TEST( line != 0 ); + BOOST_TEST_EQ( *line, 13 ); + } +} + +int main() +{ + test_catch_by_type(); + test_catch_by_exception(); + test_exception_ptr(); + test_throw_line(); + + return boost::report_errors(); +}