blob: 471571cac584ae1db3b11222f66a699f781f09e6 [file] [log] [blame]
// { 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> );