/test/SemaTemplate/resolve-single-template-id.cpp

https://bitbucket.org/larsivi/amber-clang · C++ · 82 lines · 52 code · 14 blank · 16 comment · 5 complexity · 44ff58708174aaf84be4039228610c45 MD5 · raw file

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