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)