1c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant//===----------------------------------------------------------------------===// 2c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant// 3c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant// The LLVM Compiler Infrastructure 4c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant// 5b64f8b07c104c6cc986570ac8ee0ed16a9f23976Howard Hinnant// This file is dual licensed under the MIT and the University of Illinois Open 6b64f8b07c104c6cc986570ac8ee0ed16a9f23976Howard Hinnant// Source Licenses. See LICENSE.TXT for details. 7c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant// 8c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant//===----------------------------------------------------------------------===// 9c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant 10c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant// <memory> 11c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant 12c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant// template <class ForwardIterator, class Size, class T> 132f6a6273948e56d9d39843ba1074830049222e18Howard Hinnant// ForwardIterator 14c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant// uninitialized_fill_n(ForwardIterator first, Size n, const T& x); 15c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant 16c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant#include <memory> 17c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant#include <cassert> 18c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant 19c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnantstruct B 20c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant{ 21c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant static int count_; 22c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant int data_; 23c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant explicit B() : data_(1) {} 24c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant B(const B& b) {if (++count_ == 3) throw 1; data_ = b.data_;} 25c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant ~B() {data_ = 0;} 26c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant}; 27c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant 28c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnantint B::count_ = 0; 29c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant 30c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnantint main() 31c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant{ 32c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant const int N = 5; 33c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant char pool[sizeof(B)*N] = {0}; 34c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant B* bp = (B*)pool; 35c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant try 36c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant { 37c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant std::uninitialized_fill_n(bp, 5, B()); 38c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant assert(false); 39c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant } 40c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant catch (...) 41c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant { 42c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant for (int i = 0; i < N; ++i) 43c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant assert(bp[i].data_ == 0); 44c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant } 45c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant B::count_ = 0; 462f6a6273948e56d9d39843ba1074830049222e18Howard Hinnant B* r = std::uninitialized_fill_n(bp, 2, B()); 472f6a6273948e56d9d39843ba1074830049222e18Howard Hinnant assert(r == bp + 2); 48c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant for (int i = 0; i < 2; ++i) 49c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant assert(bp[i].data_ == 1); 50c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant} 51