// P0466R5 // { dg-do compile { target c++20 } } // { dg-options "" } namespace std { template constexpr bool is_pointer_interconvertible_with_class (M S::*m) noexcept { return __builtin_is_pointer_interconvertible_with_class (m); } } struct W { struct { int a; long b; }; int c; }; union X { int a; struct { short b; long c; }; long long d; }; struct D { int x; private: int y; }; union Y { int a; struct { short b; long c; D z; }; long long d; }; static_assert (std::is_pointer_interconvertible_with_class (&W::a)); static_assert (!std::is_pointer_interconvertible_with_class (&W::b)); static_assert (!std::is_pointer_interconvertible_with_class (&W::c)); static_assert (std::is_pointer_interconvertible_with_class (&X::a)); static_assert (std::is_pointer_interconvertible_with_class (&X::b)); static_assert (!std::is_pointer_interconvertible_with_class (&X::c)); static_assert (std::is_pointer_interconvertible_with_class (&X::d)); static_assert (std::is_pointer_interconvertible_with_class (&Y::a)); static_assert (!std::is_pointer_interconvertible_with_class (&Y::b)); static_assert (!std::is_pointer_interconvertible_with_class (&Y::c)); static_assert (!std::is_pointer_interconvertible_with_class (&Y::z)); static_assert (std::is_pointer_interconvertible_with_class (&Y::d));