// { dg-options "-std=gnu++20" } // { dg-do compile { target c++20 } } #include struct A { int i; long l; }; static_assert( std::is_pointer_interconvertible_with_class(&A::i) ); static_assert( ! std::is_pointer_interconvertible_with_class(&A::l) ); constexpr int A::*a = nullptr; static_assert( ! std::is_pointer_interconvertible_with_class(a) ); static_assert( noexcept( std::is_pointer_interconvertible_with_class(a) ) ); struct B { const int i; }; static_assert( std::is_pointer_interconvertible_with_class(&B::i) ); struct C { int f(); }; static_assert( ! std::is_pointer_interconvertible_with_class(&C::f) ); struct D : A { }; static_assert( std::is_pointer_interconvertible_with_class(&D::i) ); struct E : A { int j; }; // This works because the type of &E::i is int A::* and A is standard-layout: static_assert( std::is_pointer_interconvertible_with_class(&E::i) ); constexpr int E::*e = a; // This fails because E is not standard-layout: static_assert( ! std::is_pointer_interconvertible_with_class(e) ); static_assert( ! std::is_pointer_interconvertible_with_class(&E::j) );