1*7df30e77SMitch Phillips // Ensure that operator new/delete are still replaceable.
2*7df30e77SMitch Phillips 
3*7df30e77SMitch Phillips // RUN: %clangxx %s -o %t -fsanitize=address -shared-libsan && not %run %t 2>&1 | FileCheck %s
4*7df30e77SMitch Phillips // RUN: %clangxx %s -o %t -fsanitize=address -static-libsan && not %run %t 2>&1 | FileCheck %s
5*7df30e77SMitch Phillips 
6*7df30e77SMitch Phillips #include <cstdio>
7*7df30e77SMitch Phillips #include <cstdlib>
8*7df30e77SMitch Phillips #include <new>
9*7df30e77SMitch Phillips 
10*7df30e77SMitch Phillips void *operator new[](size_t size) {
11*7df30e77SMitch Phillips   fprintf(stderr, "replaced new\n");
12*7df30e77SMitch Phillips   return malloc(size);
13*7df30e77SMitch Phillips }
14*7df30e77SMitch Phillips 
15*7df30e77SMitch Phillips void operator delete[](void *ptr) noexcept {
16*7df30e77SMitch Phillips   fprintf(stderr, "replaced delete\n");
17*7df30e77SMitch Phillips   return free(ptr);
18*7df30e77SMitch Phillips }
19*7df30e77SMitch Phillips 
20*7df30e77SMitch Phillips int main(int argc, char **argv) {
21*7df30e77SMitch Phillips   // CHECK: replaced new
22*7df30e77SMitch Phillips   char *x = new char[5];
23*7df30e77SMitch Phillips   // CHECK: replaced delete
24*7df30e77SMitch Phillips   delete[] x;
25*7df30e77SMitch Phillips   // CHECK: ERROR: AddressSanitizer
26*7df30e77SMitch Phillips   *x = 13;
27*7df30e77SMitch Phillips   return 0;
28*7df30e77SMitch Phillips }
29