new_align_val_t.pass.cpp revision f172df1f438f1dd40d751c5a4462ce5543969b6f
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
15f172df1f438f1dd40d751c5a4462ce5543969b6fEric Fiselier// XFAIL: no-aligned-allocation
16f172df1f438f1dd40d751c5a4462ce5543969b6fEric Fiselier
17f172df1f438f1dd40d751c5a4462ce5543969b6fEric Fiselier// test operator new
18f172df1f438f1dd40d751c5a4462ce5543969b6fEric Fiselier
199acbffa370bd03e4e0ed742110e4c780b99c28acEric Fiselier#include <new>
209acbffa370bd03e4e0ed742110e4c780b99c28acEric Fiselier#include <cstddef>
219acbffa370bd03e4e0ed742110e4c780b99c28acEric Fiselier#include <cassert>
229acbffa370bd03e4e0ed742110e4c780b99c28acEric Fiselier#include <cstdint>
239acbffa370bd03e4e0ed742110e4c780b99c28acEric Fiselier#include <limits>
249acbffa370bd03e4e0ed742110e4c780b99c28acEric Fiselier
259acbffa370bd03e4e0ed742110e4c780b99c28acEric Fiselier#include "test_macros.h"
269acbffa370bd03e4e0ed742110e4c780b99c28acEric Fiselier
279acbffa370bd03e4e0ed742110e4c780b99c28acEric Fiselierconstexpr auto OverAligned = alignof(std::max_align_t) * 2;
289acbffa370bd03e4e0ed742110e4c780b99c28acEric Fiselier
299acbffa370bd03e4e0ed742110e4c780b99c28acEric Fiselierint new_handler_called = 0;
309acbffa370bd03e4e0ed742110e4c780b99c28acEric Fiselier
319acbffa370bd03e4e0ed742110e4c780b99c28acEric Fiseliervoid new_handler()
329acbffa370bd03e4e0ed742110e4c780b99c28acEric Fiselier{
339acbffa370bd03e4e0ed742110e4c780b99c28acEric Fiselier    ++new_handler_called;
349acbffa370bd03e4e0ed742110e4c780b99c28acEric Fiselier    std::set_new_handler(0);
359acbffa370bd03e4e0ed742110e4c780b99c28acEric Fiselier}
369acbffa370bd03e4e0ed742110e4c780b99c28acEric Fiselier
379acbffa370bd03e4e0ed742110e4c780b99c28acEric Fiselierint A_constructed = 0;
389acbffa370bd03e4e0ed742110e4c780b99c28acEric Fiselier
399acbffa370bd03e4e0ed742110e4c780b99c28acEric Fiselierstruct alignas(OverAligned) A
409acbffa370bd03e4e0ed742110e4c780b99c28acEric Fiselier{
419acbffa370bd03e4e0ed742110e4c780b99c28acEric Fiselier    A() { ++A_constructed;}
429acbffa370bd03e4e0ed742110e4c780b99c28acEric Fiselier    ~A() { --A_constructed;}
439acbffa370bd03e4e0ed742110e4c780b99c28acEric Fiselier};
449acbffa370bd03e4e0ed742110e4c780b99c28acEric Fiselier
459acbffa370bd03e4e0ed742110e4c780b99c28acEric Fiseliervoid test_throw_max_size() {
469acbffa370bd03e4e0ed742110e4c780b99c28acEric Fiselier#ifndef TEST_HAS_NO_EXCEPTIONS
479acbffa370bd03e4e0ed742110e4c780b99c28acEric Fiselier    std::set_new_handler(new_handler);
489acbffa370bd03e4e0ed742110e4c780b99c28acEric Fiselier    try
499acbffa370bd03e4e0ed742110e4c780b99c28acEric Fiselier    {
509acbffa370bd03e4e0ed742110e4c780b99c28acEric Fiselier        void* vp = operator new[] (std::numeric_limits<std::size_t>::max(),
519acbffa370bd03e4e0ed742110e4c780b99c28acEric Fiselier                                   static_cast<std::align_val_t>(32));
529acbffa370bd03e4e0ed742110e4c780b99c28acEric Fiselier        ((void)vp);
539acbffa370bd03e4e0ed742110e4c780b99c28acEric Fiselier        assert(false);
549acbffa370bd03e4e0ed742110e4c780b99c28acEric Fiselier    }
559acbffa370bd03e4e0ed742110e4c780b99c28acEric Fiselier    catch (std::bad_alloc&)
569acbffa370bd03e4e0ed742110e4c780b99c28acEric Fiselier    {
579acbffa370bd03e4e0ed742110e4c780b99c28acEric Fiselier        assert(new_handler_called == 1);
589acbffa370bd03e4e0ed742110e4c780b99c28acEric Fiselier    }
599acbffa370bd03e4e0ed742110e4c780b99c28acEric Fiselier    catch (...)
609acbffa370bd03e4e0ed742110e4c780b99c28acEric Fiselier    {
619acbffa370bd03e4e0ed742110e4c780b99c28acEric Fiselier        assert(false);
629acbffa370bd03e4e0ed742110e4c780b99c28acEric Fiselier    }
639acbffa370bd03e4e0ed742110e4c780b99c28acEric Fiselier#endif
649acbffa370bd03e4e0ed742110e4c780b99c28acEric Fiselier}
659acbffa370bd03e4e0ed742110e4c780b99c28acEric Fiselier
669acbffa370bd03e4e0ed742110e4c780b99c28acEric Fiselierint main()
679acbffa370bd03e4e0ed742110e4c780b99c28acEric Fiselier{
689acbffa370bd03e4e0ed742110e4c780b99c28acEric Fiselier    {
699acbffa370bd03e4e0ed742110e4c780b99c28acEric Fiselier        A* ap = new A[2];
709acbffa370bd03e4e0ed742110e4c780b99c28acEric Fiselier        assert(ap);
719acbffa370bd03e4e0ed742110e4c780b99c28acEric Fiselier        assert(reinterpret_cast<std::uintptr_t>(ap) % OverAligned == 0);
729acbffa370bd03e4e0ed742110e4c780b99c28acEric Fiselier        assert(A_constructed == 2);
739acbffa370bd03e4e0ed742110e4c780b99c28acEric Fiselier        delete [] ap;
749acbffa370bd03e4e0ed742110e4c780b99c28acEric Fiselier        assert(A_constructed == 0);
759acbffa370bd03e4e0ed742110e4c780b99c28acEric Fiselier    }
769acbffa370bd03e4e0ed742110e4c780b99c28acEric Fiselier    {
779acbffa370bd03e4e0ed742110e4c780b99c28acEric Fiselier        test_throw_max_size();
789acbffa370bd03e4e0ed742110e4c780b99c28acEric Fiselier    }
799acbffa370bd03e4e0ed742110e4c780b99c28acEric Fiselier}
80