uninitialized_fill.pass.cpp revision b64f8b07c104c6cc986570ac8ee0ed16a9f23976
15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//===----------------------------------------------------------------------===// 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// The LLVM Compiler Infrastructure 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This file is dual licensed under the MIT and the University of Illinois Open 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Source Licenses. See LICENSE.TXT for details. 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//===----------------------------------------------------------------------===// 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// <memory> 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// template <class ForwardIterator, class T> 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// void 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// uninitialized_fill(ForwardIterator first, ForwardIterator last, 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// const T& x); 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <memory> 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <cassert> 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct B 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static int count_; 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int data_; 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) explicit B() : data_(1) {} 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) B(const B& b) {if (++count_ == 3) throw 1; data_ = b.data_;} 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ~B() {data_ = 0;} 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int B::count_ = 0; 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int main() 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const int N = 5; 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) char pool[sizeof(B)*N] = {0}; 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) B* bp = (B*)pool; 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) try 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::uninitialized_fill(bp, bp+N, B()); 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert(false); 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) catch (...) 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (int i = 0; i < N; ++i) 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert(bp[i].data_ == 0); 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) B::count_ = 0; 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::uninitialized_fill(bp, bp+2, B()); 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (int i = 0; i < 2; ++i) 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) assert(bp[i].data_ == 1); 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)