From d2003575ce98dc5c2c1539bc3ccded0625078201 Mon Sep 17 00:00:00 2001 From: Eric Fiselier Date: Fri, 14 Oct 2016 22:47:08 +0000 Subject: [PATCH] Prevent new/delete replacement tests from being optimized away. llvm-svn: 284289 --- .../new.delete.array/delete_align_val_t_replace.pass.cpp | 16 ++++++++-------- .../new.delete.array/new_array_nothrow_replace.pass.cpp | 8 +++----- .../new.delete.array/new_array_replace.pass.cpp | 7 +++---- .../delete_align_val_t_replace.pass.cpp | 15 ++++++++------- .../new.delete.single/new_nothrow_replace.pass.cpp | 7 +++---- .../sized_delete_calls_unsized_delete.pass.cpp | 8 +++----- .../sized_delete_fsizeddeallocation.sh.cpp | 7 +++---- 7 files changed, 31 insertions(+), 37 deletions(-) diff --git a/libcxx/test/std/language.support/support.dynamic/new.delete/new.delete.array/delete_align_val_t_replace.pass.cpp b/libcxx/test/std/language.support/support.dynamic/new.delete/new.delete.array/delete_align_val_t_replace.pass.cpp index 62ffa3f..decf26e 100644 --- a/libcxx/test/std/language.support/support.dynamic/new.delete/new.delete.array/delete_align_val_t_replace.pass.cpp +++ b/libcxx/test/std/language.support/support.dynamic/new.delete/new.delete.array/delete_align_val_t_replace.pass.cpp @@ -15,10 +15,7 @@ // XFAIL: clang-3, apple-clang // None of the current GCC compilers support this. -// XFAIL: gcc-4, gcc-5, gcc-6 - -// TODO Investigate why UBSAN prevents new from calling our replacement. -// XFAIL: ubsan +// XFAIL: gcc #include #include @@ -58,28 +55,31 @@ void operator delete [] (void* p, std::align_val_t a) throw() struct alignas(OverAligned) A {}; struct alignas(std::max_align_t) B {}; +B* volatile b; // Escape the memory +A* volatile a; + int main() { reset(); { - B *x = new B[2]; + b = new B[2]; assert(0 == unsized_delete_called); assert(0 == unsized_delete_nothrow_called); assert(0 == aligned_delete_called); - delete [] x; + delete [] b; assert(1 == unsized_delete_called); assert(0 == unsized_delete_nothrow_called); assert(0 == aligned_delete_called); } reset(); { - A *x = new A[2]; + a = new A[2]; assert(0 == unsized_delete_called); assert(0 == unsized_delete_nothrow_called); assert(0 == aligned_delete_called); - delete [] x; + delete [] a; assert(0 == unsized_delete_called); assert(0 == unsized_delete_nothrow_called); assert(1 == aligned_delete_called); diff --git a/libcxx/test/std/language.support/support.dynamic/new.delete/new.delete.array/new_array_nothrow_replace.pass.cpp b/libcxx/test/std/language.support/support.dynamic/new.delete/new.delete.array/new_array_nothrow_replace.pass.cpp index 5887bb0..3b0cb27 100644 --- a/libcxx/test/std/language.support/support.dynamic/new.delete/new.delete.array/new_array_nothrow_replace.pass.cpp +++ b/libcxx/test/std/language.support/support.dynamic/new.delete/new.delete.array/new_array_nothrow_replace.pass.cpp @@ -11,10 +11,6 @@ // UNSUPPORTED: sanitizer-new-delete -// TODO Investigate why UBSAN prevents new from calling our replacement. -// XFAIL: ubsan - - #include #include #include @@ -45,9 +41,11 @@ struct A ~A() {--A_constructed;} }; +A* volatile ap; + int main() { - A* ap = new (std::nothrow) A[3]; + ap = new (std::nothrow) A[3]; assert(ap); assert(A_constructed == 3); assert(new_called); diff --git a/libcxx/test/std/language.support/support.dynamic/new.delete/new.delete.array/new_array_replace.pass.cpp b/libcxx/test/std/language.support/support.dynamic/new.delete/new.delete.array/new_array_replace.pass.cpp index 1e78ea8..2815f5b 100644 --- a/libcxx/test/std/language.support/support.dynamic/new.delete/new.delete.array/new_array_replace.pass.cpp +++ b/libcxx/test/std/language.support/support.dynamic/new.delete/new.delete.array/new_array_replace.pass.cpp @@ -11,9 +11,6 @@ // UNSUPPORTED: sanitizer-new-delete -// TODO Investigate why UBSAN prevents new from calling our replacement. -// XFAIL: ubsan - #include #include @@ -45,9 +42,11 @@ struct A ~A() {--A_constructed;} }; +A* volatile ap; + int main() { - A* ap = new A[3]; + ap = new A[3]; assert(ap); assert(A_constructed == 3); assert(new_called == 1); diff --git a/libcxx/test/std/language.support/support.dynamic/new.delete/new.delete.single/delete_align_val_t_replace.pass.cpp b/libcxx/test/std/language.support/support.dynamic/new.delete/new.delete.single/delete_align_val_t_replace.pass.cpp index 67a5191..30ce114 100644 --- a/libcxx/test/std/language.support/support.dynamic/new.delete/new.delete.single/delete_align_val_t_replace.pass.cpp +++ b/libcxx/test/std/language.support/support.dynamic/new.delete/new.delete.single/delete_align_val_t_replace.pass.cpp @@ -15,10 +15,8 @@ // XFAIL: clang-3, apple-clang // None of the current GCC compilers support this. -// XFAIL: gcc-4, gcc-5, gcc-6 +// XFAIL: gcc -// TODO Investigate why UBSAN prevents new from calling our replacement. -// XFAIL: ubsan #include #include @@ -58,28 +56,31 @@ void operator delete(void* p, std::align_val_t a) throw() struct alignas(OverAligned) A {}; struct alignas(std::max_align_t) B {}; +B* volatile bp; +A* volatile ap; + int main() { reset(); { - B *x = new B; + bp = new B; assert(0 == unsized_delete_called); assert(0 == unsized_delete_nothrow_called); assert(0 == aligned_delete_called); - delete x; + delete bp; assert(1 == unsized_delete_called); assert(0 == unsized_delete_nothrow_called); assert(0 == aligned_delete_called); } reset(); { - A *x = new A; + ap = new A; assert(0 == unsized_delete_called); assert(0 == unsized_delete_nothrow_called); assert(0 == aligned_delete_called); - delete x; + delete ap; assert(0 == unsized_delete_called); assert(0 == unsized_delete_nothrow_called); assert(1 == aligned_delete_called); diff --git a/libcxx/test/std/language.support/support.dynamic/new.delete/new.delete.single/new_nothrow_replace.pass.cpp b/libcxx/test/std/language.support/support.dynamic/new.delete/new.delete.single/new_nothrow_replace.pass.cpp index eb8319b..9df4ace 100644 --- a/libcxx/test/std/language.support/support.dynamic/new.delete/new.delete.single/new_nothrow_replace.pass.cpp +++ b/libcxx/test/std/language.support/support.dynamic/new.delete/new.delete.single/new_nothrow_replace.pass.cpp @@ -11,9 +11,6 @@ // UNSUPPORTED: sanitizer-new-delete -// TODO Investigate why UBSAN prevents nothrow new from calling our replacement. -// XFAIL: ubsan - #include #include #include @@ -44,9 +41,11 @@ struct A ~A() {A_constructed = false;} }; +A* volatile ap; + int main() { - A* ap = new (std::nothrow) A; + ap = new (std::nothrow) A; assert(ap); assert(A_constructed); assert(new_called); diff --git a/libcxx/test/std/language.support/support.dynamic/new.delete/new.delete.single/sized_delete_calls_unsized_delete.pass.cpp b/libcxx/test/std/language.support/support.dynamic/new.delete/new.delete.single/sized_delete_calls_unsized_delete.pass.cpp index f656d1c..06be2ea 100644 --- a/libcxx/test/std/language.support/support.dynamic/new.delete/new.delete.single/sized_delete_calls_unsized_delete.pass.cpp +++ b/libcxx/test/std/language.support/support.dynamic/new.delete/new.delete.single/sized_delete_calls_unsized_delete.pass.cpp @@ -13,10 +13,6 @@ // UNSUPPORTED: sanitizer-new-delete -// TODO Investigate why UBSAN prevents new from calling our replacement. -// XFAIL: ubsan - - #include #include #include @@ -37,9 +33,11 @@ void operator delete(void* p, const std::nothrow_t&) throw() std::free(p); } +int* volatile x; + int main() { - int *x = new int(42); + x = new int(42); assert(0 == delete_called); assert(0 == delete_nothrow_called); diff --git a/libcxx/test/std/language.support/support.dynamic/new.delete/new.delete.single/sized_delete_fsizeddeallocation.sh.cpp b/libcxx/test/std/language.support/support.dynamic/new.delete/new.delete.single/sized_delete_fsizeddeallocation.sh.cpp index 24d33e2..8f70427 100644 --- a/libcxx/test/std/language.support/support.dynamic/new.delete/new.delete.single/sized_delete_fsizeddeallocation.sh.cpp +++ b/libcxx/test/std/language.support/support.dynamic/new.delete/new.delete.single/sized_delete_fsizeddeallocation.sh.cpp @@ -14,9 +14,6 @@ // UNSUPPORTED: sanitizer-new-delete -// TODO Investigate why UBSAN prevents new from calling our replacement. -// XFAIL: ubsan - // NOTE: Only clang-3.7 and GCC 5.1 and greater support -fsized-deallocation. // REQUIRES: fsized-deallocation @@ -58,9 +55,11 @@ void operator delete(void* p, std::size_t) throw() std::free(p); } +int* volatile x; + int main() { - int *x = new int(42); + x = new int(42); assert(0 == sized_delete_called); assert(0 == unsized_delete_called); assert(0 == unsized_delete_nothrow_called); -- 2.7.4