1//===----------------------------------------------------------------------===// 2// 3// The LLVM Compiler Infrastructure 4// 5// This file is dual licensed under the MIT and the University of Illinois Open 6// Source Licenses. See LICENSE.TXT for details. 7// 8//===----------------------------------------------------------------------===// 9 10// UNSUPPORTED: c++98, c++03, c++11, c++14 11// UNSUPPORTED: sanitizer-new-delete 12 13// XFAIL: no-aligned-allocation 14 15// test operator new replacement 16 17#include <new> 18#include <cstddef> 19#include <cstdlib> 20#include <cstdint> 21#include <cassert> 22#include <limits> 23 24#include "test_macros.h" 25 26constexpr auto OverAligned = alignof(std::max_align_t) * 2; 27 28int A_constructed = 0; 29 30struct alignas(OverAligned) A { 31 A() { ++A_constructed;} 32 ~A() { --A_constructed;} 33}; 34 35 36int B_constructed = 0; 37 38struct alignas(std::max_align_t) B 39{ 40 std::max_align_t member; 41 B() { ++B_constructed;} 42 ~B() { --B_constructed;} 43}; 44 45int new_called = 0; 46 47alignas(OverAligned) char DummyData[OverAligned * 4]; 48 49void* operator new[](std::size_t s, std::align_val_t a) TEST_THROW_SPEC(std::bad_alloc) 50{ 51 assert(new_called == 0); // We already allocated 52 assert(s <= sizeof(DummyData)); 53 assert(static_cast<std::size_t>(a) == OverAligned); 54 ++new_called; 55 return DummyData; 56} 57 58void operator delete[](void* p, std::align_val_t) TEST_NOEXCEPT 59{ 60 assert(new_called == 1); 61 --new_called; 62 assert(p == DummyData); 63} 64 65 66int main() 67{ 68 { 69 A* ap = new A[3]; 70 assert(ap); 71 assert(A_constructed == 3); 72 assert(new_called); 73 delete [] ap; 74 assert(!A_constructed); 75 assert(!new_called); 76 } 77 { 78 B* bp = new B[3]; 79 assert(bp); 80 assert(B_constructed == 3); 81 assert(!new_called); 82 delete [] bp; 83 assert(!new_called); 84 } 85} 86