1 | // RUN: %clang_cc1 -fsyntax-only -verify %s |
2 | |
3 | |
4 | struct Sub0 { |
5 | int &operator[](int); |
6 | }; |
7 | |
8 | struct Sub1 { |
9 | long &operator[](long); // expected-note{{candidate function}} |
10 | }; |
11 | |
12 | struct ConvertibleToInt { |
13 | operator int(); |
14 | }; |
15 | |
16 | template<typename T, typename U, typename Result> |
17 | struct Subscript0 { |
18 | void test(T t, U u) { |
19 | Result &result = t[u]; // expected-error{{no viable overloaded operator[] for type}} |
20 | } |
21 | }; |
22 | |
23 | template struct Subscript0<int*, int, int&>; |
24 | template struct Subscript0<Sub0, int, int&>; |
25 | template struct Subscript0<Sub1, ConvertibleToInt, long&>; |
26 | template struct Subscript0<Sub1, Sub0, long&>; // expected-note{{instantiation}} |
27 | |
28 | // PR5345 |
29 | template <typename T> |
30 | struct S { |
31 | bool operator[](int n) const { return true; } |
32 | }; |
33 | |
34 | template <typename T> |
35 | void Foo(const S<int>& s, T x) { |
36 | if (s[0]) {} |
37 | } |
38 | |
39 | void Bar() { |
40 | Foo(S<int>(), 0); |
41 | } |
42 | |