// { dg-options "-std=gnu++20" } // { dg-do compile { target c++20 } } #include #ifndef __cpp_lib_is_pointer_interconvertible # error "Feature test macro for is_pointer_interconvertible is missing in " #elif __cpp_lib_is_pointer_interconvertible < 201907L # error "Feature test macro for is_pointer_interconvertible has wrong value in " #endif static_assert( std::is_pointer_interconvertible_base_of::value == std::is_pointer_interconvertible_base_of_v ); struct B { }; static_assert( std::is_pointer_interconvertible_base_of::value == std::is_pointer_interconvertible_base_of_v ); static_assert( std::is_pointer_interconvertible_base_of_v ); static_assert( std::is_pointer_interconvertible_base_of_v ); static_assert( std::is_pointer_interconvertible_base_of_v ); static_assert( std::is_pointer_interconvertible_base_of_v ); struct D : B { int i; }; static_assert( std::is_pointer_interconvertible_base_of_v ); static_assert( std::is_pointer_interconvertible_base_of_v ); static_assert( std::is_pointer_interconvertible_base_of_v ); static_assert( std::is_pointer_interconvertible_base_of_v ); static_assert( std::is_pointer_interconvertible_base_of_v ); static_assert( ! std::is_pointer_interconvertible_base_of_v ); struct E : D { }; // E is not standard-layout static_assert( ! std::is_pointer_interconvertible_base_of_v ); struct D1 : B { }; struct D2 : B { }; struct D3 : D1, D2 { }; // B is ambiguously derived static_assert( ! std::is_pointer_interconvertible_base_of_v ); union U; static_assert( ! std::is_pointer_interconvertible_base_of_v ); static_assert( ! std::is_pointer_interconvertible_base_of_v ); struct I; // incomplete static_assert( std::is_pointer_interconvertible_base_of_v ); static_assert( std::is_pointer_interconvertible_base_of_v );