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