blob: e5e24513dd0927377d6c223fa0be4d9b40473ac6 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
|
// P0466R5
// { dg-do compile { target c++20 } }
// { dg-options "" }
namespace std
{
template <class S, class M>
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));
|