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