From c5198ba9925718d5e069b55cabf8ac8a7138f53d Mon Sep 17 00:00:00 2001 From: Antony Polukhin Date: Tue, 18 Sep 2018 22:10:38 +0300 Subject: [PATCH 1/2] Fix some of the visibility issues --- include/boost/test/utils/runtime/errors.hpp | 8 ++++---- include/boost/test/utils/trivial_singleton.hpp | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/include/boost/test/utils/runtime/errors.hpp b/include/boost/test/utils/runtime/errors.hpp index 5b263d21c5..056a823e33 100644 --- a/include/boost/test/utils/runtime/errors.hpp +++ b/include/boost/test/utils/runtime/errors.hpp @@ -37,7 +37,7 @@ namespace runtime { // ************** runtime::param_error ************** // // ************************************************************************** // -class param_error : public std::exception { +class BOOST_SYMBOL_VISIBLE param_error : public std::exception { public: ~param_error() BOOST_NOEXCEPT_OR_NOTHROW {} @@ -55,7 +55,7 @@ class param_error : public std::exception { //____________________________________________________________________________// -class init_error : public param_error { +class BOOST_SYMBOL_VISIBLE init_error : public param_error { protected: explicit init_error( cstring param_name ) : param_error( param_name ) {} ~init_error() BOOST_NOEXCEPT_OR_NOTHROW {} @@ -70,7 +70,7 @@ class input_error : public param_error { //____________________________________________________________________________// template -class specific_param_error : public Base { +class BOOST_SYMBOL_VISIBLE specific_param_error : public Base { protected: explicit specific_param_error( cstring param_name ) : Base( param_name ) {} ~specific_param_error() BOOST_NOEXCEPT_OR_NOTHROW {} @@ -155,7 +155,7 @@ SPECIFIC_EX_TYPE( missing_req_arg, input_error ); #undef SPECIFIC_EX_TYPE -class ambiguous_param : public specific_param_error { +class BOOST_SYMBOL_VISIBLE ambiguous_param : public specific_param_error { public: #ifndef BOOST_NO_CXX11_RVALUE_REFERENCES explicit ambiguous_param( std::vector&& amb_candidates ) diff --git a/include/boost/test/utils/trivial_singleton.hpp b/include/boost/test/utils/trivial_singleton.hpp index ac612b6393..e35f06c060 100644 --- a/include/boost/test/utils/trivial_singleton.hpp +++ b/include/boost/test/utils/trivial_singleton.hpp @@ -32,7 +32,7 @@ namespace unit_test { // ************************************************************************** // template -class singleton { +class BOOST_TEST_DECL singleton { public: static Derived& instance() { static Derived the_inst; return the_inst; } From 49cf7f33a4acb56a3dfe4096a6dc63970684b011 Mon Sep 17 00:00:00 2001 From: Antony Polukhin Date: Sat, 22 Sep 2018 21:34:11 +0300 Subject: [PATCH 2/2] Fix visibility issues by instantinating singleton::instance() only in the *.ipp files --- include/boost/test/impl/decorator.ipp | 1 + include/boost/test/impl/progress_monitor.ipp | 1 + include/boost/test/impl/results_collector.ipp | 1 + .../impl/test_framework_init_observer.ipp | 1 + include/boost/test/impl/trivial_singleton.ipp | 26 +++++++++++++++++++ include/boost/test/impl/unit_test_log.ipp | 1 + include/boost/test/impl/unit_test_monitor.ipp | 1 + .../boost/test/utils/trivial_singleton.hpp | 4 +-- 8 files changed, 34 insertions(+), 2 deletions(-) create mode 100644 include/boost/test/impl/trivial_singleton.ipp diff --git a/include/boost/test/impl/decorator.ipp b/include/boost/test/impl/decorator.ipp index 0cc562ee2f..5fd2857a66 100644 --- a/include/boost/test/impl/decorator.ipp +++ b/include/boost/test/impl/decorator.ipp @@ -18,6 +18,7 @@ // Boost.Test #include #include +#include #include #if BOOST_TEST_SUPPORT_TOKEN_ITERATOR diff --git a/include/boost/test/impl/progress_monitor.ipp b/include/boost/test/impl/progress_monitor.ipp index 34149745cf..1f6245c10b 100644 --- a/include/boost/test/impl/progress_monitor.ipp +++ b/include/boost/test/impl/progress_monitor.ipp @@ -17,6 +17,7 @@ // Boost.Test #include +#include #include #include diff --git a/include/boost/test/impl/results_collector.ipp b/include/boost/test/impl/results_collector.ipp index ea5050937b..c5236a0f0c 100644 --- a/include/boost/test/impl/results_collector.ipp +++ b/include/boost/test/impl/results_collector.ipp @@ -16,6 +16,7 @@ // Boost.Test #include #include +#include #include #include diff --git a/include/boost/test/impl/test_framework_init_observer.ipp b/include/boost/test/impl/test_framework_init_observer.ipp index 89f854aaed..9c85f25ef1 100644 --- a/include/boost/test/impl/test_framework_init_observer.ipp +++ b/include/boost/test/impl/test_framework_init_observer.ipp @@ -14,6 +14,7 @@ // Boost.Test #include +#include #include #include diff --git a/include/boost/test/impl/trivial_singleton.ipp b/include/boost/test/impl/trivial_singleton.ipp new file mode 100644 index 0000000000..b8feac3e31 --- /dev/null +++ b/include/boost/test/impl/trivial_singleton.ipp @@ -0,0 +1,26 @@ +// (C) Copyright Gennadiy Rozental 2001. +// (C) Antony Polukhin 2018. +// 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) + +// This header must be included ONLY in the *.ipp files to avoid issues with visibility. +// See the long discussion starting +// from https://github.com/boostorg/boost/pull/190#issuecomment-422197454 + +#ifndef BOOST_TEST_IMPL_TRIVIAL_SIGNLETON_IPP +#define BOOST_TEST_IMPL_TRIVIAL_SIGNLETON_IPP + +#include + +namespace boost { namespace unit_test { + +template +Derived& singleton::instance() { + static Derived the_inst; + return the_inst; +} + +}} + +#endif // BOOST_TEST_IMPL_TRIVIAL_SIGNLETON_IPP diff --git a/include/boost/test/impl/unit_test_log.ipp b/include/boost/test/impl/unit_test_log.ipp index 2a6c0f4bc6..e26a370d8d 100644 --- a/include/boost/test/impl/unit_test_log.ipp +++ b/include/boost/test/impl/unit_test_log.ipp @@ -19,6 +19,7 @@ #include #include #include +#include #include #include diff --git a/include/boost/test/impl/unit_test_monitor.ipp b/include/boost/test/impl/unit_test_monitor.ipp index cfb41a239c..fb16ff8f32 100644 --- a/include/boost/test/impl/unit_test_monitor.ipp +++ b/include/boost/test/impl/unit_test_monitor.ipp @@ -18,6 +18,7 @@ // Boost.Test #include +#include #include #include #include diff --git a/include/boost/test/utils/trivial_singleton.hpp b/include/boost/test/utils/trivial_singleton.hpp index e35f06c060..a5ca5633d2 100644 --- a/include/boost/test/utils/trivial_singleton.hpp +++ b/include/boost/test/utils/trivial_singleton.hpp @@ -32,9 +32,9 @@ namespace unit_test { // ************************************************************************** // template -class BOOST_TEST_DECL singleton { +class singleton { public: - static Derived& instance() { static Derived the_inst; return the_inst; } + BOOST_TEST_DECL static Derived& instance(); BOOST_DELETED_FUNCTION(singleton(singleton const&)) BOOST_DELETED_FUNCTION(singleton& operator=(singleton const&))