2 // { dg-do run { target c++20 } }
6 template <class S, class M>
8 is_pointer_interconvertible_with_class (M S::*m) noexcept
10 return __builtin_is_pointer_interconvertible_with_class (m);
15 struct B { int b; double b2; };
16 struct C : virtual B { int c; };
19 struct F : public B, D, E {};
20 struct G : public D, E { int g; };
22 struct I : public G, H {};
23 struct J { int j1; private: int j2; public: int j3; };
24 struct K : public J {};
25 struct L : public B, D, E {};
26 struct M { D d [[no_unique_address]]; E e [[no_unique_address]]; int f; };
27 union U { int a; double b; long long c; };
28 struct V { union { int a; long b; }; int c; };
29 union X { int a; union { short b; long c; }; long long d; };
30 struct Y { void foo () {} };
31 union Z { int a; private: int b; protected: int c; public: int d; };
37 if (!std::is_pointer_interconvertible_with_class (t1))
40 if (std::is_pointer_interconvertible_with_class (t2))
43 if (!std::is_pointer_interconvertible_with_class (t3))
46 if (!std::is_pointer_interconvertible_with_class (t4))
49 if (!std::is_pointer_interconvertible_with_class (t5))
52 if (!std::is_pointer_interconvertible_with_class (t6))
55 if (!std::is_pointer_interconvertible_with_class (t7))
58 if (!std::is_pointer_interconvertible_with_class (t8))
61 if (!std::is_pointer_interconvertible_with_class (t9))
64 if (std::is_pointer_interconvertible_with_class (t10))
67 if (std::is_pointer_interconvertible_with_class (t11))
70 if (std::is_pointer_interconvertible_with_class (t12))
73 if (std::is_pointer_interconvertible_with_class (t13))
76 if (!std::is_pointer_interconvertible_with_class (t14))
79 if (!std::is_pointer_interconvertible_with_class (t15))
82 if (!std::is_pointer_interconvertible_with_class (t16))
85 if (!std::is_pointer_interconvertible_with_class (t17))
88 if (std::is_pointer_interconvertible_with_class (t18))
91 if (std::is_pointer_interconvertible_with_class (t19))
94 if (!std::is_pointer_interconvertible_with_class (t20))
97 if (!std::is_pointer_interconvertible_with_class (t21))
100 if (!std::is_pointer_interconvertible_with_class (t22))
103 if (!std::is_pointer_interconvertible_with_class (t23))
106 if (!std::is_pointer_interconvertible_with_class (t24))
109 if (std::is_pointer_interconvertible_with_class (t25))
112 if (!std::is_pointer_interconvertible_with_class (t26))
115 if (!std::is_pointer_interconvertible_with_class (t27))
118 if (!std::is_pointer_interconvertible_with_class (t28))
121 if (!std::is_pointer_interconvertible_with_class (t29))
123 auto t30 = (int B::*) nullptr;
124 if (std::is_pointer_interconvertible_with_class (t30))
127 if (std::is_pointer_interconvertible_with_class (t31))
130 if (!std::is_pointer_interconvertible_with_class (t32))
133 if (!std::is_pointer_interconvertible_with_class (t33))