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