1 // Copyright (c) 2020-2021 Antony Polukhin 2 // 3 // Distributed under the Boost Software License, Version 1.0. (See accompanying 4 // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) 5 6 #include <boost/core/lightweight_test.hpp> 7 8 #include <boost/pfr/core.hpp> 9 10 #include <string> 11 #include <typeindex> 12 #include <type_traits> 13 14 namespace testing { 15 16 namespace { 17 18 struct other_anon { 19 int data; 20 }; 21 22 struct anon { 23 other_anon a; 24 const other_anon b; 25 }; 26 test_in_anon_ns_const_field()27void test_in_anon_ns_const_field() { 28 anon x{{1}, {2}}; 29 30 auto v = boost::pfr::structure_tie(x); 31 using v_type = decltype(v); 32 using expected_type = std::tuple<other_anon&, const other_anon&>; 33 34 // Use runtime check to make sure that Loophole fails to compile structure_tie 35 BOOST_TEST(typeid(expected_type) == typeid(v_type)); 36 } 37 38 } // anonymous namespace 39 test_in_non_non_ns_const_field()40void test_in_non_non_ns_const_field() { 41 anon x{{1}, {2}}; 42 43 auto v = boost::pfr::structure_tie(x); 44 using v_type = decltype(v); 45 using expected_type = std::tuple<other_anon&, const other_anon&>; 46 47 // Use runtime check to make sure that Loophole fails to compile structure_tie 48 BOOST_TEST(typeid(expected_type) == typeid(v_type)); 49 } 50 51 } // namespace testing 52 main()53int main() { 54 testing::test_in_anon_ns_const_field(); 55 testing::test_in_non_non_ns_const_field(); 56 57 return boost::report_errors(); 58 } 59 60 61