diff --git a/CMakeLists.txt b/CMakeLists.txt
index 25d59ff..42542d5 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -18,15 +18,11 @@ target_link_libraries(boost_dll
Boost::config
Boost::core
Boost::filesystem
- Boost::function
- Boost::move
Boost::predef
Boost::smart_ptr
- Boost::spirit
Boost::system
Boost::throw_exception
Boost::type_index
- Boost::type_traits
Boost::winapi
)
diff --git a/build.jam b/build.jam
index 6c49a76..f5d93e2 100644
--- a/build.jam
+++ b/build.jam
@@ -10,15 +10,11 @@ constant boost_dependencies :
/boost/config//boost_config
/boost/core//boost_core
/boost/filesystem//boost_filesystem
- /boost/function//boost_function
- /boost/move//boost_move
/boost/predef//boost_predef
/boost/smart_ptr//boost_smart_ptr
- /boost/spirit//boost_spirit
/boost/system//boost_system
/boost/throw_exception//boost_throw_exception
/boost/type_index//boost_type_index
- /boost/type_traits//boost_type_traits
/boost/winapi//boost_winapi ;
project /boost/dll
diff --git a/doc/Jamfile.v2 b/doc/Jamfile.v2
index 013e6cd..4f0c5d3 100644
--- a/doc/Jamfile.v2
+++ b/doc/Jamfile.v2
@@ -35,15 +35,8 @@ local doxygen_params =
\"forcedlinkfs{1}=\\xmlonlyboost::dll::fs::\\1\\endxmlonly\" \\
\"forcedmacrolink{1}=\\xmlonly\\1\\endxmlonly\" "
"PREDEFINED= \\
- \"BOOST_RV_REF(T)=T&&\" \\
- \"BOOST_RV_REF(shared_library)=shared_library&&\" \\
- \"BOOST_COPY_ASSIGN_REF(shared_library)=const shared_library&\" \\
- \"BOOST_MOVABLE_BUT_NOT_COPYABLE(shared_library)= \\
- shared_library(const shared_library&) = delete; \\
- shared_library& operator=(const shared_library&) = delete; \" \\
\"BOOST_DLL_IMPORT_RESULT_TYPE=result_type\" \\
\"BOOST_DLL_MANGLED_IMPORT_RESULT_TYPE=result_type\" \\
- \"BOOST_EXPLICIT_OPERATOR_BOOL()=explicit operator bool() const noexcept;\" \\
\"BOOST_DLL_DOXYGEN\" "
;
diff --git a/doc/dependencies.qbk b/doc/dependencies.qbk
index c82db9f..3c8416d 100644
--- a/doc/dependencies.qbk
+++ b/doc/dependencies.qbk
@@ -10,12 +10,11 @@
The Boost.DLL is a header only library, but it depends on the following libraries
and they must be available in order to compile programs that use Boost.DLL:
-* Boost.System for the boost::system::error_code and boost::system::system_error classes.
+* Boost.System for the boost::system::system_error class.
* Boost.Filesystem for directory manipulation.
Refcountable part of Boost.DLL also depends on:
-* Boost.Function for creation of a callback system.
* Boost.SharedPtr for reference counting.
[endsect]
diff --git a/doc/getting_started.qbk b/doc/getting_started.qbk
index 4f900fc..27a78fc 100644
--- a/doc/getting_started.qbk
+++ b/doc/getting_started.qbk
@@ -17,7 +17,7 @@ boost::dll::shared_library lib("/test/boost/application/libtest_library.so");
Now you can easily import symbols from that library using the `get` and `get_alias` member functions:
```
int plugin_constant = lib.get("integer_variable");
-boost::function f = lib.get("function_returning_int");
+auto function_ptr = lib.get("function_returning_int");
int& i = lib.get_alias("alias_to_int_variable");
```
In case of `boost::dll::shared_library` it is safe to use imported symbols only until `boost::dll::shared_library`
diff --git a/example/tutorial2/tutorial2.cpp b/example/tutorial2/tutorial2.cpp
index ca49b49..29e6d25 100644
--- a/example/tutorial2/tutorial2.cpp
+++ b/example/tutorial2/tutorial2.cpp
@@ -19,10 +19,9 @@ int main(int argc, char* argv[]) {
/*<-*/ b2_workarounds::argv_to_path_guard guard(argc, argv); /*->*/
boost::dll::fs::path shared_library_path(argv[1]); // argv[1] contains path to directory with our plugin library
shared_library_path /= "my_plugin_aggregator";
- typedef boost::shared_ptr (pluginapi_create_t)();
- boost::function creator;
- creator = boost::dll::import_alias( // type of imported symbol must be explicitly specified
+ using pluginapi_create_t = boost::shared_ptr();
+ auto creator = boost::dll::import_alias( // type of imported symbol must be explicitly specified
shared_library_path, // path to library
"create_plugin", // symbol to import
dll::load_mode::append_decorations // do append extensions and prefixes
diff --git a/example/tutorial3/tutorial3.cpp b/example/tutorial3/tutorial3.cpp
index 7ebc682..165956f 100644
--- a/example/tutorial3/tutorial3.cpp
+++ b/example/tutorial3/tutorial3.cpp
@@ -27,9 +27,10 @@ std::size_t search_for_symbols(const std::vector& plugins)
}
// library has symbol, importing...
- typedef boost::shared_ptr (pluginapi_create_t)();
- boost::function creator
- = dll::import_alias(boost::move(lib), "create_plugin");
+ using pluginapi_create_t = boost::shared_ptr();
+ auto creator = dll::import_alias(
+ std::move(lib), "create_plugin"
+ );
std::cout << "Matching plugin name: " << creator()->name() << std::endl;
++ plugins_found;
diff --git a/example/tutorial4/load_self.cpp b/example/tutorial4/load_self.cpp
index 80528e1..7b8e83a 100644
--- a/example/tutorial4/load_self.cpp
+++ b/example/tutorial4/load_self.cpp
@@ -21,8 +21,7 @@ int main() {
dll::shared_library self(dll::program_location());
std::cout << "Call function" << std::endl;
- boost::function()> creator
- = self.get_alias()>("create_plugin");
+ auto creator = self.get_alias()>("create_plugin");
std::cout << "Computed Value: " << creator()->calculate(2, 2) << std::endl;
//<-
diff --git a/example/tutorial5/load_all.cpp b/example/tutorial5/load_all.cpp
index de0a339..4a1464c 100644
--- a/example/tutorial5/load_all.cpp
+++ b/example/tutorial5/load_all.cpp
@@ -22,7 +22,7 @@ namespace dll = boost::dll;
class plugins_collector {
// Name => plugin
- typedef boost::container::map plugins_t;
+ using plugins_t = boost::container::map;
boost::dll::fs::path plugins_directory_;
plugins_t plugins_;
@@ -32,7 +32,7 @@ class plugins_collector {
// Gets `my_plugin_api` instance using "create_plugin" or "plugin" imports,
// stores plugin with its name in the `plugins_` map.
- void insert_plugin(BOOST_RV_REF(dll::shared_library) lib);
+ void insert_plugin(dll::shared_library&& lib);
public:
plugins_collector(const boost::dll::fs::path& plugins_directory)
@@ -52,8 +52,7 @@ public:
//[plugcpp_plugins_collector_load_all
void plugins_collector::load_all() {
namespace fs = ::boost::dll::fs;
- typedef fs::path::string_type string_type;
- const string_type extension = dll::shared_library::suffix().native();
+ const auto extension = dll::shared_library::suffix().native();
// Searching a folder for files with '.so' or '.dll' extension
fs::recursive_directory_iterator endit;
@@ -67,7 +66,7 @@ void plugins_collector::load_all() {
}
/*->*/
// We found a file. Trying to load it
- boost::dll::fs::error_code error;
+ std::error_code error;
dll::shared_library plugin(it->path(), error);
if (error) {
continue;
@@ -75,17 +74,17 @@ void plugins_collector::load_all() {
std::cout << "Loaded (" << plugin.native() << "):" << it->path() << '\n';
// Gets plugin using "create_plugin" or "plugin" function
- insert_plugin(boost::move(plugin));
+ insert_plugin(std::move(plugin));
}
dll::shared_library plugin(dll::program_location());
std::cout << "Loaded self\n";
- insert_plugin(boost::move(plugin));
+ insert_plugin(std::move(plugin));
}
//]
//[plugcpp_plugins_collector_insert_plugin
-void plugins_collector::insert_plugin(BOOST_RV_REF(dll::shared_library) lib) {
+void plugins_collector::insert_plugin(dll::shared_library&& lib) {
std::string plugin_name;
if (lib.has("create_plugin")) {
plugin_name = lib.get_alias()>("create_plugin")()->name();
@@ -96,7 +95,7 @@ void plugins_collector::insert_plugin(BOOST_RV_REF(dll::shared_library) lib) {
}
if (plugins_.find(plugin_name) == plugins_.cend()) {
- plugins_[plugin_name] = boost::move(lib);
+ plugins_[plugin_name] = std::move(lib);
}
}
//]
diff --git a/example/tutorial6/on_unload_lib.cpp b/example/tutorial6/on_unload_lib.cpp
index 0b97226..bc4cbe9 100644
--- a/example/tutorial6/on_unload_lib.cpp
+++ b/example/tutorial6/on_unload_lib.cpp
@@ -10,14 +10,14 @@
//[plugcpp_on_unload
#include // for BOOST_DLL_ALIAS
-#include
+#include
#include
namespace my_namespace {
struct on_unload {
- typedef boost::function callback_t;
- typedef on_unload this_type;
+ using callback_t = std::function ;
+ using this_type = on_unload;
~on_unload() {
for (std::size_t i = 0; i < callbacks_.size(); ++i) {
diff --git a/example/tutorial6/tutorial6.cpp b/example/tutorial6/tutorial6.cpp
index 11117e2..27169c4 100644
--- a/example/tutorial6/tutorial6.cpp
+++ b/example/tutorial6/tutorial6.cpp
@@ -9,10 +9,10 @@
//[callplugcpp_tutorial6
#include
-#include
+#include
#include
-typedef boost::function callback_t;
+using callback_t = std::function ;
void print_unloaded() {
std::cout << "unloaded" << std::endl;
@@ -23,16 +23,15 @@ int main(int argc, char* argv[]) {
boost::dll::fs::path shared_library_path = /*<-*/ b2_workarounds::first_lib_from_argv(argc, argv); /*->*/ //=argv[1];
// loading library and getting a function from it
- boost::function on_unload
- = boost::dll::import_alias(
- shared_library_path, "on_unload"
- );
+ std::function on_unload = boost::dll::import_alias(
+ shared_library_path, "on_unload"
+ );
on_unload(&print_unloaded); // adding a callback
std::cout << "Before library unload." << std::endl;
// Releasing last reference to the library, so that it gets unloaded
- on_unload.clear();
+ on_unload = {};
std::cout << "After library unload." << std::endl;
}
//]
diff --git a/example/tutorial8/refcounting_api.hpp b/example/tutorial8/refcounting_api.hpp
index e9e415d..b06d06e 100644
--- a/example/tutorial8/refcounting_api.hpp
+++ b/example/tutorial8/refcounting_api.hpp
@@ -54,8 +54,8 @@ inline boost::shared_ptr bind(my_refcounting_api* plugin) {
inline boost::shared_ptr get_plugin(
boost::dll::fs::path path, const char* func_name)
{
- typedef my_refcounting_api*(func_t)();
- boost::function creator = boost::dll::import_alias(
+ using func_t = my_refcounting_api*();
+ auto creator = boost::dll::import_alias(
path,
func_name,
boost::dll::load_mode::append_decorations // will be ignored for executable
diff --git a/example/tutorial9/tutorial9.cpp b/example/tutorial9/tutorial9.cpp
index 745c171..4412cb6 100644
--- a/example/tutorial9/tutorial9.cpp
+++ b/example/tutorial9/tutorial9.cpp
@@ -10,7 +10,7 @@
//[callplugcpp_tutorial9
#include // for dll::import
#include // for dll::shared_library
-#include
+#include
#include
#include
@@ -29,15 +29,14 @@ int main() {
);
std::cout << "0.0 GetStdHandle() returned " << get_std_handle(STD_OUTPUT_HANDLE) << std::endl;
- // You may put the `get_std_handle` into boost::function<>. But boost::function can not compile with
+ // You may put the `get_std_handle` into std::function<>. But std::function may not compile with
// Signature template parameter that contains calling conventions, so you'll have to remove the calling convention.
- boost::function get_std_handle2 = get_std_handle;
+ std::function get_std_handle2 = get_std_handle;
std::cout << "0.1 GetStdHandle() returned " << get_std_handle2(STD_OUTPUT_HANDLE) << std::endl;
/*<-*/
#endif /*->*/
- // OPTION #1, does not require C++11. But without C++11 dll::import<> can not handle calling conventions,
- // so you'll need to hand write the import.
+ // OPTION #1, hand write the import.
dll::shared_library lib("Kernel32.dll", dll::load_mode::search_system_folders);
GetStdHandle_t& func = lib.get("GetStdHandle");
diff --git a/include/boost/dll/alias.hpp b/include/boost/dll/alias.hpp
index 0eac7ce..711fbe1 100644
--- a/include/boost/dll/alias.hpp
+++ b/include/boost/dll/alias.hpp
@@ -44,7 +44,7 @@ namespace boost { namespace dll {
#define BOOST_DLL_SELECTANY __declspec(selectany)
#define BOOST_DLL_SECTION(SectionName, Permissions) \
- static_assert( \
+ static_assert( \
sizeof(#SectionName) < 10, \
"Some platforms require section names to be at most 8 bytes" \
); \
@@ -83,7 +83,7 @@ namespace boost { namespace dll {
* \param Permissions Can be "read" or "write" (without quotes!).
*/
#define BOOST_DLL_SECTION(SectionName, Permissions) \
- static_assert( \
+ static_assert( \
sizeof(#SectionName) < 10, \
"Some platforms require section names to be at most 8 bytes" \
); \
@@ -92,7 +92,7 @@ namespace boost { namespace dll {
#else // #if !BOOST_OS_MACOS && !BOOST_OS_IOS
#define BOOST_DLL_SECTION(SectionName, Permissions) \
- static_assert( \
+ static_assert( \
sizeof(#SectionName) < 10, \
"Some platforms require section names to be at most 8 bytes" \
); \
@@ -184,7 +184,7 @@ namespace boost { namespace dll {
#else
// Note: we can not use `aggressive_ptr_cast` here, because in that case GCC applies
// different permissions to the section and it causes Segmentation fault.
-// Note: we can not use `boost::addressof()` here, because in that case GCC
+// Note: we can not use `std::addressof()` here, because in that case GCC
// may optimize away the FunctionOrVar instance and we'll get a pointer to unexisting symbol.
/*!
* \brief Same as \forcedmacrolink{BOOST_DLL_ALIAS} but puts alias name into the user specified section.
diff --git a/include/boost/dll/config.hpp b/include/boost/dll/config.hpp
index 65599b8..a2c2248 100644
--- a/include/boost/dll/config.hpp
+++ b/include/boost/dll/config.hpp
@@ -16,7 +16,7 @@
#endif
#ifdef BOOST_DLL_DOXYGEN
-/// Define this macro to make Boost.DLL use C++17's std::filesystem::path, std::system_error and std::error_code.
+/// Define this macro to make Boost.DLL use C++17's std::filesystem::path and std::system_error.
#define BOOST_DLL_USE_STD_FS BOOST_DLL_USE_STD_FS
/// This namespace contains aliases to the Boost or C++17 classes. Aliases are configured using BOOST_DLL_USE_STD_FS macro.
@@ -38,19 +38,17 @@ using system_error = std::conditional_t
+
#include
namespace boost { namespace dll { namespace fs {
using namespace std::filesystem;
-
using std::error_code;
using std::system_error;
-using std::make_error_code;
-using std::errc;
-using std::system_category;
}}}
@@ -58,18 +56,14 @@ using std::system_category;
#include
#include
-#include
#include
+#include
namespace boost { namespace dll { namespace fs {
using namespace boost::filesystem;
-
using boost::system::error_code;
using boost::system::system_error;
-using boost::system::errc::make_error_code;
-namespace errc = boost::system::errc;
-using boost::system::system_category;
}}}
diff --git a/include/boost/dll/detail/aggressive_ptr_cast.hpp b/include/boost/dll/detail/aggressive_ptr_cast.hpp
index b9efc29..5734130 100644
--- a/include/boost/dll/detail/aggressive_ptr_cast.hpp
+++ b/include/boost/dll/detail/aggressive_ptr_cast.hpp
@@ -13,15 +13,9 @@
# pragma once
#endif
-#include
-#include
-#include
-#include
-#include
-#include
-#include
-#include
#include // std::memcpy
+#include
+#include
#if defined(__GNUC__) && defined(__GNUC_MINOR__) && (__GNUC__ * 100 + __GNUC_MINOR__ > 301)
# pragma GCC system_header
@@ -32,17 +26,17 @@ namespace boost { namespace dll { namespace detail {
// GCC warns when reinterpret_cast between function pointer and object pointer occur.
// This method suppress the warnings and ensures that such casts are safe.
template
-BOOST_FORCEINLINE typename boost::disable_if_c::value || boost::is_reference::value || boost::is_member_pointer::value, To>::type
- aggressive_ptr_cast(From v) BOOST_NOEXCEPT
+BOOST_FORCEINLINE typename std::enable_if::value && !std::is_reference::value && !std::is_member_pointer::value, To>::type
+ aggressive_ptr_cast(From v) noexcept
{
static_assert(
- boost::is_pointer::value && boost::is_pointer::value,
+ std::is_pointer::value && std::is_pointer::value,
"`agressive_ptr_cast` function must be used only for pointer casting."
);
static_assert(
- boost::is_void< typename boost::remove_pointer::type >::value
- || boost::is_void< typename boost::remove_pointer::type >::value,
+ std::is_void< typename std::remove_pointer::type >::value
+ || std::is_void< typename std::remove_pointer::type >::value,
"`agressive_ptr_cast` function must be used only for casting to or from void pointers."
);
@@ -60,25 +54,25 @@ BOOST_FORCEINLINE typename boost::disable_if_c::val
#endif
template
-BOOST_FORCEINLINE typename boost::disable_if_c::value || boost::is_member_pointer::value, To>::type
- aggressive_ptr_cast(From v) BOOST_NOEXCEPT
+BOOST_FORCEINLINE typename std::enable_if::value && !std::is_member_pointer::value, To>::type
+ aggressive_ptr_cast(From v) noexcept
{
static_assert(
- boost::is_pointer::value,
+ std::is_pointer::value,
"`agressive_ptr_cast` function must be used only for pointer casting."
);
static_assert(
- boost::is_void< typename boost::remove_pointer::type >::value,
+ std::is_void< typename std::remove_pointer::type >::value,
"`agressive_ptr_cast` function must be used only for casting to or from void pointers."
);
static_assert(
- sizeof(v) == sizeof(typename boost::remove_reference::type*),
+ sizeof(v) == sizeof(typename std::remove_reference::type*),
"Pointer to function and pointer to object differ in size on your platform."
);
return static_cast(
- **reinterpret_cast::type**>(
+ **reinterpret_cast::type**>(
v
)
);
@@ -89,16 +83,16 @@ BOOST_FORCEINLINE typename boost::disable_if_c::value |
#endif
template
-BOOST_FORCEINLINE typename boost::disable_if_c::value || boost::is_member_pointer::value, To>::type
- aggressive_ptr_cast(From v) BOOST_NOEXCEPT
+BOOST_FORCEINLINE typename std::enable_if::value && !std::is_member_pointer::value, To>::type
+ aggressive_ptr_cast(From v) noexcept
{
static_assert(
- boost::is_pointer::value,
+ std::is_pointer::value,
"`agressive_ptr_cast` function must be used only for pointer casting."
);
static_assert(
- boost::is_void< typename boost::remove_pointer::type >::value,
+ std::is_void< typename std::remove_pointer::type >::value,
"`agressive_ptr_cast` function must be used only for casting to or from void pointers."
);
@@ -108,16 +102,16 @@ BOOST_FORCEINLINE typename boost::disable_if_c::va
}
template
-BOOST_FORCEINLINE typename boost::disable_if_c::value || !boost::is_member_pointer::value, To>::type
- aggressive_ptr_cast(From /* v */) BOOST_NOEXCEPT
+BOOST_FORCEINLINE typename std::enable_if::value && std::is_member_pointer::value, To>::type
+ aggressive_ptr_cast(From /* v */) noexcept
{
static_assert(
- boost::is_pointer::value,
+ std::is_pointer::value,
"`agressive_ptr_cast` function must be used only for pointer casting."
);
static_assert(
- boost::is_void< typename boost::remove_pointer::type >::value,
+ std::is_void< typename std::remove_pointer::type >::value,
"`agressive_ptr_cast` function must be used only for casting to or from void pointers."
);
diff --git a/include/boost/dll/detail/ctor_dtor.hpp b/include/boost/dll/detail/ctor_dtor.hpp
index 2722055..8b077af 100644
--- a/include/boost/dll/detail/ctor_dtor.hpp
+++ b/include/boost/dll/detail/ctor_dtor.hpp
@@ -130,7 +130,7 @@ template
destructor load_dtor(Lib & lib, const mangled_storage_impl::dtor_sym & dt) {
typedef typename destructor::standard_t standard_t;
//@apolukhin That does NOT work this way with MSVC-14 x32 via memcpy. The x64 is different.
- //standard_t dtor = &lib.template get< typename boost::remove_pointer::type >(dt);
+ //standard_t dtor = &lib.template get< typename std::remove_pointer::type >(dt);
void * buf = &lib.template get(dt);
standard_t dtor;
std::memcpy(&dtor, &buf, sizeof(dtor));
@@ -175,11 +175,11 @@ destructor load_dtor(Lib & lib, const mangled_storage_impl::dtor_sym & dt
//see here for the abi http://mentorembedded.github.io/cxx-abi/abi.html#mangling-special-ctor-dtor
if (!dt.D1.empty()) {
- s = &lib.template get< typename boost::remove_pointer::type >(dt.D1);
+ s = &lib.template get< typename std::remove_pointer::type >(dt.D1);
}
if (!dt.D0.empty()) {
- d = &lib.template get< typename boost::remove_pointer::type >(dt.D0);
+ d = &lib.template get< typename std::remove_pointer::type >(dt.D0);
}
return destructor(s,d);
diff --git a/include/boost/dll/detail/demangling/itanium.hpp b/include/boost/dll/detail/demangling/itanium.hpp
index 236477f..8fe148b 100644
--- a/include/boost/dll/detail/demangling/itanium.hpp
+++ b/include/boost/dll/detail/demangling/itanium.hpp
@@ -8,19 +8,15 @@
#define BOOST_DLL_DETAIL_DEMANGLING_ITANIUM_HPP_
#include
-#include
+
#include
-#include
-#include
-#include
-#include
-#include
+#include
+#include
namespace boost { namespace dll { namespace detail {
-
class mangled_storage_impl : public mangled_storage_base
{
template
@@ -185,22 +181,22 @@ namespace parser
}
};
- inline std::string const_rule_impl(true_type ) {return " const";}
- inline std::string const_rule_impl(false_type) {return "";}
+ inline std::string const_rule_impl(std::true_type ) {return " const";}
+ inline std::string const_rule_impl(std::false_type) {return "";}
template
- std::string const_rule() {using t = is_const::type>; return const_rule_impl(t());}
+ std::string const_rule() {using t = std::is_const::type>; return const_rule_impl(t());}
- inline std::string volatile_rule_impl(true_type ) {return " volatile";}
- inline std::string volatile_rule_impl(false_type) {return "";}
+ inline std::string volatile_rule_impl(std::true_type ) {return " volatile";}
+ inline std::string volatile_rule_impl(std::false_type) {return "";}
template
- std::string volatile_rule() {using t = is_volatile::type>; return volatile_rule_impl(t());}
+ std::string volatile_rule() {using t = std::is_volatile::type>; return volatile_rule_impl(t());}
- inline std::string reference_rule_impl(false_type, false_type) {return "";}
- inline std::string reference_rule_impl(true_type, false_type) {return "&" ;}
- inline std::string reference_rule_impl(false_type, true_type ) {return "&&";}
+ inline std::string reference_rule_impl(std::false_type, std::false_type) {return "";}
+ inline std::string reference_rule_impl(std::true_type, std::false_type) {return "&" ;}
+ inline std::string reference_rule_impl(std::false_type, std::true_type ) {return "&&";}
template
- std::string reference_rule() {using t_l = is_lvalue_reference; using t_r = is_rvalue_reference; return reference_rule_impl(t_l(), t_r());}
+ std::string reference_rule() {using t_l = std::is_lvalue_reference; using t_r = std::is_rvalue_reference; return reference_rule_impl(t_l(), t_r());}
//it takes a string, because it may be overloaded.
template
diff --git a/include/boost/dll/detail/demangling/mangled_storage_base.hpp b/include/boost/dll/detail/demangling/mangled_storage_base.hpp
index d1241a0..32d0a7c 100644
--- a/include/boost/dll/detail/demangling/mangled_storage_base.hpp
+++ b/include/boost/dll/detail/demangling/mangled_storage_base.hpp
@@ -10,10 +10,12 @@
#include
#include
#include