uninitialized_fill_n.pass.cpp revision b64f8b07c104c6cc986570ac8ee0ed16a9f23976
1561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes//===----------------------------------------------------------------------===// 2561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes// 3561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes// The LLVM Compiler Infrastructure 4561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes// 5561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes// This file is dual licensed under the MIT and the University of Illinois Open 6561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes// Source Licenses. See LICENSE.TXT for details. 7561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes// 8561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes//===----------------------------------------------------------------------===// 9561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes 10561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes// <memory> 11561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes 12561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes// template <class ForwardIterator, class Size, class T> 13561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes// void 14561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes// uninitialized_fill_n(ForwardIterator first, Size n, const T& x); 15561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes 16561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes#include <memory> 17561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes#include <cassert> 18561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes 198d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamathstruct B 208d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath{ 21561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes static int count_; 22561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes int data_; 238d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath explicit B() : data_(1) {} 24561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes B(const B& b) {if (++count_ == 3) throw 1; data_ = b.data_;} 25561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes ~B() {data_ = 0;} 26561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes}; 27561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes 28561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughesint B::count_ = 0; 29561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes 30561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughesint main() 31561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes{ 32561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes const int N = 5; 33561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes char pool[sizeof(B)*N] = {0}; 34561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes B* bp = (B*)pool; 35561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes try 36561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes { 37561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes std::uninitialized_fill_n(bp, 5, B()); 38561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes assert(false); 39561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes } 40561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes catch (...) 41561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes { 42561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes for (int i = 0; i < N; ++i) 43561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes assert(bp[i].data_ == 0); 44561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes } 45561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes B::count_ = 0; 46561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes std::uninitialized_fill_n(bp, 2, B()); 47561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes for (int i = 0; i < 2; ++i) 48561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes assert(bp[i].data_ == 1); 49561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes} 50561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes