xref: /llvm-project/clang/test/SemaCXX/cxx2b-static-operator.cpp (revision ee01a2c3996f9647f3158f5acdb921a6ede94dc1)
1*ee01a2c3STianlan Zhou // RUN: %clang_cc1 -fsyntax-only -verify -std=c++23 %s
2*ee01a2c3STianlan Zhou 
3*ee01a2c3STianlan Zhou // expected-no-diagnostics
4*ee01a2c3STianlan Zhou 
5*ee01a2c3STianlan Zhou namespace A {
6*ee01a2c3STianlan Zhou 
7*ee01a2c3STianlan Zhou struct Foo {
operator ()A::Foo8*ee01a2c3STianlan Zhou   static int operator()(int a, int b) { return a + b; }
operator []A::Foo9*ee01a2c3STianlan Zhou   static int operator[](int a, int b) { return a + b; }
10*ee01a2c3STianlan Zhou };
11*ee01a2c3STianlan Zhou 
ok()12*ee01a2c3STianlan Zhou void ok() {
13*ee01a2c3STianlan Zhou   // Should pass regardless of const / volatile
14*ee01a2c3STianlan Zhou   Foo foo;
15*ee01a2c3STianlan Zhou   foo(1, 2);
16*ee01a2c3STianlan Zhou   foo[1, 2];
17*ee01a2c3STianlan Zhou 
18*ee01a2c3STianlan Zhou   const Foo fooC;
19*ee01a2c3STianlan Zhou   fooC(1, 2);
20*ee01a2c3STianlan Zhou   fooC[1, 2];
21*ee01a2c3STianlan Zhou 
22*ee01a2c3STianlan Zhou   const Foo fooV;
23*ee01a2c3STianlan Zhou   fooV(1, 2);
24*ee01a2c3STianlan Zhou   fooV[1, 2];
25*ee01a2c3STianlan Zhou 
26*ee01a2c3STianlan Zhou   const volatile Foo fooCV;
27*ee01a2c3STianlan Zhou   fooCV(1, 2);
28*ee01a2c3STianlan Zhou   fooCV[1, 2];
29*ee01a2c3STianlan Zhou }
30*ee01a2c3STianlan Zhou 
31*ee01a2c3STianlan Zhou }
32