xref: /llvm-project/clang/test/Parser/cxx2b-subscript.cpp (revision ba15d186e5cef2620d562c6c9d9a6d570382cd0a)
1 // RUN: %clang_cc1 -fsyntax-only -verify=expected,cxx23 -std=c++23 %s
2 // RUN: %clang_cc1 -fsyntax-only -verify=expected,cxx20 -std=c++20 %s
3 
4 //cxx23-no-diagnostics
5 
6 struct S {
operator []S7   constexpr int operator[](int i) {
8     return i;
9   }
operator []S10   constexpr int operator[](int a, int b) { // cxx20-error {{overloaded 'operator[]' cannot have more than one parameter before C++23}}
11     return a + b;
12   }
operator []S13   constexpr int operator[]() { // cxx20-error {{overloaded 'operator[]' cannot have no parameter before C++23}}
14     return 42;
15   }
16 };
17 
18 struct Defaults {
operator []Defaults19   constexpr int operator[](int i = 0) { // cxx20-error {{overloaded 'operator[]' cannot have a defaulted parameter before C++23}}
20     return 0;
21   }
operator []Defaults22   constexpr int operator[](int a, int b, int c = 0) { // cxx20-error {{overloaded 'operator[]' cannot have a defaulted parameter before C++23}}\
23                                                          // cxx20-error {{cannot have more than one parameter before C++23}}
24     return 0;
25   }
26 };
27 
28 template <typename... T>
29 struct T1 {
30   constexpr auto operator[](T &&...arg); // cxx20-error {{overloaded 'operator[]' cannot have no parameter before C++23}} \
31                                            // cxx20-error {{overloaded 'operator[]' cannot have more than one parameter before C++23}}
32 };
33 
34 T1<> t10;         // cxx20-note {{requested here}}
35 T1<int, int> t12; // cxx20-note {{requested here}}
36 T1<int> t11;
37 
38 struct Variadic {
operator []Variadic39   constexpr int operator[](auto &&...arg) { return 0; }
40 };
41 
f()42 void f() {
43   S s;
44   (void)s[0];
45   (void)s[1, 2]; // cxx20-warning {{left operand of comma operator has no effect}}\
46                    // cxx20-warning {{top-level comma expression in array subscript is deprecated in C++20 and unsupported in C++23}}
47   (void)S{}[];   // cxx20-error {{expected expression}}
48 
49   (void)Defaults{}[1];
50   (void)Defaults{}[];     // cxx20-error {{expected expression}}
51   (void)Defaults{}[1, 2]; // cxx20-warning {{left operand of comma operator has no effect}}\
52                             // cxx20-warning {{top-level comma expression in array subscript is deprecated in C++20 and unsupported in C++23}}
53 
54   Variadic{}[]; // cxx20-error {{expected expression}}
55   Variadic{}[1];
56   Variadic{}[1, 2]; // cxx20-warning {{left operand of comma operator has no effect}}\
57                        // cxx20-warning {{top-level comma expression in array subscript is deprecated in C++20 and unsupported in C++23}}
58 }
59