llvm-project

Форк
0
/
cxx2b-subscript.cpp 
58 строк · 2.3 Кб
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 {
7
  constexpr int operator[](int i) {
8
    return i;
9
  }
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;
12
  }
13
  constexpr int operator[]() { // cxx20-error {{overloaded 'operator[]' cannot have no parameter before C++23}}
14
    return 42;
15
  }
16
};
17

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;
21
  }
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;
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 {
39
  constexpr int operator[](auto &&...arg) { return 0; }
40
};
41

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

Использование cookies

Мы используем файлы cookie в соответствии с Политикой конфиденциальности и Политикой использования cookies.

Нажимая кнопку «Принимаю», Вы даете АО «СберТех» согласие на обработку Ваших персональных данных в целях совершенствования нашего веб-сайта и Сервиса GitVerse, а также повышения удобства их использования.

Запретить использование cookies Вы можете самостоятельно в настройках Вашего браузера.