xref: /llvm-project/clang/test/SemaCXX/cxx2b-deducing-this-constexpr.cpp (revision 69d740e5d64257524914aabd6dfead7565185d4f)
1 // RUN: %clang_cc1 -fsyntax-only -std=c++2b %s -verify
2 // RUN: %clang_cc1 -fsyntax-only -std=c++2b %s -verify -fexperimental-new-constant-interpreter
3 // expected-no-diagnostics
4 
5 template <typename Base>
6 struct Wrap : Base {
7 
8 };
9 
10 struct S {
fS11     constexpr int f(this const S&) {
12         return 42;
13     }
fS14     constexpr int f(this const S&, auto&&... args) {
15         return (args + ... + 0);
16     }
operator []S17     constexpr int operator[](this const S&) {
18         return 42;
19     }
operator []S20     constexpr int operator[](this const S& self, int i) {
21         return i + self.base;
22     }
operator ()S23     constexpr int operator()(this const S&) {
24         return 42;
25     }
operator ()S26     constexpr int operator()(this const S& self, int i) {
27         return self.base + i;
28     }
operator ==S29     constexpr bool operator==(this const S& self, auto && test) {
30         return self.base == test;
31     };
operator *S32     constexpr int operator*(this const S& self) {
33         return self.base + 22;
34     };
operator Wrap<S>S35     constexpr operator Wrap<S> (this const S& self) {
36         return Wrap<S>{self};
37     };
operator <<S38     constexpr int operator <<(this Wrap<S> self, int i) {
39         return self.base+i;
40     }
41 
42     int base = 20;
43 };
44 
test()45 consteval void test() {
46     constexpr S s;
47     static_assert(s.f() == 42);
48     static_assert(s[] == 42);
49     static_assert(s[22] == 42);
50     static_assert(s.f() == 42);
51     static_assert(s() == 42);
52     static_assert(s(22) == 42);
53     static_assert(s == 20);
54     static_assert(s != 0);
55     static_assert(*s == 42);
56     static_assert((s << 11) == 31);
57 }
58 
59 namespace GH68070 {
60 
61 constexpr auto f = [x = 3]<typename Self>(this Self&& self) {
62     return x;
63 };
64 
65 auto g = [x = 3]<typename Self>(this Self&& self) {
66     return x;
67 };
68 
test()69 int test() {
70   constexpr int a = f();
71   static_assert(a == 3);
72   return f() + g();
73 }
74 
75 }
76