|  | // RUN: %clang_cc1 -fsyntax-only -verify=expected,cxx23 -std=c++23 %s | 
|  | // RUN: %clang_cc1 -fsyntax-only -verify=expected,cxx20 -std=c++20 %s | 
|  |  | 
|  | //cxx23-no-diagnostics | 
|  |  | 
|  | struct S { | 
|  | constexpr int operator[](int i) { | 
|  | return i; | 
|  | } | 
|  | constexpr int operator[](int a, int b) { // cxx20-error {{overloaded 'operator[]' cannot have more than one parameter before C++23}} | 
|  | return a + b; | 
|  | } | 
|  | constexpr int operator[]() { // cxx20-error {{overloaded 'operator[]' cannot have no parameter before C++23}} | 
|  | return 42; | 
|  | } | 
|  | }; | 
|  |  | 
|  | struct Defaults { | 
|  | constexpr int operator[](int i = 0) { // cxx20-error {{overloaded 'operator[]' cannot have a defaulted parameter before C++23}} | 
|  | return 0; | 
|  | } | 
|  | constexpr int operator[](int a, int b, int c = 0) { // cxx20-error {{overloaded 'operator[]' cannot have a defaulted parameter before C++23}}\ | 
|  | // cxx20-error {{cannot have more than one parameter before C++23}} | 
|  | return 0; | 
|  | } | 
|  | }; | 
|  |  | 
|  | template <typename... T> | 
|  | struct T1 { | 
|  | constexpr auto operator[](T &&...arg); // cxx20-error {{overloaded 'operator[]' cannot have no parameter before C++23}} \ | 
|  | // cxx20-error {{overloaded 'operator[]' cannot have more than one parameter before C++23}} | 
|  | }; | 
|  |  | 
|  | T1<> t10;         // cxx20-note {{requested here}} | 
|  | T1<int, int> t12; // cxx20-note {{requested here}} | 
|  | T1<int> t11; | 
|  |  | 
|  | struct Variadic { | 
|  | constexpr int operator[](auto &&...arg) { return 0; } | 
|  | }; | 
|  |  | 
|  | void f() { | 
|  | S s; | 
|  | (void)s[0]; | 
|  | (void)s[1, 2]; // cxx20-warning {{left operand of comma operator has no effect}}\ | 
|  | // cxx20-warning {{top-level comma expression in array subscript is deprecated in C++20 and unsupported in C++23}} | 
|  | (void)S{}[];   // cxx20-error {{expected expression}} | 
|  |  | 
|  | (void)Defaults{}[1]; | 
|  | (void)Defaults{}[];     // cxx20-error {{expected expression}} | 
|  | (void)Defaults{}[1, 2]; // cxx20-warning {{left operand of comma operator has no effect}}\ | 
|  | // cxx20-warning {{top-level comma expression in array subscript is deprecated in C++20 and unsupported in C++23}} | 
|  |  | 
|  | Variadic{}[]; // cxx20-error {{expected expression}} | 
|  | Variadic{}[1]; | 
|  | Variadic{}[1, 2]; // cxx20-warning {{left operand of comma operator has no effect}}\ | 
|  | // cxx20-warning {{top-level comma expression in array subscript is deprecated in C++20 and unsupported in C++23}} | 
|  | } |