xref: /llvm-project/clang/test/Parser/cxx2b-subscript.cpp (revision ba15d186e5cef2620d562c6c9d9a6d570382cd0a)
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 Jabot void 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