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