// Copyright 2020, 2021 Peter Dimov // Distributed under the Boost Software License, Version 1.0. // https://www.boost.org/LICENSE_1_0.txt #include #include #include #include #include template struct X { A1 a1; A2 a2; BOOST_DESCRIBE_CLASS(X, (), (a1, a2), (), ()) }; template class Y { private: B1 b1; B2 b2; BOOST_DESCRIBE_CLASS(Y, (), (), (), (b1, b2)) }; template class Z: public X { private: // error: declaration of 'typedef struct X Z::X' changes meaning of 'X' (g++) // typedef X X; typedef X XB; protected: Y y; BOOST_DESCRIBE_CLASS(Z, (XB), (), (y), ()) }; #if !defined(BOOST_DESCRIBE_CXX14) #include BOOST_PRAGMA_MESSAGE("Skipping test because C++14 is not available") int main() {} #elif defined(BOOST_MSVC) && BOOST_MSVC < 1920 BOOST_PRAGMA_MESSAGE("Skipping test because BOOST_MSVC is below 1920") int main() {} #elif defined(BOOST_MSVC) && BOOST_MSVC >= 1920 && BOOST_MSVC < 1940 && _MSVC_LANG <= 201703L BOOST_PRAGMA_MESSAGE("Skipping test because BOOST_MSVC is 192x or 193x and _MSVC_LANG is 201703L or below") int main() {} #else #include using namespace boost::mp11; int main() { using namespace boost::describe; using namespace boost::mp11; { using L = describe_members, mod_any_access>; BOOST_TEST_EQ( mp_size::value, 2 ); using D1 = mp_at_c; using D2 = mp_at_c; BOOST_TEST( D1::pointer == (&X::a1) ); BOOST_TEST_CSTR_EQ( D1::name, "a1" ); BOOST_TEST_EQ( D1::modifiers, mod_public ); BOOST_TEST( D2::pointer == (&X::a2) ); BOOST_TEST_CSTR_EQ( D2::name, "a2" ); BOOST_TEST_EQ( D2::modifiers, mod_public ); } { using L = describe_members, mod_any_access>; BOOST_TEST_EQ( mp_size::value, 2 ); using D1 = mp_at_c; using D2 = mp_at_c; // BOOST_TEST( D1::pointer == (&Y::b1) ); BOOST_TEST_CSTR_EQ( D1::name, "b1" ); BOOST_TEST_EQ( D1::modifiers, mod_private ); // BOOST_TEST( D2::pointer == (&Y::b2) ); BOOST_TEST_CSTR_EQ( D2::name, "b2" ); BOOST_TEST_EQ( D2::modifiers, mod_private ); } { using L = describe_members, mod_any_access>; BOOST_TEST_EQ( mp_size::value, 1 ); using D1 = mp_at_c; // BOOST_TEST( D1::pointer == (&Z::y) ); BOOST_TEST_CSTR_EQ( D1::name, "y" ); BOOST_TEST_EQ( D1::modifiers, mod_protected ); } { using L = describe_members, mod_any_access | mod_inherited>; BOOST_TEST_EQ( mp_size::value, 3 ); using D1 = mp_at_c; using D2 = mp_at_c; using D3 = mp_at_c; BOOST_TEST( D1::pointer == (&X::a1) ); BOOST_TEST_CSTR_EQ( D1::name, "a1" ); BOOST_TEST_EQ( D1::modifiers, mod_public | mod_inherited ); BOOST_TEST( D2::pointer == (&X::a2) ); BOOST_TEST_CSTR_EQ( D2::name, "a2" ); BOOST_TEST_EQ( D2::modifiers, mod_public | mod_inherited ); // BOOST_TEST( D3::pointer == (&Z::y) ); BOOST_TEST_CSTR_EQ( D3::name, "y" ); BOOST_TEST_EQ( D3::modifiers, mod_protected ); } return boost::report_errors(); } #endif // !defined(BOOST_DESCRIBE_CXX14)