[clang] Implement lifetime analysis for lifetime_capture_by(X) (#115921)
[llvm-project.git] / clang / test / Parser / cxx2b-subscript.cpp
blob478bf36272e376f5033244f270b36a146df766db
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
4 //cxx23-no-diagnostics
6 struct S {
7 constexpr int operator[](int i) {
8 return i;
10 constexpr int operator[](int a, int b) { // cxx20-error {{overloaded 'operator[]' cannot have more than one parameter before C++23}}
11 return a + b;
13 constexpr int operator[]() { // cxx20-error {{overloaded 'operator[]' cannot have no parameter before C++23}}
14 return 42;
18 struct Defaults {
19 constexpr int operator[](int i = 0) { // cxx20-error {{overloaded 'operator[]' cannot have a defaulted parameter before C++23}}
20 return 0;
22 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;
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}}
34 T1<> t10; // cxx20-note {{requested here}}
35 T1<int, int> t12; // cxx20-note {{requested here}}
36 T1<int> t11;
38 struct Variadic {
39 constexpr int operator[](auto &&...arg) { return 0; }
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}}
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}}
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}}