1// Copyright (c) 2020-2024 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
14namespace testing {
15
16namespace {
17
18struct other_anon {
19 int data;
20};
21
22struct anon {
23 other_anon a;
24 const other_anon b;
25};
26
27void test_in_anon_ns_const_field() {
28 anon x{.a: {.data: 1}, .b: {.data: 2}};
29
30 auto v = boost::pfr::structure_tie(val&: 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
40void test_in_non_non_ns_const_field() {
41 anon x{.a: {.data: 1}, .b: {.data: 2}};
42
43 auto v = boost::pfr::structure_tie(val&: 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
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

source code of boost/libs/pfr/test/core/run/tie_anonymous_const_field.cpp