// Copyright (c) 2016 // Mikhail Maximov // // 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 "boost/config.hpp" #include "boost/core/lightweight_test.hpp" #if !defined(BOOST_NO_CXX11_TEMPLATE_ALIASES) && !defined(BOOST_NO_CXX11_HDR_UNORDERED_SET) // Test is based on reported issues: // https://svn.boost.org/trac/boost/ticket/12508 // https://svn.boost.org/trac/boost/ticket/12645 // Following hash function was not found at compile time, // because boost::variant construction from boost::recursive_variant_ // was forbidden. #include #include "boost/variant.hpp" struct hash; using int_t = int; template using basic_set_t = std::unordered_set; using value_t = boost::make_recursive_variant< int_t, basic_set_t >::type; using set_t = basic_set_t; struct hash { size_t operator()(const value_t&) const { return 0; } }; void run() { set_t s; int_t i = 3; value_t v = i; auto emplace_result = s.emplace(v); // raises error above BOOST_TEST(emplace_result.second); v = s; const set_t& check_set = boost::get(v); BOOST_TEST(!check_set.empty()); for (const auto& check_v : check_set) { BOOST_TEST(s.find(check_v) != s.end()); } for (const auto& check_v : s) { BOOST_TEST(check_set.find(check_v) != check_set.end()); } } #else // !defined(BOOST_NO_CXX11_TEMPLATE_ALIASES) && !defined(BOOST_NO_CXX11_HDR_UNORDERED_SET) // if no unordered_set and template aliases - does nothing void run() {} #endif int main() { run(); return boost::report_errors(); }