resolve-single-template-id.cpp revision ec8058f64bbcd79bd47748f4cf8628123dd3bae6
1// RUN: %clang_cc1 -fsyntax-only -verify -std=c++0x %s
2
3namespace std {
4  class type_info {};
5}
6
7void one() { }
8void two() { } // expected-note 3{{candidate}}
9void two(int) { } // expected-note 3{{candidate}}
10
11template<class T> void twoT() { } // expected-note 5{{candidate}}
12template<class T> void twoT(int) { } // expected-note 5{{candidate}}
13
14template<class T> void oneT() { }
15template<class T, class U> void oneT(U) { }
16/*
17The 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>
27template<void (*p)(int)> struct test { };
28
29int main()
30{
31   one;         // expected-warning {{expression result unused}}
32   two;         // expected-error {{cannot resolve overloaded function 'two' from context}}
33   oneT<int>;  // expected-warning {{expression result unused}}
34   twoT<int>;  // expected-error {{cannot resolve overloaded function 'twoT' from context}}
35   typeid(oneT<int>); // expected-warning{{expression result unused}}
36  sizeof(oneT<int>); // expected-warning {{expression result unused}}
37  sizeof(twoT<int>); //expected-error {{cannot resolve overloaded function 'twoT' from context}}
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 {{cannot resolve overloaded function 'two' from context}}
43  *twoT<int>; //expected-error {{cannot resolve overloaded function 'twoT' from context}}
44  !oneT<int>;  // expected-warning {{expression result unused}}
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  0 == oneT<int>;   // expected-warning {{equality comparison result unused}}
50  0 != oneT<int>;    // expected-warning {{inequality comparison result unused}}
51  (false ? one : oneT<int>);   // expected-warning {{expression result unused}}
52  void (*p1)(int); p1 = oneT<int>;
53
54  int i = (int) (false ? (void (*)(int))twoT<int> : oneT<int>); //expected-error {{incompatible operand}}
55  (twoT<int>) == oneT<int>; //expected-error {{cannot resolve overloaded function 'twoT' from context}}
56  bool b = oneT<int>;
57  void (*p)() = oneT<int>;
58  test<oneT<int> > ti;
59  void (*u)(int) = oneT<int>;
60
61  b = (void (*)()) twoT<int>;
62
63  one < one; //expected-warning {{self-comparison always evaluates to false}} \
64             //expected-warning {{expression result unused}}
65
66  oneT<int> < oneT<int>;  //expected-warning {{self-comparison always evaluates to false}} \
67                          //expected-warning {{expression result unused}}
68
69  two < two; //expected-error {{cannot resolve overloaded function 'two' from context}}
70  twoT<int> < twoT<int>; //expected-error {{cannot resolve overloaded function 'twoT' from context}}
71  oneT<int> == 0;   // expected-warning {{equality comparison result unused}} \
72                    // expected-note {{use '=' to turn this equality comparison into an assignment}}
73
74}
75
76struct rdar9108698 {
77  template<typename> void f();
78};
79
80void test_rdar9108698(rdar9108698 x) {
81  x.f<int>; // expected-error{{a bound member function may only be called}}
82}
83