summaryrefslogtreecommitdiffstats
path: root/libcxx/test/iterators
diff options
context:
space:
mode:
Diffstat (limited to 'libcxx/test/iterators')
-rw-r--r--libcxx/test/iterators/iterator.primitives/iterator.basic/iterator.pass.cpp82
-rw-r--r--libcxx/test/iterators/iterator.primitives/iterator.operations/advance.pass.cpp45
-rw-r--r--libcxx/test/iterators/iterator.primitives/iterator.operations/distance.pass.cpp40
-rw-r--r--libcxx/test/iterators/iterator.primitives/iterator.operations/next.pass.cpp46
-rw-r--r--libcxx/test/iterators/iterator.primitives/iterator.operations/prev.pass.cpp44
-rw-r--r--libcxx/test/iterators/iterator.primitives/iterator.traits/const_pointer.pass.cpp35
-rw-r--r--libcxx/test/iterators/iterator.primitives/iterator.traits/empty.pass.cpp26
-rw-r--r--libcxx/test/iterators/iterator.primitives/iterator.traits/iterator.pass.cpp43
-rw-r--r--libcxx/test/iterators/iterator.primitives/iterator.traits/pointer.pass.cpp35
-rw-r--r--libcxx/test/iterators/iterator.primitives/nothing_to_do.pass.cpp12
-rw-r--r--libcxx/test/iterators/iterator.primitives/std.iterator.tags/bidirectional_iterator_tag.pass.cpp24
-rw-r--r--libcxx/test/iterators/iterator.primitives/std.iterator.tags/forward_iterator_tag.pass.cpp24
-rw-r--r--libcxx/test/iterators/iterator.primitives/std.iterator.tags/input_iterator_tag.pass.cpp22
-rw-r--r--libcxx/test/iterators/iterator.primitives/std.iterator.tags/output_iterator_tag.pass.cpp22
-rw-r--r--libcxx/test/iterators/iterator.primitives/std.iterator.tags/random_access_iterator_tag.pass.cpp24
-rw-r--r--libcxx/test/iterators/iterator.requirements/bidirectional.iterators/nothing_to_do.pass.cpp12
-rw-r--r--libcxx/test/iterators/iterator.requirements/forward.iterators/nothing_to_do.pass.cpp12
-rw-r--r--libcxx/test/iterators/iterator.requirements/input.iterators/nothing_to_do.pass.cpp12
-rw-r--r--libcxx/test/iterators/iterator.requirements/iterator.iterators/nothing_to_do.pass.cpp12
-rw-r--r--libcxx/test/iterators/iterator.requirements/iterator.requirements.general/nothing_to_do.pass.cpp12
-rw-r--r--libcxx/test/iterators/iterator.requirements/nothing_to_do.pass.cpp12
-rw-r--r--libcxx/test/iterators/iterator.requirements/output.iterators/nothing_to_do.pass.cpp12
-rw-r--r--libcxx/test/iterators/iterator.requirements/random.access.iterators/nothing_to_do.pass.cpp12
-rw-r--r--libcxx/test/iterators/iterator.synopsis/nothing_to_do.pass.cpp12
-rw-r--r--libcxx/test/iterators/iterators.general/nothing_to_do.pass.cpp12
-rw-r--r--libcxx/test/iterators/iterators.h251
-rw-r--r--libcxx/test/iterators/predef.iterators/insert.iterators/back.insert.iter.ops/back.insert.iter.cons/container.fail.cpp24
-rw-r--r--libcxx/test/iterators/predef.iterators/insert.iterators/back.insert.iter.ops/back.insert.iter.cons/container.pass.cpp29
-rw-r--r--libcxx/test/iterators/predef.iterators/insert.iterators/back.insert.iter.ops/back.insert.iter.op++/post.pass.cpp34
-rw-r--r--libcxx/test/iterators/predef.iterators/insert.iterators/back.insert.iter.ops/back.insert.iter.op++/pre.pass.cpp32
-rw-r--r--libcxx/test/iterators/predef.iterators/insert.iterators/back.insert.iter.ops/back.insert.iter.op=/lv_value.pass.cpp46
-rw-r--r--libcxx/test/iterators/predef.iterators/insert.iterators/back.insert.iter.ops/back.insert.iter.op=/rv_value.pass.cpp42
-rw-r--r--libcxx/test/iterators/predef.iterators/insert.iterators/back.insert.iter.ops/back.insert.iter.op_astrk/test.pass.cpp32
-rw-r--r--libcxx/test/iterators/predef.iterators/insert.iterators/back.insert.iter.ops/back.inserter/test.pass.cpp33
-rw-r--r--libcxx/test/iterators/predef.iterators/insert.iterators/back.insert.iter.ops/nothing_to_do.pass.cpp12
-rw-r--r--libcxx/test/iterators/predef.iterators/insert.iterators/back.insert.iterator/types.pass.cpp59
-rw-r--r--libcxx/test/iterators/predef.iterators/insert.iterators/front.insert.iter.ops/front.insert.iter.cons/container.fail.cpp24
-rw-r--r--libcxx/test/iterators/predef.iterators/insert.iterators/front.insert.iter.ops/front.insert.iter.cons/container.pass.cpp29
-rw-r--r--libcxx/test/iterators/predef.iterators/insert.iterators/front.insert.iter.ops/front.insert.iter.op++/post.pass.cpp34
-rw-r--r--libcxx/test/iterators/predef.iterators/insert.iterators/front.insert.iter.ops/front.insert.iter.op++/pre.pass.cpp32
-rw-r--r--libcxx/test/iterators/predef.iterators/insert.iterators/front.insert.iter.ops/front.insert.iter.op=/lv_value.pass.cpp45
-rw-r--r--libcxx/test/iterators/predef.iterators/insert.iterators/front.insert.iter.ops/front.insert.iter.op=/rv_value.pass.cpp41
-rw-r--r--libcxx/test/iterators/predef.iterators/insert.iterators/front.insert.iter.ops/front.insert.iter.op_astrk/test.pass.cpp32
-rw-r--r--libcxx/test/iterators/predef.iterators/insert.iterators/front.insert.iter.ops/front.inserter/test.pass.cpp33
-rw-r--r--libcxx/test/iterators/predef.iterators/insert.iterators/front.insert.iter.ops/nothing_to_do.pass.cpp12
-rw-r--r--libcxx/test/iterators/predef.iterators/insert.iterators/front.insert.iterator/types.pass.cpp60
-rw-r--r--libcxx/test/iterators/predef.iterators/insert.iterators/insert.iter.ops/insert.iter.cons/test.pass.cpp29
-rw-r--r--libcxx/test/iterators/predef.iterators/insert.iterators/insert.iter.ops/insert.iter.op++/post.pass.cpp34
-rw-r--r--libcxx/test/iterators/predef.iterators/insert.iterators/insert.iter.ops/insert.iter.op++/pre.pass.cpp32
-rw-r--r--libcxx/test/iterators/predef.iterators/insert.iterators/insert.iter.ops/insert.iter.op=/lv_value.pass.cpp64
-rw-r--r--libcxx/test/iterators/predef.iterators/insert.iterators/insert.iter.ops/insert.iter.op=/rv_value.pass.cpp95
-rw-r--r--libcxx/test/iterators/predef.iterators/insert.iterators/insert.iter.ops/insert.iter.op_astrk/test.pass.cpp32
-rw-r--r--libcxx/test/iterators/predef.iterators/insert.iterators/insert.iter.ops/inserter/test.pass.cpp33
-rw-r--r--libcxx/test/iterators/predef.iterators/insert.iterators/insert.iter.ops/nothing_to_do.pass.cpp12
-rw-r--r--libcxx/test/iterators/predef.iterators/insert.iterators/insert.iterator/types.pass.cpp64
-rw-r--r--libcxx/test/iterators/predef.iterators/insert.iterators/nothing_to_do.pass.cpp12
-rw-r--r--libcxx/test/iterators/predef.iterators/move.iterators/move.iter.ops/move.iter.nonmember/make_move_iterator.pass.cpp39
-rw-r--r--libcxx/test/iterators/predef.iterators/move.iterators/move.iter.ops/move.iter.nonmember/minus.pass.cpp39
-rw-r--r--libcxx/test/iterators/predef.iterators/move.iterators/move.iter.ops/move.iter.nonmember/plus.pass.cpp37
-rw-r--r--libcxx/test/iterators/predef.iterators/move.iterators/move.iter.ops/move.iter.op.+/difference_type.pass.cpp36
-rw-r--r--libcxx/test/iterators/predef.iterators/move.iterators/move.iter.ops/move.iter.op.+=/difference_type.pass.cpp37
-rw-r--r--libcxx/test/iterators/predef.iterators/move.iterators/move.iter.ops/move.iter.op.-/difference_type.pass.cpp36
-rw-r--r--libcxx/test/iterators/predef.iterators/move.iterators/move.iter.ops/move.iter.op.-=/difference_type.pass.cpp37
-rw-r--r--libcxx/test/iterators/predef.iterators/move.iterators/move.iter.ops/move.iter.op.comp/op_eq.pass.cpp46
-rw-r--r--libcxx/test/iterators/predef.iterators/move.iterators/move.iter.ops/move.iter.op.comp/op_gt.pass.cpp42
-rw-r--r--libcxx/test/iterators/predef.iterators/move.iterators/move.iter.ops/move.iter.op.comp/op_gte.pass.cpp42
-rw-r--r--libcxx/test/iterators/predef.iterators/move.iterators/move.iter.ops/move.iter.op.comp/op_lt.pass.cpp42
-rw-r--r--libcxx/test/iterators/predef.iterators/move.iterators/move.iter.ops/move.iter.op.comp/op_lte.pass.cpp42
-rw-r--r--libcxx/test/iterators/predef.iterators/move.iterators/move.iter.ops/move.iter.op.comp/op_neq.pass.cpp46
-rw-r--r--libcxx/test/iterators/predef.iterators/move.iterators/move.iter.ops/move.iter.op.const/convert.fail.cpp38
-rw-r--r--libcxx/test/iterators/predef.iterators/move.iterators/move.iter.ops/move.iter.op.const/convert.pass.cpp44
-rw-r--r--libcxx/test/iterators/predef.iterators/move.iterators/move.iter.ops/move.iter.op.const/default.pass.cpp34
-rw-r--r--libcxx/test/iterators/predef.iterators/move.iterators/move.iter.ops/move.iter.op.const/iter.fail.cpp31
-rw-r--r--libcxx/test/iterators/predef.iterators/move.iterators/move.iter.ops/move.iter.op.const/iter.pass.cpp37
-rw-r--r--libcxx/test/iterators/predef.iterators/move.iterators/move.iter.ops/move.iter.op.conv/tested_elsewhere.pass.cpp12
-rw-r--r--libcxx/test/iterators/predef.iterators/move.iterators/move.iter.ops/move.iter.op.decr/post.pass.cpp37
-rw-r--r--libcxx/test/iterators/predef.iterators/move.iterators/move.iter.ops/move.iter.op.decr/pre.pass.cpp37
-rw-r--r--libcxx/test/iterators/predef.iterators/move.iterators/move.iter.ops/move.iter.op.incr/post.pass.cpp39
-rw-r--r--libcxx/test/iterators/predef.iterators/move.iterators/move.iter.ops/move.iter.op.incr/pre.pass.cpp39
-rw-r--r--libcxx/test/iterators/predef.iterators/move.iterators/move.iter.ops/move.iter.op.index/difference_type.pass.cpp58
-rw-r--r--libcxx/test/iterators/predef.iterators/move.iterators/move.iter.ops/move.iter.op.ref/op_arrow.pass.cpp31
-rw-r--r--libcxx/test/iterators/predef.iterators/move.iterators/move.iter.ops/move.iter.op.star/op_star.pass.cpp61
-rw-r--r--libcxx/test/iterators/predef.iterators/move.iterators/move.iter.ops/move.iter.op=/move_iterator.fail.cpp39
-rw-r--r--libcxx/test/iterators/predef.iterators/move.iterators/move.iter.ops/move.iter.op=/move_iterator.pass.cpp47
-rw-r--r--libcxx/test/iterators/predef.iterators/move.iterators/move.iter.ops/nothing_to_do.pass.cpp12
-rw-r--r--libcxx/test/iterators/predef.iterators/move.iterators/move.iter.requirements/nothing_to_do.pass.cpp12
-rw-r--r--libcxx/test/iterators/predef.iterators/move.iterators/move.iterator/types.pass.cpp56
-rw-r--r--libcxx/test/iterators/predef.iterators/move.iterators/nothing_to_do.pass.cpp12
-rw-r--r--libcxx/test/iterators/predef.iterators/nothing_to_do.pass.cpp12
-rw-r--r--libcxx/test/iterators/predef.iterators/reverse.iterators/nothing_to_do.pass.cpp12
-rw-r--r--libcxx/test/iterators/predef.iterators/reverse.iterators/reverse.iter.ops/nothing_to_do.pass.cpp12
-rw-r--r--libcxx/test/iterators/predef.iterators/reverse.iterators/reverse.iter.ops/reverse.iter.cons/default.pass.cpp33
-rw-r--r--libcxx/test/iterators/predef.iterators/reverse.iterators/reverse.iter.ops/reverse.iter.cons/iter.fail.cpp31
-rw-r--r--libcxx/test/iterators/predef.iterators/reverse.iterators/reverse.iter.ops/reverse.iter.cons/iter.pass.cpp35
-rw-r--r--libcxx/test/iterators/predef.iterators/reverse.iterators/reverse.iter.ops/reverse.iter.cons/reverse_iterator.fail.cpp38
-rw-r--r--libcxx/test/iterators/predef.iterators/reverse.iterators/reverse.iter.ops/reverse.iter.cons/reverse_iterator.pass.cpp42
-rw-r--r--libcxx/test/iterators/predef.iterators/reverse.iterators/reverse.iter.ops/reverse.iter.conv/tested_elsewhere.pass.cpp12
-rw-r--r--libcxx/test/iterators/predef.iterators/reverse.iterators/reverse.iter.ops/reverse.iter.op!=/test.pass.cpp42
-rw-r--r--libcxx/test/iterators/predef.iterators/reverse.iterators/reverse.iter.ops/reverse.iter.op++/post.pass.cpp37
-rw-r--r--libcxx/test/iterators/predef.iterators/reverse.iterators/reverse.iter.ops/reverse.iter.op++/pre.pass.cpp37
-rw-r--r--libcxx/test/iterators/predef.iterators/reverse.iterators/reverse.iter.ops/reverse.iter.op+/difference_type.pass.cpp36
-rw-r--r--libcxx/test/iterators/predef.iterators/reverse.iterators/reverse.iter.ops/reverse.iter.op+=/difference_type.pass.cpp37
-rw-r--r--libcxx/test/iterators/predef.iterators/reverse.iterators/reverse.iter.ops/reverse.iter.op--/post.pass.cpp37
-rw-r--r--libcxx/test/iterators/predef.iterators/reverse.iterators/reverse.iter.ops/reverse.iter.op--/pre.pass.cpp37
-rw-r--r--libcxx/test/iterators/predef.iterators/reverse.iterators/reverse.iter.ops/reverse.iter.op-/difference_type.pass.cpp36
-rw-r--r--libcxx/test/iterators/predef.iterators/reverse.iterators/reverse.iter.ops/reverse.iter.op-=/difference_type.pass.cpp37
-rw-r--r--libcxx/test/iterators/predef.iterators/reverse.iterators/reverse.iter.ops/reverse.iter.op.star/op_star.pass.cpp66
-rw-r--r--libcxx/test/iterators/predef.iterators/reverse.iterators/reverse.iter.ops/reverse.iter.op=/reverse_iterator.fail.cpp39
-rw-r--r--libcxx/test/iterators/predef.iterators/reverse.iterators/reverse.iter.ops/reverse.iter.op=/reverse_iterator.pass.cpp45
-rw-r--r--libcxx/test/iterators/predef.iterators/reverse.iterators/reverse.iter.ops/reverse.iter.op==/test.pass.cpp42
-rw-r--r--libcxx/test/iterators/predef.iterators/reverse.iterators/reverse.iter.ops/reverse.iter.opdiff/test.pass.cpp43
-rw-r--r--libcxx/test/iterators/predef.iterators/reverse.iterators/reverse.iter.ops/reverse.iter.opgt/test.pass.cpp42
-rw-r--r--libcxx/test/iterators/predef.iterators/reverse.iterators/reverse.iter.ops/reverse.iter.opgt=/test.pass.cpp42
-rw-r--r--libcxx/test/iterators/predef.iterators/reverse.iterators/reverse.iter.ops/reverse.iter.opindex/difference_type.pass.cpp38
-rw-r--r--libcxx/test/iterators/predef.iterators/reverse.iterators/reverse.iter.ops/reverse.iter.oplt/test.pass.cpp42
-rw-r--r--libcxx/test/iterators/predef.iterators/reverse.iterators/reverse.iter.ops/reverse.iter.oplt=/test.pass.cpp42
-rw-r--r--libcxx/test/iterators/predef.iterators/reverse.iterators/reverse.iter.ops/reverse.iter.opref/op_arrow.pass.cpp69
-rw-r--r--libcxx/test/iterators/predef.iterators/reverse.iterators/reverse.iter.ops/reverse.iter.opsum/difference_type.pass.cpp37
-rw-r--r--libcxx/test/iterators/predef.iterators/reverse.iterators/reverse.iter.requirements/nothing_to_do.pass.cpp12
-rw-r--r--libcxx/test/iterators/predef.iterators/reverse.iterators/reverse.iterator/types.pass.cpp61
-rw-r--r--libcxx/test/iterators/stream.iterators/istream.iterator/istream.iterator.cons/copy.pass.cpp36
-rw-r--r--libcxx/test/iterators/stream.iterators/istream.iterator/istream.iterator.cons/default.pass.cpp23
-rw-r--r--libcxx/test/iterators/stream.iterators/istream.iterator/istream.iterator.cons/istream.pass.cpp30
-rw-r--r--libcxx/test/iterators/stream.iterators/istream.iterator/istream.iterator.ops/arrow.pass.cpp37
-rw-r--r--libcxx/test/iterators/stream.iterators/istream.iterator/istream.iterator.ops/dereference.pass.cpp34
-rw-r--r--libcxx/test/iterators/stream.iterators/istream.iterator/istream.iterator.ops/equal.pass.cpp52
-rw-r--r--libcxx/test/iterators/stream.iterators/istream.iterator/istream.iterator.ops/post_increment.pass.cpp32
-rw-r--r--libcxx/test/iterators/stream.iterators/istream.iterator/istream.iterator.ops/pre_increment.pass.cpp29
-rw-r--r--libcxx/test/iterators/stream.iterators/istream.iterator/types.pass.cpp42
-rw-r--r--libcxx/test/iterators/stream.iterators/istreambuf.iterator/istreambuf.iterator.cons/default.pass.cpp30
-rw-r--r--libcxx/test/iterators/stream.iterators/istreambuf.iterator/istreambuf.iterator.cons/istream.pass.cpp42
-rw-r--r--libcxx/test/iterators/stream.iterators/istreambuf.iterator/istreambuf.iterator.cons/proxy.pass.cpp36
-rw-r--r--libcxx/test/iterators/stream.iterators/istreambuf.iterator/istreambuf.iterator.cons/streambuf.pass.cpp50
-rw-r--r--libcxx/test/iterators/stream.iterators/istreambuf.iterator/istreambuf.iterator::equal/equal.pass.cpp78
-rw-r--r--libcxx/test/iterators/stream.iterators/istreambuf.iterator/istreambuf.iterator::op!=/not_equal.pass.cpp80
-rw-r--r--libcxx/test/iterators/stream.iterators/istreambuf.iterator/istreambuf.iterator::op++/dereference.pass.cpp40
-rw-r--r--libcxx/test/iterators/stream.iterators/istreambuf.iterator/istreambuf.iterator::op==/equal.pass.cpp80
-rw-r--r--libcxx/test/iterators/stream.iterators/istreambuf.iterator/istreambuf.iterator::op_astrk/arrow.pass.cpp28
-rw-r--r--libcxx/test/iterators/stream.iterators/istreambuf.iterator/istreambuf.iterator::op_astrk/post_increment.pass.cpp38
-rw-r--r--libcxx/test/iterators/stream.iterators/istreambuf.iterator/istreambuf.iterator::op_astrk/pre_increment.pass.cpp39
-rw-r--r--libcxx/test/iterators/stream.iterators/istreambuf.iterator/istreambuf.iterator::proxy/proxy.pass.cpp44
-rw-r--r--libcxx/test/iterators/stream.iterators/istreambuf.iterator/types.pass.cpp51
-rw-r--r--libcxx/test/iterators/stream.iterators/iterator.range/begin_array.pass.cpp24
-rw-r--r--libcxx/test/iterators/stream.iterators/iterator.range/begin_const.pass.cpp23
-rw-r--r--libcxx/test/iterators/stream.iterators/iterator.range/begin_non_const.pass.cpp25
-rw-r--r--libcxx/test/iterators/stream.iterators/iterator.range/end_array.pass.cpp24
-rw-r--r--libcxx/test/iterators/stream.iterators/iterator.range/end_const.pass.cpp23
-rw-r--r--libcxx/test/iterators/stream.iterators/iterator.range/end_non_const.pass.cpp23
-rw-r--r--libcxx/test/iterators/stream.iterators/nothing_to_do.pass.cpp12
-rw-r--r--libcxx/test/iterators/stream.iterators/ostream.iterator/ostream.iterator.cons.des/copy.pass.cpp26
-rw-r--r--libcxx/test/iterators/stream.iterators/ostream.iterator/ostream.iterator.cons.des/ostream.pass.cpp25
-rw-r--r--libcxx/test/iterators/stream.iterators/ostream.iterator/ostream.iterator.cons.des/ostream_delem.pass.cpp32
-rw-r--r--libcxx/test/iterators/stream.iterators/ostream.iterator/ostream.iterator.ops/assign_t.pass.cpp46
-rw-r--r--libcxx/test/iterators/stream.iterators/ostream.iterator/ostream.iterator.ops/dereference.pass.cpp26
-rw-r--r--libcxx/test/iterators/stream.iterators/ostream.iterator/ostream.iterator.ops/increment.pass.cpp29
-rw-r--r--libcxx/test/iterators/stream.iterators/ostream.iterator/types.pass.cpp40
-rw-r--r--libcxx/test/iterators/stream.iterators/ostreambuf.iterator/ostreambuf.iter.cons/ostream.pass.cpp32
-rw-r--r--libcxx/test/iterators/stream.iterators/ostreambuf.iterator/ostreambuf.iter.cons/streambuf.pass.cpp32
-rw-r--r--libcxx/test/iterators/stream.iterators/ostreambuf.iterator/ostreambuf.iter.ops/assign_c.pass.cpp39
-rw-r--r--libcxx/test/iterators/stream.iterators/ostreambuf.iterator/ostreambuf.iter.ops/deref.pass.cpp34
-rw-r--r--libcxx/test/iterators/stream.iterators/ostreambuf.iterator/ostreambuf.iter.ops/failed.pass.cpp30
-rw-r--r--libcxx/test/iterators/stream.iterators/ostreambuf.iterator/ostreambuf.iter.ops/increment.pass.cpp39
-rw-r--r--libcxx/test/iterators/stream.iterators/ostreambuf.iterator/types.pass.cpp44
-rw-r--r--libcxx/test/iterators/version.pass.cpp20
164 files changed, 5966 insertions, 0 deletions
diff --git a/libcxx/test/iterators/iterator.primitives/iterator.basic/iterator.pass.cpp b/libcxx/test/iterators/iterator.primitives/iterator.basic/iterator.pass.cpp
new file mode 100644
index 00000000000..848992b3f8e
--- /dev/null
+++ b/libcxx/test/iterators/iterator.primitives/iterator.basic/iterator.pass.cpp
@@ -0,0 +1,82 @@
+//===----------------------------------------------------------------------===//
+//
+// ΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚThe LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+// <iterator>
+
+// template<class Category, class T, class Distance = ptrdiff_t,
+// class Pointer = T*, class Reference = T&>
+// struct iterator
+// {
+// typedef T value_type;
+// typedef Distance difference_type;
+// typedef Pointer pointer;
+// typedef Reference reference;
+// typedef Category iterator_category;
+// };
+
+#include <iterator>
+#include <type_traits>
+
+struct A {};
+
+template <class T>
+void
+test2()
+{
+ typedef std::iterator<std::forward_iterator_tag, T> It;
+ static_assert((std::is_same<typename It::value_type, T>::value), "");
+ static_assert((std::is_same<typename It::difference_type, std::ptrdiff_t>::value), "");
+ static_assert((std::is_same<typename It::pointer, T*>::value), "");
+ static_assert((std::is_same<typename It::reference, T&>::value), "");
+ static_assert((std::is_same<typename It::iterator_category, std::forward_iterator_tag>::value), "");
+}
+
+template <class T>
+void
+test3()
+{
+ typedef std::iterator<std::bidirectional_iterator_tag, T, short> It;
+ static_assert((std::is_same<typename It::value_type, T>::value), "");
+ static_assert((std::is_same<typename It::difference_type, short>::value), "");
+ static_assert((std::is_same<typename It::pointer, T*>::value), "");
+ static_assert((std::is_same<typename It::reference, T&>::value), "");
+ static_assert((std::is_same<typename It::iterator_category, std::bidirectional_iterator_tag>::value), "");
+}
+
+template <class T>
+void
+test4()
+{
+ typedef std::iterator<std::random_access_iterator_tag, T, int, const T*> It;
+ static_assert((std::is_same<typename It::value_type, T>::value), "");
+ static_assert((std::is_same<typename It::difference_type, int>::value), "");
+ static_assert((std::is_same<typename It::pointer, const T*>::value), "");
+ static_assert((std::is_same<typename It::reference, T&>::value), "");
+ static_assert((std::is_same<typename It::iterator_category, std::random_access_iterator_tag>::value), "");
+}
+
+template <class T>
+void
+test5()
+{
+ typedef std::iterator<std::input_iterator_tag, T, long, const T*, const T&> It;
+ static_assert((std::is_same<typename It::value_type, T>::value), "");
+ static_assert((std::is_same<typename It::difference_type, long>::value), "");
+ static_assert((std::is_same<typename It::pointer, const T*>::value), "");
+ static_assert((std::is_same<typename It::reference, const T&>::value), "");
+ static_assert((std::is_same<typename It::iterator_category, std::input_iterator_tag>::value), "");
+}
+
+int main()
+{
+ test2<A>();
+ test3<A>();
+ test4<A>();
+ test5<A>();
+}
diff --git a/libcxx/test/iterators/iterator.primitives/iterator.operations/advance.pass.cpp b/libcxx/test/iterators/iterator.primitives/iterator.operations/advance.pass.cpp
new file mode 100644
index 00000000000..9b5e30c1405
--- /dev/null
+++ b/libcxx/test/iterators/iterator.primitives/iterator.operations/advance.pass.cpp
@@ -0,0 +1,45 @@
+//===----------------------------------------------------------------------===//
+//
+// ΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚThe LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+// <iterator>
+
+// template <InputIterator Iter>
+// void advance(Iter& i, Iter::difference_type n);
+//
+// template <BidirectionalIterator Iter>
+// void advance(Iter& i, Iter::difference_type n);
+//
+// template <RandomAccessIterator Iter>
+// void advance(Iter& i, Iter::difference_type n);
+
+#include <iterator>
+#include <cassert>
+
+#include "../../iterators.h"
+
+template <class It>
+void
+test(It i, typename std::iterator_traits<It>::difference_type n, It x)
+{
+ std::advance(i, n);
+ assert(i == x);
+}
+
+int main()
+{
+ const char* s = "1234567890";
+ test(input_iterator<const char*>(s), 10, input_iterator<const char*>(s+10));
+ test(forward_iterator<const char*>(s), 10, forward_iterator<const char*>(s+10));
+ test(bidirectional_iterator<const char*>(s+5), 5, bidirectional_iterator<const char*>(s+10));
+ test(bidirectional_iterator<const char*>(s+5), -5, bidirectional_iterator<const char*>(s));
+ test(random_access_iterator<const char*>(s+5), 5, random_access_iterator<const char*>(s+10));
+ test(random_access_iterator<const char*>(s+5), -5, random_access_iterator<const char*>(s));
+ test(s+5, 5, s+10);
+ test(s+5, -5, s);
+}
diff --git a/libcxx/test/iterators/iterator.primitives/iterator.operations/distance.pass.cpp b/libcxx/test/iterators/iterator.primitives/iterator.operations/distance.pass.cpp
new file mode 100644
index 00000000000..5b7b0cb2941
--- /dev/null
+++ b/libcxx/test/iterators/iterator.primitives/iterator.operations/distance.pass.cpp
@@ -0,0 +1,40 @@
+//===----------------------------------------------------------------------===//
+//
+// ΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚThe LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+// <iterator>
+
+// template <InputIterator Iter>
+// Iter::difference_type
+// distance(Iter first, Iter last);
+//
+// template <RandomAccessIterator Iter>
+// Iter::difference_type
+// distance(Iter first, Iter last);
+
+#include <iterator>
+#include <cassert>
+
+#include "../../iterators.h"
+
+template <class It>
+void
+test(It first, It last, typename std::iterator_traits<It>::difference_type x)
+{
+ assert(std::distance(first, last) == x);
+}
+
+int main()
+{
+ const char* s = "1234567890";
+ test(input_iterator<const char*>(s), input_iterator<const char*>(s+10), 10);
+ test(forward_iterator<const char*>(s), forward_iterator<const char*>(s+10), 10);
+ test(bidirectional_iterator<const char*>(s), bidirectional_iterator<const char*>(s+10), 10);
+ test(random_access_iterator<const char*>(s), random_access_iterator<const char*>(s+10), 10);
+ test(s, s+10, 10);
+}
diff --git a/libcxx/test/iterators/iterator.primitives/iterator.operations/next.pass.cpp b/libcxx/test/iterators/iterator.primitives/iterator.operations/next.pass.cpp
new file mode 100644
index 00000000000..4e36eab501b
--- /dev/null
+++ b/libcxx/test/iterators/iterator.primitives/iterator.operations/next.pass.cpp
@@ -0,0 +1,46 @@
+//===----------------------------------------------------------------------===//
+//
+// ΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚThe LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+// <iterator>
+
+// template <InputIterator Iter>
+// Iter next(Iter x, Iter::difference_type n = 1);
+
+#include <iterator>
+#include <cassert>
+
+#include "../../iterators.h"
+
+template <class It>
+void
+test(It i, typename std::iterator_traits<It>::difference_type n, It x)
+{
+ assert(std::next(i, n) == x);
+}
+
+template <class It>
+void
+test(It i, It x)
+{
+ assert(std::next(i) == x);
+}
+
+int main()
+{
+ const char* s = "1234567890";
+ test(forward_iterator<const char*>(s), 10, forward_iterator<const char*>(s+10));
+ test(bidirectional_iterator<const char*>(s), 10, bidirectional_iterator<const char*>(s+10));
+ test(random_access_iterator<const char*>(s), 10, random_access_iterator<const char*>(s+10));
+ test(s, 10, s+10);
+
+ test(forward_iterator<const char*>(s), forward_iterator<const char*>(s+1));
+ test(bidirectional_iterator<const char*>(s), bidirectional_iterator<const char*>(s+1));
+ test(random_access_iterator<const char*>(s), random_access_iterator<const char*>(s+1));
+ test(s, s+1);
+}
diff --git a/libcxx/test/iterators/iterator.primitives/iterator.operations/prev.pass.cpp b/libcxx/test/iterators/iterator.primitives/iterator.operations/prev.pass.cpp
new file mode 100644
index 00000000000..9938a999a76
--- /dev/null
+++ b/libcxx/test/iterators/iterator.primitives/iterator.operations/prev.pass.cpp
@@ -0,0 +1,44 @@
+//===----------------------------------------------------------------------===//
+//
+// ΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚThe LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+// <iterator>
+
+// template <BidirectionalIterator Iter>
+// Iter prev(Iter x, Iter::difference_type n = 1);
+
+#include <iterator>
+#include <cassert>
+
+#include "../../iterators.h"
+
+template <class It>
+void
+test(It i, typename std::iterator_traits<It>::difference_type n, It x)
+{
+ assert(std::prev(i, n) == x);
+}
+
+template <class It>
+void
+test(It i, It x)
+{
+ assert(std::prev(i) == x);
+}
+
+int main()
+{
+ const char* s = "1234567890";
+ test(bidirectional_iterator<const char*>(s+10), 10, bidirectional_iterator<const char*>(s));
+ test(random_access_iterator<const char*>(s+10), 10, random_access_iterator<const char*>(s));
+ test(s+10, 10, s);
+
+ test(bidirectional_iterator<const char*>(s+1), bidirectional_iterator<const char*>(s));
+ test(random_access_iterator<const char*>(s+1), random_access_iterator<const char*>(s));
+ test(s+1, s);
+}
diff --git a/libcxx/test/iterators/iterator.primitives/iterator.traits/const_pointer.pass.cpp b/libcxx/test/iterators/iterator.primitives/iterator.traits/const_pointer.pass.cpp
new file mode 100644
index 00000000000..037db9961c5
--- /dev/null
+++ b/libcxx/test/iterators/iterator.primitives/iterator.traits/const_pointer.pass.cpp
@@ -0,0 +1,35 @@
+//===----------------------------------------------------------------------===//
+//
+// ΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚThe LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+// <iterator>
+
+// template<class T>
+// struct iterator_traits<const T*>
+// {
+// typedef ptrdiff_t difference_type;
+// typedef T value_type;
+// typedef const T* pointer;
+// typedef const T& reference;
+// typedef random_access_iterator_tag iterator_category;
+// };
+
+#include <iterator>
+#include <type_traits>
+
+struct A {};
+
+int main()
+{
+ typedef std::iterator_traits<const A*> It;
+ static_assert((std::is_same<It::difference_type, std::ptrdiff_t>::value), "");
+ static_assert((std::is_same<It::value_type, A>::value), "");
+ static_assert((std::is_same<It::pointer, const A*>::value), "");
+ static_assert((std::is_same<It::reference, const A&>::value), "");
+ static_assert((std::is_same<It::iterator_category, std::random_access_iterator_tag>::value), "");
+}
diff --git a/libcxx/test/iterators/iterator.primitives/iterator.traits/empty.pass.cpp b/libcxx/test/iterators/iterator.primitives/iterator.traits/empty.pass.cpp
new file mode 100644
index 00000000000..d3bbe5a9158
--- /dev/null
+++ b/libcxx/test/iterators/iterator.primitives/iterator.traits/empty.pass.cpp
@@ -0,0 +1,26 @@
+//===----------------------------------------------------------------------===//
+//
+// ΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚThe LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+// <iterator>
+
+// template<class NotAnIterator>
+// struct iterator_traits
+// {
+// };
+
+#include <iterator>
+
+struct not_an_iterator
+{
+};
+
+int main()
+{
+ typedef std::iterator_traits<not_an_iterator> It;
+}
diff --git a/libcxx/test/iterators/iterator.primitives/iterator.traits/iterator.pass.cpp b/libcxx/test/iterators/iterator.primitives/iterator.traits/iterator.pass.cpp
new file mode 100644
index 00000000000..841b17e0f4d
--- /dev/null
+++ b/libcxx/test/iterators/iterator.primitives/iterator.traits/iterator.pass.cpp
@@ -0,0 +1,43 @@
+//===----------------------------------------------------------------------===//
+//
+// ΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚThe LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+// <iterator>
+
+// template<class Iter>
+// struct iterator_traits
+// {
+// typedef typename Iter::difference_type difference_type;
+// typedef typename Iter::value_type value_type;
+// typedef typename Iter::pointer pointer;
+// typedef typename Iter::reference reference;
+// typedef typename Iter::iterator_category iterator_category;
+// };
+
+#include <iterator>
+#include <type_traits>
+
+struct A {};
+
+struct test_iterator
+{
+ typedef int difference_type;
+ typedef A value_type;
+ typedef A* pointer;
+ typedef A& reference;
+ typedef std::forward_iterator_tag iterator_category;
+};
+
+int main()
+{
+ typedef std::iterator_traits<test_iterator> It;
+ static_assert((std::is_same<It::difference_type, int>::value), "");
+ static_assert((std::is_same<It::value_type, A>::value), "");
+ static_assert((std::is_same<It::pointer, A*>::value), "");
+ static_assert((std::is_same<It::iterator_category, std::forward_iterator_tag>::value), "");
+}
diff --git a/libcxx/test/iterators/iterator.primitives/iterator.traits/pointer.pass.cpp b/libcxx/test/iterators/iterator.primitives/iterator.traits/pointer.pass.cpp
new file mode 100644
index 00000000000..9680f46d9f5
--- /dev/null
+++ b/libcxx/test/iterators/iterator.primitives/iterator.traits/pointer.pass.cpp
@@ -0,0 +1,35 @@
+//===----------------------------------------------------------------------===//
+//
+// ΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚThe LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+// <iterator>
+
+// template<class T>
+// struct iterator_traits<T*>
+// {
+// typedef ptrdiff_t difference_type;
+// typedef T value_type;
+// typedef T* pointer;
+// typedef T& reference;
+// typedef random_access_iterator_tag iterator_category;
+// };
+
+#include <iterator>
+#include <type_traits>
+
+struct A {};
+
+int main()
+{
+ typedef std::iterator_traits<A*> It;
+ static_assert((std::is_same<It::difference_type, std::ptrdiff_t>::value), "");
+ static_assert((std::is_same<It::value_type, A>::value), "");
+ static_assert((std::is_same<It::pointer, A*>::value), "");
+ static_assert((std::is_same<It::reference, A&>::value), "");
+ static_assert((std::is_same<It::iterator_category, std::random_access_iterator_tag>::value), "");
+}
diff --git a/libcxx/test/iterators/iterator.primitives/nothing_to_do.pass.cpp b/libcxx/test/iterators/iterator.primitives/nothing_to_do.pass.cpp
new file mode 100644
index 00000000000..fa4d462f18d
--- /dev/null
+++ b/libcxx/test/iterators/iterator.primitives/nothing_to_do.pass.cpp
@@ -0,0 +1,12 @@
+//===----------------------------------------------------------------------===//
+//
+// ΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚThe LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+int main()
+{
+}
diff --git a/libcxx/test/iterators/iterator.primitives/std.iterator.tags/bidirectional_iterator_tag.pass.cpp b/libcxx/test/iterators/iterator.primitives/std.iterator.tags/bidirectional_iterator_tag.pass.cpp
new file mode 100644
index 00000000000..3d343e38e2b
--- /dev/null
+++ b/libcxx/test/iterators/iterator.primitives/std.iterator.tags/bidirectional_iterator_tag.pass.cpp
@@ -0,0 +1,24 @@
+//===----------------------------------------------------------------------===//
+//
+// ΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚThe LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+// <iterator>
+
+// struct bidirectional_iterator_tag : public forward_iterator_tag {};
+
+#include <iterator>
+#include <type_traits>
+
+int main()
+{
+ std::bidirectional_iterator_tag tag;
+ static_assert((std::is_base_of<std::forward_iterator_tag,
+ std::bidirectional_iterator_tag>::value), "");
+ static_assert((!std::is_base_of<std::output_iterator_tag,
+ std::bidirectional_iterator_tag>::value), "");
+}
diff --git a/libcxx/test/iterators/iterator.primitives/std.iterator.tags/forward_iterator_tag.pass.cpp b/libcxx/test/iterators/iterator.primitives/std.iterator.tags/forward_iterator_tag.pass.cpp
new file mode 100644
index 00000000000..bb1b5b78f36
--- /dev/null
+++ b/libcxx/test/iterators/iterator.primitives/std.iterator.tags/forward_iterator_tag.pass.cpp
@@ -0,0 +1,24 @@
+//===----------------------------------------------------------------------===//
+//
+// ΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚThe LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+// <iterator>
+
+// struct forward_iterator_tag: public input_iterator_tag {};
+
+#include <iterator>
+#include <type_traits>
+
+int main()
+{
+ std::forward_iterator_tag tag;
+ static_assert((std::is_base_of<std::input_iterator_tag,
+ std::forward_iterator_tag>::value), "");
+ static_assert((!std::is_base_of<std::output_iterator_tag,
+ std::forward_iterator_tag>::value), "");
+}
diff --git a/libcxx/test/iterators/iterator.primitives/std.iterator.tags/input_iterator_tag.pass.cpp b/libcxx/test/iterators/iterator.primitives/std.iterator.tags/input_iterator_tag.pass.cpp
new file mode 100644
index 00000000000..ddbe1b288aa
--- /dev/null
+++ b/libcxx/test/iterators/iterator.primitives/std.iterator.tags/input_iterator_tag.pass.cpp
@@ -0,0 +1,22 @@
+//===----------------------------------------------------------------------===//
+//
+// ΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚThe LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+// <iterator>
+
+// struct input_iterator_tag {};
+
+#include <iterator>
+#include <type_traits>
+
+int main()
+{
+ std::input_iterator_tag tag;
+ static_assert((!std::is_base_of<std::output_iterator_tag,
+ std::input_iterator_tag>::value), "");
+}
diff --git a/libcxx/test/iterators/iterator.primitives/std.iterator.tags/output_iterator_tag.pass.cpp b/libcxx/test/iterators/iterator.primitives/std.iterator.tags/output_iterator_tag.pass.cpp
new file mode 100644
index 00000000000..5d75f5b703f
--- /dev/null
+++ b/libcxx/test/iterators/iterator.primitives/std.iterator.tags/output_iterator_tag.pass.cpp
@@ -0,0 +1,22 @@
+//===----------------------------------------------------------------------===//
+//
+// ΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚThe LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+// <iterator>
+
+// struct output_iterator_tag {};
+
+#include <iterator>
+#include <type_traits>
+
+int main()
+{
+ std::output_iterator_tag tag;
+ static_assert((!std::is_base_of<std::input_iterator_tag,
+ std::output_iterator_tag>::value), "");
+}
diff --git a/libcxx/test/iterators/iterator.primitives/std.iterator.tags/random_access_iterator_tag.pass.cpp b/libcxx/test/iterators/iterator.primitives/std.iterator.tags/random_access_iterator_tag.pass.cpp
new file mode 100644
index 00000000000..a6ec848ecb6
--- /dev/null
+++ b/libcxx/test/iterators/iterator.primitives/std.iterator.tags/random_access_iterator_tag.pass.cpp
@@ -0,0 +1,24 @@
+//===----------------------------------------------------------------------===//
+//
+// ΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚThe LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+// <iterator>
+
+// struct random_access_iterator_tag : public bidirectional_iterator_tag {};
+
+#include <iterator>
+#include <type_traits>
+
+int main()
+{
+ std::random_access_iterator_tag tag;
+ static_assert((std::is_base_of<std::bidirectional_iterator_tag,
+ std::random_access_iterator_tag>::value), "");
+ static_assert((!std::is_base_of<std::output_iterator_tag,
+ std::random_access_iterator_tag>::value), "");
+}
diff --git a/libcxx/test/iterators/iterator.requirements/bidirectional.iterators/nothing_to_do.pass.cpp b/libcxx/test/iterators/iterator.requirements/bidirectional.iterators/nothing_to_do.pass.cpp
new file mode 100644
index 00000000000..fa4d462f18d
--- /dev/null
+++ b/libcxx/test/iterators/iterator.requirements/bidirectional.iterators/nothing_to_do.pass.cpp
@@ -0,0 +1,12 @@
+//===----------------------------------------------------------------------===//
+//
+// ΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚThe LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+int main()
+{
+}
diff --git a/libcxx/test/iterators/iterator.requirements/forward.iterators/nothing_to_do.pass.cpp b/libcxx/test/iterators/iterator.requirements/forward.iterators/nothing_to_do.pass.cpp
new file mode 100644
index 00000000000..fa4d462f18d
--- /dev/null
+++ b/libcxx/test/iterators/iterator.requirements/forward.iterators/nothing_to_do.pass.cpp
@@ -0,0 +1,12 @@
+//===----------------------------------------------------------------------===//
+//
+// ΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚThe LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+int main()
+{
+}
diff --git a/libcxx/test/iterators/iterator.requirements/input.iterators/nothing_to_do.pass.cpp b/libcxx/test/iterators/iterator.requirements/input.iterators/nothing_to_do.pass.cpp
new file mode 100644
index 00000000000..fa4d462f18d
--- /dev/null
+++ b/libcxx/test/iterators/iterator.requirements/input.iterators/nothing_to_do.pass.cpp
@@ -0,0 +1,12 @@
+//===----------------------------------------------------------------------===//
+//
+// ΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚThe LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+int main()
+{
+}
diff --git a/libcxx/test/iterators/iterator.requirements/iterator.iterators/nothing_to_do.pass.cpp b/libcxx/test/iterators/iterator.requirements/iterator.iterators/nothing_to_do.pass.cpp
new file mode 100644
index 00000000000..fa4d462f18d
--- /dev/null
+++ b/libcxx/test/iterators/iterator.requirements/iterator.iterators/nothing_to_do.pass.cpp
@@ -0,0 +1,12 @@
+//===----------------------------------------------------------------------===//
+//
+// ΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚThe LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+int main()
+{
+}
diff --git a/libcxx/test/iterators/iterator.requirements/iterator.requirements.general/nothing_to_do.pass.cpp b/libcxx/test/iterators/iterator.requirements/iterator.requirements.general/nothing_to_do.pass.cpp
new file mode 100644
index 00000000000..fa4d462f18d
--- /dev/null
+++ b/libcxx/test/iterators/iterator.requirements/iterator.requirements.general/nothing_to_do.pass.cpp
@@ -0,0 +1,12 @@
+//===----------------------------------------------------------------------===//
+//
+// ΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚThe LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+int main()
+{
+}
diff --git a/libcxx/test/iterators/iterator.requirements/nothing_to_do.pass.cpp b/libcxx/test/iterators/iterator.requirements/nothing_to_do.pass.cpp
new file mode 100644
index 00000000000..fa4d462f18d
--- /dev/null
+++ b/libcxx/test/iterators/iterator.requirements/nothing_to_do.pass.cpp
@@ -0,0 +1,12 @@
+//===----------------------------------------------------------------------===//
+//
+// ΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚThe LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+int main()
+{
+}
diff --git a/libcxx/test/iterators/iterator.requirements/output.iterators/nothing_to_do.pass.cpp b/libcxx/test/iterators/iterator.requirements/output.iterators/nothing_to_do.pass.cpp
new file mode 100644
index 00000000000..fa4d462f18d
--- /dev/null
+++ b/libcxx/test/iterators/iterator.requirements/output.iterators/nothing_to_do.pass.cpp
@@ -0,0 +1,12 @@
+//===----------------------------------------------------------------------===//
+//
+// ΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚThe LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+int main()
+{
+}
diff --git a/libcxx/test/iterators/iterator.requirements/random.access.iterators/nothing_to_do.pass.cpp b/libcxx/test/iterators/iterator.requirements/random.access.iterators/nothing_to_do.pass.cpp
new file mode 100644
index 00000000000..fa4d462f18d
--- /dev/null
+++ b/libcxx/test/iterators/iterator.requirements/random.access.iterators/nothing_to_do.pass.cpp
@@ -0,0 +1,12 @@
+//===----------------------------------------------------------------------===//
+//
+// ΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚThe LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+int main()
+{
+}
diff --git a/libcxx/test/iterators/iterator.synopsis/nothing_to_do.pass.cpp b/libcxx/test/iterators/iterator.synopsis/nothing_to_do.pass.cpp
new file mode 100644
index 00000000000..fa4d462f18d
--- /dev/null
+++ b/libcxx/test/iterators/iterator.synopsis/nothing_to_do.pass.cpp
@@ -0,0 +1,12 @@
+//===----------------------------------------------------------------------===//
+//
+// ΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚThe LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+int main()
+{
+}
diff --git a/libcxx/test/iterators/iterators.general/nothing_to_do.pass.cpp b/libcxx/test/iterators/iterators.general/nothing_to_do.pass.cpp
new file mode 100644
index 00000000000..fa4d462f18d
--- /dev/null
+++ b/libcxx/test/iterators/iterators.general/nothing_to_do.pass.cpp
@@ -0,0 +1,12 @@
+//===----------------------------------------------------------------------===//
+//
+// ΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚThe LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+int main()
+{
+}
diff --git a/libcxx/test/iterators/iterators.h b/libcxx/test/iterators/iterators.h
new file mode 100644
index 00000000000..85332ac725d
--- /dev/null
+++ b/libcxx/test/iterators/iterators.h
@@ -0,0 +1,251 @@
+#ifndef ITERATORS_H
+#define ITERATORS_H
+
+#include <iterator>
+
+template <class It>
+class input_iterator
+{
+ It it_;
+
+ template <class U> friend class input_iterator;
+public:
+ typedef std::input_iterator_tag iterator_category;
+ typedef typename std::iterator_traits<It>::value_type value_type;
+ typedef typename std::iterator_traits<It>::difference_type difference_type;
+ typedef It pointer;
+ typedef typename std::iterator_traits<It>::reference reference;
+
+ It base() const {return it_;}
+
+ input_iterator() : it_() {}
+ explicit input_iterator(It it) : it_(it) {}
+ template <class U>
+ input_iterator(const input_iterator<U>& u) :it_(u.it_) {}
+
+ reference operator*() const {return *it_;}
+ pointer operator->() const {return it_;}
+
+ input_iterator& operator++() {++it_; return *this;}
+ input_iterator operator++(int)
+ {input_iterator tmp(*this); ++(*this); return tmp;}
+
+ friend bool operator==(const input_iterator& x, const input_iterator& y)
+ {return x.it_ == y.it_;}
+ friend bool operator!=(const input_iterator& x, const input_iterator& y)
+ {return !(x == y);}
+};
+
+template <class T, class U>
+inline
+bool
+operator==(const input_iterator<T>& x, const input_iterator<U>& y)
+{
+ return x.base() == y.base();
+}
+
+template <class T, class U>
+inline
+bool
+operator!=(const input_iterator<T>& x, const input_iterator<U>& y)
+{
+ return !(x == y);
+}
+
+template <class It>
+class forward_iterator
+{
+ It it_;
+
+ template <class U> friend class forward_iterator;
+public:
+ typedef std::forward_iterator_tag iterator_category;
+ typedef typename std::iterator_traits<It>::value_type value_type;
+ typedef typename std::iterator_traits<It>::difference_type difference_type;
+ typedef It pointer;
+ typedef typename std::iterator_traits<It>::reference reference;
+
+ It base() const {return it_;}
+
+ forward_iterator() : it_() {}
+ explicit forward_iterator(It it) : it_(it) {}
+ template <class U>
+ forward_iterator(const forward_iterator<U>& u) :it_(u.it_) {}
+
+ reference operator*() const {return *it_;}
+ pointer operator->() const {return it_;}
+
+ forward_iterator& operator++() {++it_; return *this;}
+ forward_iterator operator++(int)
+ {forward_iterator tmp(*this); ++(*this); return tmp;}
+
+ friend bool operator==(const forward_iterator& x, const forward_iterator& y)
+ {return x.it_ == y.it_;}
+ friend bool operator!=(const forward_iterator& x, const forward_iterator& y)
+ {return !(x == y);}
+};
+
+template <class T, class U>
+inline
+bool
+operator==(const forward_iterator<T>& x, const forward_iterator<U>& y)
+{
+ return x.base() == y.base();
+}
+
+template <class T, class U>
+inline
+bool
+operator!=(const forward_iterator<T>& x, const forward_iterator<U>& y)
+{
+ return !(x == y);
+}
+
+template <class It>
+class bidirectional_iterator
+{
+ It it_;
+
+ template <class U> friend class bidirectional_iterator;
+public:
+ typedef std::bidirectional_iterator_tag iterator_category;
+ typedef typename std::iterator_traits<It>::value_type value_type;
+ typedef typename std::iterator_traits<It>::difference_type difference_type;
+ typedef It pointer;
+ typedef typename std::iterator_traits<It>::reference reference;
+
+ It base() const {return it_;}
+
+ bidirectional_iterator() : it_() {}
+ explicit bidirectional_iterator(It it) : it_(it) {}
+ template <class U>
+ bidirectional_iterator(const bidirectional_iterator<U>& u) :it_(u.it_) {}
+
+ reference operator*() const {return *it_;}
+ pointer operator->() const {return it_;}
+
+ bidirectional_iterator& operator++() {++it_; return *this;}
+ bidirectional_iterator operator++(int)
+ {bidirectional_iterator tmp(*this); ++(*this); return tmp;}
+
+ bidirectional_iterator& operator--() {--it_; return *this;}
+ bidirectional_iterator operator--(int)
+ {bidirectional_iterator tmp(*this); --(*this); return tmp;}
+};
+
+template <class T, class U>
+inline
+bool
+operator==(const bidirectional_iterator<T>& x, const bidirectional_iterator<U>& y)
+{
+ return x.base() == y.base();
+}
+
+template <class T, class U>
+inline
+bool
+operator!=(const bidirectional_iterator<T>& x, const bidirectional_iterator<U>& y)
+{
+ return !(x == y);
+}
+
+template <class It>
+class random_access_iterator
+{
+ It it_;
+
+ template <class U> friend class random_access_iterator;
+public:
+ typedef std::random_access_iterator_tag iterator_category;
+ typedef typename std::iterator_traits<It>::value_type value_type;
+ typedef typename std::iterator_traits<It>::difference_type difference_type;
+ typedef It pointer;
+ typedef typename std::iterator_traits<It>::reference reference;
+
+ It base() const {return it_;}
+
+ random_access_iterator() : it_() {}
+ explicit random_access_iterator(It it) : it_(it) {}
+ template <class U>
+ random_access_iterator(const random_access_iterator<U>& u) :it_(u.it_) {}
+
+ reference operator*() const {return *it_;}
+ pointer operator->() const {return it_;}
+
+ random_access_iterator& operator++() {++it_; return *this;}
+ random_access_iterator operator++(int)
+ {random_access_iterator tmp(*this); ++(*this); return tmp;}
+
+ random_access_iterator& operator--() {--it_; return *this;}
+ random_access_iterator operator--(int)
+ {random_access_iterator tmp(*this); --(*this); return tmp;}
+
+ random_access_iterator& operator+=(difference_type n) {it_ += n; return *this;}
+ random_access_iterator operator+(difference_type n) const
+ {random_access_iterator tmp(*this); tmp += n; return tmp;}
+ friend random_access_iterator operator+(difference_type n, random_access_iterator x)
+ {x += n; return x;}
+ random_access_iterator& operator-=(difference_type n) {return *this += -n;}
+ random_access_iterator operator-(difference_type n) const
+ {random_access_iterator tmp(*this); tmp -= n; return tmp;}
+
+ reference operator[](difference_type n) const {return it_[n];}
+};
+
+template <class T, class U>
+inline
+bool
+operator==(const random_access_iterator<T>& x, const random_access_iterator<U>& y)
+{
+ return x.base() == y.base();
+}
+
+template <class T, class U>
+inline
+bool
+operator!=(const random_access_iterator<T>& x, const random_access_iterator<U>& y)
+{
+ return !(x == y);
+}
+
+template <class T, class U>
+inline
+bool
+operator<(const random_access_iterator<T>& x, const random_access_iterator<U>& y)
+{
+ return x.base() < y.base();
+}
+
+template <class T, class U>
+inline
+bool
+operator<=(const random_access_iterator<T>& x, const random_access_iterator<U>& y)
+{
+ return !(y < x);
+}
+
+template <class T, class U>
+inline
+bool
+operator>(const random_access_iterator<T>& x, const random_access_iterator<U>& y)
+{
+ return y < x;
+}
+
+template <class T, class U>
+inline
+bool
+operator>=(const random_access_iterator<T>& x, const random_access_iterator<U>& y)
+{
+ return !(x < y);
+}
+
+template <class T, class U>
+inline
+typename std::iterator_traits<T>::difference_type
+operator-(const random_access_iterator<T>& x, const random_access_iterator<U>& y)
+{
+ return x.base() - y.base();
+}
+
+#endif
diff --git a/libcxx/test/iterators/predef.iterators/insert.iterators/back.insert.iter.ops/back.insert.iter.cons/container.fail.cpp b/libcxx/test/iterators/predef.iterators/insert.iterators/back.insert.iter.ops/back.insert.iter.cons/container.fail.cpp
new file mode 100644
index 00000000000..2e7a56cd1e7
--- /dev/null
+++ b/libcxx/test/iterators/predef.iterators/insert.iterators/back.insert.iter.ops/back.insert.iter.cons/container.fail.cpp
@@ -0,0 +1,24 @@
+//===----------------------------------------------------------------------===//
+//
+// ΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚThe LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+// <iterator>
+
+// back_insert_iterator
+
+// explicit back_insert_iterator(Cont& x);
+
+// test for explicit
+
+#include <iterator>
+#include <vector>
+
+int main()
+{
+ std::back_insert_iterator<std::vector<int> > i = std::vector<int>();
+}
diff --git a/libcxx/test/iterators/predef.iterators/insert.iterators/back.insert.iter.ops/back.insert.iter.cons/container.pass.cpp b/libcxx/test/iterators/predef.iterators/insert.iterators/back.insert.iter.ops/back.insert.iter.cons/container.pass.cpp
new file mode 100644
index 00000000000..f213484141a
--- /dev/null
+++ b/libcxx/test/iterators/predef.iterators/insert.iterators/back.insert.iter.ops/back.insert.iter.cons/container.pass.cpp
@@ -0,0 +1,29 @@
+//===----------------------------------------------------------------------===//
+//
+// ΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚThe LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+// <iterator>
+
+// back_insert_iterator
+
+// explicit back_insert_iterator(Cont& x);
+
+#include <iterator>
+#include <vector>
+
+template <class C>
+void
+test(C c)
+{
+ std::back_insert_iterator<C> i(c);
+}
+
+int main()
+{
+ test(std::vector<int>());
+}
diff --git a/libcxx/test/iterators/predef.iterators/insert.iterators/back.insert.iter.ops/back.insert.iter.op++/post.pass.cpp b/libcxx/test/iterators/predef.iterators/insert.iterators/back.insert.iter.ops/back.insert.iter.op++/post.pass.cpp
new file mode 100644
index 00000000000..ff95280d024
--- /dev/null
+++ b/libcxx/test/iterators/predef.iterators/insert.iterators/back.insert.iter.ops/back.insert.iter.op++/post.pass.cpp
@@ -0,0 +1,34 @@
+//===----------------------------------------------------------------------===//
+//
+// ΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚThe LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+// <iterator>
+
+// back_insert_iterator
+
+// back_insert_iterator<Cont> operator++(int);
+
+#include <iterator>
+#include <vector>
+#include <cassert>
+
+template <class C>
+void
+test(C c)
+{
+ std::back_insert_iterator<C> i(c);
+ std::back_insert_iterator<C> r = i++;
+ r = 0;
+ assert(c.size() == 1);
+ assert(c.back() == 0);
+}
+
+int main()
+{
+ test(std::vector<int>());
+}
diff --git a/libcxx/test/iterators/predef.iterators/insert.iterators/back.insert.iter.ops/back.insert.iter.op++/pre.pass.cpp b/libcxx/test/iterators/predef.iterators/insert.iterators/back.insert.iter.ops/back.insert.iter.op++/pre.pass.cpp
new file mode 100644
index 00000000000..3e80c6cdc23
--- /dev/null
+++ b/libcxx/test/iterators/predef.iterators/insert.iterators/back.insert.iter.ops/back.insert.iter.op++/pre.pass.cpp
@@ -0,0 +1,32 @@
+//===----------------------------------------------------------------------===//
+//
+// ΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚThe LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+// <iterator>
+
+// back_insert_iterator
+
+// back_insert_iterator<Cont>& operator++();
+
+#include <iterator>
+#include <vector>
+#include <cassert>
+
+template <class C>
+void
+test(C c)
+{
+ std::back_insert_iterator<C> i(c);
+ std::back_insert_iterator<C>& r = ++i;
+ assert(&r == &i);
+}
+
+int main()
+{
+ test(std::vector<int>());
+}
diff --git a/libcxx/test/iterators/predef.iterators/insert.iterators/back.insert.iter.ops/back.insert.iter.op=/lv_value.pass.cpp b/libcxx/test/iterators/predef.iterators/insert.iterators/back.insert.iter.ops/back.insert.iter.op=/lv_value.pass.cpp
new file mode 100644
index 00000000000..eea220cd870
--- /dev/null
+++ b/libcxx/test/iterators/predef.iterators/insert.iterators/back.insert.iter.ops/back.insert.iter.op=/lv_value.pass.cpp
@@ -0,0 +1,46 @@
+//===----------------------------------------------------------------------===//
+//
+// ΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚThe LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+// <iterator>
+
+// back_insert_iterator
+
+// requires CopyConstructible<Cont::value_type>
+// back_insert_iterator<Cont>&
+// operator=(const Cont::value_type& value);
+
+#include <iterator>
+#include <vector>
+#include <cassert>
+
+template <class C>
+void
+test(C c)
+{
+ const typename C::value_type v = typename C::value_type();
+ std::back_insert_iterator<C> i(c);
+ i = v;
+ assert(c.back() == v);
+}
+
+class Copyable
+{
+ int data_;
+public:
+ Copyable() : data_(0) {}
+ ~Copyable() {data_ = -1;}
+
+ friend bool operator==(const Copyable& x, const Copyable& y)
+ {return x.data_ == y.data_;}
+};
+
+int main()
+{
+ test(std::vector<Copyable>());
+}
diff --git a/libcxx/test/iterators/predef.iterators/insert.iterators/back.insert.iter.ops/back.insert.iter.op=/rv_value.pass.cpp b/libcxx/test/iterators/predef.iterators/insert.iterators/back.insert.iter.ops/back.insert.iter.op=/rv_value.pass.cpp
new file mode 100644
index 00000000000..8b0035472a3
--- /dev/null
+++ b/libcxx/test/iterators/predef.iterators/insert.iterators/back.insert.iter.ops/back.insert.iter.op=/rv_value.pass.cpp
@@ -0,0 +1,42 @@
+//===----------------------------------------------------------------------===//
+//
+// ΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚThe LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+// <iterator>
+
+// back_insert_iterator
+
+// requires CopyConstructible<Cont::value_type>
+// back_insert_iterator<Cont>&
+// operator=(Cont::value_type&& value);
+
+#include <iterator>
+
+#ifdef _LIBCPP_MOVE
+
+#include <vector>
+#include <memory>
+#include <cassert>
+
+template <class C>
+void
+test(C c)
+{
+ std::back_insert_iterator<C> i(c);
+ i = typename C::value_type();
+ assert(c.back() == typename C::value_type());
+}
+
+#endif
+
+int main()
+{
+#ifdef _LIBCPP_MOVE
+ test(std::vector<std::unique_ptr<int> >());
+#endif
+}
diff --git a/libcxx/test/iterators/predef.iterators/insert.iterators/back.insert.iter.ops/back.insert.iter.op_astrk/test.pass.cpp b/libcxx/test/iterators/predef.iterators/insert.iterators/back.insert.iter.ops/back.insert.iter.op_astrk/test.pass.cpp
new file mode 100644
index 00000000000..437d500eb2b
--- /dev/null
+++ b/libcxx/test/iterators/predef.iterators/insert.iterators/back.insert.iter.ops/back.insert.iter.op_astrk/test.pass.cpp
@@ -0,0 +1,32 @@
+//===----------------------------------------------------------------------===//
+//
+// ΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚThe LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+// <iterator>
+
+// back_insert_iterator
+
+// back_insert_iterator<Cont>& operator*();
+
+#include <iterator>
+#include <vector>
+#include <cassert>
+
+template <class C>
+void
+test(C c)
+{
+ std::back_insert_iterator<C> i(c);
+ std::back_insert_iterator<C>& r = *i;
+ assert(&r == &i);
+}
+
+int main()
+{
+ test(std::vector<int>());
+}
diff --git a/libcxx/test/iterators/predef.iterators/insert.iterators/back.insert.iter.ops/back.inserter/test.pass.cpp b/libcxx/test/iterators/predef.iterators/insert.iterators/back.insert.iter.ops/back.inserter/test.pass.cpp
new file mode 100644
index 00000000000..ec568aaaa50
--- /dev/null
+++ b/libcxx/test/iterators/predef.iterators/insert.iterators/back.insert.iter.ops/back.inserter/test.pass.cpp
@@ -0,0 +1,33 @@
+//===----------------------------------------------------------------------===//
+//
+// ΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚThe LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+// <iterator>
+
+// template <BackInsertionContainer Cont>
+// back_insert_iterator<Cont>
+// back_inserter(Cont& x);
+
+#include <iterator>
+#include <vector>
+#include <cassert>
+
+template <class C>
+void
+test(C c)
+{
+ std::back_insert_iterator<C> i = std::back_inserter(c);
+ i = 0;
+ assert(c.size() == 1);
+ assert(c.back() == 0);
+}
+
+int main()
+{
+ test(std::vector<int>());
+}
diff --git a/libcxx/test/iterators/predef.iterators/insert.iterators/back.insert.iter.ops/nothing_to_do.pass.cpp b/libcxx/test/iterators/predef.iterators/insert.iterators/back.insert.iter.ops/nothing_to_do.pass.cpp
new file mode 100644
index 00000000000..fa4d462f18d
--- /dev/null
+++ b/libcxx/test/iterators/predef.iterators/insert.iterators/back.insert.iter.ops/nothing_to_do.pass.cpp
@@ -0,0 +1,12 @@
+//===----------------------------------------------------------------------===//
+//
+// ΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚThe LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+int main()
+{
+}
diff --git a/libcxx/test/iterators/predef.iterators/insert.iterators/back.insert.iterator/types.pass.cpp b/libcxx/test/iterators/predef.iterators/insert.iterators/back.insert.iterator/types.pass.cpp
new file mode 100644
index 00000000000..4efd53e0cf0
--- /dev/null
+++ b/libcxx/test/iterators/predef.iterators/insert.iterators/back.insert.iterator/types.pass.cpp
@@ -0,0 +1,59 @@
+//===----------------------------------------------------------------------===//
+//
+// ΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚThe LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+// <iterator>
+
+// back_insert_iterator
+
+// Test nested types and data member:
+
+// template <BackInsertionContainer Cont>
+// class back_insert_iterator {
+// protected:
+// Cont* container;
+// public:
+// typedef Cont container_type;
+// typedef void value_type;
+// typedef void difference_type;
+// typedef back_insert_iterator<Cont>& reference;
+// typedef void pointer;
+// };
+
+#include <iterator>
+#include <type_traits>
+#include <vector>
+
+template <class C>
+struct find_container
+ : private std::back_insert_iterator<C>
+{
+ explicit find_container(C& c) : std::back_insert_iterator<C>(c) {}
+ void test() {this->container = 0;}
+};
+
+template <class C>
+void
+test()
+{
+ typedef std::back_insert_iterator<C> R;
+ C c;
+ find_container<C> q(c);
+ q.test();
+ static_assert((std::is_same<typename R::container_type, C>::value), "");
+ static_assert((std::is_same<typename R::value_type, void>::value), "");
+ static_assert((std::is_same<typename R::difference_type, void>::value), "");
+ static_assert((std::is_same<typename R::reference, R&>::value), "");
+ static_assert((std::is_same<typename R::pointer, void>::value), "");
+ static_assert((std::is_same<typename R::iterator_category, std::output_iterator_tag>::value), "");
+}
+
+int main()
+{
+ test<std::vector<int> >();
+}
diff --git a/libcxx/test/iterators/predef.iterators/insert.iterators/front.insert.iter.ops/front.insert.iter.cons/container.fail.cpp b/libcxx/test/iterators/predef.iterators/insert.iterators/front.insert.iter.ops/front.insert.iter.cons/container.fail.cpp
new file mode 100644
index 00000000000..a9cf087d387
--- /dev/null
+++ b/libcxx/test/iterators/predef.iterators/insert.iterators/front.insert.iter.ops/front.insert.iter.cons/container.fail.cpp
@@ -0,0 +1,24 @@
+//===----------------------------------------------------------------------===//
+//
+// ΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚThe LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+// <iterator>
+
+// front_insert_iterator
+
+// explicit front_insert_iterator(Cont& x);
+
+// test for explicit
+
+#include <iterator>
+#include <list>
+
+int main()
+{
+ std::front_insert_iterator<std::list<int> > i = std::list<int>();
+}
diff --git a/libcxx/test/iterators/predef.iterators/insert.iterators/front.insert.iter.ops/front.insert.iter.cons/container.pass.cpp b/libcxx/test/iterators/predef.iterators/insert.iterators/front.insert.iter.ops/front.insert.iter.cons/container.pass.cpp
new file mode 100644
index 00000000000..5b36b20dc18
--- /dev/null
+++ b/libcxx/test/iterators/predef.iterators/insert.iterators/front.insert.iter.ops/front.insert.iter.cons/container.pass.cpp
@@ -0,0 +1,29 @@
+//===----------------------------------------------------------------------===//
+//
+// ΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚThe LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+// <iterator>
+
+// front_insert_iterator
+
+// explicit front_insert_iterator(Cont& x);
+
+#include <iterator>
+#include <list>
+
+template <class C>
+void
+test(C c)
+{
+ std::front_insert_iterator<C> i(c);
+}
+
+int main()
+{
+ test(std::list<int>());
+}
diff --git a/libcxx/test/iterators/predef.iterators/insert.iterators/front.insert.iter.ops/front.insert.iter.op++/post.pass.cpp b/libcxx/test/iterators/predef.iterators/insert.iterators/front.insert.iter.ops/front.insert.iter.op++/post.pass.cpp
new file mode 100644
index 00000000000..922789c0593
--- /dev/null
+++ b/libcxx/test/iterators/predef.iterators/insert.iterators/front.insert.iter.ops/front.insert.iter.op++/post.pass.cpp
@@ -0,0 +1,34 @@
+//===----------------------------------------------------------------------===//
+//
+// ΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚThe LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+// <iterator>
+
+// front_insert_iterator
+
+// front_insert_iterator<Cont> operator++(int);
+
+#include <iterator>
+#include <list>
+#include <cassert>
+
+template <class C>
+void
+test(C c)
+{
+ std::front_insert_iterator<C> i(c);
+ std::front_insert_iterator<C> r = i++;
+ r = 0;
+ assert(c.size() == 1);
+ assert(c.back() == 0);
+}
+
+int main()
+{
+ test(std::list<int>());
+}
diff --git a/libcxx/test/iterators/predef.iterators/insert.iterators/front.insert.iter.ops/front.insert.iter.op++/pre.pass.cpp b/libcxx/test/iterators/predef.iterators/insert.iterators/front.insert.iter.ops/front.insert.iter.op++/pre.pass.cpp
new file mode 100644
index 00000000000..bf582a8f189
--- /dev/null
+++ b/libcxx/test/iterators/predef.iterators/insert.iterators/front.insert.iter.ops/front.insert.iter.op++/pre.pass.cpp
@@ -0,0 +1,32 @@
+//===----------------------------------------------------------------------===//
+//
+// ΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚThe LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+// <iterator>
+
+// front_insert_iterator
+
+// front_insert_iterator<Cont>& operator++();
+
+#include <iterator>
+#include <list>
+#include <cassert>
+
+template <class C>
+void
+test(C c)
+{
+ std::front_insert_iterator<C> i(c);
+ std::front_insert_iterator<C>& r = ++i;
+ assert(&r == &i);
+}
+
+int main()
+{
+ test(std::list<int>());
+}
diff --git a/libcxx/test/iterators/predef.iterators/insert.iterators/front.insert.iter.ops/front.insert.iter.op=/lv_value.pass.cpp b/libcxx/test/iterators/predef.iterators/insert.iterators/front.insert.iter.ops/front.insert.iter.op=/lv_value.pass.cpp
new file mode 100644
index 00000000000..968a171e5d7
--- /dev/null
+++ b/libcxx/test/iterators/predef.iterators/insert.iterators/front.insert.iter.ops/front.insert.iter.op=/lv_value.pass.cpp
@@ -0,0 +1,45 @@
+//===----------------------------------------------------------------------===//
+//
+// ΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚThe LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+// <iterator>
+
+// front_insert_iterator
+
+// front_insert_iterator<Cont>&
+// operator=(const Cont::value_type& value);
+
+#include <iterator>
+#include <list>
+#include <cassert>
+
+template <class C>
+void
+test(C c)
+{
+ const typename C::value_type v = typename C::value_type();
+ std::front_insert_iterator<C> i(c);
+ i = v;
+ assert(c.front() == v);
+}
+
+class Copyable
+{
+ int data_;
+public:
+ Copyable() : data_(0) {}
+ ~Copyable() {data_ = -1;}
+
+ friend bool operator==(const Copyable& x, const Copyable& y)
+ {return x.data_ == y.data_;}
+};
+
+int main()
+{
+ test(std::list<Copyable>());
+}
diff --git a/libcxx/test/iterators/predef.iterators/insert.iterators/front.insert.iter.ops/front.insert.iter.op=/rv_value.pass.cpp b/libcxx/test/iterators/predef.iterators/insert.iterators/front.insert.iter.ops/front.insert.iter.op=/rv_value.pass.cpp
new file mode 100644
index 00000000000..48e54b5a221
--- /dev/null
+++ b/libcxx/test/iterators/predef.iterators/insert.iterators/front.insert.iter.ops/front.insert.iter.op=/rv_value.pass.cpp
@@ -0,0 +1,41 @@
+//===----------------------------------------------------------------------===//
+//
+// ΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚThe LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+// <iterator>
+
+// front_insert_iterator
+
+// front_insert_iterator<Cont>&
+// operator=(Cont::value_type&& value);
+
+#include <iterator>
+
+#ifdef _LIBCPP_MOVE
+
+#include <list>
+#include <memory>
+#include <cassert>
+
+template <class C>
+void
+test(C c)
+{
+ std::front_insert_iterator<C> i(c);
+ i = typename C::value_type();
+ assert(c.front() == typename C::value_type());
+}
+
+#endif
+
+int main()
+{
+#ifdef _LIBCPP_MOVE
+ test(std::list<std::unique_ptr<int> >());
+#endif
+}
diff --git a/libcxx/test/iterators/predef.iterators/insert.iterators/front.insert.iter.ops/front.insert.iter.op_astrk/test.pass.cpp b/libcxx/test/iterators/predef.iterators/insert.iterators/front.insert.iter.ops/front.insert.iter.op_astrk/test.pass.cpp
new file mode 100644
index 00000000000..8d886c55619
--- /dev/null
+++ b/libcxx/test/iterators/predef.iterators/insert.iterators/front.insert.iter.ops/front.insert.iter.op_astrk/test.pass.cpp
@@ -0,0 +1,32 @@
+//===----------------------------------------------------------------------===//
+//
+// ΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚThe LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+// <iterator>
+
+// front_insert_iterator
+
+// front_insert_iterator<Cont>& operator*();
+
+#include <iterator>
+#include <list>
+#include <cassert>
+
+template <class C>
+void
+test(C c)
+{
+ std::front_insert_iterator<C> i(c);
+ std::front_insert_iterator<C>& r = *i;
+ assert(&r == &i);
+}
+
+int main()
+{
+ test(std::list<int>());
+}
diff --git a/libcxx/test/iterators/predef.iterators/insert.iterators/front.insert.iter.ops/front.inserter/test.pass.cpp b/libcxx/test/iterators/predef.iterators/insert.iterators/front.insert.iter.ops/front.inserter/test.pass.cpp
new file mode 100644
index 00000000000..a218d02fd49
--- /dev/null
+++ b/libcxx/test/iterators/predef.iterators/insert.iterators/front.insert.iter.ops/front.inserter/test.pass.cpp
@@ -0,0 +1,33 @@
+//===----------------------------------------------------------------------===//
+//
+// ΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚThe LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+// <iterator>
+
+// template <BackInsertionContainer Cont>
+// front_insert_iterator<Cont>
+// front_inserter(Cont& x);
+
+#include <iterator>
+#include <list>
+#include <cassert>
+
+template <class C>
+void
+test(C c)
+{
+ std::front_insert_iterator<C> i = std::front_inserter(c);
+ i = 0;
+ assert(c.size() == 1);
+ assert(c.front() == 0);
+}
+
+int main()
+{
+ test(std::list<int>());
+}
diff --git a/libcxx/test/iterators/predef.iterators/insert.iterators/front.insert.iter.ops/nothing_to_do.pass.cpp b/libcxx/test/iterators/predef.iterators/insert.iterators/front.insert.iter.ops/nothing_to_do.pass.cpp
new file mode 100644
index 00000000000..fa4d462f18d
--- /dev/null
+++ b/libcxx/test/iterators/predef.iterators/insert.iterators/front.insert.iter.ops/nothing_to_do.pass.cpp
@@ -0,0 +1,12 @@
+//===----------------------------------------------------------------------===//
+//
+// ΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚThe LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+int main()
+{
+}
diff --git a/libcxx/test/iterators/predef.iterators/insert.iterators/front.insert.iterator/types.pass.cpp b/libcxx/test/iterators/predef.iterators/insert.iterators/front.insert.iterator/types.pass.cpp
new file mode 100644
index 00000000000..ebbc4ab85d4
--- /dev/null
+++ b/libcxx/test/iterators/predef.iterators/insert.iterators/front.insert.iterator/types.pass.cpp
@@ -0,0 +1,60 @@
+//===----------------------------------------------------------------------===//
+//
+// ΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚThe LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+// <iterator>
+
+// front_insert_iterator
+
+// Test nested types and data member:
+
+// template <class Container>
+// class front_insert_iterator {
+// protected:
+// Container* container;
+// public:
+// typedef Container container_type;
+// typedef void value_type;
+// typedef void difference_type;
+// typedef front_insert_iterator<Cont>& reference;
+// typedef void pointer;
+// typedef output_iterator_tag iterator_category;
+// };
+
+#include <iterator>
+#include <type_traits>
+#include <vector>
+
+template <class C>
+struct find_container
+ : private std::front_insert_iterator<C>
+{
+ explicit find_container(C& c) : std::front_insert_iterator<C>(c) {}
+ void test() {this->container = 0;}
+};
+
+template <class C>
+void
+test()
+{
+ typedef std::front_insert_iterator<C> R;
+ C c;
+ find_container<C> q(c);
+ q.test();
+ static_assert((std::is_same<typename R::container_type, C>::value), "");
+ static_assert((std::is_same<typename R::value_type, void>::value), "");
+ static_assert((std::is_same<typename R::difference_type, void>::value), "");
+ static_assert((std::is_same<typename R::reference, R&>::value), "");
+ static_assert((std::is_same<typename R::pointer, void>::value), "");
+ static_assert((std::is_same<typename R::iterator_category, std::output_iterator_tag>::value), "");
+}
+
+int main()
+{
+ test<std::vector<int> >();
+}
diff --git a/libcxx/test/iterators/predef.iterators/insert.iterators/insert.iter.ops/insert.iter.cons/test.pass.cpp b/libcxx/test/iterators/predef.iterators/insert.iterators/insert.iter.ops/insert.iter.cons/test.pass.cpp
new file mode 100644
index 00000000000..7c803df4395
--- /dev/null
+++ b/libcxx/test/iterators/predef.iterators/insert.iterators/insert.iter.ops/insert.iter.cons/test.pass.cpp
@@ -0,0 +1,29 @@
+//===----------------------------------------------------------------------===//
+//
+// ΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚThe LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+// <iterator>
+
+// insert_iterator
+
+// insert_iterator(Cont& x, Cont::iterator i);
+
+#include <iterator>
+#include <vector>
+
+template <class C>
+void
+test(C c)
+{
+ std::insert_iterator<C> i(c, c.begin());
+}
+
+int main()
+{
+ test(std::vector<int>());
+}
diff --git a/libcxx/test/iterators/predef.iterators/insert.iterators/insert.iter.ops/insert.iter.op++/post.pass.cpp b/libcxx/test/iterators/predef.iterators/insert.iterators/insert.iter.ops/insert.iter.op++/post.pass.cpp
new file mode 100644
index 00000000000..0b00c9103e8
--- /dev/null
+++ b/libcxx/test/iterators/predef.iterators/insert.iterators/insert.iter.ops/insert.iter.op++/post.pass.cpp
@@ -0,0 +1,34 @@
+//===----------------------------------------------------------------------===//
+//
+// ΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚThe LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+// <iterator>
+
+// insert_iterator
+
+// insert_iterator<Cont> operator++(int);
+
+#include <iterator>
+#include <vector>
+#include <cassert>
+
+template <class C>
+void
+test(C c)
+{
+ std::insert_iterator<C> i(c, c.end());
+ std::insert_iterator<C> r = i++;
+ r = 0;
+ assert(c.size() == 1);
+ assert(c.back() == 0);
+}
+
+int main()
+{
+ test(std::vector<int>());
+}
diff --git a/libcxx/test/iterators/predef.iterators/insert.iterators/insert.iter.ops/insert.iter.op++/pre.pass.cpp b/libcxx/test/iterators/predef.iterators/insert.iterators/insert.iter.ops/insert.iter.op++/pre.pass.cpp
new file mode 100644
index 00000000000..2838af5e794
--- /dev/null
+++ b/libcxx/test/iterators/predef.iterators/insert.iterators/insert.iter.ops/insert.iter.op++/pre.pass.cpp
@@ -0,0 +1,32 @@
+//===----------------------------------------------------------------------===//
+//
+// ΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚThe LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+// <iterator>
+
+// insert_iterator
+
+// insert_iterator<Cont>& operator++();
+
+#include <iterator>
+#include <vector>
+#include <cassert>
+
+template <class C>
+void
+test(C c)
+{
+ std::insert_iterator<C> i(c, c.end());
+ std::insert_iterator<C>& r = ++i;
+ assert(&r == &i);
+}
+
+int main()
+{
+ test(std::vector<int>());
+}
diff --git a/libcxx/test/iterators/predef.iterators/insert.iterators/insert.iter.ops/insert.iter.op=/lv_value.pass.cpp b/libcxx/test/iterators/predef.iterators/insert.iterators/insert.iter.ops/insert.iter.op=/lv_value.pass.cpp
new file mode 100644
index 00000000000..87ca88a9027
--- /dev/null
+++ b/libcxx/test/iterators/predef.iterators/insert.iterators/insert.iter.ops/insert.iter.op=/lv_value.pass.cpp
@@ -0,0 +1,64 @@
+//===----------------------------------------------------------------------===//
+//
+// ΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚThe LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+// <iterator>
+
+// insert_iterator
+
+// requires CopyConstructible<Cont::value_type>
+// insert_iterator<Cont>&
+// operator=(const Cont::value_type& value);
+
+#include <iterator>
+#include <vector>
+#include <cassert>
+
+template <class C>
+void
+test(C c1, typename C::difference_type j,
+ typename C::value_type x1, typename C::value_type x2,
+ typename C::value_type x3, const C& c2)
+{
+ std::insert_iterator<C> q(c1, c1.begin() + j);
+ q = x1;
+ q = x2;
+ q = x3;
+ assert(c1 == c2);
+}
+
+template <class C>
+void
+insert3at(C& c, typename C::iterator i,
+ typename C::value_type x1, typename C::value_type x2,
+ typename C::value_type x3)
+{
+ i = c.insert(i, x1);
+ i = c.insert(++i, x2);
+ c.insert(++i, x3);
+}
+
+int main()
+{
+ typedef std::vector<int> C;
+ C c1;
+ for (int i = 0; i < 3; ++i)
+ c1.push_back(i);
+ C c2 = c1;
+ insert3at(c2, c2.begin(), 'a', 'b', 'c');
+ test(c1, 0, 'a', 'b', 'c', c2);
+ c2 = c1;
+ insert3at(c2, c2.begin()+1, 'a', 'b', 'c');
+ test(c1, 1, 'a', 'b', 'c', c2);
+ c2 = c1;
+ insert3at(c2, c2.begin()+2, 'a', 'b', 'c');
+ test(c1, 2, 'a', 'b', 'c', c2);
+ c2 = c1;
+ insert3at(c2, c2.begin()+3, 'a', 'b', 'c');
+ test(c1, 3, 'a', 'b', 'c', c2);
+}
diff --git a/libcxx/test/iterators/predef.iterators/insert.iterators/insert.iter.ops/insert.iter.op=/rv_value.pass.cpp b/libcxx/test/iterators/predef.iterators/insert.iterators/insert.iter.ops/insert.iter.op=/rv_value.pass.cpp
new file mode 100644
index 00000000000..d4f63307a8f
--- /dev/null
+++ b/libcxx/test/iterators/predef.iterators/insert.iterators/insert.iter.ops/insert.iter.op=/rv_value.pass.cpp
@@ -0,0 +1,95 @@
+//===----------------------------------------------------------------------===//
+//
+// ΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚThe LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+// <iterator>
+
+// insert_iterator
+
+// requires CopyConstructible<Cont::value_type>
+// insert_iterator<Cont>&
+// operator=(const Cont::value_type& value);
+
+#include <iterator>
+
+#ifdef _LIBCPP_MOVE
+#include <vector>
+#include <memory>
+#include <cassert>
+
+template <class C>
+void
+test(C c1, typename C::difference_type j,
+ typename C::value_type x1, typename C::value_type x2,
+ typename C::value_type x3, const C& c2)
+{
+ std::insert_iterator<C> q(c1, c1.begin() + j);
+ q = std::move(x1);
+ q = std::move(x2);
+ q = std::move(x3);
+ assert(c1 == c2);
+}
+
+template <class C>
+void
+insert3at(C& c, typename C::iterator i,
+ typename C::value_type x1, typename C::value_type x2,
+ typename C::value_type x3)
+{
+ i = c.insert(i, std::move(x1));
+ i = c.insert(++i, std::move(x2));
+ c.insert(++i, std::move(x3));
+}
+
+struct do_nothing
+{
+ void operator()(void*) const {}
+};
+
+#endif
+
+int main()
+{
+#ifdef _LIBCPP_MOVE
+ typedef std::unique_ptr<int, do_nothing> Ptr;
+ typedef std::vector<Ptr> C;
+ C c1;
+ int x[6] = {0};
+ for (int i = 0; i < 3; ++i)
+ c1.push_back(Ptr(x+i));
+ C c2;
+ for (int i = 0; i < 3; ++i)
+ c2.push_back(Ptr(x+i));
+ insert3at(c2, c2.begin(), Ptr(x+3), Ptr(x+4), Ptr(x+5));
+ test(std::move(c1), 0, Ptr(x+3), Ptr(x+4), Ptr(x+5), c2);
+ c1.clear();
+ for (int i = 0; i < 3; ++i)
+ c1.push_back(Ptr(x+i));
+ c2.clear();
+ for (int i = 0; i < 3; ++i)
+ c2.push_back(Ptr(x+i));
+ insert3at(c2, c2.begin()+1, Ptr(x+3), Ptr(x+4), Ptr(x+5));
+ test(std::move(c1), 1, Ptr(x+3), Ptr(x+4), Ptr(x+5), c2);
+ c1.clear();
+ for (int i = 0; i < 3; ++i)
+ c1.push_back(Ptr(x+i));
+ c2.clear();
+ for (int i = 0; i < 3; ++i)
+ c2.push_back(Ptr(x+i));
+ insert3at(c2, c2.begin()+2, Ptr(x+3), Ptr(x+4), Ptr(x+5));
+ test(std::move(c1), 2, Ptr(x+3), Ptr(x+4), Ptr(x+5), c2);
+ c1.clear();
+ for (int i = 0; i < 3; ++i)
+ c1.push_back(Ptr(x+i));
+ c2.clear();
+ for (int i = 0; i < 3; ++i)
+ c2.push_back(Ptr(x+i));
+ insert3at(c2, c2.begin()+3, Ptr(x+3), Ptr(x+4), Ptr(x+5));
+ test(std::move(c1), 3, Ptr(x+3), Ptr(x+4), Ptr(x+5), c2);
+#endif
+}
diff --git a/libcxx/test/iterators/predef.iterators/insert.iterators/insert.iter.ops/insert.iter.op_astrk/test.pass.cpp b/libcxx/test/iterators/predef.iterators/insert.iterators/insert.iter.ops/insert.iter.op_astrk/test.pass.cpp
new file mode 100644
index 00000000000..e6dd4925175
--- /dev/null
+++ b/libcxx/test/iterators/predef.iterators/insert.iterators/insert.iter.ops/insert.iter.op_astrk/test.pass.cpp
@@ -0,0 +1,32 @@
+//===----------------------------------------------------------------------===//
+//
+// ΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚThe LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+// <iterator>
+
+// insert_iterator
+
+// insert_iterator<Cont>& operator*();
+
+#include <iterator>
+#include <vector>
+#include <cassert>
+
+template <class C>
+void
+test(C c)
+{
+ std::insert_iterator<C> i(c, c.end());
+ std::insert_iterator<C>& r = *i;
+ assert(&r == &i);
+}
+
+int main()
+{
+ test(std::vector<int>());
+}
diff --git a/libcxx/test/iterators/predef.iterators/insert.iterators/insert.iter.ops/inserter/test.pass.cpp b/libcxx/test/iterators/predef.iterators/insert.iterators/insert.iter.ops/inserter/test.pass.cpp
new file mode 100644
index 00000000000..96bd3740f5c
--- /dev/null
+++ b/libcxx/test/iterators/predef.iterators/insert.iterators/insert.iter.ops/inserter/test.pass.cpp
@@ -0,0 +1,33 @@
+//===----------------------------------------------------------------------===//
+//
+// ΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚThe LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+// <iterator>
+
+// template <InsertionContainer Cont>
+// insert_iterator<Cont>
+// inserter(Cont& x, Cont::iterator i);
+
+#include <iterator>
+#include <vector>
+#include <cassert>
+
+template <class C>
+void
+test(C c)
+{
+ std::insert_iterator<C> i = std::inserter(c, c.end());
+ i = 0;
+ assert(c.size() == 1);
+ assert(c.back() == 0);
+}
+
+int main()
+{
+ test(std::vector<int>());
+}
diff --git a/libcxx/test/iterators/predef.iterators/insert.iterators/insert.iter.ops/nothing_to_do.pass.cpp b/libcxx/test/iterators/predef.iterators/insert.iterators/insert.iter.ops/nothing_to_do.pass.cpp
new file mode 100644
index 00000000000..fa4d462f18d
--- /dev/null
+++ b/libcxx/test/iterators/predef.iterators/insert.iterators/insert.iter.ops/nothing_to_do.pass.cpp
@@ -0,0 +1,12 @@
+//===----------------------------------------------------------------------===//
+//
+// ΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚThe LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+int main()
+{
+}
diff --git a/libcxx/test/iterators/predef.iterators/insert.iterators/insert.iterator/types.pass.cpp b/libcxx/test/iterators/predef.iterators/insert.iterators/insert.iterator/types.pass.cpp
new file mode 100644
index 00000000000..1c2dec01181
--- /dev/null
+++ b/libcxx/test/iterators/predef.iterators/insert.iterators/insert.iterator/types.pass.cpp
@@ -0,0 +1,64 @@
+//===----------------------------------------------------------------------===//
+//
+// ΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚThe LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+// <iterator>
+
+// insert_iterator
+
+// Test nested types and data members:
+
+// template <InsertionContainer Cont>
+// class insert_iterator {
+// protected:
+// Cont* container;
+// Cont::iterator iter;
+// public:
+// typedef Cont container_type;
+// typedef void value_type;
+// typedef void difference_type;
+// typedef insert_iterator<Cont>& reference;
+// typedef void pointer;
+// };
+
+#include <iterator>
+#include <type_traits>
+#include <vector>
+
+template <class C>
+struct find_members
+ : private std::insert_iterator<C>
+{
+ explicit find_members(C& c) : std::insert_iterator<C>(c, c.begin()) {}
+ void test()
+ {
+ this->container = 0;
+ this->iter == this->iter;
+ }
+};
+
+template <class C>
+void
+test()
+{
+ typedef std::insert_iterator<C> R;
+ C c;
+ find_members<C> q(c);
+ q.test();
+ static_assert((std::is_same<typename R::container_type, C>::value), "");
+ static_assert((std::is_same<typename R::value_type, void>::value), "");
+ static_assert((std::is_same<typename R::difference_type, void>::value), "");
+ static_assert((std::is_same<typename R::reference, R&>::value), "");
+ static_assert((std::is_same<typename R::pointer, void>::value), "");
+ static_assert((std::is_same<typename R::iterator_category, std::output_iterator_tag>::value), "");
+}
+
+int main()
+{
+ test<std::vector<int> >();
+}
diff --git a/libcxx/test/iterators/predef.iterators/insert.iterators/nothing_to_do.pass.cpp b/libcxx/test/iterators/predef.iterators/insert.iterators/nothing_to_do.pass.cpp
new file mode 100644
index 00000000000..fa4d462f18d
--- /dev/null
+++ b/libcxx/test/iterators/predef.iterators/insert.iterators/nothing_to_do.pass.cpp
@@ -0,0 +1,12 @@
+//===----------------------------------------------------------------------===//
+//
+// ΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚThe LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+int main()
+{
+}
diff --git a/libcxx/test/iterators/predef.iterators/move.iterators/move.iter.ops/move.iter.nonmember/make_move_iterator.pass.cpp b/libcxx/test/iterators/predef.iterators/move.iterators/move.iter.ops/move.iter.nonmember/make_move_iterator.pass.cpp
new file mode 100644
index 00000000000..4c4c4fa857d
--- /dev/null
+++ b/libcxx/test/iterators/predef.iterators/move.iterators/move.iter.ops/move.iter.nonmember/make_move_iterator.pass.cpp
@@ -0,0 +1,39 @@
+//===----------------------------------------------------------------------===//
+//
+// ΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚThe LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+// <iterator>
+
+// move_iterator
+
+// template <InputIterator Iter>
+// move_iterator<Iter>
+// make_move_iterator(const Iter& i);
+
+#include <iterator>
+#include <cassert>
+
+#include "../../../../iterators.h"
+
+template <class It>
+void
+test(It i)
+{
+ const std::move_iterator<It> r(i);
+ assert(std::make_move_iterator(i) == r);
+}
+
+int main()
+{
+ char s[] = "1234567890";
+ test(input_iterator<char*>(s+5));
+ test(forward_iterator<char*>(s+5));
+ test(bidirectional_iterator<char*>(s+5));
+ test(random_access_iterator<char*>(s+5));
+ test(s+5);
+}
diff --git a/libcxx/test/iterators/predef.iterators/move.iterators/move.iter.ops/move.iter.nonmember/minus.pass.cpp b/libcxx/test/iterators/predef.iterators/move.iterators/move.iter.ops/move.iter.nonmember/minus.pass.cpp
new file mode 100644
index 00000000000..7ab223e3277
--- /dev/null
+++ b/libcxx/test/iterators/predef.iterators/move.iterators/move.iter.ops/move.iter.nonmember/minus.pass.cpp
@@ -0,0 +1,39 @@
+//===----------------------------------------------------------------------===//
+//
+// ΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚThe LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+// <iterator>
+
+// move_iterator
+
+// template <RandomAccessIterator Iter1, RandomAccessIterator Iter2>
+// requires HasMinus<Iter1, Iter2>
+// auto
+// operator-(const move_iterator<Iter1>& x, const move_iterator<Iter2>& y)
+// -> decltype(x.base() - y.base());
+
+#include <iterator>
+#include <cassert>
+
+#include "../../../../iterators.h"
+
+template <class It>
+void
+test(It l, It r, typename std::iterator_traits<It>::difference_type x)
+{
+ const std::move_iterator<It> r1(l);
+ const std::move_iterator<It> r2(r);
+ assert(r1 - r2 == x);
+}
+
+int main()
+{
+ char s[] = "1234567890";
+ test(random_access_iterator<char*>(s+5), random_access_iterator<char*>(s), 5);
+ test(s+5, s, 5);
+}
diff --git a/libcxx/test/iterators/predef.iterators/move.iterators/move.iter.ops/move.iter.nonmember/plus.pass.cpp b/libcxx/test/iterators/predef.iterators/move.iterators/move.iter.ops/move.iter.nonmember/plus.pass.cpp
new file mode 100644
index 00000000000..8203e02d367
--- /dev/null
+++ b/libcxx/test/iterators/predef.iterators/move.iterators/move.iter.ops/move.iter.nonmember/plus.pass.cpp
@@ -0,0 +1,37 @@
+//===----------------------------------------------------------------------===//
+//
+// ΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚThe LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+// <iterator>
+
+// move_iterator
+
+// template <RandomAccessIterator Iter>
+// move_iterator<Iter>
+// operator+(Iter::difference_type n, const move_iterator<Iter>& x);
+
+#include <iterator>
+#include <cassert>
+
+#include "../../../../iterators.h"
+
+template <class It>
+void
+test(It i, typename std::iterator_traits<It>::difference_type n, It x)
+{
+ const std::move_iterator<It> r(i);
+ std::move_iterator<It> rr = n + r;
+ assert(rr.base() == x);
+}
+
+int main()
+{
+ char s[] = "1234567890";
+ test(random_access_iterator<char*>(s+5), 5, random_access_iterator<char*>(s+10));
+ test(s+5, 5, s+10);
+}
diff --git a/libcxx/test/iterators/predef.iterators/move.iterators/move.iter.ops/move.iter.op.+/difference_type.pass.cpp b/libcxx/test/iterators/predef.iterators/move.iterators/move.iter.ops/move.iter.op.+/difference_type.pass.cpp
new file mode 100644
index 00000000000..c1e6e8bf42e
--- /dev/null
+++ b/libcxx/test/iterators/predef.iterators/move.iterators/move.iter.ops/move.iter.op.+/difference_type.pass.cpp
@@ -0,0 +1,36 @@
+//===----------------------------------------------------------------------===//
+//
+// ΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚThe LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+// <iterator>
+
+// move_iterator
+
+// requires RandomAccessIterator<Iter>
+// move_iterator operator+(difference_type n) const;
+
+#include <iterator>
+#include <cassert>
+
+#include "../../../../iterators.h"
+
+template <class It>
+void
+test(It i, typename std::iterator_traits<It>::difference_type n, It x)
+{
+ const std::move_iterator<It> r(i);
+ std::move_iterator<It> rr = r + n;
+ assert(rr.base() == x);
+}
+
+int main()
+{
+ const char* s = "1234567890";
+ test(random_access_iterator<const char*>(s+5), 5, random_access_iterator<const char*>(s+10));
+ test(s+5, 5, s+10);
+}
diff --git a/libcxx/test/iterators/predef.iterators/move.iterators/move.iter.ops/move.iter.op.+=/difference_type.pass.cpp b/libcxx/test/iterators/predef.iterators/move.iterators/move.iter.ops/move.iter.op.+=/difference_type.pass.cpp
new file mode 100644
index 00000000000..4a6f16541cc
--- /dev/null
+++ b/libcxx/test/iterators/predef.iterators/move.iterators/move.iter.ops/move.iter.op.+=/difference_type.pass.cpp
@@ -0,0 +1,37 @@
+//===----------------------------------------------------------------------===//
+//
+// ΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚThe LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+// <iterator>
+
+// move_iterator
+
+// requires RandomAccessIterator<Iter>
+// move_iterator& operator+=(difference_type n);
+
+#include <iterator>
+#include <cassert>
+
+#include "../../../../iterators.h"
+
+template <class It>
+void
+test(It i, typename std::iterator_traits<It>::difference_type n, It x)
+{
+ std::move_iterator<It> r(i);
+ std::move_iterator<It>& rr = r += n;
+ assert(r.base() == x);
+ assert(&rr == &r);
+}
+
+int main()
+{
+ const char* s = "1234567890";
+ test(random_access_iterator<const char*>(s+5), 5, random_access_iterator<const char*>(s+10));
+ test(s+5, 5, s+10);
+}
diff --git a/libcxx/test/iterators/predef.iterators/move.iterators/move.iter.ops/move.iter.op.-/difference_type.pass.cpp b/libcxx/test/iterators/predef.iterators/move.iterators/move.iter.ops/move.iter.op.-/difference_type.pass.cpp
new file mode 100644
index 00000000000..9ba7f8af63e
--- /dev/null
+++ b/libcxx/test/iterators/predef.iterators/move.iterators/move.iter.ops/move.iter.op.-/difference_type.pass.cpp
@@ -0,0 +1,36 @@
+//===----------------------------------------------------------------------===//
+//
+// ΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚThe LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+// <iterator>
+
+// move_iterator
+
+// requires RandomAccessIterator<Iter>
+// move_iterator operator-(difference_type n) const;
+
+#include <iterator>
+#include <cassert>
+
+#include "../../../../iterators.h"
+
+template <class It>
+void
+test(It i, typename std::iterator_traits<It>::difference_type n, It x)
+{
+ const std::move_iterator<It> r(i);
+ std::move_iterator<It> rr = r - n;
+ assert(rr.base() == x);
+}
+
+int main()
+{
+ const char* s = "1234567890";
+ test(random_access_iterator<const char*>(s+5), 5, random_access_iterator<const char*>(s));
+ test(s+5, 5, s);
+}
diff --git a/libcxx/test/iterators/predef.iterators/move.iterators/move.iter.ops/move.iter.op.-=/difference_type.pass.cpp b/libcxx/test/iterators/predef.iterators/move.iterators/move.iter.ops/move.iter.op.-=/difference_type.pass.cpp
new file mode 100644
index 00000000000..8d6b473ef44
--- /dev/null
+++ b/libcxx/test/iterators/predef.iterators/move.iterators/move.iter.ops/move.iter.op.-=/difference_type.pass.cpp
@@ -0,0 +1,37 @@
+//===----------------------------------------------------------------------===//
+//
+// ΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚThe LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+// <iterator>
+
+// move_iterator
+
+// requires RandomAccessIterator<Iter>
+// move_iterator& operator-=(difference_type n);
+
+#include <iterator>
+#include <cassert>
+
+#include "../../../../iterators.h"
+
+template <class It>
+void
+test(It i, typename std::iterator_traits<It>::difference_type n, It x)
+{
+ std::move_iterator<It> r(i);
+ std::move_iterator<It>& rr = r -= n;
+ assert(r.base() == x);
+ assert(&rr == &r);
+}
+
+int main()
+{
+ const char* s = "1234567890";
+ test(random_access_iterator<const char*>(s+5), 5, random_access_iterator<const char*>(s));
+ test(s+5, 5, s);
+}
diff --git a/libcxx/test/iterators/predef.iterators/move.iterators/move.iter.ops/move.iter.op.comp/op_eq.pass.cpp b/libcxx/test/iterators/predef.iterators/move.iterators/move.iter.ops/move.iter.op.comp/op_eq.pass.cpp
new file mode 100644
index 00000000000..4fd8560a87b
--- /dev/null
+++ b/libcxx/test/iterators/predef.iterators/move.iterators/move.iter.ops/move.iter.op.comp/op_eq.pass.cpp
@@ -0,0 +1,46 @@
+//===----------------------------------------------------------------------===//
+//
+// ΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚThe LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+// <iterator>
+
+// move_iterator
+
+// template <InputIterator Iter1, InputIterator Iter2>
+// requires HasEqualTo<Iter1, Iter2>
+// bool
+// operator==(const move_iterator<Iter1>& x, const move_iterator<Iter2>& y);
+
+#include <iterator>
+#include <cassert>
+
+#include "../../../../iterators.h"
+
+template <class It>
+void
+test(It l, It r, bool x)
+{
+ const std::move_iterator<It> r1(l);
+ const std::move_iterator<It> r2(r);
+ assert((r1 == r2) == x);
+}
+
+int main()
+{
+ char s[] = "1234567890";
+ test(input_iterator<char*>(s), input_iterator<char*>(s), true);
+ test(input_iterator<char*>(s), input_iterator<char*>(s+1), false);
+ test(forward_iterator<char*>(s), forward_iterator<char*>(s), true);
+ test(forward_iterator<char*>(s), forward_iterator<char*>(s+1), false);
+ test(bidirectional_iterator<char*>(s), bidirectional_iterator<char*>(s), true);
+ test(bidirectional_iterator<char*>(s), bidirectional_iterator<char*>(s+1), false);
+ test(random_access_iterator<char*>(s), random_access_iterator<char*>(s), true);
+ test(random_access_iterator<char*>(s), random_access_iterator<char*>(s+1), false);
+ test(s, s, true);
+ test(s, s+1, false);
+}
diff --git a/libcxx/test/iterators/predef.iterators/move.iterators/move.iter.ops/move.iter.op.comp/op_gt.pass.cpp b/libcxx/test/iterators/predef.iterators/move.iterators/move.iter.ops/move.iter.op.comp/op_gt.pass.cpp
new file mode 100644
index 00000000000..5875265a6ae
--- /dev/null
+++ b/libcxx/test/iterators/predef.iterators/move.iterators/move.iter.ops/move.iter.op.comp/op_gt.pass.cpp
@@ -0,0 +1,42 @@
+//===----------------------------------------------------------------------===//
+//
+// ΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚThe LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+// <iterator>
+
+// move_iterator
+
+// template <RandomAccessIterator Iter1, RandomAccessIterator Iter2>
+// requires HasLess<Iter2, Iter1>
+// bool
+// operator>(const move_iterator<Iter1>& x, const move_iterator<Iter2>& y);
+
+#include <iterator>
+#include <cassert>
+
+#include "../../../../iterators.h"
+
+template <class It>
+void
+test(It l, It r, bool x)
+{
+ const std::move_iterator<It> r1(l);
+ const std::move_iterator<It> r2(r);
+ assert((r1 > r2) == x);
+}
+
+int main()
+{
+ char s[] = "1234567890";
+ test(random_access_iterator<char*>(s), random_access_iterator<char*>(s), false);
+ test(random_access_iterator<char*>(s), random_access_iterator<char*>(s+1), false);
+ test(random_access_iterator<char*>(s+1), random_access_iterator<char*>(s), true);
+ test(s, s, false);
+ test(s, s+1, false);
+ test(s+1, s, true);
+}
diff --git a/libcxx/test/iterators/predef.iterators/move.iterators/move.iter.ops/move.iter.op.comp/op_gte.pass.cpp b/libcxx/test/iterators/predef.iterators/move.iterators/move.iter.ops/move.iter.op.comp/op_gte.pass.cpp
new file mode 100644
index 00000000000..87b604077db
--- /dev/null
+++ b/libcxx/test/iterators/predef.iterators/move.iterators/move.iter.ops/move.iter.op.comp/op_gte.pass.cpp
@@ -0,0 +1,42 @@
+//===----------------------------------------------------------------------===//
+//
+// ΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚThe LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+// <iterator>
+
+// move_iterator
+
+// template <RandomAccessIterator Iter1, RandomAccessIterator Iter2>
+// requires HasLess<Iter1, Iter2>
+// bool
+// operator>=(const move_iterator<Iter1>& x, const move_iterator<Iter2>& y);
+
+#include <iterator>
+#include <cassert>
+
+#include "../../../../iterators.h"
+
+template <class It>
+void
+test(It l, It r, bool x)
+{
+ const std::move_iterator<It> r1(l);
+ const std::move_iterator<It> r2(r);
+ assert((r1 >= r2) == x);
+}
+
+int main()
+{
+ char s[] = "1234567890";
+ test(random_access_iterator<char*>(s), random_access_iterator<char*>(s), true);
+ test(random_access_iterator<char*>(s), random_access_iterator<char*>(s+1), false);
+ test(random_access_iterator<char*>(s+1), random_access_iterator<char*>(s), true);
+ test(s, s, true);
+ test(s, s+1, false);
+ test(s+1, s, true);
+}
diff --git a/libcxx/test/iterators/predef.iterators/move.iterators/move.iter.ops/move.iter.op.comp/op_lt.pass.cpp b/libcxx/test/iterators/predef.iterators/move.iterators/move.iter.ops/move.iter.op.comp/op_lt.pass.cpp
new file mode 100644
index 00000000000..12f3feb62a6
--- /dev/null
+++ b/libcxx/test/iterators/predef.iterators/move.iterators/move.iter.ops/move.iter.op.comp/op_lt.pass.cpp
@@ -0,0 +1,42 @@
+//===----------------------------------------------------------------------===//
+//
+// ΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚThe LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+// <iterator>
+
+// move_iterator
+
+// template <RandomAccessIterator Iter1, RandomAccessIterator Iter2>
+// requires HasLess<Iter1, Iter2>
+// bool
+// operator<(const move_iterator<Iter1>& x, const move_iterator<Iter2>& y);
+
+#include <iterator>
+#include <cassert>
+
+#include "../../../../iterators.h"
+
+template <class It>
+void
+test(It l, It r, bool x)
+{
+ const std::move_iterator<It> r1(l);
+ const std::move_iterator<It> r2(r);
+ assert((r1 < r2) == x);
+}
+
+int main()
+{
+ char s[] = "1234567890";
+ test(random_access_iterator<char*>(s), random_access_iterator<char*>(s), false);
+ test(random_access_iterator<char*>(s), random_access_iterator<char*>(s+1), true);
+ test(random_access_iterator<char*>(s+1), random_access_iterator<char*>(s), false);
+ test(s, s, false);
+ test(s, s+1, true);
+ test(s+1, s, false);
+}
diff --git a/libcxx/test/iterators/predef.iterators/move.iterators/move.iter.ops/move.iter.op.comp/op_lte.pass.cpp b/libcxx/test/iterators/predef.iterators/move.iterators/move.iter.ops/move.iter.op.comp/op_lte.pass.cpp
new file mode 100644
index 00000000000..8be470570e3
--- /dev/null
+++ b/libcxx/test/iterators/predef.iterators/move.iterators/move.iter.ops/move.iter.op.comp/op_lte.pass.cpp
@@ -0,0 +1,42 @@
+//===----------------------------------------------------------------------===//
+//
+// ΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚThe LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+// <iterator>
+
+// move_iterator
+
+// template <RandomAccessIterator Iter1, RandomAccessIterator Iter2>
+// requires HasLess<Iter2, Iter1>
+// bool
+// operator<=(const move_iterator<Iter1>& x, const move_iterator<Iter2>& y);
+
+#include <iterator>
+#include <cassert>
+
+#include "../../../../iterators.h"
+
+template <class It>
+void
+test(It l, It r, bool x)
+{
+ const std::move_iterator<It> r1(l);
+ const std::move_iterator<It> r2(r);
+ assert((r1 <= r2) == x);
+}
+
+int main()
+{
+ char s[] = "1234567890";
+ test(random_access_iterator<char*>(s), random_access_iterator<char*>(s), true);
+ test(random_access_iterator<char*>(s), random_access_iterator<char*>(s+1), true);
+ test(random_access_iterator<char*>(s+1), random_access_iterator<char*>(s), false);
+ test(s, s, true);
+ test(s, s+1, true);
+ test(s+1, s, false);
+}
diff --git a/libcxx/test/iterators/predef.iterators/move.iterators/move.iter.ops/move.iter.op.comp/op_neq.pass.cpp b/libcxx/test/iterators/predef.iterators/move.iterators/move.iter.ops/move.iter.op.comp/op_neq.pass.cpp
new file mode 100644
index 00000000000..1d4669a4f3d
--- /dev/null
+++ b/libcxx/test/iterators/predef.iterators/move.iterators/move.iter.ops/move.iter.op.comp/op_neq.pass.cpp
@@ -0,0 +1,46 @@
+//===----------------------------------------------------------------------===//
+//
+// ΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚThe LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+// <iterator>
+
+// move_iterator
+
+// template <InputIterator Iter1, InputIterator Iter2>
+// requires HasEqualTo<Iter1, Iter2>
+// bool
+// operator!=(const move_iterator<Iter1>& x, const move_iterator<Iter2>& y);
+
+#include <iterator>
+#include <cassert>
+
+#include "../../../../iterators.h"
+
+template <class It>
+void
+test(It l, It r, bool x)
+{
+ const std::move_iterator<It> r1(l);
+ const std::move_iterator<It> r2(r);
+ assert((r1 != r2) == x);
+}
+
+int main()
+{
+ char s[] = "1234567890";
+ test(input_iterator<char*>(s), input_iterator<char*>(s), false);
+ test(input_iterator<char*>(s), input_iterator<char*>(s+1), true);
+ test(forward_iterator<char*>(s), forward_iterator<char*>(s), false);
+ test(forward_iterator<char*>(s), forward_iterator<char*>(s+1), true);
+ test(bidirectional_iterator<char*>(s), bidirectional_iterator<char*>(s), false);
+ test(bidirectional_iterator<char*>(s), bidirectional_iterator<char*>(s+1), true);
+ test(random_access_iterator<char*>(s), random_access_iterator<char*>(s), false);
+ test(random_access_iterator<char*>(s), random_access_iterator<char*>(s+1), true);
+ test(s, s, false);
+ test(s, s+1, true);
+}
diff --git a/libcxx/test/iterators/predef.iterators/move.iterators/move.iter.ops/move.iter.op.const/convert.fail.cpp b/libcxx/test/iterators/predef.iterators/move.iterators/move.iter.ops/move.iter.op.const/convert.fail.cpp
new file mode 100644
index 00000000000..b1eeb0a4fd5
--- /dev/null
+++ b/libcxx/test/iterators/predef.iterators/move.iterators/move.iter.ops/move.iter.op.const/convert.fail.cpp
@@ -0,0 +1,38 @@
+//===----------------------------------------------------------------------===//
+//
+// ΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚThe LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+// <iterator>
+
+// move_iterator
+
+// template <class U>
+// requires HasConstructor<Iter, const U&>
+// move_iterator(const move_iterator<U> &u);
+
+// test requires
+
+#include <iterator>
+
+template <class It, class U>
+void
+test(U u)
+{
+ std::move_iterator<U> r2(u);
+ std::move_iterator<It> r1 = r2;
+}
+
+struct base {};
+struct derived {};
+
+int main()
+{
+ derived d;
+
+ test<base*>(&d);
+}
diff --git a/libcxx/test/iterators/predef.iterators/move.iterators/move.iter.ops/move.iter.op.const/convert.pass.cpp b/libcxx/test/iterators/predef.iterators/move.iterators/move.iter.ops/move.iter.op.const/convert.pass.cpp
new file mode 100644
index 00000000000..c49697b315e
--- /dev/null
+++ b/libcxx/test/iterators/predef.iterators/move.iterators/move.iter.ops/move.iter.op.const/convert.pass.cpp
@@ -0,0 +1,44 @@
+//===----------------------------------------------------------------------===//
+//
+// ΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚThe LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+// <iterator>
+
+// move_iterator
+
+// template <class U>
+// requires HasConstructor<Iter, const U&>
+// move_iterator(const move_iterator<U> &u);
+
+#include <iterator>
+#include <cassert>
+
+#include "../../../../iterators.h"
+
+template <class It, class U>
+void
+test(U u)
+{
+ const std::move_iterator<U> r2(u);
+ std::move_iterator<It> r1 = r2;
+ assert(r1.base() == u);
+}
+
+struct base {};
+struct derived : base {};
+
+int main()
+{
+ derived d;
+
+ test<input_iterator<base*> >(input_iterator<derived*>(&d));
+ test<forward_iterator<base*> >(forward_iterator<derived*>(&d));
+ test<bidirectional_iterator<base*> >(bidirectional_iterator<derived*>(&d));
+ test<random_access_iterator<const base*> >(random_access_iterator<derived*>(&d));
+ test<base*>(&d);
+}
diff --git a/libcxx/test/iterators/predef.iterators/move.iterators/move.iter.ops/move.iter.op.const/default.pass.cpp b/libcxx/test/iterators/predef.iterators/move.iterators/move.iter.ops/move.iter.op.const/default.pass.cpp
new file mode 100644
index 00000000000..dcebbe75e14
--- /dev/null
+++ b/libcxx/test/iterators/predef.iterators/move.iterators/move.iter.ops/move.iter.op.const/default.pass.cpp
@@ -0,0 +1,34 @@
+//===----------------------------------------------------------------------===//
+//
+// ΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚThe LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+// <iterator>
+
+// move_iterator
+
+// move_iterator();
+
+#include <iterator>
+
+#include "../../../../iterators.h"
+
+template <class It>
+void
+test()
+{
+ std::move_iterator<It> r;
+}
+
+int main()
+{
+ test<input_iterator<char*> >();
+ test<forward_iterator<char*> >();
+ test<bidirectional_iterator<char*> >();
+ test<random_access_iterator<char*> >();
+ test<char*>();
+}
diff --git a/libcxx/test/iterators/predef.iterators/move.iterators/move.iter.ops/move.iter.op.const/iter.fail.cpp b/libcxx/test/iterators/predef.iterators/move.iterators/move.iter.ops/move.iter.op.const/iter.fail.cpp
new file mode 100644
index 00000000000..9759a744596
--- /dev/null
+++ b/libcxx/test/iterators/predef.iterators/move.iterators/move.iter.ops/move.iter.op.const/iter.fail.cpp
@@ -0,0 +1,31 @@
+//===----------------------------------------------------------------------===//
+//
+// ΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚThe LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+// <iterator>
+
+// move_iterator
+
+// explicit move_iterator(Iter );
+
+// test explicit
+
+#include <iterator>
+
+template <class It>
+void
+test(It i)
+{
+ std::move_iterator<It> r = i;
+}
+
+int main()
+{
+ char s[] = "123";
+ test(s);
+}
diff --git a/libcxx/test/iterators/predef.iterators/move.iterators/move.iter.ops/move.iter.op.const/iter.pass.cpp b/libcxx/test/iterators/predef.iterators/move.iterators/move.iter.ops/move.iter.op.const/iter.pass.cpp
new file mode 100644
index 00000000000..67a9d4cabef
--- /dev/null
+++ b/libcxx/test/iterators/predef.iterators/move.iterators/move.iter.ops/move.iter.op.const/iter.pass.cpp
@@ -0,0 +1,37 @@
+//===----------------------------------------------------------------------===//
+//
+// ΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚThe LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+// <iterator>
+
+// move_iterator
+
+// explicit move_iterator(Iter i);
+
+#include <iterator>
+#include <cassert>
+
+#include "../../../../iterators.h"
+
+template <class It>
+void
+test(It i)
+{
+ std::move_iterator<It> r(i);
+ assert(r.base() == i);
+}
+
+int main()
+{
+ char s[] = "123";
+ test(input_iterator<char*>(s));
+ test(forward_iterator<char*>(s));
+ test(bidirectional_iterator<char*>(s));
+ test(random_access_iterator<char*>(s));
+ test(s);
+}
diff --git a/libcxx/test/iterators/predef.iterators/move.iterators/move.iter.ops/move.iter.op.conv/tested_elsewhere.pass.cpp b/libcxx/test/iterators/predef.iterators/move.iterators/move.iter.ops/move.iter.op.conv/tested_elsewhere.pass.cpp
new file mode 100644
index 00000000000..fa4d462f18d
--- /dev/null
+++ b/libcxx/test/iterators/predef.iterators/move.iterators/move.iter.ops/move.iter.op.conv/tested_elsewhere.pass.cpp
@@ -0,0 +1,12 @@
+//===----------------------------------------------------------------------===//
+//
+// ΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚThe LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+int main()
+{
+}
diff --git a/libcxx/test/iterators/predef.iterators/move.iterators/move.iter.ops/move.iter.op.decr/post.pass.cpp b/libcxx/test/iterators/predef.iterators/move.iterators/move.iter.ops/move.iter.op.decr/post.pass.cpp
new file mode 100644
index 00000000000..3f46f882ad0
--- /dev/null
+++ b/libcxx/test/iterators/predef.iterators/move.iterators/move.iter.ops/move.iter.op.decr/post.pass.cpp
@@ -0,0 +1,37 @@
+//===----------------------------------------------------------------------===//
+//
+// ΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚThe LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+// <iterator>
+
+// move_iterator
+
+// move_iterator operator--(int);
+
+#include <iterator>
+#include <cassert>
+
+#include "../../../../iterators.h"
+
+template <class It>
+void
+test(It i, It x)
+{
+ std::move_iterator<It> r(i);
+ std::move_iterator<It> rr = r--;
+ assert(r.base() == x);
+ assert(rr.base() == i);
+}
+
+int main()
+{
+ char s[] = "123";
+ test(bidirectional_iterator<char*>(s+1), bidirectional_iterator<char*>(s));
+ test(random_access_iterator<char*>(s+1), random_access_iterator<char*>(s));
+ test(s+1, s);
+}
diff --git a/libcxx/test/iterators/predef.iterators/move.iterators/move.iter.ops/move.iter.op.decr/pre.pass.cpp b/libcxx/test/iterators/predef.iterators/move.iterators/move.iter.ops/move.iter.op.decr/pre.pass.cpp
new file mode 100644
index 00000000000..6f09436d718
--- /dev/null
+++ b/libcxx/test/iterators/predef.iterators/move.iterators/move.iter.ops/move.iter.op.decr/pre.pass.cpp
@@ -0,0 +1,37 @@
+//===----------------------------------------------------------------------===//
+//
+// ΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚThe LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+// <iterator>
+
+// move_iterator
+
+// move_iterator& operator--();
+
+#include <iterator>
+#include <cassert>
+
+#include "../../../../iterators.h"
+
+template <class It>
+void
+test(It i, It x)
+{
+ std::move_iterator<It> r(i);
+ std::move_iterator<It>& rr = --r;
+ assert(r.base() == x);
+ assert(&rr == &r);
+}
+
+int main()
+{
+ char s[] = "123";
+ test(bidirectional_iterator<char*>(s+1), bidirectional_iterator<char*>(s));
+ test(random_access_iterator<char*>(s+1), random_access_iterator<char*>(s));
+ test(s+1, s);
+}
diff --git a/libcxx/test/iterators/predef.iterators/move.iterators/move.iter.ops/move.iter.op.incr/post.pass.cpp b/libcxx/test/iterators/predef.iterators/move.iterators/move.iter.ops/move.iter.op.incr/post.pass.cpp
new file mode 100644
index 00000000000..6b7dcaa84d3
--- /dev/null
+++ b/libcxx/test/iterators/predef.iterators/move.iterators/move.iter.ops/move.iter.op.incr/post.pass.cpp
@@ -0,0 +1,39 @@
+//===----------------------------------------------------------------------===//
+//
+// ΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚThe LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+// <iterator>
+
+// move_iterator
+
+// move_iterator operator++(int);
+
+#include <iterator>
+#include <cassert>
+
+#include "../../../../iterators.h"
+
+template <class It>
+void
+test(It i, It x)
+{
+ std::move_iterator<It> r(i);
+ std::move_iterator<It> rr = r++;
+ assert(r.base() == x);
+ assert(rr.base() == i);
+}
+
+int main()
+{
+ char s[] = "123";
+ test(input_iterator<char*>(s), input_iterator<char*>(s+1));
+ test(forward_iterator<char*>(s), forward_iterator<char*>(s+1));
+ test(bidirectional_iterator<char*>(s), bidirectional_iterator<char*>(s+1));
+ test(random_access_iterator<char*>(s), random_access_iterator<char*>(s+1));
+ test(s, s+1);
+}
diff --git a/libcxx/test/iterators/predef.iterators/move.iterators/move.iter.ops/move.iter.op.incr/pre.pass.cpp b/libcxx/test/iterators/predef.iterators/move.iterators/move.iter.ops/move.iter.op.incr/pre.pass.cpp
new file mode 100644
index 00000000000..a65b57961c6
--- /dev/null
+++ b/libcxx/test/iterators/predef.iterators/move.iterators/move.iter.ops/move.iter.op.incr/pre.pass.cpp
@@ -0,0 +1,39 @@
+//===----------------------------------------------------------------------===//
+//
+// ΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚThe LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+// <iterator>
+
+// move_iterator
+
+// move_iterator& operator++();
+
+#include <iterator>
+#include <cassert>
+
+#include "../../../../iterators.h"
+
+template <class It>
+void
+test(It i, It x)
+{
+ std::move_iterator<It> r(i);
+ std::move_iterator<It>& rr = ++r;
+ assert(r.base() == x);
+ assert(&rr == &r);
+}
+
+int main()
+{
+ char s[] = "123";
+ test(input_iterator<char*>(s), input_iterator<char*>(s+1));
+ test(forward_iterator<char*>(s), forward_iterator<char*>(s+1));
+ test(bidirectional_iterator<char*>(s), bidirectional_iterator<char*>(s+1));
+ test(random_access_iterator<char*>(s), random_access_iterator<char*>(s+1));
+ test(s, s+1);
+}
diff --git a/libcxx/test/iterators/predef.iterators/move.iterators/move.iter.ops/move.iter.op.index/difference_type.pass.cpp b/libcxx/test/iterators/predef.iterators/move.iterators/move.iter.ops/move.iter.op.index/difference_type.pass.cpp
new file mode 100644
index 00000000000..9afbeb70f41
--- /dev/null
+++ b/libcxx/test/iterators/predef.iterators/move.iterators/move.iter.ops/move.iter.op.index/difference_type.pass.cpp
@@ -0,0 +1,58 @@
+//===----------------------------------------------------------------------===//
+//
+// ΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚThe LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+// <iterator>
+
+// move_iterator
+
+// requires RandomAccessIterator<Iter>
+// unspecified operator[](difference_type n) const;
+
+#include <iterator>
+#include <cassert>
+#ifdef _LIBCPP_MOVE
+#include <memory>
+#endif
+
+#include "../../../../iterators.h"
+
+template <class It>
+void
+test(It i, typename std::iterator_traits<It>::difference_type n,
+ typename std::iterator_traits<It>::value_type x)
+{
+ typedef typename std::iterator_traits<It>::value_type value_type;
+ const std::move_iterator<It> r(i);
+ value_type rr = r[n];
+ assert(rr == x);
+}
+
+#ifdef _LIBCPP_MOVE
+
+struct do_nothing
+{
+ void operator()(void*) const {}
+};
+
+#endif
+
+int main()
+{
+ char s[] = "1234567890";
+ test(random_access_iterator<char*>(s+5), 4, '0');
+ test(s+5, 4, '0');
+#ifdef _LIBCPP_MOVE
+ int i[5];
+ typedef std::unique_ptr<int, do_nothing> Ptr;
+ Ptr p[5];
+ for (unsigned j = 0; j < 5; ++j)
+ p[j].reset(i+j);
+ test(p, 3, Ptr(i+3));
+#endif
+}
diff --git a/libcxx/test/iterators/predef.iterators/move.iterators/move.iter.ops/move.iter.op.ref/op_arrow.pass.cpp b/libcxx/test/iterators/predef.iterators/move.iterators/move.iter.ops/move.iter.op.ref/op_arrow.pass.cpp
new file mode 100644
index 00000000000..382f7ba5728
--- /dev/null
+++ b/libcxx/test/iterators/predef.iterators/move.iterators/move.iter.ops/move.iter.op.ref/op_arrow.pass.cpp
@@ -0,0 +1,31 @@
+//===----------------------------------------------------------------------===//
+//
+// ΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚThe LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+// <iterator>
+
+// move_iterator
+
+// pointer operator->() const;
+
+#include <iterator>
+#include <cassert>
+
+template <class It>
+void
+test(It i)
+{
+ std::move_iterator<It> r(i);
+ assert(r.operator->() == i);
+}
+
+int main()
+{
+ char s[] = "123";
+ test(s);
+}
diff --git a/libcxx/test/iterators/predef.iterators/move.iterators/move.iter.ops/move.iter.op.star/op_star.pass.cpp b/libcxx/test/iterators/predef.iterators/move.iterators/move.iter.ops/move.iter.op.star/op_star.pass.cpp
new file mode 100644
index 00000000000..7ffac7f56a9
--- /dev/null
+++ b/libcxx/test/iterators/predef.iterators/move.iterators/move.iter.ops/move.iter.op.star/op_star.pass.cpp
@@ -0,0 +1,61 @@
+//===----------------------------------------------------------------------===//
+//
+// ΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚThe LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+// <iterator>
+
+// move_iterator
+
+// reference operator*() const;
+
+#include <iterator>
+#include <cassert>
+#ifdef _LIBCPP_MOVE
+#include <memory>
+#endif
+
+class A
+{
+ int data_;
+public:
+ A() : data_(1) {}
+ ~A() {data_ = -1;}
+
+ friend bool operator==(const A& x, const A& y)
+ {return x.data_ == y.data_;}
+};
+
+template <class It>
+void
+test(It i, typename std::iterator_traits<It>::value_type x)
+{
+ std::move_iterator<It> r(i);
+ assert(*r == x);
+ typename std::iterator_traits<It>::value_type x2 = *r;
+ assert(x2 == x);
+}
+
+#ifdef _LIBCPP_MOVE
+
+struct do_nothing
+{
+ void operator()(void*) const {}
+};
+
+#endif
+
+int main()
+{
+ A a;
+ test(&a, A());
+#ifdef _LIBCPP_MOVE
+ int i;
+ std::unique_ptr<int, do_nothing> p(&i);
+ test(&p, std::unique_ptr<int, do_nothing>(&i));
+#endif
+}
diff --git a/libcxx/test/iterators/predef.iterators/move.iterators/move.iter.ops/move.iter.op=/move_iterator.fail.cpp b/libcxx/test/iterators/predef.iterators/move.iterators/move.iter.ops/move.iter.op=/move_iterator.fail.cpp
new file mode 100644
index 00000000000..2c3a0172dc4
--- /dev/null
+++ b/libcxx/test/iterators/predef.iterators/move.iterators/move.iter.ops/move.iter.op=/move_iterator.fail.cpp
@@ -0,0 +1,39 @@
+//===----------------------------------------------------------------------===//
+//
+// ΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚThe LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+// <iterator>
+
+// move_iterator
+
+// template <class U>
+// requires HasAssign<Iter, const U&>
+// move_iterator&
+// operator=(const move_iterator<U>& u);
+
+// test requires
+
+#include <iterator>
+
+template <class It, class U>
+void
+test(U u)
+{
+ const std::move_iterator<U> r2(u);
+ std::move_iterator<It> r1;
+ r1 = r2;
+}
+
+struct base {};
+struct derived {};
+
+int main()
+{
+ derived d;
+ test<base*>(&d);
+}
diff --git a/libcxx/test/iterators/predef.iterators/move.iterators/move.iter.ops/move.iter.op=/move_iterator.pass.cpp b/libcxx/test/iterators/predef.iterators/move.iterators/move.iter.ops/move.iter.op=/move_iterator.pass.cpp
new file mode 100644
index 00000000000..7a434299497
--- /dev/null
+++ b/libcxx/test/iterators/predef.iterators/move.iterators/move.iter.ops/move.iter.op=/move_iterator.pass.cpp
@@ -0,0 +1,47 @@
+//===----------------------------------------------------------------------===//
+//
+// ΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚThe LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+// <iterator>
+
+// move_iterator
+
+// template <class U>
+// requires HasAssign<Iter, const U&>
+// move_iterator&
+// operator=(const move_iterator<U>& u);
+
+#include <iterator>
+#include <cassert>
+
+#include "../../../../iterators.h"
+
+template <class It, class U>
+void
+test(U u)
+{
+ const std::move_iterator<U> r2(u);
+ std::move_iterator<It> r1;
+ std::move_iterator<It>& rr = r1 = r2;
+ assert(r1.base() == u);
+ assert(&rr == &r1);
+}
+
+struct base {};
+struct derived : base {};
+
+int main()
+{
+ derived d;
+
+ test<input_iterator<base*> >(input_iterator<derived*>(&d));
+ test<forward_iterator<base*> >(forward_iterator<derived*>(&d));
+ test<bidirectional_iterator<base*> >(bidirectional_iterator<derived*>(&d));
+ test<random_access_iterator<const base*> >(random_access_iterator<derived*>(&d));
+ test<base*>(&d);
+}
diff --git a/libcxx/test/iterators/predef.iterators/move.iterators/move.iter.ops/nothing_to_do.pass.cpp b/libcxx/test/iterators/predef.iterators/move.iterators/move.iter.ops/nothing_to_do.pass.cpp
new file mode 100644
index 00000000000..fa4d462f18d
--- /dev/null
+++ b/libcxx/test/iterators/predef.iterators/move.iterators/move.iter.ops/nothing_to_do.pass.cpp
@@ -0,0 +1,12 @@
+//===----------------------------------------------------------------------===//
+//
+// ΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚThe LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+int main()
+{
+}
diff --git a/libcxx/test/iterators/predef.iterators/move.iterators/move.iter.requirements/nothing_to_do.pass.cpp b/libcxx/test/iterators/predef.iterators/move.iterators/move.iter.requirements/nothing_to_do.pass.cpp
new file mode 100644
index 00000000000..fa4d462f18d
--- /dev/null
+++ b/libcxx/test/iterators/predef.iterators/move.iterators/move.iter.requirements/nothing_to_do.pass.cpp
@@ -0,0 +1,12 @@
+//===----------------------------------------------------------------------===//
+//
+// ΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚThe LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+int main()
+{
+}
diff --git a/libcxx/test/iterators/predef.iterators/move.iterators/move.iterator/types.pass.cpp b/libcxx/test/iterators/predef.iterators/move.iterators/move.iterator/types.pass.cpp
new file mode 100644
index 00000000000..a9e4fe8a29b
--- /dev/null
+++ b/libcxx/test/iterators/predef.iterators/move.iterators/move.iterator/types.pass.cpp
@@ -0,0 +1,56 @@
+//===----------------------------------------------------------------------===//
+//
+// ΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚThe LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+// <iterator>
+
+// move_iterator
+
+// Test nested types:
+
+// template <InputIterator Iter>
+// class move_iterator {
+// public:
+// typedef Iter iterator_type;
+// typedef Iter::difference_type difference_type;
+// typedef Iterator pointer;
+// typedef Iter::value_type value_type;
+// typedef value_type&& reference;
+// };
+
+#include <iterator>
+#include <type_traits>
+
+#include "../../../iterators.h"
+
+template <class It>
+void
+test()
+{
+ typedef std::move_iterator<It> R;
+ typedef std::iterator_traits<It> T;
+ static_assert((std::is_same<typename R::iterator_type, It>::value), "");
+ static_assert((std::is_same<typename R::difference_type, typename T::difference_type>::value), "");
+ static_assert((std::is_same<typename R::pointer, typename T::pointer>::value), "");
+ static_assert((std::is_same<typename R::value_type, typename T::value_type>::value), "");
+#ifdef _LIBCPP_MOVE
+ static_assert((std::is_same<typename R::reference, typename R::value_type&&>::value), "");
+#else
+ static_assert((std::is_same<typename R::reference, typename T::reference>::value), "");
+#endif
+ static_assert((std::is_same<typename R::iterator_category, typename T::iterator_category>::value), "");
+}
+
+int main()
+{
+ test<input_iterator<char*> >();
+ test<forward_iterator<char*> >();
+ test<bidirectional_iterator<char*> >();
+ test<random_access_iterator<char*> >();
+ test<char*>();
+}
diff --git a/libcxx/test/iterators/predef.iterators/move.iterators/nothing_to_do.pass.cpp b/libcxx/test/iterators/predef.iterators/move.iterators/nothing_to_do.pass.cpp
new file mode 100644
index 00000000000..fa4d462f18d
--- /dev/null
+++ b/libcxx/test/iterators/predef.iterators/move.iterators/nothing_to_do.pass.cpp
@@ -0,0 +1,12 @@
+//===----------------------------------------------------------------------===//
+//
+// ΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚThe LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+int main()
+{
+}
diff --git a/libcxx/test/iterators/predef.iterators/nothing_to_do.pass.cpp b/libcxx/test/iterators/predef.iterators/nothing_to_do.pass.cpp
new file mode 100644
index 00000000000..fa4d462f18d
--- /dev/null
+++ b/libcxx/test/iterators/predef.iterators/nothing_to_do.pass.cpp
@@ -0,0 +1,12 @@
+//===----------------------------------------------------------------------===//
+//
+// ΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚThe LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+int main()
+{
+}
diff --git a/libcxx/test/iterators/predef.iterators/reverse.iterators/nothing_to_do.pass.cpp b/libcxx/test/iterators/predef.iterators/reverse.iterators/nothing_to_do.pass.cpp
new file mode 100644
index 00000000000..fa4d462f18d
--- /dev/null
+++ b/libcxx/test/iterators/predef.iterators/reverse.iterators/nothing_to_do.pass.cpp
@@ -0,0 +1,12 @@
+//===----------------------------------------------------------------------===//
+//
+// ΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚThe LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+int main()
+{
+}
diff --git a/libcxx/test/iterators/predef.iterators/reverse.iterators/reverse.iter.ops/nothing_to_do.pass.cpp b/libcxx/test/iterators/predef.iterators/reverse.iterators/reverse.iter.ops/nothing_to_do.pass.cpp
new file mode 100644
index 00000000000..fa4d462f18d
--- /dev/null
+++ b/libcxx/test/iterators/predef.iterators/reverse.iterators/reverse.iter.ops/nothing_to_do.pass.cpp
@@ -0,0 +1,12 @@
+//===----------------------------------------------------------------------===//
+//
+// ΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚThe LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+int main()
+{
+}
diff --git a/libcxx/test/iterators/predef.iterators/reverse.iterators/reverse.iter.ops/reverse.iter.cons/default.pass.cpp b/libcxx/test/iterators/predef.iterators/reverse.iterators/reverse.iter.ops/reverse.iter.cons/default.pass.cpp
new file mode 100644
index 00000000000..7dd8fb1e6ca
--- /dev/null
+++ b/libcxx/test/iterators/predef.iterators/reverse.iterators/reverse.iter.ops/reverse.iter.cons/default.pass.cpp
@@ -0,0 +1,33 @@
+//===----------------------------------------------------------------------===//
+//
+// ΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚThe LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+// <iterator>
+
+// reverse_iterator
+
+// reverse_iterator();
+
+#include <iterator>
+
+#include "../../../../iterators.h"
+
+template <class It>
+void
+test()
+{
+ std::reverse_iterator<It> r;
+}
+
+int main()
+{
+ test<bidirectional_iterator<const char*> >();
+ test<random_access_iterator<char*> >();
+ test<char*>();
+ test<const char*>();
+}
diff --git a/libcxx/test/iterators/predef.iterators/reverse.iterators/reverse.iter.ops/reverse.iter.cons/iter.fail.cpp b/libcxx/test/iterators/predef.iterators/reverse.iterators/reverse.iter.ops/reverse.iter.cons/iter.fail.cpp
new file mode 100644
index 00000000000..9ed84d275ed
--- /dev/null
+++ b/libcxx/test/iterators/predef.iterators/reverse.iterators/reverse.iter.ops/reverse.iter.cons/iter.fail.cpp
@@ -0,0 +1,31 @@
+//===----------------------------------------------------------------------===//
+//
+// ΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚThe LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+// <iterator>
+
+// reverse_iterator
+
+// explicit reverse_iterator(Iter x);
+
+// test explicit
+
+#include <iterator>
+
+template <class It>
+void
+test(It i)
+{
+ std::reverse_iterator<It> r = i;
+}
+
+int main()
+{
+ const char s[] = "123";
+ test(s);
+}
diff --git a/libcxx/test/iterators/predef.iterators/reverse.iterators/reverse.iter.ops/reverse.iter.cons/iter.pass.cpp b/libcxx/test/iterators/predef.iterators/reverse.iterators/reverse.iter.ops/reverse.iter.cons/iter.pass.cpp
new file mode 100644
index 00000000000..e2633f05da4
--- /dev/null
+++ b/libcxx/test/iterators/predef.iterators/reverse.iterators/reverse.iter.ops/reverse.iter.cons/iter.pass.cpp
@@ -0,0 +1,35 @@
+//===----------------------------------------------------------------------===//
+//
+// ΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚThe LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+// <iterator>
+
+// reverse_iterator
+
+// explicit reverse_iterator(Iter x);
+
+#include <iterator>
+#include <cassert>
+
+#include "../../../../iterators.h"
+
+template <class It>
+void
+test(It i)
+{
+ std::reverse_iterator<It> r(i);
+ assert(r.base() == i);
+}
+
+int main()
+{
+ const char s[] = "123";
+ test(bidirectional_iterator<const char*>(s));
+ test(random_access_iterator<const char*>(s));
+ test(s);
+}
diff --git a/libcxx/test/iterators/predef.iterators/reverse.iterators/reverse.iter.ops/reverse.iter.cons/reverse_iterator.fail.cpp b/libcxx/test/iterators/predef.iterators/reverse.iterators/reverse.iter.ops/reverse.iter.cons/reverse_iterator.fail.cpp
new file mode 100644
index 00000000000..376932eb1a2
--- /dev/null
+++ b/libcxx/test/iterators/predef.iterators/reverse.iterators/reverse.iter.ops/reverse.iter.cons/reverse_iterator.fail.cpp
@@ -0,0 +1,38 @@
+//===----------------------------------------------------------------------===//
+//
+// ΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚThe LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+// <iterator>
+
+// reverse_iterator
+
+// template <class U>
+// requires HasConstructor<Iter, const U&>
+// reverse_iterator(const reverse_iterator<U> &u);
+
+// test requires
+
+#include <iterator>
+
+template <class It, class U>
+void
+test(U u)
+{
+ std::reverse_iterator<U> r2(u);
+ std::reverse_iterator<It> r1 = r2;
+}
+
+struct base {};
+struct derived {};
+
+int main()
+{
+ derived d;
+
+ test<base*>(&d);
+}
diff --git a/libcxx/test/iterators/predef.iterators/reverse.iterators/reverse.iter.ops/reverse.iter.cons/reverse_iterator.pass.cpp b/libcxx/test/iterators/predef.iterators/reverse.iterators/reverse.iter.ops/reverse.iter.cons/reverse_iterator.pass.cpp
new file mode 100644
index 00000000000..923a594649c
--- /dev/null
+++ b/libcxx/test/iterators/predef.iterators/reverse.iterators/reverse.iter.ops/reverse.iter.cons/reverse_iterator.pass.cpp
@@ -0,0 +1,42 @@
+//===----------------------------------------------------------------------===//
+//
+// ΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚThe LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+// <iterator>
+
+// reverse_iterator
+
+// template <class U>
+// requires HasConstructor<Iter, const U&>
+// reverse_iterator(const reverse_iterator<U> &u);
+
+#include <iterator>
+#include <cassert>
+
+#include "../../../../iterators.h"
+
+template <class It, class U>
+void
+test(U u)
+{
+ const std::reverse_iterator<U> r2(u);
+ std::reverse_iterator<It> r1 = r2;
+ assert(r1.base() == u);
+}
+
+struct base {};
+struct derived : base {};
+
+int main()
+{
+ derived d;
+
+ test<bidirectional_iterator<base*> >(bidirectional_iterator<derived*>(&d));
+ test<random_access_iterator<const base*> >(random_access_iterator<derived*>(&d));
+ test<base*>(&d);
+}
diff --git a/libcxx/test/iterators/predef.iterators/reverse.iterators/reverse.iter.ops/reverse.iter.conv/tested_elsewhere.pass.cpp b/libcxx/test/iterators/predef.iterators/reverse.iterators/reverse.iter.ops/reverse.iter.conv/tested_elsewhere.pass.cpp
new file mode 100644
index 00000000000..fa4d462f18d
--- /dev/null
+++ b/libcxx/test/iterators/predef.iterators/reverse.iterators/reverse.iter.ops/reverse.iter.conv/tested_elsewhere.pass.cpp
@@ -0,0 +1,12 @@
+//===----------------------------------------------------------------------===//
+//
+// ΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚThe LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+int main()
+{
+}
diff --git a/libcxx/test/iterators/predef.iterators/reverse.iterators/reverse.iter.ops/reverse.iter.op!=/test.pass.cpp b/libcxx/test/iterators/predef.iterators/reverse.iterators/reverse.iter.ops/reverse.iter.op!=/test.pass.cpp
new file mode 100644
index 00000000000..1990f0e450b
--- /dev/null
+++ b/libcxx/test/iterators/predef.iterators/reverse.iterators/reverse.iter.ops/reverse.iter.op!=/test.pass.cpp
@@ -0,0 +1,42 @@
+//===----------------------------------------------------------------------===//
+//
+// ΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚThe LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+// <iterator>
+
+// reverse_iterator
+
+// template <BidirectionalIterator Iter1, BidirectionalIterator Iter2>
+// requires HasEqualTo<Iter1, Iter2>
+// bool
+// operator!=(const reverse_iterator<Iter1>& x, const reverse_iterator<Iter2>& y);
+
+#include <iterator>
+#include <cassert>
+
+#include "../../../../iterators.h"
+
+template <class It>
+void
+test(It l, It r, bool x)
+{
+ const std::reverse_iterator<It> r1(l);
+ const std::reverse_iterator<It> r2(r);
+ assert((r1 != r2) == x);
+}
+
+int main()
+{
+ const char* s = "1234567890";
+ test(bidirectional_iterator<const char*>(s), bidirectional_iterator<const char*>(s), false);
+ test(bidirectional_iterator<const char*>(s), bidirectional_iterator<const char*>(s+1), true);
+ test(random_access_iterator<const char*>(s), random_access_iterator<const char*>(s), false);
+ test(random_access_iterator<const char*>(s), random_access_iterator<const char*>(s+1), true);
+ test(s, s, false);
+ test(s, s+1, true);
+}
diff --git a/libcxx/test/iterators/predef.iterators/reverse.iterators/reverse.iter.ops/reverse.iter.op++/post.pass.cpp b/libcxx/test/iterators/predef.iterators/reverse.iterators/reverse.iter.ops/reverse.iter.op++/post.pass.cpp
new file mode 100644
index 00000000000..a29b82ad4e7
--- /dev/null
+++ b/libcxx/test/iterators/predef.iterators/reverse.iterators/reverse.iter.ops/reverse.iter.op++/post.pass.cpp
@@ -0,0 +1,37 @@
+//===----------------------------------------------------------------------===//
+//
+// ΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚThe LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+// <iterator>
+
+// reverse_iterator
+
+// reverse_iterator operator++(int);
+
+#include <iterator>
+#include <cassert>
+
+#include "../../../../iterators.h"
+
+template <class It>
+void
+test(It i, It x)
+{
+ std::reverse_iterator<It> r(i);
+ std::reverse_iterator<It> rr = r++;
+ assert(r.base() == x);
+ assert(rr.base() == i);
+}
+
+int main()
+{
+ const char* s = "123";
+ test(bidirectional_iterator<const char*>(s+1), bidirectional_iterator<const char*>(s));
+ test(random_access_iterator<const char*>(s+1), random_access_iterator<const char*>(s));
+ test(s+1, s);
+}
diff --git a/libcxx/test/iterators/predef.iterators/reverse.iterators/reverse.iter.ops/reverse.iter.op++/pre.pass.cpp b/libcxx/test/iterators/predef.iterators/reverse.iterators/reverse.iter.ops/reverse.iter.op++/pre.pass.cpp
new file mode 100644
index 00000000000..1bce56923d5
--- /dev/null
+++ b/libcxx/test/iterators/predef.iterators/reverse.iterators/reverse.iter.ops/reverse.iter.op++/pre.pass.cpp
@@ -0,0 +1,37 @@
+//===----------------------------------------------------------------------===//
+//
+// ΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚThe LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+// <iterator>
+
+// reverse_iterator
+
+// reverse_iterator& operator++();
+
+#include <iterator>
+#include <cassert>
+
+#include "../../../../iterators.h"
+
+template <class It>
+void
+test(It i, It x)
+{
+ std::reverse_iterator<It> r(i);
+ std::reverse_iterator<It>& rr = ++r;
+ assert(r.base() == x);
+ assert(&rr == &r);
+}
+
+int main()
+{
+ const char* s = "123";
+ test(bidirectional_iterator<const char*>(s+1), bidirectional_iterator<const char*>(s));
+ test(random_access_iterator<const char*>(s+1), random_access_iterator<const char*>(s));
+ test(s+1, s);
+}
diff --git a/libcxx/test/iterators/predef.iterators/reverse.iterators/reverse.iter.ops/reverse.iter.op+/difference_type.pass.cpp b/libcxx/test/iterators/predef.iterators/reverse.iterators/reverse.iter.ops/reverse.iter.op+/difference_type.pass.cpp
new file mode 100644
index 00000000000..bfda849897b
--- /dev/null
+++ b/libcxx/test/iterators/predef.iterators/reverse.iterators/reverse.iter.ops/reverse.iter.op+/difference_type.pass.cpp
@@ -0,0 +1,36 @@
+//===----------------------------------------------------------------------===//
+//
+// ΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚThe LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+// <iterator>
+
+// reverse_iterator
+
+// requires RandomAccessIterator<Iter>
+// reverse_iterator operator+(difference_type n) const;
+
+#include <iterator>
+#include <cassert>
+
+#include "../../../../iterators.h"
+
+template <class It>
+void
+test(It i, typename std::iterator_traits<It>::difference_type n, It x)
+{
+ const std::reverse_iterator<It> r(i);
+ std::reverse_iterator<It> rr = r + n;
+ assert(rr.base() == x);
+}
+
+int main()
+{
+ const char* s = "1234567890";
+ test(random_access_iterator<const char*>(s+5), 5, random_access_iterator<const char*>(s));
+ test(s+5, 5, s);
+}
diff --git a/libcxx/test/iterators/predef.iterators/reverse.iterators/reverse.iter.ops/reverse.iter.op+=/difference_type.pass.cpp b/libcxx/test/iterators/predef.iterators/reverse.iterators/reverse.iter.ops/reverse.iter.op+=/difference_type.pass.cpp
new file mode 100644
index 00000000000..dcd2d6e3f5f
--- /dev/null
+++ b/libcxx/test/iterators/predef.iterators/reverse.iterators/reverse.iter.ops/reverse.iter.op+=/difference_type.pass.cpp
@@ -0,0 +1,37 @@
+//===----------------------------------------------------------------------===//
+//
+// ΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚThe LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+// <iterator>
+
+// reverse_iterator
+
+// requires RandomAccessIterator<Iter>
+// reverse_iterator& operator+=(difference_type n);
+
+#include <iterator>
+#include <cassert>
+
+#include "../../../../iterators.h"
+
+template <class It>
+void
+test(It i, typename std::iterator_traits<It>::difference_type n, It x)
+{
+ std::reverse_iterator<It> r(i);
+ std::reverse_iterator<It>& rr = r += n;
+ assert(r.base() == x);
+ assert(&rr == &r);
+}
+
+int main()
+{
+ const char* s = "1234567890";
+ test(random_access_iterator<const char*>(s+5), 5, random_access_iterator<const char*>(s));
+ test(s+5, 5, s);
+}
diff --git a/libcxx/test/iterators/predef.iterators/reverse.iterators/reverse.iter.ops/reverse.iter.op--/post.pass.cpp b/libcxx/test/iterators/predef.iterators/reverse.iterators/reverse.iter.ops/reverse.iter.op--/post.pass.cpp
new file mode 100644
index 00000000000..322a288442a
--- /dev/null
+++ b/libcxx/test/iterators/predef.iterators/reverse.iterators/reverse.iter.ops/reverse.iter.op--/post.pass.cpp
@@ -0,0 +1,37 @@
+//===----------------------------------------------------------------------===//
+//
+// ΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚThe LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+// <iterator>
+
+// reverse_iterator
+
+// reverse_iterator operator--(int);
+
+#include <iterator>
+#include <cassert>
+
+#include "../../../../iterators.h"
+
+template <class It>
+void
+test(It i, It x)
+{
+ std::reverse_iterator<It> r(i);
+ std::reverse_iterator<It> rr = r--;
+ assert(r.base() == x);
+ assert(rr.base() == i);
+}
+
+int main()
+{
+ const char* s = "123";
+ test(bidirectional_iterator<const char*>(s+1), bidirectional_iterator<const char*>(s+2));
+ test(random_access_iterator<const char*>(s+1), random_access_iterator<const char*>(s+2));
+ test(s+1, s+2);
+}
diff --git a/libcxx/test/iterators/predef.iterators/reverse.iterators/reverse.iter.ops/reverse.iter.op--/pre.pass.cpp b/libcxx/test/iterators/predef.iterators/reverse.iterators/reverse.iter.ops/reverse.iter.op--/pre.pass.cpp
new file mode 100644
index 00000000000..ec26ab2b2ad
--- /dev/null
+++ b/libcxx/test/iterators/predef.iterators/reverse.iterators/reverse.iter.ops/reverse.iter.op--/pre.pass.cpp
@@ -0,0 +1,37 @@
+//===----------------------------------------------------------------------===//
+//
+// ΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚThe LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+// <iterator>
+
+// reverse_iterator
+
+// reverse_iterator& operator--();
+
+#include <iterator>
+#include <cassert>
+
+#include "../../../../iterators.h"
+
+template <class It>
+void
+test(It i, It x)
+{
+ std::reverse_iterator<It> r(i);
+ std::reverse_iterator<It>& rr = --r;
+ assert(r.base() == x);
+ assert(&rr == &r);
+}
+
+int main()
+{
+ const char* s = "123";
+ test(bidirectional_iterator<const char*>(s+1), bidirectional_iterator<const char*>(s+2));
+ test(random_access_iterator<const char*>(s+1), random_access_iterator<const char*>(s+2));
+ test(s+1, s+2);
+}
diff --git a/libcxx/test/iterators/predef.iterators/reverse.iterators/reverse.iter.ops/reverse.iter.op-/difference_type.pass.cpp b/libcxx/test/iterators/predef.iterators/reverse.iterators/reverse.iter.ops/reverse.iter.op-/difference_type.pass.cpp
new file mode 100644
index 00000000000..a2a4e7aa994
--- /dev/null
+++ b/libcxx/test/iterators/predef.iterators/reverse.iterators/reverse.iter.ops/reverse.iter.op-/difference_type.pass.cpp
@@ -0,0 +1,36 @@
+//===----------------------------------------------------------------------===//
+//
+// ΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚThe LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+// <iterator>
+
+// reverse_iterator
+
+// requires RandomAccessIterator<Iter>
+// reverse_iterator operator-(difference_type n) const;
+
+#include <iterator>
+#include <cassert>
+
+#include "../../../../iterators.h"
+
+template <class It>
+void
+test(It i, typename std::iterator_traits<It>::difference_type n, It x)
+{
+ const std::reverse_iterator<It> r(i);
+ std::reverse_iterator<It> rr = r - n;
+ assert(rr.base() == x);
+}
+
+int main()
+{
+ const char* s = "1234567890";
+ test(random_access_iterator<const char*>(s+5), 5, random_access_iterator<const char*>(s+10));
+ test(s+5, 5, s+10);
+}
diff --git a/libcxx/test/iterators/predef.iterators/reverse.iterators/reverse.iter.ops/reverse.iter.op-=/difference_type.pass.cpp b/libcxx/test/iterators/predef.iterators/reverse.iterators/reverse.iter.ops/reverse.iter.op-=/difference_type.pass.cpp
new file mode 100644
index 00000000000..641ce3fbc1c
--- /dev/null
+++ b/libcxx/test/iterators/predef.iterators/reverse.iterators/reverse.iter.ops/reverse.iter.op-=/difference_type.pass.cpp
@@ -0,0 +1,37 @@
+//===----------------------------------------------------------------------===//
+//
+// ΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚThe LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+// <iterator>
+
+// reverse_iterator
+
+// requires RandomAccessIterator<Iter>
+// reverse_iterator& operator-=(difference_type n);
+
+#include <iterator>
+#include <cassert>
+
+#include "../../../../iterators.h"
+
+template <class It>
+void
+test(It i, typename std::iterator_traits<It>::difference_type n, It x)
+{
+ std::reverse_iterator<It> r(i);
+ std::reverse_iterator<It>& rr = r -= n;
+ assert(r.base() == x);
+ assert(&rr == &r);
+}
+
+int main()
+{
+ const char* s = "1234567890";
+ test(random_access_iterator<const char*>(s+5), 5, random_access_iterator<const char*>(s+10));
+ test(s+5, 5, s+10);
+}
diff --git a/libcxx/test/iterators/predef.iterators/reverse.iterators/reverse.iter.ops/reverse.iter.op.star/op_star.pass.cpp b/libcxx/test/iterators/predef.iterators/reverse.iterators/reverse.iter.ops/reverse.iter.op.star/op_star.pass.cpp
new file mode 100644
index 00000000000..334b5daae8f
--- /dev/null
+++ b/libcxx/test/iterators/predef.iterators/reverse.iterators/reverse.iter.ops/reverse.iter.op.star/op_star.pass.cpp
@@ -0,0 +1,66 @@
+//===----------------------------------------------------------------------===//
+//
+// ΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚThe LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+// <iterator>
+
+// reverse_iterator
+
+// reference operator*() const;
+
+// Be sure to respect LWG 198:
+// http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#198
+
+#include <iterator>
+#include <cassert>
+
+class A
+{
+ int data_;
+public:
+ A() : data_(1) {}
+ ~A() {data_ = -1;}
+
+ friend bool operator==(const A& x, const A& y)
+ {return x.data_ == y.data_;}
+};
+
+template <class It>
+class weird_iterator
+{
+ It it_;
+public:
+ typedef It value_type;
+ typedef std::bidirectional_iterator_tag iterator_category;
+ typedef std::ptrdiff_t difference_type;
+ typedef It* pointer;
+ typedef It& reference;
+
+ weird_iterator() {}
+ explicit weird_iterator(It it) : it_(it) {}
+ ~weird_iterator() {it_ = It();}
+
+ reference operator*() {return it_;}
+
+ weird_iterator& operator--() {return *this;}
+};
+
+template <class It>
+void
+test(It i, typename std::iterator_traits<It>::value_type x)
+{
+ std::reverse_iterator<It> r(i);
+ assert(*r == x);
+}
+
+int main()
+{
+ test(weird_iterator<A>(A()), A());
+ A a;
+ test(&a+1, A());
+}
diff --git a/libcxx/test/iterators/predef.iterators/reverse.iterators/reverse.iter.ops/reverse.iter.op=/reverse_iterator.fail.cpp b/libcxx/test/iterators/predef.iterators/reverse.iterators/reverse.iter.ops/reverse.iter.op=/reverse_iterator.fail.cpp
new file mode 100644
index 00000000000..7fc6948cff4
--- /dev/null
+++ b/libcxx/test/iterators/predef.iterators/reverse.iterators/reverse.iter.ops/reverse.iter.op=/reverse_iterator.fail.cpp
@@ -0,0 +1,39 @@
+//===----------------------------------------------------------------------===//
+//
+// ΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚThe LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+// <iterator>
+
+// reverse_iterator
+
+// template <class U>
+// requires HasAssign<Iter, const U&>
+// reverse_iterator&
+// operator=(const reverse_iterator<U>& u);
+
+// test requires
+
+#include <iterator>
+
+template <class It, class U>
+void
+test(U u)
+{
+ const std::reverse_iterator<U> r2(u);
+ std::reverse_iterator<It> r1;
+ r1 = r2;
+}
+
+struct base {};
+struct derived {};
+
+int main()
+{
+ derived d;
+ test<base*>(&d);
+}
diff --git a/libcxx/test/iterators/predef.iterators/reverse.iterators/reverse.iter.ops/reverse.iter.op=/reverse_iterator.pass.cpp b/libcxx/test/iterators/predef.iterators/reverse.iterators/reverse.iter.ops/reverse.iter.op=/reverse_iterator.pass.cpp
new file mode 100644
index 00000000000..a83a43a91a0
--- /dev/null
+++ b/libcxx/test/iterators/predef.iterators/reverse.iterators/reverse.iter.ops/reverse.iter.op=/reverse_iterator.pass.cpp
@@ -0,0 +1,45 @@
+//===----------------------------------------------------------------------===//
+//
+// ΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚThe LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+// <iterator>
+
+// reverse_iterator
+
+// template <class U>
+// requires HasAssign<Iter, const U&>
+// reverse_iterator&
+// operator=(const reverse_iterator<U>& u);
+
+#include <iterator>
+#include <cassert>
+
+#include "../../../../iterators.h"
+
+template <class It, class U>
+void
+test(U u)
+{
+ const std::reverse_iterator<U> r2(u);
+ std::reverse_iterator<It> r1;
+ std::reverse_iterator<It>& rr = r1 = r2;
+ assert(r1.base() == u);
+ assert(&rr == &r1);
+}
+
+struct base {};
+struct derived : base {};
+
+int main()
+{
+ derived d;
+
+ test<bidirectional_iterator<base*> >(bidirectional_iterator<derived*>(&d));
+ test<random_access_iterator<const base*> >(random_access_iterator<derived*>(&d));
+ test<base*>(&d);
+}
diff --git a/libcxx/test/iterators/predef.iterators/reverse.iterators/reverse.iter.ops/reverse.iter.op==/test.pass.cpp b/libcxx/test/iterators/predef.iterators/reverse.iterators/reverse.iter.ops/reverse.iter.op==/test.pass.cpp
new file mode 100644
index 00000000000..0abc1d9aaf3
--- /dev/null
+++ b/libcxx/test/iterators/predef.iterators/reverse.iterators/reverse.iter.ops/reverse.iter.op==/test.pass.cpp
@@ -0,0 +1,42 @@
+//===----------------------------------------------------------------------===//
+//
+// ΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚThe LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+// <iterator>
+
+// reverse_iterator
+
+// template <BidirectionalIterator Iter1, BidirectionalIterator Iter2>
+// requires HasEqualTo<Iter1, Iter2>
+// bool
+// operator==(const reverse_iterator<Iter1>& x, const reverse_iterator<Iter2>& y);
+
+#include <iterator>
+#include <cassert>
+
+#include "../../../../iterators.h"
+
+template <class It>
+void
+test(It l, It r, bool x)
+{
+ const std::reverse_iterator<It> r1(l);
+ const std::reverse_iterator<It> r2(r);
+ assert((r1 == r2) == x);
+}
+
+int main()
+{
+ const char* s = "1234567890";
+ test(bidirectional_iterator<const char*>(s), bidirectional_iterator<const char*>(s), true);
+ test(bidirectional_iterator<const char*>(s), bidirectional_iterator<const char*>(s+1), false);
+ test(random_access_iterator<const char*>(s), random_access_iterator<const char*>(s), true);
+ test(random_access_iterator<const char*>(s), random_access_iterator<const char*>(s+1), false);
+ test(s, s, true);
+ test(s, s+1, false);
+}
diff --git a/libcxx/test/iterators/predef.iterators/reverse.iterators/reverse.iter.ops/reverse.iter.opdiff/test.pass.cpp b/libcxx/test/iterators/predef.iterators/reverse.iterators/reverse.iter.ops/reverse.iter.opdiff/test.pass.cpp
new file mode 100644
index 00000000000..3c08e33d6ec
--- /dev/null
+++ b/libcxx/test/iterators/predef.iterators/reverse.iterators/reverse.iter.ops/reverse.iter.opdiff/test.pass.cpp
@@ -0,0 +1,43 @@
+//===----------------------------------------------------------------------===//
+//
+// ΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚThe LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+// <iterator>
+
+// reverse_iterator
+
+// template <RandomAccessIterator Iter1, RandomAccessIterator Iter2>
+// requires HasMinus<Iter2, Iter1>
+// auto operator-(const reverse_iterator<Iter1>& x, const reverse_iterator<Iter2>& y)
+// -> decltype(y.base() - x.base());
+
+#include <iterator>
+#include <cstddef>
+#include <cassert>
+
+#include "../../../../iterators.h"
+
+template <class It1, class It2>
+void
+test(It1 l, It2 r, std::ptrdiff_t x)
+{
+ const std::reverse_iterator<It1> r1(l);
+ const std::reverse_iterator<It2> r2(r);
+ assert((r1 - r2) == x);
+}
+
+int main()
+{
+ char s[3] = {0};
+ test(random_access_iterator<const char*>(s), random_access_iterator<char*>(s), 0);
+ test(random_access_iterator<char*>(s), random_access_iterator<const char*>(s+1), 1);
+ test(random_access_iterator<const char*>(s+1), random_access_iterator<char*>(s), -1);
+ test(s, s, 0);
+ test(s, s+1, 1);
+ test(s+1, s, -1);
+}
diff --git a/libcxx/test/iterators/predef.iterators/reverse.iterators/reverse.iter.ops/reverse.iter.opgt/test.pass.cpp b/libcxx/test/iterators/predef.iterators/reverse.iterators/reverse.iter.ops/reverse.iter.opgt/test.pass.cpp
new file mode 100644
index 00000000000..c1367eca94d
--- /dev/null
+++ b/libcxx/test/iterators/predef.iterators/reverse.iterators/reverse.iter.ops/reverse.iter.opgt/test.pass.cpp
@@ -0,0 +1,42 @@
+//===----------------------------------------------------------------------===//
+//
+// ΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚThe LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+// <iterator>
+
+// reverse_iterator
+
+// template <RandomAccessIterator Iter1, RandomAccessIterator Iter2>
+// requires HasGreater<Iter1, Iter2>
+// bool
+// operator>(const reverse_iterator<Iter1>& x, const reverse_iterator<Iter2>& y);
+
+#include <iterator>
+#include <cassert>
+
+#include "../../../../iterators.h"
+
+template <class It>
+void
+test(It l, It r, bool x)
+{
+ const std::reverse_iterator<It> r1(l);
+ const std::reverse_iterator<It> r2(r);
+ assert((r1 > r2) == x);
+}
+
+int main()
+{
+ const char* s = "1234567890";
+ test(random_access_iterator<const char*>(s), random_access_iterator<const char*>(s), false);
+ test(random_access_iterator<const char*>(s), random_access_iterator<const char*>(s+1), true);
+ test(random_access_iterator<const char*>(s+1), random_access_iterator<const char*>(s), false);
+ test(s, s, false);
+ test(s, s+1, true);
+ test(s+1, s, false);
+}
diff --git a/libcxx/test/iterators/predef.iterators/reverse.iterators/reverse.iter.ops/reverse.iter.opgt=/test.pass.cpp b/libcxx/test/iterators/predef.iterators/reverse.iterators/reverse.iter.ops/reverse.iter.opgt=/test.pass.cpp
new file mode 100644
index 00000000000..7dfcae89ea1
--- /dev/null
+++ b/libcxx/test/iterators/predef.iterators/reverse.iterators/reverse.iter.ops/reverse.iter.opgt=/test.pass.cpp
@@ -0,0 +1,42 @@
+//===----------------------------------------------------------------------===//
+//
+// ΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚThe LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+// <iterator>
+
+// reverse_iterator
+
+// template <RandomAccessIterator Iter1, RandomAccessIterator Iter2>
+// requires HasGreater<Iter1, Iter2>
+// bool
+// operator>=(const reverse_iterator<Iter1>& x, const reverse_iterator<Iter2>& y);
+
+#include <iterator>
+#include <cassert>
+
+#include "../../../../iterators.h"
+
+template <class It>
+void
+test(It l, It r, bool x)
+{
+ const std::reverse_iterator<It> r1(l);
+ const std::reverse_iterator<It> r2(r);
+ assert((r1 >= r2) == x);
+}
+
+int main()
+{
+ const char* s = "1234567890";
+ test(random_access_iterator<const char*>(s), random_access_iterator<const char*>(s), true);
+ test(random_access_iterator<const char*>(s), random_access_iterator<const char*>(s+1), true);
+ test(random_access_iterator<const char*>(s+1), random_access_iterator<const char*>(s), false);
+ test(s, s, true);
+ test(s, s+1, true);
+ test(s+1, s, false);
+}
diff --git a/libcxx/test/iterators/predef.iterators/reverse.iterators/reverse.iter.ops/reverse.iter.opindex/difference_type.pass.cpp b/libcxx/test/iterators/predef.iterators/reverse.iterators/reverse.iter.ops/reverse.iter.opindex/difference_type.pass.cpp
new file mode 100644
index 00000000000..541d1e5093b
--- /dev/null
+++ b/libcxx/test/iterators/predef.iterators/reverse.iterators/reverse.iter.ops/reverse.iter.opindex/difference_type.pass.cpp
@@ -0,0 +1,38 @@
+//===----------------------------------------------------------------------===//
+//
+// ΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚThe LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+// <iterator>
+
+// reverse_iterator
+
+// requires RandomAccessIterator<Iter>
+// unspecified operator[](difference_type n) const;
+
+#include <iterator>
+#include <cassert>
+
+#include "../../../../iterators.h"
+
+template <class It>
+void
+test(It i, typename std::iterator_traits<It>::difference_type n,
+ typename std::iterator_traits<It>::value_type x)
+{
+ typedef typename std::iterator_traits<It>::value_type value_type;
+ const std::reverse_iterator<It> r(i);
+ value_type rr = r[n];
+ assert(rr == x);
+}
+
+int main()
+{
+ const char* s = "1234567890";
+ test(random_access_iterator<const char*>(s+5), 4, '1');
+ test(s+5, 4, '1');
+}
diff --git a/libcxx/test/iterators/predef.iterators/reverse.iterators/reverse.iter.ops/reverse.iter.oplt/test.pass.cpp b/libcxx/test/iterators/predef.iterators/reverse.iterators/reverse.iter.ops/reverse.iter.oplt/test.pass.cpp
new file mode 100644
index 00000000000..6594c25d5f7
--- /dev/null
+++ b/libcxx/test/iterators/predef.iterators/reverse.iterators/reverse.iter.ops/reverse.iter.oplt/test.pass.cpp
@@ -0,0 +1,42 @@
+//===----------------------------------------------------------------------===//
+//
+// ΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚThe LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+// <iterator>
+
+// reverse_iterator
+
+// template <RandomAccessIterator Iter1, RandomAccessIterator Iter2>
+// requires HasGreater<Iter1, Iter2>
+// bool
+// operator<(const reverse_iterator<Iter1>& x, const reverse_iterator<Iter2>& y);
+
+#include <iterator>
+#include <cassert>
+
+#include "../../../../iterators.h"
+
+template <class It>
+void
+test(It l, It r, bool x)
+{
+ const std::reverse_iterator<It> r1(l);
+ const std::reverse_iterator<It> r2(r);
+ assert((r1 < r2) == x);
+}
+
+int main()
+{
+ const char* s = "1234567890";
+ test(random_access_iterator<const char*>(s), random_access_iterator<const char*>(s), false);
+ test(random_access_iterator<const char*>(s), random_access_iterator<const char*>(s+1), false);
+ test(random_access_iterator<const char*>(s+1), random_access_iterator<const char*>(s), true);
+ test(s, s, false);
+ test(s, s+1, false);
+ test(s+1, s, true);
+}
diff --git a/libcxx/test/iterators/predef.iterators/reverse.iterators/reverse.iter.ops/reverse.iter.oplt=/test.pass.cpp b/libcxx/test/iterators/predef.iterators/reverse.iterators/reverse.iter.ops/reverse.iter.oplt=/test.pass.cpp
new file mode 100644
index 00000000000..123d2edf1aa
--- /dev/null
+++ b/libcxx/test/iterators/predef.iterators/reverse.iterators/reverse.iter.ops/reverse.iter.oplt=/test.pass.cpp
@@ -0,0 +1,42 @@
+//===----------------------------------------------------------------------===//
+//
+// ΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚThe LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+// <iterator>
+
+// reverse_iterator
+
+// template <RandomAccessIterator Iter1, RandomAccessIterator Iter2>
+// requires HasGreater<Iter1, Iter2>
+// bool
+// operator<=(const reverse_iterator<Iter1>& x, const reverse_iterator<Iter2>& y);
+
+#include <iterator>
+#include <cassert>
+
+#include "../../../../iterators.h"
+
+template <class It>
+void
+test(It l, It r, bool x)
+{
+ const std::reverse_iterator<It> r1(l);
+ const std::reverse_iterator<It> r2(r);
+ assert((r1 <= r2) == x);
+}
+
+int main()
+{
+ const char* s = "1234567890";
+ test(random_access_iterator<const char*>(s), random_access_iterator<const char*>(s), true);
+ test(random_access_iterator<const char*>(s), random_access_iterator<const char*>(s+1), false);
+ test(random_access_iterator<const char*>(s+1), random_access_iterator<const char*>(s), true);
+ test(s, s, true);
+ test(s, s+1, false);
+ test(s+1, s, true);
+}
diff --git a/libcxx/test/iterators/predef.iterators/reverse.iterators/reverse.iter.ops/reverse.iter.opref/op_arrow.pass.cpp b/libcxx/test/iterators/predef.iterators/reverse.iterators/reverse.iter.ops/reverse.iter.opref/op_arrow.pass.cpp
new file mode 100644
index 00000000000..0eddb2b4c52
--- /dev/null
+++ b/libcxx/test/iterators/predef.iterators/reverse.iterators/reverse.iter.ops/reverse.iter.opref/op_arrow.pass.cpp
@@ -0,0 +1,69 @@
+//===----------------------------------------------------------------------===//
+//
+// ΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚThe LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+// <iterator>
+
+// reverse_iterator
+
+// pointer operator->() const;
+
+// Be sure to respect LWG 198:
+// http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#198
+
+#include <iterator>
+#include <cassert>
+
+class A
+{
+ int data_;
+public:
+ A() : data_(1) {}
+ ~A() {data_ = -1;}
+
+ int get() const {return data_;}
+
+ friend bool operator==(const A& x, const A& y)
+ {return x.data_ == y.data_;}
+};
+
+template <class It>
+class weird_iterator
+{
+ It it_;
+public:
+ typedef It value_type;
+ typedef std::bidirectional_iterator_tag iterator_category;
+ typedef std::ptrdiff_t difference_type;
+ typedef It* pointer;
+ typedef It& reference;
+
+ weird_iterator() {}
+ explicit weird_iterator(It it) : it_(it) {}
+ ~weird_iterator() {it_ = It();}
+
+ reference operator*() {return it_;}
+ pointer operator->() {return &it_;}
+
+ weird_iterator& operator--() {return *this;}
+};
+
+template <class It>
+void
+test(It i, typename std::iterator_traits<It>::value_type x)
+{
+ std::reverse_iterator<It> r(i);
+ assert(r->get() == x.get());
+}
+
+int main()
+{
+ test(weird_iterator<A>(A()), A());
+ A a;
+ test(&a+1, A());
+}
diff --git a/libcxx/test/iterators/predef.iterators/reverse.iterators/reverse.iter.ops/reverse.iter.opsum/difference_type.pass.cpp b/libcxx/test/iterators/predef.iterators/reverse.iterators/reverse.iter.ops/reverse.iter.opsum/difference_type.pass.cpp
new file mode 100644
index 00000000000..f1915d3dfd8
--- /dev/null
+++ b/libcxx/test/iterators/predef.iterators/reverse.iterators/reverse.iter.ops/reverse.iter.opsum/difference_type.pass.cpp
@@ -0,0 +1,37 @@
+//===----------------------------------------------------------------------===//
+//
+// ΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚThe LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+// <iterator>
+
+// reverse_iterator
+
+// template <RandomAccessIterator Iterator>
+// reverse_iterator<Iter>
+// operator+(Iter::difference_type n, const reverse_iterator<Iter>& x);
+
+#include <iterator>
+#include <cassert>
+
+#include "../../../../iterators.h"
+
+template <class It>
+void
+test(It i, typename std::iterator_traits<It>::difference_type n, It x)
+{
+ const std::reverse_iterator<It> r(i);
+ std::reverse_iterator<It> rr = n + r;
+ assert(rr.base() == x);
+}
+
+int main()
+{
+ const char* s = "1234567890";
+ test(random_access_iterator<const char*>(s+5), 5, random_access_iterator<const char*>(s));
+ test(s+5, 5, s);
+}
diff --git a/libcxx/test/iterators/predef.iterators/reverse.iterators/reverse.iter.requirements/nothing_to_do.pass.cpp b/libcxx/test/iterators/predef.iterators/reverse.iterators/reverse.iter.requirements/nothing_to_do.pass.cpp
new file mode 100644
index 00000000000..fa4d462f18d
--- /dev/null
+++ b/libcxx/test/iterators/predef.iterators/reverse.iterators/reverse.iter.requirements/nothing_to_do.pass.cpp
@@ -0,0 +1,12 @@
+//===----------------------------------------------------------------------===//
+//
+// ΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚThe LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+int main()
+{
+}
diff --git a/libcxx/test/iterators/predef.iterators/reverse.iterators/reverse.iterator/types.pass.cpp b/libcxx/test/iterators/predef.iterators/reverse.iterators/reverse.iterator/types.pass.cpp
new file mode 100644
index 00000000000..a2c5b85d187
--- /dev/null
+++ b/libcxx/test/iterators/predef.iterators/reverse.iterators/reverse.iterator/types.pass.cpp
@@ -0,0 +1,61 @@
+//===----------------------------------------------------------------------===//
+//
+// ΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚThe LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+// <iterator>
+
+// reverse_iterator
+
+// Test nested types and data member:
+
+// template <BidirectionalIterator Iter>
+// class reverse_iterator {
+// protected:
+// Iter current;
+// public:
+// typedef Iter iterator_type;
+// typedef Iter::value_type value_type;
+// typedef Iter::difference_type difference_type;
+// typedef Iter::reference reference;
+// typedef Iter::pointer pointer;
+// };
+
+#include <iterator>
+#include <type_traits>
+
+#include "../../../iterators.h"
+
+template <class It>
+struct find_current
+ : private std::reverse_iterator<It>
+{
+ void test() {++(this->current);}
+};
+
+template <class It>
+void
+test()
+{
+ typedef std::reverse_iterator<It> R;
+ typedef std::iterator_traits<It> T;
+ find_current<It> q;
+ q.test();
+ static_assert((std::is_same<typename R::iterator_type, It>::value), "");
+ static_assert((std::is_same<typename R::value_type, typename T::value_type>::value), "");
+ static_assert((std::is_same<typename R::difference_type, typename T::difference_type>::value), "");
+ static_assert((std::is_same<typename R::reference, typename T::reference>::value), "");
+ static_assert((std::is_same<typename R::pointer, It>::value), "");
+ static_assert((std::is_same<typename R::iterator_category, typename T::iterator_category>::value), "");
+}
+
+int main()
+{
+ test<bidirectional_iterator<char*> >();
+ test<random_access_iterator<char*> >();
+ test<char*>();
+}
diff --git a/libcxx/test/iterators/stream.iterators/istream.iterator/istream.iterator.cons/copy.pass.cpp b/libcxx/test/iterators/stream.iterators/istream.iterator/istream.iterator.cons/copy.pass.cpp
new file mode 100644
index 00000000000..cf988f22c07
--- /dev/null
+++ b/libcxx/test/iterators/stream.iterators/istream.iterator/istream.iterator.cons/copy.pass.cpp
@@ -0,0 +1,36 @@
+//===----------------------------------------------------------------------===//
+//
+// ΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚThe LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+// <iterator>
+
+// class istream_iterator
+
+// istream_iterator(const istream_iterator& x);
+
+#include <iterator>
+#include <sstream>
+#include <cassert>
+
+int main()
+{
+ {
+ std::istream_iterator<int> io;
+ std::istream_iterator<int> i = io;
+ assert(i == std::istream_iterator<int>());
+ }
+ {
+ std::istringstream inf(" 1 23");
+ std::istream_iterator<int> io(inf);
+ std::istream_iterator<int> i = io;
+ assert(i != std::istream_iterator<int>());
+ int j = 0;
+ j = *i;
+ assert(j == 1);
+ }
+}
diff --git a/libcxx/test/iterators/stream.iterators/istream.iterator/istream.iterator.cons/default.pass.cpp b/libcxx/test/iterators/stream.iterators/istream.iterator/istream.iterator.cons/default.pass.cpp
new file mode 100644
index 00000000000..e0fa4525d13
--- /dev/null
+++ b/libcxx/test/iterators/stream.iterators/istream.iterator/istream.iterator.cons/default.pass.cpp
@@ -0,0 +1,23 @@
+//===----------------------------------------------------------------------===//
+//
+// ΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚThe LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+// <iterator>
+
+// class istream_iterator
+
+// istream_iterator();
+
+#include <iterator>
+#include <cassert>
+
+int main()
+{
+ std::istream_iterator<int> i;
+ assert(i == std::istream_iterator<int>());
+}
diff --git a/libcxx/test/iterators/stream.iterators/istream.iterator/istream.iterator.cons/istream.pass.cpp b/libcxx/test/iterators/stream.iterators/istream.iterator/istream.iterator.cons/istream.pass.cpp
new file mode 100644
index 00000000000..d40edc548dc
--- /dev/null
+++ b/libcxx/test/iterators/stream.iterators/istream.iterator/istream.iterator.cons/istream.pass.cpp
@@ -0,0 +1,30 @@
+//===----------------------------------------------------------------------===//
+//
+// ΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚThe LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+// <iterator>
+
+// class istream_iterator
+
+// istream_iterator(istream_type& s);
+
+#include <iterator>
+#include <sstream>
+#include <cassert>
+
+int main()
+{
+ std::istringstream inf(" 1 23");
+ std::istream_iterator<int> i(inf);
+ assert(i != std::istream_iterator<int>());
+ assert(inf.peek() == ' ');
+ assert(inf.good());
+ int j = 0;
+ inf >> j;
+ assert(j == 23);
+}
diff --git a/libcxx/test/iterators/stream.iterators/istream.iterator/istream.iterator.ops/arrow.pass.cpp b/libcxx/test/iterators/stream.iterators/istream.iterator/istream.iterator.ops/arrow.pass.cpp
new file mode 100644
index 00000000000..6c79e54d16b
--- /dev/null
+++ b/libcxx/test/iterators/stream.iterators/istream.iterator/istream.iterator.ops/arrow.pass.cpp
@@ -0,0 +1,37 @@
+//===----------------------------------------------------------------------===//
+//
+// ΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚThe LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+// <iterator>
+
+// class istream_iterator
+
+// const T* operator->() const;
+
+#include <iterator>
+#include <sstream>
+#include <cassert>
+
+struct A
+{
+ double d_;
+ int i_;
+};
+
+std::istream& operator>>(std::istream& is, A& a)
+{
+ return is >> a.d_ >> a.i_;
+}
+
+int main()
+{
+ std::istringstream inf("1.5 23 ");
+ std::istream_iterator<A> i(inf);
+ assert(i->d_ == 1.5);
+ assert(i->i_ == 23);
+}
diff --git a/libcxx/test/iterators/stream.iterators/istream.iterator/istream.iterator.ops/dereference.pass.cpp b/libcxx/test/iterators/stream.iterators/istream.iterator/istream.iterator.ops/dereference.pass.cpp
new file mode 100644
index 00000000000..5e068a1e2a9
--- /dev/null
+++ b/libcxx/test/iterators/stream.iterators/istream.iterator/istream.iterator.ops/dereference.pass.cpp
@@ -0,0 +1,34 @@
+//===----------------------------------------------------------------------===//
+//
+// ΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚThe LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+// <iterator>
+
+// class istream_iterator
+
+// const T& operator*() const;
+
+#include <iterator>
+#include <sstream>
+#include <cassert>
+
+int main()
+{
+ std::istringstream inf(" 1 23");
+ std::istream_iterator<int> i(inf);
+ int j = 0;
+ j = *i;
+ assert(j == 1);
+ j = *i;
+ assert(j == 1);
+ ++i;
+ j = *i;
+ assert(j == 23);
+ j = *i;
+ assert(j == 23);
+}
diff --git a/libcxx/test/iterators/stream.iterators/istream.iterator/istream.iterator.ops/equal.pass.cpp b/libcxx/test/iterators/stream.iterators/istream.iterator/istream.iterator.ops/equal.pass.cpp
new file mode 100644
index 00000000000..736c188bf13
--- /dev/null
+++ b/libcxx/test/iterators/stream.iterators/istream.iterator/istream.iterator.ops/equal.pass.cpp
@@ -0,0 +1,52 @@
+//===----------------------------------------------------------------------===//
+//
+// ΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚThe LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+// <iterator>
+
+// class istream_iterator
+
+// template <class T, class charT, class traits, class Distance>
+// bool operator==(const istream_iterator<T,charT,traits,Distance> &x,
+// const istream_iterator<T,charT,traits,Distance> &y);
+//
+// template <class T, class charT, class traits, class Distance>
+// bool operator!=(const istream_iterator<T,charT,traits,Distance> &x,
+// const istream_iterator<T,charT,traits,Distance> &y);
+
+#include <iterator>
+#include <sstream>
+#include <cassert>
+
+int main()
+{
+ std::istringstream inf1(" 1 23");
+ std::istringstream inf2(" 1 23");
+ std::istream_iterator<int> i1(inf1);
+ std::istream_iterator<int> i2(inf1);
+ std::istream_iterator<int> i3(inf2);
+ std::istream_iterator<int> i4;
+ std::istream_iterator<int> i5;
+ assert(i1 == i1);
+ assert(i1 == i2);
+ assert(i1 != i3);
+ assert(i1 != i4);
+ assert(i1 != i5);
+
+ assert(i2 == i2);
+ assert(i2 != i3);
+ assert(i2 != i4);
+ assert(i2 != i5);
+
+ assert(i3 == i3);
+ assert(i3 != i4);
+ assert(i3 != i5);
+
+ assert(i4 == i4);
+ assert(i4 == i5);
+}
diff --git a/libcxx/test/iterators/stream.iterators/istream.iterator/istream.iterator.ops/post_increment.pass.cpp b/libcxx/test/iterators/stream.iterators/istream.iterator/istream.iterator.ops/post_increment.pass.cpp
new file mode 100644
index 00000000000..7f24b817798
--- /dev/null
+++ b/libcxx/test/iterators/stream.iterators/istream.iterator/istream.iterator.ops/post_increment.pass.cpp
@@ -0,0 +1,32 @@
+//===----------------------------------------------------------------------===//
+//
+// ΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚThe LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+// <iterator>
+
+// class istream_iterator
+
+// istream_iterator operator++(int);
+
+#include <iterator>
+#include <sstream>
+#include <cassert>
+
+int main()
+{
+ std::istringstream inf(" 1 23");
+ std::istream_iterator<int> i(inf);
+ std::istream_iterator<int> icopy = i++;
+ assert(icopy == i);
+ int j = 0;
+ j = *i;
+ assert(j == 23);
+ j = 0;
+ j = *icopy;
+ assert(j == 1);
+}
diff --git a/libcxx/test/iterators/stream.iterators/istream.iterator/istream.iterator.ops/pre_increment.pass.cpp b/libcxx/test/iterators/stream.iterators/istream.iterator/istream.iterator.ops/pre_increment.pass.cpp
new file mode 100644
index 00000000000..90315633089
--- /dev/null
+++ b/libcxx/test/iterators/stream.iterators/istream.iterator/istream.iterator.ops/pre_increment.pass.cpp
@@ -0,0 +1,29 @@
+//===----------------------------------------------------------------------===//
+//
+// ΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚThe LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+// <iterator>
+
+// class istream_iterator
+
+// istream_iterator& operator++();
+
+#include <iterator>
+#include <sstream>
+#include <cassert>
+
+int main()
+{
+ std::istringstream inf(" 1 23");
+ std::istream_iterator<int> i(inf);
+ std::istream_iterator<int>& iref = ++i;
+ assert(&iref == &i);
+ int j = 0;
+ j = *i;
+ assert(j == 23);
+}
diff --git a/libcxx/test/iterators/stream.iterators/istream.iterator/types.pass.cpp b/libcxx/test/iterators/stream.iterators/istream.iterator/types.pass.cpp
new file mode 100644
index 00000000000..dbfac03ee47
--- /dev/null
+++ b/libcxx/test/iterators/stream.iterators/istream.iterator/types.pass.cpp
@@ -0,0 +1,42 @@
+//===----------------------------------------------------------------------===//
+//
+// ΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚThe LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+// <iterator>
+
+// template <class T, class charT = char, class traits = char_traits<charT>,
+// class Distance = ptrdiff_t>
+// class istream_iterator
+// : public iterator<input_iterator_tag, T, Distance, const T*, const T&>
+// {
+// public:
+// typedef charT char_type;
+// typedef traits traits_type;
+// typedef basic_istream<charT,traits> istream_type;
+// ...
+
+#include <iterator>
+#include <type_traits>
+
+int main()
+{
+ typedef std::istream_iterator<double> I1;
+ static_assert((std::is_convertible<I1,
+ std::iterator<std::input_iterator_tag, double, std::ptrdiff_t,
+ const double*, const double&> >::value), "");
+ static_assert((std::is_same<I1::char_type, char>::value), "");
+ static_assert((std::is_same<I1::traits_type, std::char_traits<char> >::value), "");
+ static_assert((std::is_same<I1::istream_type, std::istream>::value), "");
+ typedef std::istream_iterator<unsigned, wchar_t> I2;
+ static_assert((std::is_convertible<I2,
+ std::iterator<std::input_iterator_tag, unsigned, std::ptrdiff_t,
+ const unsigned*, const unsigned&> >::value), "");
+ static_assert((std::is_same<I2::char_type, wchar_t>::value), "");
+ static_assert((std::is_same<I2::traits_type, std::char_traits<wchar_t> >::value), "");
+ static_assert((std::is_same<I2::istream_type, std::wistream>::value), "");
+}
diff --git a/libcxx/test/iterators/stream.iterators/istreambuf.iterator/istreambuf.iterator.cons/default.pass.cpp b/libcxx/test/iterators/stream.iterators/istreambuf.iterator/istreambuf.iterator.cons/default.pass.cpp
new file mode 100644
index 00000000000..cf552a19b70
--- /dev/null
+++ b/libcxx/test/iterators/stream.iterators/istreambuf.iterator/istreambuf.iterator.cons/default.pass.cpp
@@ -0,0 +1,30 @@
+//===----------------------------------------------------------------------===//
+//
+// ΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚThe LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+// <iterator>
+
+// istreambuf_iterator
+
+// istreambuf_iterator() throw();
+
+#include <iterator>
+#include <sstream>
+#include <cassert>
+
+int main()
+{
+ {
+ std::istreambuf_iterator<char> i;
+ assert(i == std::istreambuf_iterator<char>());
+ }
+ {
+ std::istreambuf_iterator<wchar_t> i;
+ assert(i == std::istreambuf_iterator<wchar_t>());
+ }
+}
diff --git a/libcxx/test/iterators/stream.iterators/istreambuf.iterator/istreambuf.iterator.cons/istream.pass.cpp b/libcxx/test/iterators/stream.iterators/istreambuf.iterator/istreambuf.iterator.cons/istream.pass.cpp
new file mode 100644
index 00000000000..9fd4862f5e6
--- /dev/null
+++ b/libcxx/test/iterators/stream.iterators/istreambuf.iterator/istreambuf.iterator.cons/istream.pass.cpp
@@ -0,0 +1,42 @@
+//===----------------------------------------------------------------------===//
+//
+// ΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚThe LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+// <iterator>
+
+// istreambuf_iterator
+
+// istreambuf_iterator(basic_istream<charT,traits>& s) throw();
+
+#include <iterator>
+#include <sstream>
+#include <cassert>
+
+int main()
+{
+ {
+ std::istringstream inf;
+ std::istreambuf_iterator<char> i(inf);
+ assert(i == std::istreambuf_iterator<char>());
+ }
+ {
+ std::istringstream inf("a");
+ std::istreambuf_iterator<char> i(inf);
+ assert(i != std::istreambuf_iterator<char>());
+ }
+ {
+ std::wistringstream inf;
+ std::istreambuf_iterator<wchar_t> i(inf);
+ assert(i == std::istreambuf_iterator<wchar_t>());
+ }
+ {
+ std::wistringstream inf(L"a");
+ std::istreambuf_iterator<wchar_t> i(inf);
+ assert(i != std::istreambuf_iterator<wchar_t>());
+ }
+}
diff --git a/libcxx/test/iterators/stream.iterators/istreambuf.iterator/istreambuf.iterator.cons/proxy.pass.cpp b/libcxx/test/iterators/stream.iterators/istreambuf.iterator/istreambuf.iterator.cons/proxy.pass.cpp
new file mode 100644
index 00000000000..79312ac1b76
--- /dev/null
+++ b/libcxx/test/iterators/stream.iterators/istreambuf.iterator/istreambuf.iterator.cons/proxy.pass.cpp
@@ -0,0 +1,36 @@
+//===----------------------------------------------------------------------===//
+//
+// ΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚThe LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+// <iterator>
+
+// istreambuf_iterator
+
+// istreambuf_iterator(const proxy& p) throw();
+
+#include <iterator>
+#include <sstream>
+#include <cassert>
+
+int main()
+{
+ {
+ std::istringstream inf("abc");
+ std::istreambuf_iterator<char> j(inf);
+ std::istreambuf_iterator<char> i = j++;
+ assert(i != std::istreambuf_iterator<char>());
+ assert(*i == 'b');
+ }
+ {
+ std::wistringstream inf(L"abc");
+ std::istreambuf_iterator<wchar_t> j(inf);
+ std::istreambuf_iterator<wchar_t> i = j++;
+ assert(i != std::istreambuf_iterator<wchar_t>());
+ assert(*i == L'b');
+ }
+}
diff --git a/libcxx/test/iterators/stream.iterators/istreambuf.iterator/istreambuf.iterator.cons/streambuf.pass.cpp b/libcxx/test/iterators/stream.iterators/istreambuf.iterator/istreambuf.iterator.cons/streambuf.pass.cpp
new file mode 100644
index 00000000000..459a664aebb
--- /dev/null
+++ b/libcxx/test/iterators/stream.iterators/istreambuf.iterator/istreambuf.iterator.cons/streambuf.pass.cpp
@@ -0,0 +1,50 @@
+//===----------------------------------------------------------------------===//
+//
+// ΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚThe LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+// <iterator>
+
+// istreambuf_iterator
+
+// istreambuf_iterator(basic_streambuf<charT,traits>* s) throw();
+
+#include <iterator>
+#include <sstream>
+#include <cassert>
+
+int main()
+{
+ {
+ std::istreambuf_iterator<char> i(nullptr);
+ assert(i == std::istreambuf_iterator<char>());
+ }
+ {
+ std::istringstream inf;
+ std::istreambuf_iterator<char> i(inf.rdbuf());
+ assert(i == std::istreambuf_iterator<char>());
+ }
+ {
+ std::istringstream inf("a");
+ std::istreambuf_iterator<char> i(inf.rdbuf());
+ assert(i != std::istreambuf_iterator<char>());
+ }
+ {
+ std::istreambuf_iterator<wchar_t> i(nullptr);
+ assert(i == std::istreambuf_iterator<wchar_t>());
+ }
+ {
+ std::wistringstream inf;
+ std::istreambuf_iterator<wchar_t> i(inf.rdbuf());
+ assert(i == std::istreambuf_iterator<wchar_t>());
+ }
+ {
+ std::wistringstream inf(L"a");
+ std::istreambuf_iterator<wchar_t> i(inf.rdbuf());
+ assert(i != std::istreambuf_iterator<wchar_t>());
+ }
+}
diff --git a/libcxx/test/iterators/stream.iterators/istreambuf.iterator/istreambuf.iterator::equal/equal.pass.cpp b/libcxx/test/iterators/stream.iterators/istreambuf.iterator/istreambuf.iterator::equal/equal.pass.cpp
new file mode 100644
index 00000000000..20bae45dee2
--- /dev/null
+++ b/libcxx/test/iterators/stream.iterators/istreambuf.iterator/istreambuf.iterator::equal/equal.pass.cpp
@@ -0,0 +1,78 @@
+//===----------------------------------------------------------------------===//
+//
+// ΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚThe LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+// <iterator>
+
+// istreambuf_iterator
+
+// bool equal(istreambuf_iterator<charT,traits>& b) const;
+
+#include <iterator>
+#include <sstream>
+#include <cassert>
+
+int main()
+{
+ {
+ std::istringstream inf1("abc");
+ std::istringstream inf2("def");
+ std::istreambuf_iterator<char> i1(inf1);
+ std::istreambuf_iterator<char> i2(inf2);
+ std::istreambuf_iterator<char> i3;
+ std::istreambuf_iterator<char> i4;
+
+ assert( i1.equal(i1));
+ assert( i1.equal(i2));
+ assert(!i1.equal(i3));
+ assert(!i1.equal(i4));
+
+ assert( i2.equal(i1));
+ assert( i2.equal(i2));
+ assert(!i2.equal(i3));
+ assert(!i2.equal(i4));
+
+ assert(!i3.equal(i1));
+ assert(!i3.equal(i2));
+ assert( i3.equal(i3));
+ assert( i3.equal(i4));
+
+ assert(!i4.equal(i1));
+ assert(!i4.equal(i2));
+ assert( i4.equal(i3));
+ assert( i4.equal(i4));
+ }
+ {
+ std::wistringstream inf1(L"abc");
+ std::wistringstream inf2(L"def");
+ std::istreambuf_iterator<wchar_t> i1(inf1);
+ std::istreambuf_iterator<wchar_t> i2(inf2);
+ std::istreambuf_iterator<wchar_t> i3;
+ std::istreambuf_iterator<wchar_t> i4;
+
+ assert( i1.equal(i1));
+ assert( i1.equal(i2));
+ assert(!i1.equal(i3));
+ assert(!i1.equal(i4));
+
+ assert( i2.equal(i1));
+ assert( i2.equal(i2));
+ assert(!i2.equal(i3));
+ assert(!i2.equal(i4));
+
+ assert(!i3.equal(i1));
+ assert(!i3.equal(i2));
+ assert( i3.equal(i3));
+ assert( i3.equal(i4));
+
+ assert(!i4.equal(i1));
+ assert(!i4.equal(i2));
+ assert( i4.equal(i3));
+ assert( i4.equal(i4));
+ }
+}
diff --git a/libcxx/test/iterators/stream.iterators/istreambuf.iterator/istreambuf.iterator::op!=/not_equal.pass.cpp b/libcxx/test/iterators/stream.iterators/istreambuf.iterator/istreambuf.iterator::op!=/not_equal.pass.cpp
new file mode 100644
index 00000000000..1dd36b951c7
--- /dev/null
+++ b/libcxx/test/iterators/stream.iterators/istreambuf.iterator/istreambuf.iterator::op!=/not_equal.pass.cpp
@@ -0,0 +1,80 @@
+//===----------------------------------------------------------------------===//
+//
+// ΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚThe LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+// <iterator>
+
+// istreambuf_iterator
+
+// template <class charT, class traits>
+// bool operator!=(const istreambuf_iterator<charT,traits>& a,
+// const istreambuf_iterator<charT,traits>& b);
+
+#include <iterator>
+#include <sstream>
+#include <cassert>
+
+int main()
+{
+ {
+ std::istringstream inf1("abc");
+ std::istringstream inf2("def");
+ std::istreambuf_iterator<char> i1(inf1);
+ std::istreambuf_iterator<char> i2(inf2);
+ std::istreambuf_iterator<char> i3;
+ std::istreambuf_iterator<char> i4;
+
+ assert(!(i1 != i1));
+ assert(!(i1 != i2));
+ assert( (i1 != i3));
+ assert( (i1 != i4));
+
+ assert(!(i2 != i1));
+ assert(!(i2 != i2));
+ assert( (i2 != i3));
+ assert( (i2 != i4));
+
+ assert( (i3 != i1));
+ assert( (i3 != i2));
+ assert(!(i3 != i3));
+ assert(!(i3 != i4));
+
+ assert( (i4 != i1));
+ assert( (i4 != i2));
+ assert(!(i4 != i3));
+ assert(!(i4 != i4));
+ }
+ {
+ std::wistringstream inf1(L"abc");
+ std::wistringstream inf2(L"def");
+ std::istreambuf_iterator<wchar_t> i1(inf1);
+ std::istreambuf_iterator<wchar_t> i2(inf2);
+ std::istreambuf_iterator<wchar_t> i3;
+ std::istreambuf_iterator<wchar_t> i4;
+
+ assert(!(i1 != i1));
+ assert(!(i1 != i2));
+ assert( (i1 != i3));
+ assert( (i1 != i4));
+
+ assert(!(i2 != i1));
+ assert(!(i2 != i2));
+ assert( (i2 != i3));
+ assert( (i2 != i4));
+
+ assert( (i3 != i1));
+ assert( (i3 != i2));
+ assert(!(i3 != i3));
+ assert(!(i3 != i4));
+
+ assert( (i4 != i1));
+ assert( (i4 != i2));
+ assert(!(i4 != i3));
+ assert(!(i4 != i4));
+ }
+}
diff --git a/libcxx/test/iterators/stream.iterators/istreambuf.iterator/istreambuf.iterator::op++/dereference.pass.cpp b/libcxx/test/iterators/stream.iterators/istreambuf.iterator/istreambuf.iterator::op++/dereference.pass.cpp
new file mode 100644
index 00000000000..3571f844dc2
--- /dev/null
+++ b/libcxx/test/iterators/stream.iterators/istreambuf.iterator/istreambuf.iterator::op++/dereference.pass.cpp
@@ -0,0 +1,40 @@
+//===----------------------------------------------------------------------===//
+//
+// ΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚThe LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+// <iterator>
+
+// istreambuf_iterator
+
+// charT operator*() const
+
+#include <iterator>
+#include <sstream>
+#include <cassert>
+
+int main()
+{
+ {
+ std::istringstream inf("abc");
+ std::istreambuf_iterator<char> i(inf);
+ assert(*i == 'a');
+ ++i;
+ assert(*i == 'b');
+ ++i;
+ assert(*i == 'c');
+ }
+ {
+ std::wistringstream inf(L"abc");
+ std::istreambuf_iterator<wchar_t> i(inf);
+ assert(*i == L'a');
+ ++i;
+ assert(*i == L'b');
+ ++i;
+ assert(*i == L'c');
+ }
+}
diff --git a/libcxx/test/iterators/stream.iterators/istreambuf.iterator/istreambuf.iterator::op==/equal.pass.cpp b/libcxx/test/iterators/stream.iterators/istreambuf.iterator/istreambuf.iterator::op==/equal.pass.cpp
new file mode 100644
index 00000000000..9c0bca4068e
--- /dev/null
+++ b/libcxx/test/iterators/stream.iterators/istreambuf.iterator/istreambuf.iterator::op==/equal.pass.cpp
@@ -0,0 +1,80 @@
+//===----------------------------------------------------------------------===//
+//
+// ΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚThe LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+// <iterator>
+
+// istreambuf_iterator
+
+// template <class charT, class traits>
+// bool operator==(const istreambuf_iterator<charT,traits>& a,
+// const istreambuf_iterator<charT,traits>& b);
+
+#include <iterator>
+#include <sstream>
+#include <cassert>
+
+int main()
+{
+ {
+ std::istringstream inf1("abc");
+ std::istringstream inf2("def");
+ std::istreambuf_iterator<char> i1(inf1);
+ std::istreambuf_iterator<char> i2(inf2);
+ std::istreambuf_iterator<char> i3;
+ std::istreambuf_iterator<char> i4;
+
+ assert( (i1 == i1));
+ assert( (i1 == i2));
+ assert(!(i1 == i3));
+ assert(!(i1 == i4));
+
+ assert( (i2 == i1));
+ assert( (i2 == i2));
+ assert(!(i2 == i3));
+ assert(!(i2 == i4));
+
+ assert(!(i3 == i1));
+ assert(!(i3 == i2));
+ assert( (i3 == i3));
+ assert( (i3 == i4));
+
+ assert(!(i4 == i1));
+ assert(!(i4 == i2));
+ assert( (i4 == i3));
+ assert( (i4 == i4));
+ }
+ {
+ std::wistringstream inf1(L"abc");
+ std::wistringstream inf2(L"def");
+ std::istreambuf_iterator<wchar_t> i1(inf1);
+ std::istreambuf_iterator<wchar_t> i2(inf2);
+ std::istreambuf_iterator<wchar_t> i3;
+ std::istreambuf_iterator<wchar_t> i4;
+
+ assert( (i1 == i1));
+ assert( (i1 == i2));
+ assert(!(i1 == i3));
+ assert(!(i1 == i4));
+
+ assert( (i2 == i1));
+ assert( (i2 == i2));
+ assert(!(i2 == i3));
+ assert(!(i2 == i4));
+
+ assert(!(i3 == i1));
+ assert(!(i3 == i2));
+ assert( (i3 == i3));
+ assert( (i3 == i4));
+
+ assert(!(i4 == i1));
+ assert(!(i4 == i2));
+ assert( (i4 == i3));
+ assert( (i4 == i4));
+ }
+}
diff --git a/libcxx/test/iterators/stream.iterators/istreambuf.iterator/istreambuf.iterator::op_astrk/arrow.pass.cpp b/libcxx/test/iterators/stream.iterators/istreambuf.iterator/istreambuf.iterator::op_astrk/arrow.pass.cpp
new file mode 100644
index 00000000000..475608b74e8
--- /dev/null
+++ b/libcxx/test/iterators/stream.iterators/istreambuf.iterator/istreambuf.iterator::op_astrk/arrow.pass.cpp
@@ -0,0 +1,28 @@
+//===----------------------------------------------------------------------===//
+//
+// ΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚThe LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+// <iterator>
+
+// istreambuf_iterator
+
+// pointer operator->() const;
+
+#include <iostream>
+#include <sstream>
+#include <streambuf>
+
+typedef char C;
+int main ()
+{
+ std::istringstream s("filename");
+ std::istreambuf_iterator<char> i(s);
+
+ (*i).~C(); // This is well-formed...
+ i->~C(); // ... so this should be supported!
+}
diff --git a/libcxx/test/iterators/stream.iterators/istreambuf.iterator/istreambuf.iterator::op_astrk/post_increment.pass.cpp b/libcxx/test/iterators/stream.iterators/istreambuf.iterator/istreambuf.iterator::op_astrk/post_increment.pass.cpp
new file mode 100644
index 00000000000..8c31d5e98f9
--- /dev/null
+++ b/libcxx/test/iterators/stream.iterators/istreambuf.iterator/istreambuf.iterator::op_astrk/post_increment.pass.cpp
@@ -0,0 +1,38 @@
+//===----------------------------------------------------------------------===//
+//
+// ΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚThe LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+// <iterator>
+
+// istreambuf_iterator
+
+// proxy istreambuf_iterator<charT,traits>::operator++(int);
+
+#include <iterator>
+#include <sstream>
+#include <cassert>
+
+int main()
+{
+ {
+ std::istringstream inf("abc");
+ std::istreambuf_iterator<char> i(inf);
+ assert(*i++ == 'a');
+ assert(*i++ == 'b');
+ assert(*i++ == 'c');
+ assert(i == std::istreambuf_iterator<char>());
+ }
+ {
+ std::wistringstream inf(L"abc");
+ std::istreambuf_iterator<wchar_t> i(inf);
+ assert(*i++ == L'a');
+ assert(*i++ == L'b');
+ assert(*i++ == L'c');
+ assert(i == std::istreambuf_iterator<wchar_t>());
+ }
+}
diff --git a/libcxx/test/iterators/stream.iterators/istreambuf.iterator/istreambuf.iterator::op_astrk/pre_increment.pass.cpp b/libcxx/test/iterators/stream.iterators/istreambuf.iterator/istreambuf.iterator::op_astrk/pre_increment.pass.cpp
new file mode 100644
index 00000000000..4b315f005f8
--- /dev/null
+++ b/libcxx/test/iterators/stream.iterators/istreambuf.iterator/istreambuf.iterator::op_astrk/pre_increment.pass.cpp
@@ -0,0 +1,39 @@
+//===----------------------------------------------------------------------===//
+//
+// ΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚThe LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+// <iterator>
+
+// istreambuf_iterator
+
+// istreambuf_iterator<charT,traits>&
+// istreambuf_iterator<charT,traits>::operator++();
+
+#include <iterator>
+#include <sstream>
+#include <cassert>
+
+int main()
+{
+ {
+ std::istringstream inf("abc");
+ std::istreambuf_iterator<char> i(inf);
+ assert(*i == 'a');
+ assert(*++i == 'b');
+ assert(*++i == 'c');
+ assert(++i == std::istreambuf_iterator<char>());
+ }
+ {
+ std::wistringstream inf(L"abc");
+ std::istreambuf_iterator<wchar_t> i(inf);
+ assert(*i == L'a');
+ assert(*++i == L'b');
+ assert(*++i == L'c');
+ assert(++i == std::istreambuf_iterator<wchar_t>());
+ }
+}
diff --git a/libcxx/test/iterators/stream.iterators/istreambuf.iterator/istreambuf.iterator::proxy/proxy.pass.cpp b/libcxx/test/iterators/stream.iterators/istreambuf.iterator/istreambuf.iterator::proxy/proxy.pass.cpp
new file mode 100644
index 00000000000..1f088df19c1
--- /dev/null
+++ b/libcxx/test/iterators/stream.iterators/istreambuf.iterator/istreambuf.iterator::proxy/proxy.pass.cpp
@@ -0,0 +1,44 @@
+//===----------------------------------------------------------------------===//
+//
+// ΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚThe LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+// <iterator>
+
+// template<class charT, class traits = char_traits<charT> >
+// class istreambuf_iterator
+// : public iterator<input_iterator_tag, charT,
+// typename traits::off_type, charT*,
+// charT>
+// {
+// public:
+// ...
+// proxy operator++(int);
+
+// class proxy
+// {
+// public:
+// charT operator*();
+// };
+
+#include <iterator>
+#include <sstream>
+#include <cassert>
+
+int main()
+{
+ {
+ std::istringstream inf("abc");
+ std::istreambuf_iterator<char> i(inf);
+ assert(*i++ == 'a');
+ }
+ {
+ std::wistringstream inf(L"abc");
+ std::istreambuf_iterator<wchar_t> i(inf);
+ assert(*i++ == L'a');
+ }
+}
diff --git a/libcxx/test/iterators/stream.iterators/istreambuf.iterator/types.pass.cpp b/libcxx/test/iterators/stream.iterators/istreambuf.iterator/types.pass.cpp
new file mode 100644
index 00000000000..7562332e998
--- /dev/null
+++ b/libcxx/test/iterators/stream.iterators/istreambuf.iterator/types.pass.cpp
@@ -0,0 +1,51 @@
+//===----------------------------------------------------------------------===//
+//
+// ΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚThe LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+// <iterator>
+
+// template<class charT, class traits = char_traits<charT> >
+// class istreambuf_iterator
+// : public iterator<input_iterator_tag, charT,
+// typename traits::off_type, unspecified,
+// charT>
+// {
+// public:
+// typedef charT char_type;
+// typedef traits traits_type;
+// typedef typename traits::int_type int_type;
+// typedef basic_streambuf<charT,traits> streambuf_type;
+// typedef basic_istream<charT,traits> istream_type;
+// ...
+
+#include <iterator>
+#include <string>
+#include <type_traits>
+
+int main()
+{
+ typedef std::istreambuf_iterator<char> I1;
+ static_assert((std::is_convertible<I1,
+ std::iterator<std::input_iterator_tag, char, std::char_traits<char>::off_type,
+ char*, char> >::value), "");
+ static_assert((std::is_same<I1::char_type, char>::value), "");
+ static_assert((std::is_same<I1::traits_type, std::char_traits<char> >::value), "");
+ static_assert((std::is_same<I1::int_type, I1::traits_type::int_type>::value), "");
+ static_assert((std::is_same<I1::streambuf_type, std::streambuf>::value), "");
+ static_assert((std::is_same<I1::istream_type, std::istream>::value), "");
+
+ typedef std::istreambuf_iterator<wchar_t> I2;
+ static_assert((std::is_convertible<I2,
+ std::iterator<std::input_iterator_tag, wchar_t, std::char_traits<wchar_t>::off_type,
+ wchar_t*, wchar_t> >::value), "");
+ static_assert((std::is_same<I2::char_type, wchar_t>::value), "");
+ static_assert((std::is_same<I2::traits_type, std::char_traits<wchar_t> >::value), "");
+ static_assert((std::is_same<I2::int_type, I2::traits_type::int_type>::value), "");
+ static_assert((std::is_same<I2::streambuf_type, std::wstreambuf>::value), "");
+ static_assert((std::is_same<I2::istream_type, std::wistream>::value), "");
+}
diff --git a/libcxx/test/iterators/stream.iterators/iterator.range/begin_array.pass.cpp b/libcxx/test/iterators/stream.iterators/iterator.range/begin_array.pass.cpp
new file mode 100644
index 00000000000..9909ea8a004
--- /dev/null
+++ b/libcxx/test/iterators/stream.iterators/iterator.range/begin_array.pass.cpp
@@ -0,0 +1,24 @@
+//===----------------------------------------------------------------------===//
+//
+// ΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚThe LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+// <iterator>
+
+// template <class T, size_t N> T* begin(T (&array)[N]);
+
+#include <iterator>
+#include <cassert>
+
+int main()
+{
+ int ia[] = {1, 2, 3};
+ int* i = std::begin(ia);
+ assert(*i == 1);
+ *i = 2;
+ assert(ia[0] == 2);
+}
diff --git a/libcxx/test/iterators/stream.iterators/iterator.range/begin_const.pass.cpp b/libcxx/test/iterators/stream.iterators/iterator.range/begin_const.pass.cpp
new file mode 100644
index 00000000000..71fcce006b1
--- /dev/null
+++ b/libcxx/test/iterators/stream.iterators/iterator.range/begin_const.pass.cpp
@@ -0,0 +1,23 @@
+//===----------------------------------------------------------------------===//
+//
+// ΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚThe LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+// <iterator>
+
+// template <class C> auto begin(const C& c) -> decltype(c.begin());
+
+#include <vector>
+#include <cassert>
+
+int main()
+{
+ int ia[] = {1, 2, 3};
+ const std::vector<int> v(ia, ia + sizeof(ia)/sizeof(ia[0]));
+ std::vector<int>::const_iterator i = begin(v);
+ assert(*i == 1);
+}
diff --git a/libcxx/test/iterators/stream.iterators/iterator.range/begin_non_const.pass.cpp b/libcxx/test/iterators/stream.iterators/iterator.range/begin_non_const.pass.cpp
new file mode 100644
index 00000000000..60aa74dcd86
--- /dev/null
+++ b/libcxx/test/iterators/stream.iterators/iterator.range/begin_non_const.pass.cpp
@@ -0,0 +1,25 @@
+//===----------------------------------------------------------------------===//
+//
+// ΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚThe LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+// <iterator>
+
+// template <class C> auto begin(C& c) -> decltype(c.begin());
+
+#include <vector>
+#include <cassert>
+
+int main()
+{
+ int ia[] = {1, 2, 3};
+ std::vector<int> v(ia, ia + sizeof(ia)/sizeof(ia[0]));
+ std::vector<int>::iterator i = begin(v);
+ assert(*i == 1);
+ *i = 2;
+ assert(*i == 2);
+}
diff --git a/libcxx/test/iterators/stream.iterators/iterator.range/end_array.pass.cpp b/libcxx/test/iterators/stream.iterators/iterator.range/end_array.pass.cpp
new file mode 100644
index 00000000000..72ab1fb0992
--- /dev/null
+++ b/libcxx/test/iterators/stream.iterators/iterator.range/end_array.pass.cpp
@@ -0,0 +1,24 @@
+//===----------------------------------------------------------------------===//
+//
+// ΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚThe LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+// <iterator>
+
+// template <class T, size_t N> T* end(T (&array)[N]);
+
+#include <iterator>
+#include <cassert>
+
+int main()
+{
+ int ia[] = {1, 2, 3};
+ int* i = std::begin(ia);
+ int* e = std::end(ia);
+ assert(e == ia + 3);
+ assert(e - i == 3);
+}
diff --git a/libcxx/test/iterators/stream.iterators/iterator.range/end_const.pass.cpp b/libcxx/test/iterators/stream.iterators/iterator.range/end_const.pass.cpp
new file mode 100644
index 00000000000..f07bd3e9868
--- /dev/null
+++ b/libcxx/test/iterators/stream.iterators/iterator.range/end_const.pass.cpp
@@ -0,0 +1,23 @@
+//===----------------------------------------------------------------------===//
+//
+// ΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚThe LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+// <iterator>
+
+// template <class C> auto end(const C& c) -> decltype(c.end());
+
+#include <vector>
+#include <cassert>
+
+int main()
+{
+ int ia[] = {1, 2, 3};
+ const std::vector<int> v(ia, ia + sizeof(ia)/sizeof(ia[0]));
+ std::vector<int>::const_iterator i = end(v);
+ assert(i == v.cend());
+}
diff --git a/libcxx/test/iterators/stream.iterators/iterator.range/end_non_const.pass.cpp b/libcxx/test/iterators/stream.iterators/iterator.range/end_non_const.pass.cpp
new file mode 100644
index 00000000000..4571928fc51
--- /dev/null
+++ b/libcxx/test/iterators/stream.iterators/iterator.range/end_non_const.pass.cpp
@@ -0,0 +1,23 @@
+//===----------------------------------------------------------------------===//
+//
+// ΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚThe LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+// <iterator>
+
+// template <class C> auto end(C& c) -> decltype(c.end());
+
+#include <vector>
+#include <cassert>
+
+int main()
+{
+ int ia[] = {1, 2, 3};
+ std::vector<int> v(ia, ia + sizeof(ia)/sizeof(ia[0]));
+ std::vector<int>::iterator i = end(v);
+ assert(i == v.end());
+}
diff --git a/libcxx/test/iterators/stream.iterators/nothing_to_do.pass.cpp b/libcxx/test/iterators/stream.iterators/nothing_to_do.pass.cpp
new file mode 100644
index 00000000000..fa4d462f18d
--- /dev/null
+++ b/libcxx/test/iterators/stream.iterators/nothing_to_do.pass.cpp
@@ -0,0 +1,12 @@
+//===----------------------------------------------------------------------===//
+//
+// ΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚThe LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+int main()
+{
+}
diff --git a/libcxx/test/iterators/stream.iterators/ostream.iterator/ostream.iterator.cons.des/copy.pass.cpp b/libcxx/test/iterators/stream.iterators/ostream.iterator/ostream.iterator.cons.des/copy.pass.cpp
new file mode 100644
index 00000000000..7c619308edc
--- /dev/null
+++ b/libcxx/test/iterators/stream.iterators/ostream.iterator/ostream.iterator.cons.des/copy.pass.cpp
@@ -0,0 +1,26 @@
+//===----------------------------------------------------------------------===//
+//
+// ΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚThe LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+// <iterator>
+
+// class ostream_iterator
+
+// ostream_iterator(const ostream_iterator& x);
+
+#include <iterator>
+#include <sstream>
+#include <cassert>
+
+int main()
+{
+ std::ostringstream outf;
+ std::ostream_iterator<int> i(outf);
+ std::ostream_iterator<int> j = i;
+ assert(outf.good());
+}
diff --git a/libcxx/test/iterators/stream.iterators/ostream.iterator/ostream.iterator.cons.des/ostream.pass.cpp b/libcxx/test/iterators/stream.iterators/ostream.iterator/ostream.iterator.cons.des/ostream.pass.cpp
new file mode 100644
index 00000000000..5a5b98d8579
--- /dev/null
+++ b/libcxx/test/iterators/stream.iterators/ostream.iterator/ostream.iterator.cons.des/ostream.pass.cpp
@@ -0,0 +1,25 @@
+//===----------------------------------------------------------------------===//
+//
+// ΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚThe LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+// <iterator>
+
+// class ostream_iterator
+
+// ostream_iterator(ostream_type& s);
+
+#include <iterator>
+#include <sstream>
+#include <cassert>
+
+int main()
+{
+ std::ostringstream outf;
+ std::ostream_iterator<int> i(outf);
+ assert(outf.good());
+}
diff --git a/libcxx/test/iterators/stream.iterators/ostream.iterator/ostream.iterator.cons.des/ostream_delem.pass.cpp b/libcxx/test/iterators/stream.iterators/ostream.iterator/ostream.iterator.cons.des/ostream_delem.pass.cpp
new file mode 100644
index 00000000000..f83eddbcac4
--- /dev/null
+++ b/libcxx/test/iterators/stream.iterators/ostream.iterator/ostream.iterator.cons.des/ostream_delem.pass.cpp
@@ -0,0 +1,32 @@
+//===----------------------------------------------------------------------===//
+//
+// ΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚThe LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+// <iterator>
+
+// class ostream_iterator
+
+// ostream_iterator(ostream_type& s, const charT* delimiter);
+
+#include <iterator>
+#include <sstream>
+#include <cassert>
+
+int main()
+{
+ {
+ std::ostringstream outf;
+ std::ostream_iterator<int> i(outf, ", ");
+ assert(outf.good());
+ }
+ {
+ std::wostringstream outf;
+ std::ostream_iterator<double, wchar_t> i(outf, L", ");
+ assert(outf.good());
+ }
+}
diff --git a/libcxx/test/iterators/stream.iterators/ostream.iterator/ostream.iterator.ops/assign_t.pass.cpp b/libcxx/test/iterators/stream.iterators/ostream.iterator/ostream.iterator.ops/assign_t.pass.cpp
new file mode 100644
index 00000000000..7252cf492c3
--- /dev/null
+++ b/libcxx/test/iterators/stream.iterators/ostream.iterator/ostream.iterator.ops/assign_t.pass.cpp
@@ -0,0 +1,46 @@
+//===----------------------------------------------------------------------===//
+//
+// ΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚThe LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+// <iterator>
+
+// class ostream_iterator
+
+// ostream_iterator& operator=(const T& value);
+
+#include <iterator>
+#include <sstream>
+#include <cassert>
+
+int main()
+{
+ {
+ std::ostringstream outf;
+ std::ostream_iterator<int> i(outf);
+ i = 2.4;
+ assert(outf.str() == "2");
+ }
+ {
+ std::ostringstream outf;
+ std::ostream_iterator<int> i(outf, ", ");
+ i = 2.4;
+ assert(outf.str() == "2, ");
+ }
+ {
+ std::wostringstream outf;
+ std::ostream_iterator<int, wchar_t> i(outf);
+ i = 2.4;
+ assert(outf.str() == L"2");
+ }
+ {
+ std::wostringstream outf;
+ std::ostream_iterator<int, wchar_t> i(outf, L", ");
+ i = 2.4;
+ assert(outf.str() == L"2, ");
+ }
+}
diff --git a/libcxx/test/iterators/stream.iterators/ostream.iterator/ostream.iterator.ops/dereference.pass.cpp b/libcxx/test/iterators/stream.iterators/ostream.iterator/ostream.iterator.ops/dereference.pass.cpp
new file mode 100644
index 00000000000..092deca02b8
--- /dev/null
+++ b/libcxx/test/iterators/stream.iterators/ostream.iterator/ostream.iterator.ops/dereference.pass.cpp
@@ -0,0 +1,26 @@
+//===----------------------------------------------------------------------===//
+//
+// ΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚThe LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+// <iterator>
+
+// class ostream_iterator
+
+// ostream_iterator& operator*() const;
+
+#include <iterator>
+#include <sstream>
+#include <cassert>
+
+int main()
+{
+ std::ostringstream os;
+ std::ostream_iterator<int> i(os);
+ std::ostream_iterator<int>& iref = *i;
+ assert(&iref == &i);
+}
diff --git a/libcxx/test/iterators/stream.iterators/ostream.iterator/ostream.iterator.ops/increment.pass.cpp b/libcxx/test/iterators/stream.iterators/ostream.iterator/ostream.iterator.ops/increment.pass.cpp
new file mode 100644
index 00000000000..665cac0a1c0
--- /dev/null
+++ b/libcxx/test/iterators/stream.iterators/ostream.iterator/ostream.iterator.ops/increment.pass.cpp
@@ -0,0 +1,29 @@
+//===----------------------------------------------------------------------===//
+//
+// ΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚThe LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+// <iterator>
+
+// class ostream_iterator
+
+// ostream_iterator& operator++();
+// ostream_iterator& operator++(int);
+
+#include <iterator>
+#include <sstream>
+#include <cassert>
+
+int main()
+{
+ std::ostringstream os;
+ std::ostream_iterator<int> i(os);
+ std::ostream_iterator<int>& iref1 = ++i;
+ assert(&iref1 == &i);
+ std::ostream_iterator<int>& iref2 = i++;
+ assert(&iref2 == &i);
+}
diff --git a/libcxx/test/iterators/stream.iterators/ostream.iterator/types.pass.cpp b/libcxx/test/iterators/stream.iterators/ostream.iterator/types.pass.cpp
new file mode 100644
index 00000000000..536c6953298
--- /dev/null
+++ b/libcxx/test/iterators/stream.iterators/ostream.iterator/types.pass.cpp
@@ -0,0 +1,40 @@
+//===----------------------------------------------------------------------===//
+//
+// ΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚThe LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+// <iterator>
+
+// template <class T, class charT = char, class traits = char_traits<charT>,
+// class Distance = ptrdiff_t>
+// class ostream_iterator
+// : public iterator<output_iterator_tag, void, void, void, void>
+// {
+// public:
+// typedef charT char_type;
+// typedef traits traits_type;
+// typedef basic_istream<charT,traits> istream_type;
+// ...
+
+#include <iterator>
+#include <type_traits>
+
+int main()
+{
+ typedef std::ostream_iterator<double> I1;
+ static_assert((std::is_convertible<I1,
+ std::iterator<std::output_iterator_tag, void, void, void, void> >::value), "");
+ static_assert((std::is_same<I1::char_type, char>::value), "");
+ static_assert((std::is_same<I1::traits_type, std::char_traits<char> >::value), "");
+ static_assert((std::is_same<I1::ostream_type, std::ostream>::value), "");
+ typedef std::ostream_iterator<unsigned, wchar_t> I2;
+ static_assert((std::is_convertible<I2,
+ std::iterator<std::output_iterator_tag, void, void, void, void> >::value), "");
+ static_assert((std::is_same<I2::char_type, wchar_t>::value), "");
+ static_assert((std::is_same<I2::traits_type, std::char_traits<wchar_t> >::value), "");
+ static_assert((std::is_same<I2::ostream_type, std::wostream>::value), "");
+}
diff --git a/libcxx/test/iterators/stream.iterators/ostreambuf.iterator/ostreambuf.iter.cons/ostream.pass.cpp b/libcxx/test/iterators/stream.iterators/ostreambuf.iterator/ostreambuf.iter.cons/ostream.pass.cpp
new file mode 100644
index 00000000000..f5641650fde
--- /dev/null
+++ b/libcxx/test/iterators/stream.iterators/ostreambuf.iterator/ostreambuf.iter.cons/ostream.pass.cpp
@@ -0,0 +1,32 @@
+//===----------------------------------------------------------------------===//
+//
+// ΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚThe LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+// <iterator>
+
+// class ostreambuf_iterator
+
+// ostreambuf_iterator(ostream_type& s) throw();
+
+#include <iterator>
+#include <sstream>
+#include <cassert>
+
+int main()
+{
+ {
+ std::ostringstream outf;
+ std::ostreambuf_iterator<char> i(outf);
+ assert(!i.failed());
+ }
+ {
+ std::wostringstream outf;
+ std::ostreambuf_iterator<wchar_t> i(outf);
+ assert(!i.failed());
+ }
+}
diff --git a/libcxx/test/iterators/stream.iterators/ostreambuf.iterator/ostreambuf.iter.cons/streambuf.pass.cpp b/libcxx/test/iterators/stream.iterators/ostreambuf.iterator/ostreambuf.iter.cons/streambuf.pass.cpp
new file mode 100644
index 00000000000..6634e3e8425
--- /dev/null
+++ b/libcxx/test/iterators/stream.iterators/ostreambuf.iterator/ostreambuf.iter.cons/streambuf.pass.cpp
@@ -0,0 +1,32 @@
+//===----------------------------------------------------------------------===//
+//
+// ΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚThe LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+// <iterator>
+
+// class ostreambuf_iterator
+
+// ostreambuf_iterator(streambuf_type* s) throw();
+
+#include <iterator>
+#include <sstream>
+#include <cassert>
+
+int main()
+{
+ {
+ std::ostringstream outf;
+ std::ostreambuf_iterator<char> i(outf.rdbuf());
+ assert(!i.failed());
+ }
+ {
+ std::wostringstream outf;
+ std::ostreambuf_iterator<wchar_t> i(outf.rdbuf());
+ assert(!i.failed());
+ }
+}
diff --git a/libcxx/test/iterators/stream.iterators/ostreambuf.iterator/ostreambuf.iter.ops/assign_c.pass.cpp b/libcxx/test/iterators/stream.iterators/ostreambuf.iterator/ostreambuf.iter.ops/assign_c.pass.cpp
new file mode 100644
index 00000000000..35f8bb172a7
--- /dev/null
+++ b/libcxx/test/iterators/stream.iterators/ostreambuf.iterator/ostreambuf.iter.ops/assign_c.pass.cpp
@@ -0,0 +1,39 @@
+//===----------------------------------------------------------------------===//
+//
+// ΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚThe LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+// <iterator>
+
+// class ostreambuf_iterator
+
+// ostreambuf_iterator<charT,traits>&
+// operator=(charT c);
+
+#include <iterator>
+#include <sstream>
+#include <cassert>
+
+int main()
+{
+ {
+ std::ostringstream outf;
+ std::ostreambuf_iterator<char> i(outf);
+ i = 'a';
+ assert(outf.str() == "a");
+ i = 'b';
+ assert(outf.str() == "ab");
+ }
+ {
+ std::wostringstream outf;
+ std::ostreambuf_iterator<wchar_t> i(outf);
+ i = L'a';
+ assert(outf.str() == L"a");
+ i = L'b';
+ assert(outf.str() == L"ab");
+ }
+}
diff --git a/libcxx/test/iterators/stream.iterators/ostreambuf.iterator/ostreambuf.iter.ops/deref.pass.cpp b/libcxx/test/iterators/stream.iterators/ostreambuf.iterator/ostreambuf.iter.ops/deref.pass.cpp
new file mode 100644
index 00000000000..8a1e5a12235
--- /dev/null
+++ b/libcxx/test/iterators/stream.iterators/ostreambuf.iterator/ostreambuf.iter.ops/deref.pass.cpp
@@ -0,0 +1,34 @@
+//===----------------------------------------------------------------------===//
+//
+// ΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚThe LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+// <iterator>
+
+// class ostreambuf_iterator
+
+// ostreambuf_iterator<charT,traits>& operator*();
+
+#include <iterator>
+#include <sstream>
+#include <cassert>
+
+int main()
+{
+ {
+ std::ostringstream outf;
+ std::ostreambuf_iterator<char> i(outf);
+ std::ostreambuf_iterator<char>& iref = *i;
+ assert(&iref == &i);
+ }
+ {
+ std::wostringstream outf;
+ std::ostreambuf_iterator<wchar_t> i(outf);
+ std::ostreambuf_iterator<wchar_t>& iref = *i;
+ assert(&iref == &i);
+ }
+}
diff --git a/libcxx/test/iterators/stream.iterators/ostreambuf.iterator/ostreambuf.iter.ops/failed.pass.cpp b/libcxx/test/iterators/stream.iterators/ostreambuf.iterator/ostreambuf.iter.ops/failed.pass.cpp
new file mode 100644
index 00000000000..ff699092b49
--- /dev/null
+++ b/libcxx/test/iterators/stream.iterators/ostreambuf.iterator/ostreambuf.iter.ops/failed.pass.cpp
@@ -0,0 +1,30 @@
+//===----------------------------------------------------------------------===//
+//
+// ΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚThe LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+// <iterator>
+
+// class ostreambuf_iterator
+
+// bool failed() const throw();
+
+#include <iterator>
+#include <sstream>
+#include <cassert>
+
+int main()
+{
+ {
+ std::ostreambuf_iterator<char> i(nullptr);
+ assert(i.failed());
+ }
+ {
+ std::ostreambuf_iterator<wchar_t> i(nullptr);
+ assert(i.failed());
+ }
+}
diff --git a/libcxx/test/iterators/stream.iterators/ostreambuf.iterator/ostreambuf.iter.ops/increment.pass.cpp b/libcxx/test/iterators/stream.iterators/ostreambuf.iterator/ostreambuf.iter.ops/increment.pass.cpp
new file mode 100644
index 00000000000..79db9358de5
--- /dev/null
+++ b/libcxx/test/iterators/stream.iterators/ostreambuf.iterator/ostreambuf.iter.ops/increment.pass.cpp
@@ -0,0 +1,39 @@
+//===----------------------------------------------------------------------===//
+//
+// ΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚThe LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+// <iterator>
+
+// class ostreambuf_iterator
+
+// ostreambuf_iterator<charT,traits>& operator++();
+// ostreambuf_iterator<charT,traits>& operator++(int);
+
+#include <iterator>
+#include <sstream>
+#include <cassert>
+
+int main()
+{
+ {
+ std::ostringstream outf;
+ std::ostreambuf_iterator<char> i(outf);
+ std::ostreambuf_iterator<char>& iref = ++i;
+ assert(&iref == &i);
+ std::ostreambuf_iterator<char>& iref2 = i++;
+ assert(&iref2 == &i);
+ }
+ {
+ std::wostringstream outf;
+ std::ostreambuf_iterator<wchar_t> i(outf);
+ std::ostreambuf_iterator<wchar_t>& iref = ++i;
+ assert(&iref == &i);
+ std::ostreambuf_iterator<wchar_t>& iref2 = i++;
+ assert(&iref2 == &i);
+ }
+}
diff --git a/libcxx/test/iterators/stream.iterators/ostreambuf.iterator/types.pass.cpp b/libcxx/test/iterators/stream.iterators/ostreambuf.iterator/types.pass.cpp
new file mode 100644
index 00000000000..e2894b9531e
--- /dev/null
+++ b/libcxx/test/iterators/stream.iterators/ostreambuf.iterator/types.pass.cpp
@@ -0,0 +1,44 @@
+//===----------------------------------------------------------------------===//
+//
+// ΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚThe LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+// <iterator>
+
+// template <class charT, class traits = char_traits<charT> >
+// class ostreambuf_iterator
+// : public iterator<output_iterator_tag, void, void, void, void>
+// {
+// public:
+// typedef charT char_type;
+// typedef traits traits_type;
+// typedef basic_streambuf<charT, traits> streambuf_type;
+// typedef basic_ostream<charT, traits> ostream_type;
+// ...
+
+#include <iterator>
+#include <string>
+#include <type_traits>
+
+int main()
+{
+ typedef std::ostreambuf_iterator<char> I1;
+ static_assert((std::is_convertible<I1,
+ std::iterator<std::output_iterator_tag, void, void, void, void> >::value), "");
+ static_assert((std::is_same<I1::char_type, char>::value), "");
+ static_assert((std::is_same<I1::traits_type, std::char_traits<char> >::value), "");
+ static_assert((std::is_same<I1::streambuf_type, std::streambuf>::value), "");
+ static_assert((std::is_same<I1::ostream_type, std::ostream>::value), "");
+
+ typedef std::ostreambuf_iterator<wchar_t> I2;
+ static_assert((std::is_convertible<I2,
+ std::iterator<std::output_iterator_tag, void, void, void, void> >::value), "");
+ static_assert((std::is_same<I2::char_type, wchar_t>::value), "");
+ static_assert((std::is_same<I2::traits_type, std::char_traits<wchar_t> >::value), "");
+ static_assert((std::is_same<I2::streambuf_type, std::wstreambuf>::value), "");
+ static_assert((std::is_same<I2::ostream_type, std::wostream>::value), "");
+}
diff --git a/libcxx/test/iterators/version.pass.cpp b/libcxx/test/iterators/version.pass.cpp
new file mode 100644
index 00000000000..19cb755d6c2
--- /dev/null
+++ b/libcxx/test/iterators/version.pass.cpp
@@ -0,0 +1,20 @@
+//===----------------------------------------------------------------------===//
+//
+// ΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚΚThe LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+// <iterator>
+
+#include <iterator>
+
+#ifndef _LIBCPP_VERSION
+#error _LIBCPP_VERSION not defined
+#endif
+
+int main()
+{
+}
OpenPOWER on IntegriCloud