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