19acbffa370bd03e4e0ed742110e4c780b99c28acEric Fiselier//===----------------------------------------------------------------------===// 29acbffa370bd03e4e0ed742110e4c780b99c28acEric Fiselier// 39acbffa370bd03e4e0ed742110e4c780b99c28acEric Fiselier// The LLVM Compiler Infrastructure 49acbffa370bd03e4e0ed742110e4c780b99c28acEric Fiselier// 59acbffa370bd03e4e0ed742110e4c780b99c28acEric Fiselier// This file is dual licensed under the MIT and the University of Illinois Open 69acbffa370bd03e4e0ed742110e4c780b99c28acEric Fiselier// Source Licenses. See LICENSE.TXT for details. 79acbffa370bd03e4e0ed742110e4c780b99c28acEric Fiselier// 89acbffa370bd03e4e0ed742110e4c780b99c28acEric Fiselier//===----------------------------------------------------------------------===// 99acbffa370bd03e4e0ed742110e4c780b99c28acEric Fiselier 109acbffa370bd03e4e0ed742110e4c780b99c28acEric Fiselier// UNSUPPORTED: c++98, c++03, c++11, c++14 119acbffa370bd03e4e0ed742110e4c780b99c28acEric Fiselier 129acbffa370bd03e4e0ed742110e4c780b99c28acEric Fiselier// asan and msan will not call the new handler. 139acbffa370bd03e4e0ed742110e4c780b99c28acEric Fiselier// UNSUPPORTED: sanitizer-new-delete 149acbffa370bd03e4e0ed742110e4c780b99c28acEric Fiselier 156d36efa497230e2700e59237f3577b76d6d59767Eric Fiselier// FIXME turn this into an XFAIL 166d36efa497230e2700e59237f3577b76d6d59767Eric Fiselier// UNSUPPORTED: no-aligned-allocation 17f172df1f438f1dd40d751c5a4462ce5543969b6fEric Fiselier 18f172df1f438f1dd40d751c5a4462ce5543969b6fEric Fiselier// test operator new (nothrow) 19f172df1f438f1dd40d751c5a4462ce5543969b6fEric Fiselier 209acbffa370bd03e4e0ed742110e4c780b99c28acEric Fiselier#include <new> 219acbffa370bd03e4e0ed742110e4c780b99c28acEric Fiselier#include <cstddef> 229acbffa370bd03e4e0ed742110e4c780b99c28acEric Fiselier#include <cstdint> 239acbffa370bd03e4e0ed742110e4c780b99c28acEric Fiselier#include <cassert> 249acbffa370bd03e4e0ed742110e4c780b99c28acEric Fiselier#include <limits> 259acbffa370bd03e4e0ed742110e4c780b99c28acEric Fiselier 269acbffa370bd03e4e0ed742110e4c780b99c28acEric Fiselier#include "test_macros.h" 279acbffa370bd03e4e0ed742110e4c780b99c28acEric Fiselier 289acbffa370bd03e4e0ed742110e4c780b99c28acEric Fiselierconstexpr auto OverAligned = alignof(std::max_align_t) * 2; 299acbffa370bd03e4e0ed742110e4c780b99c28acEric Fiselier 309acbffa370bd03e4e0ed742110e4c780b99c28acEric Fiselierint new_handler_called = 0; 319acbffa370bd03e4e0ed742110e4c780b99c28acEric Fiselier 32ebb98392304940f2231e06dbad068c17291a1509Eric Fiseliervoid my_new_handler() 339acbffa370bd03e4e0ed742110e4c780b99c28acEric Fiselier{ 349acbffa370bd03e4e0ed742110e4c780b99c28acEric Fiselier ++new_handler_called; 359acbffa370bd03e4e0ed742110e4c780b99c28acEric Fiselier std::set_new_handler(0); 369acbffa370bd03e4e0ed742110e4c780b99c28acEric Fiselier} 379acbffa370bd03e4e0ed742110e4c780b99c28acEric Fiselier 389acbffa370bd03e4e0ed742110e4c780b99c28acEric Fiselierint A_constructed = 0; 399acbffa370bd03e4e0ed742110e4c780b99c28acEric Fiselier 409acbffa370bd03e4e0ed742110e4c780b99c28acEric Fiselierstruct alignas(OverAligned) A 419acbffa370bd03e4e0ed742110e4c780b99c28acEric Fiselier{ 429acbffa370bd03e4e0ed742110e4c780b99c28acEric Fiselier A() { ++A_constructed; } 439acbffa370bd03e4e0ed742110e4c780b99c28acEric Fiselier ~A() { --A_constructed; } 449acbffa370bd03e4e0ed742110e4c780b99c28acEric Fiselier}; 459acbffa370bd03e4e0ed742110e4c780b99c28acEric Fiselier 469acbffa370bd03e4e0ed742110e4c780b99c28acEric Fiseliervoid test_max_alloc() { 47ebb98392304940f2231e06dbad068c17291a1509Eric Fiselier std::set_new_handler(my_new_handler); 489acbffa370bd03e4e0ed742110e4c780b99c28acEric Fiselier auto do_test = []() { 499acbffa370bd03e4e0ed742110e4c780b99c28acEric Fiselier void* vp = operator new [](std::numeric_limits<std::size_t>::max(), 509acbffa370bd03e4e0ed742110e4c780b99c28acEric Fiselier std::align_val_t(OverAligned), 519acbffa370bd03e4e0ed742110e4c780b99c28acEric Fiselier std::nothrow); 529acbffa370bd03e4e0ed742110e4c780b99c28acEric Fiselier assert(new_handler_called == 1); 539acbffa370bd03e4e0ed742110e4c780b99c28acEric Fiselier assert(vp == 0); 549acbffa370bd03e4e0ed742110e4c780b99c28acEric Fiselier }; 559acbffa370bd03e4e0ed742110e4c780b99c28acEric Fiselier#ifndef TEST_HAS_NO_EXCEPTIONS 569acbffa370bd03e4e0ed742110e4c780b99c28acEric Fiselier try 579acbffa370bd03e4e0ed742110e4c780b99c28acEric Fiselier { 589acbffa370bd03e4e0ed742110e4c780b99c28acEric Fiselier do_test(); 599acbffa370bd03e4e0ed742110e4c780b99c28acEric Fiselier } 609acbffa370bd03e4e0ed742110e4c780b99c28acEric Fiselier catch (...) 619acbffa370bd03e4e0ed742110e4c780b99c28acEric Fiselier { 629acbffa370bd03e4e0ed742110e4c780b99c28acEric Fiselier assert(false); 639acbffa370bd03e4e0ed742110e4c780b99c28acEric Fiselier } 649acbffa370bd03e4e0ed742110e4c780b99c28acEric Fiselier#else 659acbffa370bd03e4e0ed742110e4c780b99c28acEric Fiselier do_test(); 669acbffa370bd03e4e0ed742110e4c780b99c28acEric Fiselier#endif 679acbffa370bd03e4e0ed742110e4c780b99c28acEric Fiselier} 689acbffa370bd03e4e0ed742110e4c780b99c28acEric Fiselier 699acbffa370bd03e4e0ed742110e4c780b99c28acEric Fiselierint main() 709acbffa370bd03e4e0ed742110e4c780b99c28acEric Fiselier{ 719acbffa370bd03e4e0ed742110e4c780b99c28acEric Fiselier { 729acbffa370bd03e4e0ed742110e4c780b99c28acEric Fiselier A* ap = new(std::nothrow) A[3]; 739acbffa370bd03e4e0ed742110e4c780b99c28acEric Fiselier assert(ap); 749acbffa370bd03e4e0ed742110e4c780b99c28acEric Fiselier assert(reinterpret_cast<std::uintptr_t>(ap) % OverAligned == 0); 759acbffa370bd03e4e0ed742110e4c780b99c28acEric Fiselier assert(A_constructed == 3); 769acbffa370bd03e4e0ed742110e4c780b99c28acEric Fiselier delete [] ap; 779acbffa370bd03e4e0ed742110e4c780b99c28acEric Fiselier assert(!A_constructed); 789acbffa370bd03e4e0ed742110e4c780b99c28acEric Fiselier } 799acbffa370bd03e4e0ed742110e4c780b99c28acEric Fiselier { 809acbffa370bd03e4e0ed742110e4c780b99c28acEric Fiselier test_max_alloc(); 819acbffa370bd03e4e0ed742110e4c780b99c28acEric Fiselier } 829acbffa370bd03e4e0ed742110e4c780b99c28acEric Fiselier} 83