1 | // RUN: %clang_cc1 -fsyntax-only -verify -std=c++11 %s |
2 | |
3 | namespace std { |
4 | class type_info {}; |
5 | } |
6 | |
7 | void one() { } |
8 | void two() { } // expected-note 4{{possible target for call}} |
9 | void two(int) { } // expected-note 4{{possible target for call}} |
10 | |
11 | template<class T> void twoT() { } // expected-note 5{{possible target for call}} |
12 | template<class T> void twoT(int) { } // expected-note 5{{possible target for call}} |
13 | |
14 | template<class T> void oneT() { } |
15 | template<class T, class U> void oneT(U) { } |
16 | /* |
17 | The target can be |
18 | an object or reference being initialized (8.5, 8.5.3), |
19 | the left side of an assignment (5.17), |
20 | a parameter of a function (5.2.2), |
21 | a parameter of a user-defined operator (13.5), |
22 | the return value of a function, operator function, or conversion (6.6.3), |
23 | an explicit type conversion (5.2.3, 5.2.9, 5.4), or |
24 | a non-type template-parameter (14.3.2) |
25 | */ |
26 | //#include <typeinfo> |
27 | template<void (*p)(int)> struct test { }; |
28 | |
29 | int main() |
30 | { |
31 | one; // expected-warning {{expression result unused}} |
32 | two; // expected-error {{reference to overloaded function could not be resolved; did you mean to call it with no arguments?}} |
33 | oneT<int>; // expected-warning {{expression result unused}} |
34 | twoT<int>; // expected-error {{reference to overloaded function could not be resolved; did you mean to call it?}} |
35 | typeid(oneT<int>); // expected-warning{{expression result unused}} |
36 | sizeof(oneT<int>); // expected-error {{invalid application of 'sizeof' to a function type}} |
37 | sizeof(twoT<int>); //expected-error {{reference to overloaded function could not be resolved; did you mean to call it?}} |
38 | decltype(oneT<int>)* fun = 0; |
39 | |
40 | *one; // expected-warning {{expression result unused}} |
41 | *oneT<int>; // expected-warning {{expression result unused}} |
42 | *two; //expected-error {{reference to overloaded function could not be resolved; did you mean to call it with no arguments?}} expected-error {{indirection requires pointer operand}} |
43 | *twoT<int>; //expected-error {{reference to overloaded function could not be resolved; did you mean to call it?}} |
44 | !oneT<int>; // expected-warning {{expression result unused}} expected-warning {{address of function 'oneT<int>' will always evaluate to 'true'}} expected-note {{prefix with the address-of operator to silence this warning}} |
45 | +oneT<int>; // expected-warning {{expression result unused}} |
46 | -oneT<int>; //expected-error {{invalid argument type}} |
47 | oneT<int> == 0; // expected-warning {{equality comparison result unused}} \ |
48 | // expected-note {{use '=' to turn this equality comparison into an assignment}} \ |
49 | // expected-warning {{comparison of function 'oneT<int>' equal to a null pointer is always false}} \ |
50 | // expected-note {{prefix with the address-of operator to silence this warning}} |
51 | 0 == oneT<int>; // expected-warning {{equality comparison result unused}} \ |
52 | // expected-warning {{comparison of function 'oneT<int>' equal to a null pointer is always false}} \ |
53 | // expected-note {{prefix with the address-of operator to silence this warning}} |
54 | 0 != oneT<int>; // expected-warning {{inequality comparison result unused}} \ |
55 | // expected-warning {{comparison of function 'oneT<int>' not equal to a null pointer is always true}} \ |
56 | // expected-note {{prefix with the address-of operator to silence this warning}} |
57 | (false ? one : oneT<int>); // expected-warning {{expression result unused}} |
58 | void (*p1)(int); p1 = oneT<int>; |
59 | |
60 | int i = (int) (false ? (void (*)(int))twoT<int> : oneT<int>); //expected-error {{incompatible operand}} |
61 | (twoT<int>) == oneT<int>; //expected-error {{reference to overloaded function could not be resolved; did you mean to call it?}} {{cannot resolve overloaded function 'twoT' from context}} |
62 | bool b = oneT<int>; // expected-warning {{address of function 'oneT<int>' will always evaluate to 'true'}} expected-note {{prefix with the address-of operator to silence this warning}} |
63 | void (*p)() = oneT<int>; |
64 | test<oneT<int> > ti; |
65 | void (*u)(int) = oneT<int>; |
66 | |
67 | b = (void (*)()) twoT<int>; |
68 | |
69 | one < one; //expected-warning {{self-comparison always evaluates to false}} \ |
70 | //expected-warning {{relational comparison result unused}} |
71 | |
72 | oneT<int> < oneT<int>; //expected-warning {{self-comparison always evaluates to false}} \ |
73 | //expected-warning {{relational comparison result unused}} |
74 | |
75 | two < two; //expected-error 2 {{reference to overloaded function could not be resolved; did you mean to call it with no arguments?}} expected-error {{invalid operands to binary expression ('void' and 'void')}} |
76 | twoT<int> < twoT<int>; //expected-error {{reference to overloaded function could not be resolved; did you mean to call it?}} {{cannot resolve overloaded function 'twoT' from context}} |
77 | oneT<int> == 0; // expected-warning {{equality comparison result unused}} \ |
78 | // expected-note {{use '=' to turn this equality comparison into an assignment}} \ |
79 | // expected-warning {{comparison of function 'oneT<int>' equal to a null pointer is always false}} \ |
80 | // expected-note {{prefix with the address-of operator to silence this warning}} |
81 | |
82 | } |
83 | |
84 | struct rdar9108698 { |
85 | template<typename> void f(); // expected-note{{possible target for call}} |
86 | }; |
87 | |
88 | void test_rdar9108698(rdar9108698 x) { |
89 | x.f<int>; // expected-error{{reference to non-static member function must be called}} |
90 | } |
91 | |