2 // { dg-do compile { target c++23 } }
4 // basic use cases and calling
12 void f3(this S0 const&) {}
13 void f4(this S0 const&&) {}
14 template<typename Self>
15 void d0(this Self&&) {}
16 void d1(this auto&&) {}
23 void f3(this S1 const&);
24 void f4(this S1 const&&);
25 template<typename Self>
29 // out of line definitions
30 void S1::f0(this S1) {}
31 void S1::f1(this S1&) {}
32 void S1::f2(this S1&&) {}
33 void S1::f3(this S1 const&) {}
34 void S1::f4(this S1 const&&) {}
35 template<typename Self>
36 void S1::d0(this Self&&) {}
37 void S1::d1(this auto&&) {}
42 auto f0(this S2) -> void {}
43 auto f1(this S2&) -> void {}
44 auto f2(this S2&&) -> void {}
45 auto f3(this S2 const&) -> void {}
46 auto f4(this S2 const&&) -> void {}
47 template<typename Self>
48 auto d0(this Self&&) -> void {}
50 auto d1(this auto&&) -> void {}
54 auto f0(this S3) -> void;
55 auto f1(this S3&) -> void;
56 auto f2(this S3&&) -> void;
57 auto f3(this S3 const&) -> void;
58 auto f4(this S3 const&&) -> void;
59 template<typename Self>
60 auto d0(this Self&&) -> void;
61 auto d1(this auto&&) -> void;
63 // out of line definitions
64 auto S3::f0(this S3) -> void {}
65 auto S3::f1(this S3&) -> void {}
66 auto S3::f2(this S3&&) -> void {}
67 auto S3::f3(this S3 const&) -> void {}
68 auto S3::f4(this S3 const&&) -> void {}
69 template<typename Self>
70 auto S3::d0(this Self&&) -> void {}
71 auto S3::d1(this auto&&) -> void {}
74 void call_with_qualification()
77 // by value should take any qualification (f0)
80 static_cast<T&&>(obj).f0();
81 static_cast<T const&>(obj).f0();
82 static_cast<T const&&>(obj).f0();
83 // specific qualification (f1 - f4)
89 static_cast<T&&>(obj).f2();
90 static_cast<T&&>(obj).f3();
91 static_cast<T&&>(obj).f4();
92 static_cast<T const&>(obj).f3();
93 static_cast<T const&&>(obj).f4();
94 // deduced should (obviously) take any qualification (d0, d1)
97 static_cast<T&&>(obj).d0();
98 static_cast<T const&>(obj).d0();
99 static_cast<T const&&>(obj).d0();
102 static_cast<T&&>(obj).d1();
103 static_cast<T const&>(obj).d1();
104 static_cast<T const&&>(obj).d1();
109 call_with_qualification<S0>();
110 call_with_qualification<S1>();
111 call_with_qualification<S2>();
112 call_with_qualification<S3>();