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