brintos

brintos / llvm-project-archived public Read only

0
0
Text · 2.2 KiB · 13676a8 Raw
69 lines · cpp
1// RUN: %clang_cc1 -fsyntax-only -verify -std=c++11 -fexceptions %s2// RUN: %clang_cc1 -fsyntax-only -verify -std=c++14 -fexceptions %s3// RUN: %clang_cc1 -fsyntax-only -verify -std=c++1z -fexceptions %s4typedef __SIZE_TYPE__ size_t;5 6namespace std { enum class align_val_t : size_t {}; }7 8struct S {9  // Placement allocation function:10  static void* operator new(size_t, size_t);11  // Usual (non-placement) deallocation function:12  static void operator delete(void*, size_t); // expected-note{{declared here}}13};14 15void testS() {16  S* p = new (0) S; // expected-error{{'new' expression with placement arguments refers to non-placement 'operator delete'}}17}18 19struct T {20  // Placement allocation function:21  static void* operator new(size_t, size_t);22  // Usual (non-placement) deallocation function:23  static void operator delete(void*);24  // Placement deallocation function:25  static void operator delete(void*, size_t);26};27 28void testT() {29  T* p = new (0) T; // ok30}31 32#if __cplusplus > 201402L33struct U {34  // Placement allocation function:35  static void* operator new(size_t, size_t, std::align_val_t);36  // Placement deallocation function:37  static void operator delete(void*, size_t, std::align_val_t); // expected-note{{declared here}}38};39 40void testU() {41  U* p = new (0, std::align_val_t(0)) U; // expected-error{{'new' expression with placement arguments refers to non-placement 'operator delete'}}42}43 44struct V {45  // Placement allocation function:46  static void* operator new(size_t, size_t, std::align_val_t);47  // Usual (non-placement) deallocation function:48  static void operator delete(void*, std::align_val_t);49  // Placement deallocation function:50  static void operator delete(void*, size_t, std::align_val_t);51};52 53void testV() {54  V* p = new (0, std::align_val_t(0)) V;55}56 57struct W {58  // Placement allocation function:59  static void* operator new(size_t, size_t, std::align_val_t);60  // Usual (non-placement) deallocation functions:61  static void operator delete(void*);62  static void operator delete(void*, size_t, std::align_val_t); // expected-note {{declared here}}63};64 65void testW() {66  W* p = new (0, std::align_val_t(0)) W; // expected-error{{'new' expression with placement arguments refers to non-placement 'operator delete'}}67}68#endif69