p20.cpp 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141
  1. // RUN: %clang_cc1 -fsyntax-only -verify -fexceptions %s
  2. typedef __SIZE_TYPE__ size_t;
  3. // Overloaded operator delete with two arguments
  4. template<int I>
  5. struct X0 {
  6. X0();
  7. static void* operator new(size_t);
  8. static void operator delete(void*, size_t) {
  9. int *ip = I; // expected-error{{cannot initialize}}
  10. }
  11. };
  12. void test_X0() {
  13. new X0<1>; // expected-note{{instantiation}}
  14. }
  15. // Overloaded operator delete with one argument
  16. template<int I>
  17. struct X1 {
  18. X1();
  19. static void* operator new(size_t);
  20. static void operator delete(void*) {
  21. int *ip = I; // expected-error{{cannot initialize}}
  22. }
  23. };
  24. void test_X1() {
  25. new X1<1>; // expected-note{{instantiation}}
  26. }
  27. // Overloaded operator delete for placement new
  28. template<int I>
  29. struct X2 {
  30. X2();
  31. static void* operator new(size_t, double, double);
  32. static void* operator new(size_t, int, int);
  33. static void operator delete(void*, const int, int) {
  34. int *ip = I; // expected-error{{cannot initialize}}
  35. }
  36. static void operator delete(void*, double, double);
  37. };
  38. void test_X2() {
  39. new (0, 0) X2<1>; // expected-note{{instantiation}}
  40. }
  41. // Operator delete template for placement new
  42. struct X3 {
  43. X3();
  44. static void* operator new(size_t, double, double);
  45. template<typename T>
  46. static void operator delete(void*, T x, T) {
  47. double *dp = &x;
  48. int *ip = &x; // expected-error{{cannot initialize}}
  49. }
  50. };
  51. void test_X3() {
  52. new (0, 0) X3; // expected-note{{instantiation}}
  53. }
  54. // Operator delete template for placement new in global scope.
  55. struct X4 {
  56. X4();
  57. static void* operator new(size_t, double, double);
  58. };
  59. template<typename T>
  60. void operator delete(void*, T x, T) {
  61. double *dp = &x;
  62. int *ip = &x; // expected-error{{cannot initialize}}
  63. }
  64. void test_X4() {
  65. new (0, 0) X4; // expected-note{{instantiation}}
  66. }
  67. // Useless operator delete hides global operator delete template.
  68. struct X5 {
  69. X5();
  70. static void* operator new(size_t, double, double);
  71. void operator delete(void*, double*, double*);
  72. };
  73. void test_X5() {
  74. new (0, 0) X5; // okay, we found X5::operator delete but didn't pick it
  75. }
  76. // Operator delete template for placement new
  77. template<int I>
  78. struct X6 {
  79. X6();
  80. static void* operator new(size_t) {
  81. return I; // expected-error{{cannot initialize}}
  82. }
  83. static void operator delete(void*) {
  84. int *ip = I; // expected-error{{cannot initialize}}
  85. }
  86. };
  87. void test_X6() {
  88. new X6<3>; // expected-note 2{{instantiation}}
  89. }
  90. void *operator new(size_t, double, double, double);
  91. template<typename T>
  92. void operator delete(void*, T x, T, T) {
  93. double *dp = &x;
  94. int *ip = &x; // expected-error{{cannot initialize}}
  95. }
  96. void test_int_new() {
  97. new (1.0, 1.0, 1.0) int; // expected-note{{instantiation}}
  98. }
  99. // We don't need an operator delete if the type has a trivial
  100. // constructor, since we know that constructor cannot throw.
  101. // FIXME: Is this within the standard? Seems fishy, but both EDG+GCC do it.
  102. #if 0
  103. template<int I>
  104. struct X7 {
  105. static void* operator new(size_t);
  106. static void operator delete(void*, size_t) {
  107. int *ip = I; // okay, since it isn't instantiated.
  108. }
  109. };
  110. void test_X7() {
  111. new X7<1>;
  112. }
  113. #endif