PageRenderTime 49ms CodeModel.GetById 16ms RepoModel.GetById 0ms app.codeStats 0ms

/test/CXX/special/class.dtor/p5-0x.cpp

https://github.com/alex-v-odesk/clang
C++ | 105 lines | 87 code | 6 blank | 12 comment | 0 complexity | 08d475c7268c5800db62bcebb87e96ea MD5 | raw file
Possible License(s): JSON
  1. // RUN: %clang_cc1 -verify -std=c++11 %s
  2. struct NonTrivDtor {
  3. ~NonTrivDtor();
  4. };
  5. struct DeletedDtor {
  6. ~DeletedDtor() = delete; // expected-note 5 {{deleted here}}
  7. };
  8. class InaccessibleDtor {
  9. ~InaccessibleDtor() = default;
  10. };
  11. // A defaulted destructor for a class X is defined as deleted if:
  12. // -- X is a union-like class that has a variant member with a non-trivial
  13. // destructor.
  14. union A1 {
  15. A1();
  16. NonTrivDtor n; // expected-note {{destructor of 'A1' is implicitly deleted because variant field 'n' has a non-trivial destructor}}
  17. };
  18. A1 a1; // expected-error {{deleted function}}
  19. struct A2 {
  20. A2();
  21. union {
  22. NonTrivDtor n; // expected-note {{because variant field 'n' has a non-trivial destructor}}
  23. };
  24. };
  25. A2 a2; // expected-error {{deleted function}}
  26. union A3 {
  27. A3();
  28. NonTrivDtor n[3]; // expected-note {{because variant field 'n' has a non-trivial destructor}}
  29. };
  30. A3 a3; // expected-error {{deleted function}}
  31. struct A4 {
  32. A4();
  33. union {
  34. NonTrivDtor n[3]; // expected-note {{because variant field 'n' has a non-trivial destructor}}
  35. };
  36. };
  37. A4 a4; // expected-error {{deleted function}}
  38. // -- any of the non-static data members has class type M (or array thereof) and
  39. // M has a deleted or inaccessible destructor.
  40. struct B1 {
  41. B1();
  42. DeletedDtor a; // expected-note {{because field 'a' has a deleted destructor}}
  43. };
  44. B1 b1; // expected-error {{deleted function}}
  45. struct B2 {
  46. B2();
  47. InaccessibleDtor a; // expected-note {{because field 'a' has an inaccessible destructor}}
  48. };
  49. B2 b2; // expected-error {{deleted function}}
  50. struct B3 {
  51. B3();
  52. DeletedDtor a[4]; // expected-note {{because field 'a' has a deleted destructor}}
  53. };
  54. B3 b3; // expected-error {{deleted function}}
  55. struct B4 {
  56. B4();
  57. InaccessibleDtor a[4]; // expected-note {{because field 'a' has an inaccessible destructor}}
  58. };
  59. B4 b4; // expected-error {{deleted function}}
  60. union B5 {
  61. B5();
  62. // FIXME: Describe the anonymous union member better than ''.
  63. union { // expected-note {{because field '' has a deleted destructor}}
  64. DeletedDtor a; // expected-note {{because field 'a' has a deleted destructor}}
  65. };
  66. };
  67. B5 b5; // expected-error {{deleted function}}
  68. union B6 {
  69. B6();
  70. union { // expected-note {{because field '' has a deleted destructor}}
  71. InaccessibleDtor a; // expected-note {{because field 'a' has an inaccessible destructor}}
  72. };
  73. };
  74. B6 b6; // expected-error {{deleted function}}
  75. // -- any direct or virtual base class has a deleted or inaccessible destructor.
  76. struct C1 : DeletedDtor { C1(); } c1; // expected-error {{deleted function}} expected-note {{base class 'DeletedDtor' has a deleted destructor}}
  77. struct C2 : InaccessibleDtor { C2(); } c2; // expected-error {{deleted function}} expected-note {{base class 'InaccessibleDtor' has an inaccessible destructor}}
  78. struct C3 : virtual DeletedDtor { C3(); } c3; // expected-error {{deleted function}} expected-note {{base class 'DeletedDtor' has a deleted destructor}}
  79. struct C4 : virtual InaccessibleDtor { C4(); } c4; // expected-error {{deleted function}} expected-note {{base class 'InaccessibleDtor' has an inaccessible destructor}}
  80. // -- for a virtual destructor, lookup of the non-array deallocation function
  81. // results in an ambiguity or a function that is deleted or inaccessible.
  82. class D1 {
  83. void operator delete(void*);
  84. public:
  85. virtual ~D1() = default; // expected-note {{here}}
  86. } d1; // ok
  87. struct D2 : D1 { // expected-note {{virtual destructor requires an unambiguous, accessible 'operator delete'}} \
  88. // expected-error {{deleted function '~D2' cannot override a non-deleted}}
  89. // implicitly-virtual destructor
  90. } d2; // expected-error {{deleted function}}
  91. struct D3 { // expected-note {{virtual destructor requires an unambiguous, accessible 'operator delete'}}
  92. virtual ~D3() = default; // expected-note {{explicitly defaulted function was implicitly deleted here}}
  93. void operator delete(void*, double = 0.0);
  94. void operator delete(void*, char = 0);
  95. } d3; // expected-error {{deleted function}}
  96. struct D4 { // expected-note {{virtual destructor requires an unambiguous, accessible 'operator delete'}}
  97. virtual ~D4() = default; // expected-note {{implicitly deleted here}}
  98. void operator delete(void*) = delete;
  99. } d4; // expected-error {{deleted function}}