diff options
Diffstat (limited to 'src/boost/libs/dll/test/cpp_mangle_test.cpp')
-rw-r--r-- | src/boost/libs/dll/test/cpp_mangle_test.cpp | 133 |
1 files changed, 133 insertions, 0 deletions
diff --git a/src/boost/libs/dll/test/cpp_mangle_test.cpp b/src/boost/libs/dll/test/cpp_mangle_test.cpp new file mode 100644 index 000000000..1b235877b --- /dev/null +++ b/src/boost/libs/dll/test/cpp_mangle_test.cpp @@ -0,0 +1,133 @@ +// Copyright 2016 Klemens Morgenstern +// +// 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) + +// For more information, see http://www.boost.org + +#include <boost/predef.h> + +#if (__cplusplus >= 201402L) || (BOOST_COMP_MSVC >= BOOST_VERSION_NUMBER(14,0,0)) + +#include "../example/b2_workarounds.hpp" + +#include <boost/dll/smart_library.hpp> +#include <boost/core/lightweight_test.hpp> +#include <boost/filesystem.hpp> +#include <boost/variant.hpp> + +#include <iostream> + + +struct override_class {}; + + +int main(int argc, char* argv[]) +{ + using namespace boost::dll; + using mangled_storage = detail::mangled_storage_impl; + + boost::dll::fs::path pt = b2_workarounds::first_lib_from_argv(argc, argv); + + std::cout << "Library: " << pt << std::endl; + library_info lib{pt}; + + mangled_storage ms(lib); + + std::cout << "Symbols: " << std::endl; + + for (auto &s : ms.get_storage()) + { + std::cout << s.demangled << std::endl; + } + + std::string v; + v = ms.get_variable<double>("some_space::variable"); + + BOOST_TEST(!v.empty()); //check if a symbols was found. + BOOST_TEST(v != "some_space::variable"); //demangle is different + + v = ms.get_variable<double>("some_space::variable_typo"); + BOOST_TEST(v.empty()); + + + v = ms.get_variable<const double>("unscoped_c_var"); + + BOOST_TEST(!v.empty()); //check if a symbols was found. + + v = ms.get_variable<int>("unscoped_var"); + + BOOST_TEST(!v.empty()); //check if a symbols was found. + + + v = ms.get_function<const int &()>("some_space::scoped_fun"); + + BOOST_TEST(!v.empty()); + BOOST_TEST(v != "some_space::scoped_fun"); + + + auto v1 = ms.get_function<void(const double)>("overloaded"); + auto v2 = ms.get_function<void(const volatile int)>("overloaded"); + BOOST_TEST(!v1.empty()); + BOOST_TEST(!v2.empty()); + BOOST_TEST(v1 != v2); + + v = ms.get_variable<int>("some_space::some_class::value"); + BOOST_TEST(!v.empty()); + BOOST_TEST(v != "some_space::some_class::value"); + + v = ms.get_function<void(const int &)>("some_space::some_class::set_value"); + + BOOST_TEST(!v.empty()); + BOOST_TEST(v != "some_space::some_class::set_value"); + + + + ms.add_alias<override_class>("some_space::some_class"); + + auto ctor1 = ms.get_constructor<override_class()>(); + BOOST_TEST(!ctor1.empty()); + + auto ctor2 = ms.get_constructor<override_class(int)>(); + BOOST_TEST(!ctor2.empty()); + + + v = ms.get_mem_fn<override_class, double(double, double)>("func"); + BOOST_TEST(!v.empty()); + + v = ms.get_mem_fn<override_class, int(int, int)>("func"); + BOOST_TEST(!v.empty()); + + + auto dtor = ms.get_destructor<override_class>(); + + BOOST_TEST(!dtor.empty()); + +// TODO: ms.get_name on Clang has space after comma `boost::variant<double, int>` +#if !(defined(BOOST_TRAVISCI_BUILD) && defined(_MSC_VER) && defined(BOOST_CLANG)) + auto var1 = ms.get_function<void(boost::variant<int, double> &)>("use_variant"); + auto var2 = ms.get_function<void(boost::variant<double, int> &)>("use_variant"); + + BOOST_TEST(!var1.empty()); + BOOST_TEST(!var2.empty()); +#endif + +#ifndef BOOST_NO_RTTI + +#if defined(_MSC_VER) // MSVC, Clang-cl, and ICC on Windows + auto vtable = ms.get_vtable<override_class>(); + BOOST_TEST(!vtable.empty()); +#else + auto ti = ms.get_type_info<override_class>(); + BOOST_TEST(!ti.empty()); +#endif + +#endif // #ifndef BOOST_NO_RTTI + + return boost::report_errors(); +} + +#else +int main() {return 0;} +#endif |