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 change this to XFAIL.
166d36efa497230e2700e59237f3577b76d6d59767Eric Fiselier// UNSUPPORTED: no-aligned-allocation
17f172df1f438f1dd40d751c5a4462ce5543969b6fEric Fiselier
18f172df1f438f1dd40d751c5a4462ce5543969b6fEric Fiselier// test operator new
19f172df1f438f1dd40d751c5a4462ce5543969b6fEric Fiselier
209acbffa370bd03e4e0ed742110e4c780b99c28acEric Fiselier#include <new>
219acbffa370bd03e4e0ed742110e4c780b99c28acEric Fiselier#include <cstddef>
229acbffa370bd03e4e0ed742110e4c780b99c28acEric Fiselier#include <cassert>
239acbffa370bd03e4e0ed742110e4c780b99c28acEric Fiselier#include <cstdint>
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
329acbffa370bd03e4e0ed742110e4c780b99c28acEric Fiseliervoid 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_throw_max_size() {
479acbffa370bd03e4e0ed742110e4c780b99c28acEric Fiselier#ifndef TEST_HAS_NO_EXCEPTIONS
489acbffa370bd03e4e0ed742110e4c780b99c28acEric Fiselier    std::set_new_handler(new_handler);
499acbffa370bd03e4e0ed742110e4c780b99c28acEric Fiselier    try
509acbffa370bd03e4e0ed742110e4c780b99c28acEric Fiselier    {
519acbffa370bd03e4e0ed742110e4c780b99c28acEric Fiselier        void* vp = operator new[] (std::numeric_limits<std::size_t>::max(),
529acbffa370bd03e4e0ed742110e4c780b99c28acEric Fiselier                                   static_cast<std::align_val_t>(32));
539acbffa370bd03e4e0ed742110e4c780b99c28acEric Fiselier        ((void)vp);
549acbffa370bd03e4e0ed742110e4c780b99c28acEric Fiselier        assert(false);
559acbffa370bd03e4e0ed742110e4c780b99c28acEric Fiselier    }
569acbffa370bd03e4e0ed742110e4c780b99c28acEric Fiselier    catch (std::bad_alloc&)
579acbffa370bd03e4e0ed742110e4c780b99c28acEric Fiselier    {
589acbffa370bd03e4e0ed742110e4c780b99c28acEric Fiselier        assert(new_handler_called == 1);
599acbffa370bd03e4e0ed742110e4c780b99c28acEric Fiselier    }
609acbffa370bd03e4e0ed742110e4c780b99c28acEric Fiselier    catch (...)
619acbffa370bd03e4e0ed742110e4c780b99c28acEric Fiselier    {
629acbffa370bd03e4e0ed742110e4c780b99c28acEric Fiselier        assert(false);
639acbffa370bd03e4e0ed742110e4c780b99c28acEric Fiselier    }
649acbffa370bd03e4e0ed742110e4c780b99c28acEric Fiselier#endif
659acbffa370bd03e4e0ed742110e4c780b99c28acEric Fiselier}
669acbffa370bd03e4e0ed742110e4c780b99c28acEric Fiselier
679acbffa370bd03e4e0ed742110e4c780b99c28acEric Fiselierint main()
689acbffa370bd03e4e0ed742110e4c780b99c28acEric Fiselier{
699acbffa370bd03e4e0ed742110e4c780b99c28acEric Fiselier    {
709acbffa370bd03e4e0ed742110e4c780b99c28acEric Fiselier        A* ap = new A[2];
719acbffa370bd03e4e0ed742110e4c780b99c28acEric Fiselier        assert(ap);
729acbffa370bd03e4e0ed742110e4c780b99c28acEric Fiselier        assert(reinterpret_cast<std::uintptr_t>(ap) % OverAligned == 0);
739acbffa370bd03e4e0ed742110e4c780b99c28acEric Fiselier        assert(A_constructed == 2);
749acbffa370bd03e4e0ed742110e4c780b99c28acEric Fiselier        delete [] ap;
759acbffa370bd03e4e0ed742110e4c780b99c28acEric Fiselier        assert(A_constructed == 0);
769acbffa370bd03e4e0ed742110e4c780b99c28acEric Fiselier    }
779acbffa370bd03e4e0ed742110e4c780b99c28acEric Fiselier    {
789acbffa370bd03e4e0ed742110e4c780b99c28acEric Fiselier        test_throw_max_size();
799acbffa370bd03e4e0ed742110e4c780b99c28acEric Fiselier    }
809acbffa370bd03e4e0ed742110e4c780b99c28acEric Fiselier}
81