111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert//===----------------------------------------------------------------------===// 211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// 311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// The LLVM Compiler Infrastructure 411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// 511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// This file is dual licensed under the MIT and the University of Illinois Open 611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// Source Licenses. See LICENSE.TXT for details. 711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// 811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert//===----------------------------------------------------------------------===// 911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 1011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// test operator new [] nothrow by replacing only operator new 1111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 1211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// UNSUPPORTED: sanitizer-new-delete 1311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 1411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#include <new> 1511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#include <cstddef> 1611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#include <cstdlib> 1711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#include <cassert> 1811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#include <limits> 1911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 2011cd02dfb91661c65134cac258cf5924270e9d2Dan Albertint new_called = 0; 2111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 2211cd02dfb91661c65134cac258cf5924270e9d2Dan Albertvoid* operator new(std::size_t s) throw(std::bad_alloc) 2311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert{ 2411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert ++new_called; 2511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert return std::malloc(s); 2611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert} 2711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 2811cd02dfb91661c65134cac258cf5924270e9d2Dan Albertvoid operator delete(void* p) throw() 2911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert{ 3011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert --new_called; 3111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert std::free(p); 3211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert} 3311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 3411cd02dfb91661c65134cac258cf5924270e9d2Dan Albertvolatile int A_constructed = 0; 3511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 3611cd02dfb91661c65134cac258cf5924270e9d2Dan Albertstruct A 3711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert{ 3811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert A() {++A_constructed;} 3911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert ~A() {--A_constructed;} 4011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert}; 4111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 4211cd02dfb91661c65134cac258cf5924270e9d2Dan Albertint main() 4311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert{ 4411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert A* ap = new (std::nothrow) A[3]; 4511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert assert(ap); 4611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert assert(A_constructed == 3); 4711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert assert(new_called); 4811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert delete [] ap; 4911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert assert(A_constructed == 0); 5011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert assert(!new_called); 5111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert} 52