destructor-template.cpp 1.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788
  1. // RUN: %clang_cc1 -fsyntax-only -verify -std=c++11 %s
  2. template<typename A> class s0 {
  3. template<typename B> class s1 : public s0<A> {
  4. ~s1() {}
  5. s0<A> ms0;
  6. };
  7. };
  8. struct Incomplete;
  9. template<typename T>
  10. void destroy_me(T me) {
  11. me.~T();
  12. }
  13. template void destroy_me(Incomplete*);
  14. namespace PR6152 {
  15. template<typename T> struct X { void f(); };
  16. template<typename T> struct Y { };
  17. template<typename T>
  18. void X<T>::f() {
  19. Y<T> *y;
  20. y->template Y<T>::~Y();
  21. y->template Y<T>::~Y<T>();
  22. y->~Y();
  23. }
  24. template struct X<int>;
  25. }
  26. namespace cvquals {
  27. template<typename T>
  28. void f(int *ptr) {
  29. ptr->~T();
  30. }
  31. template void f<const volatile int>(int *);
  32. }
  33. namespace PR7239 {
  34. template<class E> class A { };
  35. class B {
  36. void f() {
  37. A<int>* x;
  38. x->A<int>::~A<int>();
  39. }
  40. };
  41. }
  42. namespace PR7904 {
  43. struct Foo {};
  44. template <class T>
  45. Foo::~Foo() { // expected-error{{destructor cannot be declared as a template}}
  46. T t;
  47. T &pT = t;
  48. pT;
  49. }
  50. Foo f;
  51. }
  52. namespace rdar13140795 {
  53. template <class T> class shared_ptr {};
  54. template <typename T> struct Marshal {
  55. static int gc();
  56. };
  57. template <typename T> int Marshal<T>::gc() {
  58. shared_ptr<T> *x;
  59. x->template shared_ptr<T>::~shared_ptr();
  60. return 0;
  61. }
  62. void test() {
  63. Marshal<int>::gc();
  64. }
  65. }
  66. namespace PR16852 {
  67. template<typename T> struct S { int a; T x; };
  68. template<typename T> decltype(S<T>().~S()) f(); // expected-note {{candidate template ignored: couldn't infer template argument 'T'}}
  69. void g() { f(); } // expected-error {{no matching function for call to 'f'}}
  70. }