17df30e77SMitch Phillips // Ensure that operator new/delete are still replaceable.
27df30e77SMitch Phillips 
3*15689f3aSMitch Phillips // FIXME: Weak symbols aren't supported on Windows, although some code in
4*15689f3aSMitch Phillips // compiler-rt already exists to solve this problem. We should probably define
5*15689f3aSMitch Phillips // the new/delete interceptors as "weak" using those workarounds as well.
6*15689f3aSMitch Phillips // UNSUPPORTED: windows
7*15689f3aSMitch Phillips 
87df30e77SMitch Phillips // RUN: %clangxx %s -o %t -fsanitize=address -shared-libsan && not %run %t 2>&1 | FileCheck %s
97df30e77SMitch Phillips // RUN: %clangxx %s -o %t -fsanitize=address -static-libsan && not %run %t 2>&1 | FileCheck %s
107df30e77SMitch Phillips 
117df30e77SMitch Phillips #include <cstdio>
127df30e77SMitch Phillips #include <cstdlib>
137df30e77SMitch Phillips #include <new>
147df30e77SMitch Phillips 
operator new[](size_t size)157df30e77SMitch Phillips void *operator new[](size_t size) {
167df30e77SMitch Phillips   fprintf(stderr, "replaced new\n");
177df30e77SMitch Phillips   return malloc(size);
187df30e77SMitch Phillips }
197df30e77SMitch Phillips 
operator delete[](void * ptr)207df30e77SMitch Phillips void operator delete[](void *ptr) noexcept {
217df30e77SMitch Phillips   fprintf(stderr, "replaced delete\n");
227df30e77SMitch Phillips   return free(ptr);
237df30e77SMitch Phillips }
247df30e77SMitch Phillips 
main(int argc,char ** argv)257df30e77SMitch Phillips int main(int argc, char **argv) {
267df30e77SMitch Phillips   // CHECK: replaced new
277df30e77SMitch Phillips   char *x = new char[5];
287df30e77SMitch Phillips   // CHECK: replaced delete
297df30e77SMitch Phillips   delete[] x;
307df30e77SMitch Phillips   // CHECK: ERROR: AddressSanitizer
317df30e77SMitch Phillips   *x = 13;
327df30e77SMitch Phillips   return 0;
337df30e77SMitch Phillips }
34