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// test aligned operator delete replacement.
119acbffa370bd03e4e0ed742110e4c780b99c28acEric Fiselier
129acbffa370bd03e4e0ed742110e4c780b99c28acEric Fiselier// UNSUPPORTED: sanitizer-new-delete, c++98, c++03, c++11, c++14
139acbffa370bd03e4e0ed742110e4c780b99c28acEric Fiselier
149acbffa370bd03e4e0ed742110e4c780b99c28acEric Fiselier// Older Clang versions do not support this
159acbffa370bd03e4e0ed742110e4c780b99c28acEric Fiselier// XFAIL: clang-3, apple-clang
169acbffa370bd03e4e0ed742110e4c780b99c28acEric Fiselier
179acbffa370bd03e4e0ed742110e4c780b99c28acEric Fiselier// None of the current GCC compilers support this.
189ffd1d56b461a19673e55ad72328548423cae59cEric Fiselier// XFAIL: gcc
199acbffa370bd03e4e0ed742110e4c780b99c28acEric Fiselier
2034c6b805cf0358809ea95c0d4303537be3225db7Eric Fiselier
219acbffa370bd03e4e0ed742110e4c780b99c28acEric Fiselier#include <new>
229acbffa370bd03e4e0ed742110e4c780b99c28acEric Fiselier#include <cstddef>
239acbffa370bd03e4e0ed742110e4c780b99c28acEric Fiselier#include <cstdlib>
249acbffa370bd03e4e0ed742110e4c780b99c28acEric Fiselier#include <cassert>
259acbffa370bd03e4e0ed742110e4c780b99c28acEric Fiselier
26e5bca2ba666cc85b26ec69a93558f583ced4c2edEric Fiselier#include "test_macros.h"
27e5bca2ba666cc85b26ec69a93558f583ced4c2edEric Fiselier
289acbffa370bd03e4e0ed742110e4c780b99c28acEric Fiselierconstexpr auto OverAligned = alignof(std::max_align_t) * 2;
299acbffa370bd03e4e0ed742110e4c780b99c28acEric Fiselier
309acbffa370bd03e4e0ed742110e4c780b99c28acEric Fiselierint unsized_delete_called = 0;
319acbffa370bd03e4e0ed742110e4c780b99c28acEric Fiselierint unsized_delete_nothrow_called = 0;
329acbffa370bd03e4e0ed742110e4c780b99c28acEric Fiselierint aligned_delete_called = 0;
339acbffa370bd03e4e0ed742110e4c780b99c28acEric Fiselier
349acbffa370bd03e4e0ed742110e4c780b99c28acEric Fiseliervoid reset() {
359acbffa370bd03e4e0ed742110e4c780b99c28acEric Fiselier    unsized_delete_called = 0;
369acbffa370bd03e4e0ed742110e4c780b99c28acEric Fiselier    unsized_delete_nothrow_called = 0;
379acbffa370bd03e4e0ed742110e4c780b99c28acEric Fiselier    aligned_delete_called = 0;
389acbffa370bd03e4e0ed742110e4c780b99c28acEric Fiselier}
399acbffa370bd03e4e0ed742110e4c780b99c28acEric Fiselier
40e5bca2ba666cc85b26ec69a93558f583ced4c2edEric Fiseliervoid operator delete(void* p) TEST_NOEXCEPT
419acbffa370bd03e4e0ed742110e4c780b99c28acEric Fiselier{
429acbffa370bd03e4e0ed742110e4c780b99c28acEric Fiselier    ++unsized_delete_called;
439acbffa370bd03e4e0ed742110e4c780b99c28acEric Fiselier    std::free(p);
449acbffa370bd03e4e0ed742110e4c780b99c28acEric Fiselier}
459acbffa370bd03e4e0ed742110e4c780b99c28acEric Fiselier
46e5bca2ba666cc85b26ec69a93558f583ced4c2edEric Fiseliervoid operator delete(void* p, const std::nothrow_t&) TEST_NOEXCEPT
479acbffa370bd03e4e0ed742110e4c780b99c28acEric Fiselier{
489acbffa370bd03e4e0ed742110e4c780b99c28acEric Fiselier    ++unsized_delete_nothrow_called;
499acbffa370bd03e4e0ed742110e4c780b99c28acEric Fiselier    std::free(p);
509acbffa370bd03e4e0ed742110e4c780b99c28acEric Fiselier}
519acbffa370bd03e4e0ed742110e4c780b99c28acEric Fiselier
520e5ebbc77c3c2cfd7d835fcfe40fcb65df0c5598Eric Fiseliervoid operator delete(void* p, std::align_val_t) TEST_NOEXCEPT
539acbffa370bd03e4e0ed742110e4c780b99c28acEric Fiselier{
549acbffa370bd03e4e0ed742110e4c780b99c28acEric Fiselier    ++aligned_delete_called;
559acbffa370bd03e4e0ed742110e4c780b99c28acEric Fiselier    std::free(p);
569acbffa370bd03e4e0ed742110e4c780b99c28acEric Fiselier}
579acbffa370bd03e4e0ed742110e4c780b99c28acEric Fiselier
589acbffa370bd03e4e0ed742110e4c780b99c28acEric Fiselierstruct alignas(OverAligned) A {};
599acbffa370bd03e4e0ed742110e4c780b99c28acEric Fiselierstruct alignas(std::max_align_t) B {};
609acbffa370bd03e4e0ed742110e4c780b99c28acEric Fiselier
619ffd1d56b461a19673e55ad72328548423cae59cEric FiselierB* volatile bp;
629ffd1d56b461a19673e55ad72328548423cae59cEric FiselierA* volatile ap;
639ffd1d56b461a19673e55ad72328548423cae59cEric Fiselier
649acbffa370bd03e4e0ed742110e4c780b99c28acEric Fiselierint main()
659acbffa370bd03e4e0ed742110e4c780b99c28acEric Fiselier{
66e630058e904a849ceb5d6ec3066225cfe424aa01Eric Fiselier    reset();
679acbffa370bd03e4e0ed742110e4c780b99c28acEric Fiselier    {
689ffd1d56b461a19673e55ad72328548423cae59cEric Fiselier        bp = new B;
699acbffa370bd03e4e0ed742110e4c780b99c28acEric Fiselier        assert(0 == unsized_delete_called);
709acbffa370bd03e4e0ed742110e4c780b99c28acEric Fiselier        assert(0 == unsized_delete_nothrow_called);
719acbffa370bd03e4e0ed742110e4c780b99c28acEric Fiselier        assert(0 == aligned_delete_called);
729acbffa370bd03e4e0ed742110e4c780b99c28acEric Fiselier
739ffd1d56b461a19673e55ad72328548423cae59cEric Fiselier        delete bp;
749acbffa370bd03e4e0ed742110e4c780b99c28acEric Fiselier        assert(1 == unsized_delete_called);
759acbffa370bd03e4e0ed742110e4c780b99c28acEric Fiselier        assert(0 == unsized_delete_nothrow_called);
769acbffa370bd03e4e0ed742110e4c780b99c28acEric Fiselier        assert(0 == aligned_delete_called);
779acbffa370bd03e4e0ed742110e4c780b99c28acEric Fiselier    }
789acbffa370bd03e4e0ed742110e4c780b99c28acEric Fiselier    reset();
799acbffa370bd03e4e0ed742110e4c780b99c28acEric Fiselier    {
809ffd1d56b461a19673e55ad72328548423cae59cEric Fiselier        ap = new A;
819acbffa370bd03e4e0ed742110e4c780b99c28acEric Fiselier        assert(0 == unsized_delete_called);
829acbffa370bd03e4e0ed742110e4c780b99c28acEric Fiselier        assert(0 == unsized_delete_nothrow_called);
839acbffa370bd03e4e0ed742110e4c780b99c28acEric Fiselier        assert(0 == aligned_delete_called);
849acbffa370bd03e4e0ed742110e4c780b99c28acEric Fiselier
859ffd1d56b461a19673e55ad72328548423cae59cEric Fiselier        delete ap;
869acbffa370bd03e4e0ed742110e4c780b99c28acEric Fiselier        assert(0 == unsized_delete_called);
879acbffa370bd03e4e0ed742110e4c780b99c28acEric Fiselier        assert(0 == unsized_delete_nothrow_called);
889acbffa370bd03e4e0ed742110e4c780b99c28acEric Fiselier        assert(1 == aligned_delete_called);
899acbffa370bd03e4e0ed742110e4c780b99c28acEric Fiselier    }
909acbffa370bd03e4e0ed742110e4c780b99c28acEric Fiselier}
91