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