<div dir="ltr">This commit is responsible for breaking the libc++ bots hosted on gribozavr4. The issue is a bug in Clang which was fixed prior to the 3.9 release.<div>I've asked Dimitri to upgrade the compiler to fix the bots.</div><div><br></div><div>/Eric</div><div><br><div><br></div><div><br><div class="gmail_extra"><br><div class="gmail_quote">On Wed, Oct 12, 2016 at 1:46 AM, Eric Fiselier via cfe-commits <span dir="ltr"><<a href="mailto:cfe-commits@lists.llvm.org" target="_blank">cfe-commits@lists.llvm.org</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">Author: ericwf<br>
Date: Wed Oct 12 02:46:20 2016<br>
New Revision: 283980<br>
<br>
URL: <a href="http://llvm.org/viewvc/llvm-project?rev=283980&view=rev" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-pr<wbr>oject?rev=283980&view=rev</a><br>
Log:<br>
Implement N4606 optional<br>
<br>
Summary:<br>
Adapt implementation of Library Fundamentals TS optional into an implementation of N4606 optional.<br>
<br>
  - Update relational operators per <a href="http://wg21.link/P0307" rel="noreferrer" target="_blank">http://wg21.link/P0307</a><br>
  - Update to requirements of <a href="http://wg21.link/P0032" rel="noreferrer" target="_blank">http://wg21.link/P0032</a><br>
  - Extension: Implement trivial copy/move construction/assignment for `optional<T>` when `T` is trivially copyable.<br>
<br>
Audit P/Rs for optional LWG issues:<br>
  - 2756 "C++ WP optional<T> should 'forward' T's implicit conversions" Implemented, which also resolves 2753 "Optional's constructors and assignments need constraints" (modulo my refusal to explicitly delete the move operations, which is a design error that I'm working on correcting in the 2756 P/R).<br>
  - 2736 "nullopt_t insufficiently constrained" Already conforming. I've added a test ensuring that `nullopt_t` is not copy-initializable from an empty braced-init-list, which I believe is the root intent of the issue, to avoid regression.<br>
  - 2740 "constexpr optional<T>::operator->" Already conforming.<br>
  - 2746 "Inconsistency between requirements for emplace between optional and variant" No P/R, but note that the author's '"suggested resolution" is already implemented.<br>
  - 2748 "swappable traits for optionals" Already conforming.<br>
  - 2753 "Optional's constructors and assignments need constraints" Implemented.<br>
<br>
Most of the work for this patch was done by Casey Carter @ Microsoft. Thank you Casey!<br>
<br>
<br>
<br>
Reviewers: mclow.lists, CaseyCarter, EricWF<br>
<br>
Differential Revision: <a href="https://reviews.llvm.org/D22741" rel="noreferrer" target="_blank">https://reviews.llvm.org/D2274<wbr>1</a><br>
<br>
Added:<br>
    libcxx/trunk/include/optional<br>
    libcxx/trunk/test/libcxx/utili<wbr>ties/optional/<br>
    libcxx/trunk/test/libcxx/utili<wbr>ties/optional/optional.object/<br>
    libcxx/trunk/test/libcxx/utili<wbr>ties/optional/optional.object/<wbr>optional.object.assign/<br>
    libcxx/trunk/test/libcxx/utili<wbr>ties/optional/optional.object/<wbr>optional.object.assign/copy.<wbr>pass.cpp<br>
    libcxx/trunk/test/libcxx/utili<wbr>ties/optional/optional.object/<wbr>optional.object.assign/move.<wbr>pass.cpp<br>
    libcxx/trunk/test/libcxx/utili<wbr>ties/optional/optional.object/<wbr>optional.object.ctor/<br>
    libcxx/trunk/test/libcxx/utili<wbr>ties/optional/optional.object/<wbr>optional.object.ctor/copy.<wbr>pass.cpp<br>
    libcxx/trunk/test/libcxx/utili<wbr>ties/optional/optional.object/<wbr>optional.object.ctor/move.<wbr>pass.cpp<br>
    libcxx/trunk/test/libcxx/utili<wbr>ties/optional/optional.object/<wbr>special_member_gen.pass.cpp<br>
    libcxx/trunk/test/libcxx/utili<wbr>ties/optional/version.pass.cpp<br>
    libcxx/trunk/test/std/utilitie<wbr>s/optional/<br>
    libcxx/trunk/test/std/utilitie<wbr>s/optional/optional.bad_<wbr>optional_access/<br>
    libcxx/trunk/test/std/utilitie<wbr>s/optional/optional.bad_<wbr>optional_access/default.pass.<wbr>cpp<br>
    libcxx/trunk/test/std/utilitie<wbr>s/optional/optional.bad_<wbr>optional_access/derive.pass.<wbr>cpp<br>
    libcxx/trunk/test/std/utilitie<wbr>s/optional/optional.comp_with_<wbr>t/<br>
    libcxx/trunk/test/std/utilitie<wbr>s/optional/optional.comp_with_<wbr>t/equal.pass.cpp<br>
    libcxx/trunk/test/std/utilitie<wbr>s/optional/optional.comp_with_<wbr>t/greater.pass.cpp<br>
    libcxx/trunk/test/std/utilitie<wbr>s/optional/optional.comp_with_<wbr>t/greater_equal.pass.cpp<br>
    libcxx/trunk/test/std/utilitie<wbr>s/optional/optional.comp_with_<wbr>t/less_equal.pass.cpp<br>
    libcxx/trunk/test/std/utilitie<wbr>s/optional/optional.comp_with_<wbr>t/less_than.pass.cpp<br>
    libcxx/trunk/test/std/utilitie<wbr>s/optional/optional.comp_with_<wbr>t/not_equal.pass.cpp<br>
    libcxx/trunk/test/std/utilitie<wbr>s/optional/optional.hash/<br>
    libcxx/trunk/test/std/utilitie<wbr>s/optional/optional.hash/hash.<wbr>pass.cpp<br>
    libcxx/trunk/test/std/utilitie<wbr>s/optional/optional.nullops/<br>
    libcxx/trunk/test/std/utilitie<wbr>s/optional/optional.nullops/<wbr>equal.pass.cpp<br>
    libcxx/trunk/test/std/utilitie<wbr>s/optional/optional.nullops/<wbr>greater.pass.cpp<br>
    libcxx/trunk/test/std/utilitie<wbr>s/optional/optional.nullops/<wbr>greater_equal.pass.cpp<br>
    libcxx/trunk/test/std/utilitie<wbr>s/optional/optional.nullops/<wbr>less_equal.pass.cpp<br>
    libcxx/trunk/test/std/utilitie<wbr>s/optional/optional.nullops/<wbr>less_than.pass.cpp<br>
    libcxx/trunk/test/std/utilitie<wbr>s/optional/optional.nullops/<wbr>not_equal.pass.cpp<br>
    libcxx/trunk/test/std/utilitie<wbr>s/optional/optional.nullopt/<br>
    libcxx/trunk/test/std/utilitie<wbr>s/optional/optional.nullopt/<wbr>not_brace_initializable.fail.<wbr>cpp<br>
    libcxx/trunk/test/std/utilitie<wbr>s/optional/optional.nullopt/<wbr>nullopt_t.pass.cpp<br>
    libcxx/trunk/test/std/utilitie<wbr>s/optional/optional.object/<br>
    libcxx/trunk/test/std/utilitie<wbr>s/optional/optional.object/<wbr>optional.object.assign/<br>
    libcxx/trunk/test/std/utilitie<wbr>s/optional/optional.object/<wbr>optional.object.assign/assign_<wbr>value.pass.cpp<br>
    libcxx/trunk/test/std/utilitie<wbr>s/optional/optional.object/<wbr>optional.object.assign/const_<wbr>optional_U.pass.cpp<br>
    libcxx/trunk/test/std/utilitie<wbr>s/optional/optional.object/<wbr>optional.object.assign/copy.<wbr>pass.cpp<br>
    libcxx/trunk/test/std/utilitie<wbr>s/optional/optional.object/<wbr>optional.object.assign/emplace<wbr>.pass.cpp<br>
    libcxx/trunk/test/std/utilitie<wbr>s/optional/optional.object/<wbr>optional.object.assign/emplace<wbr>_initializer_list.pass.cpp<br>
    libcxx/trunk/test/std/utilitie<wbr>s/optional/optional.object/<wbr>optional.object.assign/move.<wbr>pass.cpp<br>
    libcxx/trunk/test/std/utilitie<wbr>s/optional/optional.object/<wbr>optional.object.assign/nullopt<wbr>_t.pass.cpp<br>
    libcxx/trunk/test/std/utilitie<wbr>s/optional/optional.object/<wbr>optional.object.assign/optiona<wbr>l_U.pass.cpp<br>
    libcxx/trunk/test/std/utilitie<wbr>s/optional/optional.object/<wbr>optional.object.ctor/<br>
    libcxx/trunk/test/std/utilitie<wbr>s/optional/optional.object/<wbr>optional.object.ctor/U.pass.<wbr>cpp<br>
    libcxx/trunk/test/std/utilitie<wbr>s/optional/optional.object/<wbr>optional.object.ctor/const_T.<wbr>pass.cpp<br>
    libcxx/trunk/test/std/utilitie<wbr>s/optional/optional.object/<wbr>optional.object.ctor/const_<wbr>optional_U.pass.cpp<br>
    libcxx/trunk/test/std/utilitie<wbr>s/optional/optional.object/<wbr>optional.object.ctor/copy.<wbr>pass.cpp<br>
    libcxx/trunk/test/std/utilitie<wbr>s/optional/optional.object/<wbr>optional.object.ctor/default.<wbr>pass.cpp<br>
    libcxx/trunk/test/std/utilitie<wbr>s/optional/optional.object/<wbr>optional.object.ctor/explicit_<wbr>const_optional_U.pass.cpp<br>
    libcxx/trunk/test/std/utilitie<wbr>s/optional/optional.object/<wbr>optional.object.ctor/explicit_<wbr>optional_U.pass.cpp<br>
    libcxx/trunk/test/std/utilitie<wbr>s/optional/optional.object/<wbr>optional.object.ctor/in_place_<wbr>t.pass.cpp<br>
    libcxx/trunk/test/std/utilitie<wbr>s/optional/optional.object/<wbr>optional.object.ctor/initializ<wbr>er_list.pass.cpp<br>
    libcxx/trunk/test/std/utilitie<wbr>s/optional/optional.object/<wbr>optional.object.ctor/move.<wbr>pass.cpp<br>
    libcxx/trunk/test/std/utilitie<wbr>s/optional/optional.object/<wbr>optional.object.ctor/nullopt_<wbr>t.pass.cpp<br>
    libcxx/trunk/test/std/utilitie<wbr>s/optional/optional.object/<wbr>optional.object.ctor/optional_<wbr>U.pass.cpp<br>
    libcxx/trunk/test/std/utilitie<wbr>s/optional/optional.object/<wbr>optional.object.ctor/rvalue_T.<wbr>pass.cpp<br>
    libcxx/trunk/test/std/utilitie<wbr>s/optional/optional.object/<wbr>optional.object.dtor/<br>
    libcxx/trunk/test/std/utilitie<wbr>s/optional/optional.object/<wbr>optional.object.dtor/dtor.<wbr>pass.cpp<br>
    libcxx/trunk/test/std/utilitie<wbr>s/optional/optional.object/<wbr>optional.object.mod/<br>
    libcxx/trunk/test/std/utilitie<wbr>s/optional/optional.object/<wbr>optional.object.mod/reset.<wbr>pass.cpp<br>
    libcxx/trunk/test/std/utilitie<wbr>s/optional/optional.object/<wbr>optional.object.observe/<br>
    libcxx/trunk/test/std/utilitie<wbr>s/optional/optional.object/<wbr>optional.object.observe/bool.<wbr>pass.cpp<br>
    libcxx/trunk/test/std/utilitie<wbr>s/optional/optional.object/<wbr>optional.object.observe/<wbr>dereference.pass.cpp<br>
    libcxx/trunk/test/std/utilitie<wbr>s/optional/optional.object/<wbr>optional.object.observe/<wbr>dereference_const.pass.cpp<br>
    libcxx/trunk/test/std/utilitie<wbr>s/optional/optional.object/<wbr>optional.object.observe/<wbr>dereference_const_rvalue.pass.<wbr>cpp<br>
    libcxx/trunk/test/std/utilitie<wbr>s/optional/optional.object/<wbr>optional.object.observe/<wbr>dereference_rvalue.pass.cpp<br>
    libcxx/trunk/test/std/utilitie<wbr>s/optional/optional.object/<wbr>optional.object.observe/has_<wbr>value.pass.cpp<br>
    libcxx/trunk/test/std/utilitie<wbr>s/optional/optional.object/<wbr>optional.object.observe/op_<wbr>arrow.pass.cpp<br>
    libcxx/trunk/test/std/utilitie<wbr>s/optional/optional.object/<wbr>optional.object.observe/op_<wbr>arrow_const.pass.cpp<br>
    libcxx/trunk/test/std/utilitie<wbr>s/optional/optional.object/<wbr>optional.object.observe/value.<wbr>pass.cpp<br>
    libcxx/trunk/test/std/utilitie<wbr>s/optional/optional.object/<wbr>optional.object.observe/value_<wbr>const.fail.cpp<br>
    libcxx/trunk/test/std/utilitie<wbr>s/optional/optional.object/<wbr>optional.object.observe/value_<wbr>const.pass.cpp<br>
    libcxx/trunk/test/std/utilitie<wbr>s/optional/optional.object/<wbr>optional.object.observe/value_<wbr>const_rvalue.pass.cpp<br>
    libcxx/trunk/test/std/utilitie<wbr>s/optional/optional.object/<wbr>optional.object.observe/value_<wbr>or.pass.cpp<br>
    libcxx/trunk/test/std/utilitie<wbr>s/optional/optional.object/<wbr>optional.object.observe/value_<wbr>or_const.pass.cpp<br>
    libcxx/trunk/test/std/utilitie<wbr>s/optional/optional.object/<wbr>optional.object.observe/value_<wbr>rvalue.pass.cpp<br>
    libcxx/trunk/test/std/utilitie<wbr>s/optional/optional.object/<wbr>optional.object.swap/<br>
    libcxx/trunk/test/std/utilitie<wbr>s/optional/optional.object/<wbr>optional.object.swap/swap.<wbr>pass.cpp<br>
    libcxx/trunk/test/std/utilitie<wbr>s/optional/optional.object/<wbr>optional_requires_destructible<wbr>_object.fail.cpp<br>
    libcxx/trunk/test/std/utilitie<wbr>s/optional/optional.object/<wbr>special_member_gen.pass.cpp<br>
    libcxx/trunk/test/std/utilitie<wbr>s/optional/optional.object/<wbr>types.pass.cpp<br>
    libcxx/trunk/test/std/utilitie<wbr>s/optional/optional.relops/<br>
    libcxx/trunk/test/std/utilitie<wbr>s/optional/optional.relops/<wbr>equal.pass.cpp<br>
    libcxx/trunk/test/std/utilitie<wbr>s/optional/optional.relops/<wbr>greater_equal.pass.cpp<br>
    libcxx/trunk/test/std/utilitie<wbr>s/optional/optional.relops/<wbr>greater_than.pass.cpp<br>
    libcxx/trunk/test/std/utilitie<wbr>s/optional/optional.relops/<wbr>less_equal.pass.cpp<br>
    libcxx/trunk/test/std/utilitie<wbr>s/optional/optional.relops/<wbr>less_than.pass.cpp<br>
    libcxx/trunk/test/std/utilitie<wbr>s/optional/optional.relops/<wbr>not_equal.pass.cpp<br>
    libcxx/trunk/test/std/utilitie<wbr>s/optional/optional.specalg/<br>
    libcxx/trunk/test/std/utilitie<wbr>s/optional/optional.specalg/<wbr>make_optional.pass.cpp<br>
    libcxx/trunk/test/std/utilitie<wbr>s/optional/optional.specalg/<wbr>make_optional_explicit.pass.<wbr>cpp<br>
    libcxx/trunk/test/std/utilitie<wbr>s/optional/optional.specalg/<wbr>make_optional_explicit_<wbr>initializer_list.pass.cpp<br>
    libcxx/trunk/test/std/utilitie<wbr>s/optional/optional.specalg/<wbr>swap.pass.cpp<br>
    libcxx/trunk/test/std/utilitie<wbr>s/optional/optional.syn/<br>
    libcxx/trunk/test/std/utilitie<wbr>s/optional/optional.syn/<wbr>optional_in_place_t.fail.cpp<br>
    libcxx/trunk/test/std/utilitie<wbr>s/optional/optional.syn/<wbr>optional_includes_initializer_<wbr>list.pass.cpp<br>
    libcxx/trunk/test/std/utilitie<wbr>s/optional/optional.syn/<wbr>optional_nullopt_t.fail.cpp<br>
Modified:<br>
    libcxx/trunk/.gitignore<br>
    libcxx/trunk/include/__config<br>
    libcxx/trunk/include/type_trai<wbr>ts<br>
    libcxx/trunk/src/optional.cpp<br>
    libcxx/trunk/test/std/utilitie<wbr>s/meta/meta.unary/meta.unary.<wbr>prop/is_nothrow_swappable_<wbr>with.pass.cpp<br>
    libcxx/trunk/test/support/arch<wbr>etypes.hpp<br>
    libcxx/trunk/test/support/arch<wbr>etypes.ipp<br>
<br>
Modified: libcxx/trunk/.gitignore<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/libcxx/trunk/.gitignore?rev=283980&r1=283979&r2=283980&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-pr<wbr>oject/libcxx/trunk/.gitignore?<wbr>rev=283980&r1=283979&r2=<wbr>283980&view=diff</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- libcxx/trunk/.gitignore (original)<br>
+++ libcxx/trunk/.gitignore Wed Oct 12 02:46:20 2016<br>
@@ -56,3 +56,6 @@ target/<br>
 # MSVC libraries test harness<br>
 env.lst<br>
 keep.lst<br>
+<br>
+# Editor by-products<br>
+.vscode/<br>
<br>
Modified: libcxx/trunk/include/__config<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/libcxx/trunk/include/__config?rev=283980&r1=283979&r2=283980&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-pr<wbr>oject/libcxx/trunk/include/__<wbr>config?rev=283980&r1=283979&r2<wbr>=283980&view=diff</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- libcxx/trunk/include/__config (original)<br>
+++ libcxx/trunk/include/__config Wed Oct 12 02:46:20 2016<br>
@@ -914,6 +914,10 @@ extern "C" void __sanitizer_annotate_con<br>
 #define _LIBCPP_SAFE_STATIC<br>
 #endif<br>
<br>
+#if !__has_builtin(__builtin_addre<wbr>ssof) && _GNUC_VER < 700<br>
+#define _LIBCPP_HAS_NO_BUILTIN_ADDRESS<wbr>OF<br>
+#endif<br>
+<br>
 #endif // __cplusplus<br>
<br>
 #endif // _LIBCPP_CONFIG<br>
<br>
Added: libcxx/trunk/include/optional<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/libcxx/trunk/include/optional?rev=283980&view=auto" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-pr<wbr>oject/libcxx/trunk/include/opt<wbr>ional?rev=283980&view=auto</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- libcxx/trunk/include/optional (added)<br>
+++ libcxx/trunk/include/optional Wed Oct 12 02:46:20 2016<br>
@@ -0,0 +1,1313 @@<br>
+// -*- C++ -*-<br>
+//===------------------------<wbr>-- optional ------------------------------<wbr>----===//<br>
+//<br>
+//                     The LLVM Compiler Infrastructure<br>
+//<br>
+// This file is dual licensed under the MIT and the University of Illinois Open<br>
+// Source Licenses. See LICENSE.TXT for details.<br>
+//<br>
+//===------------------------<wbr>------------------------------<wbr>----------------===//<br>
+<br>
+#ifndef _LIBCPP_OPTIONAL<br>
+#define _LIBCPP_OPTIONAL<br>
+<br>
+/*<br>
+    optional synopsis<br>
+<br>
+// C++1z<br>
+<br>
+namespace std {<br>
+  // 20.6.3, optional for object types<br>
+  template <class T> class optional;<br>
+<br>
+  // 20.6.4, no-value state indicator<br>
+  struct nullopt_t{see below };<br>
+  constexpr nullopt_t nullopt(unspecified );<br>
+<br>
+  // 20.6.5, class bad_optional_access<br>
+  class bad_optional_access;<br>
+<br>
+  // 20.6.6, relational operators<br>
+  template <class T><br>
+  constexpr bool operator==(const optional<T>&, const optional<T>&);<br>
+  template <class T><br>
+  constexpr bool operator!=(const optional<T>&, const optional<T>&);<br>
+  template <class T><br>
+  constexpr bool operator<(const optional<T>&, const optional<T>&);<br>
+  template <class T><br>
+  constexpr bool operator>(const optional<T>&, const optional<T>&);<br>
+  template <class T><br>
+  constexpr bool operator<=(const optional<T>&, const optional<T>&);<br>
+  template <class T><br>
+  constexpr bool operator>=(const optional<T>&, const optional<T>&);<br>
+  template <class T> constexpr bool operator==(const optional<T>&, nullopt_t) noexcept;<br>
+  template <class T> constexpr bool operator==(nullopt_t, const optional<T>&) noexcept;<br>
+  template <class T> constexpr bool operator!=(const optional<T>&, nullopt_t) noexcept;<br>
+  template <class T> constexpr bool operator!=(nullopt_t, const optional<T>&) noexcept;<br>
+  template <class T> constexpr bool operator<(const optional<T>&, nullopt_t) noexcept;<br>
+  template <class T> constexpr bool operator<(nullopt_t, const optional<T>&) noexcept;<br>
+  template <class T> constexpr bool operator<=(const optional<T>&, nullopt_t) noexcept;<br>
+  template <class T> constexpr bool operator<=(nullopt_t, const optional<T>&) noexcept;<br>
+  template <class T> constexpr bool operator>(const optional<T>&, nullopt_t) noexcept;<br>
+  template <class T> constexpr bool operator>(nullopt_t, const optional<T>&) noexcept;<br>
+  template <class T> constexpr bool operator>=(const optional<T>&, nullopt_t) noexcept;<br>
+  template <class T> constexpr bool operator>=(nullopt_t, const optional<T>&) noexcept;<br>
+<br>
+  // 20.6.8, comparison with T<br>
+  template <class T> constexpr bool operator==(const optional<T>&, const T&);<br>
+  template <class T> constexpr bool operator==(const T&, const optional<T>&);<br>
+  template <class T> constexpr bool operator!=(const optional<T>&, const T&);<br>
+  template <class T> constexpr bool operator!=(const T&, const optional<T>&);<br>
+  template <class T> constexpr bool operator<(const optional<T>&, const T&);<br>
+  template <class T> constexpr bool operator<(const T&, const optional<T>&);<br>
+  template <class T> constexpr bool operator<=(const optional<T>&, const T&);<br>
+  template <class T> constexpr bool operator<=(const T&, const optional<T>&);<br>
+  template <class T> constexpr bool operator>(const optional<T>&, const T&);<br>
+  template <class T> constexpr bool operator>(const T&, const optional<T>&);<br>
+  template <class T> constexpr bool operator>=(const optional<T>&, const T&);<br>
+  template <class T> constexpr bool operator>=(const T&, const optional<T>&);<br>
+<br>
+  // 20.6.9, specialized algorithms<br>
+  template <class T> void swap(optional<T>&, optional<T>&) noexcept(see below );<br>
+  template <class T> constexpr optional<see below > make_optional(T&&);<br>
+  template <class T, class... Args><br>
+    constexpr optional<T> make_optional(Args&&... args);<br>
+  template <class T, class U, class... Args><br>
+    constexpr optional<T> make_optional(initializer_list<wbr><U> il, Args&&... args);<br>
+<br>
+  // 20.6.10, hash support<br>
+  template <class T> struct hash;<br>
+  template <class T> struct hash<optional<T>>;<br>
+<br>
+  template <class T> class optional {<br>
+  public:<br>
+    using value_type = T;<br>
+<br>
+    // 20.6.3.1, constructors<br>
+    constexpr optional() noexcept;<br>
+    constexpr optional(nullopt_t) noexcept;<br>
+    optional(const optional &);<br>
+    optional(optional &&) noexcept(see below );<br>
+    template <class... Args> constexpr explicit optional(in_place_t, Args &&...);<br>
+    template <class U, class... Args><br>
+      constexpr explicit optional(in_place_t, initializer_list<U>, Args &&...);<br>
+    template <class U = T><br>
+      constexpr EXPLICIT optional(U &&);<br>
+    template <class U><br>
+      constexpr EXPLICIT optional(const optional<U> &);<br>
+    template <class U><br>
+      constexpr EXPLICIT optional(optional<U> &&);<br>
+<br>
+    // 20.6.3.2, destructor<br>
+    ~optional();<br>
+<br>
+    // 20.6.3.3, assignment<br>
+    optional &operator=(nullopt_t) noexcept;<br>
+    optional &operator=(const optional &);<br>
+    optional &operator=(optional &&) noexcept(see below );<br>
+    template <class U = T> optional &operator=(U &&);<br>
+    template <class U> optional &operator=(const optional<U> &);<br>
+    template <class U> optional &operator=(optional<U> &&);<br>
+    template <class... Args> void emplace(Args &&...);<br>
+    template <class U, class... Args><br>
+      void emplace(initializer_list<U>, Args &&...);<br>
+<br>
+    // 20.6.3.4, swap<br>
+    void swap(optional &) noexcept(see below );<br>
+<br>
+    // 20.6.3.5, observers<br>
+    constexpr T const *operator->() const;<br>
+    constexpr T *operator->();<br>
+    constexpr T const &operator*() const &;<br>
+    constexpr T &operator*() &;<br>
+    constexpr T &&operator*() &&;<br>
+    constexpr const T &&operator*() const &&;<br>
+    constexpr explicit operator bool() const noexcept;<br>
+    constexpr bool has_value() const noexcept;<br>
+    constexpr T const &value() const &;<br>
+    constexpr T &value() &;<br>
+    constexpr T &&value() &&;<br>
+    constexpr const T &&value() const &&;<br>
+    template <class U> constexpr T value_or(U &&) const &;<br>
+    template <class U> constexpr T value_or(U &&) &&;<br>
+<br>
+    // 20.6.3.6, modifiers<br>
+    void reset() noexcept;<br>
+<br>
+  private:<br>
+    T *val; // exposition only<br>
+  };<br>
+} // namespace std<br>
+<br>
+*/<br>
+<br>
+#include <__config><br>
+#include <__debug><br>
+#include <__functional_base><br>
+#include <__undef_min_max><br>
+#include <functional><br>
+#include <initializer_list><br>
+#include <new><br>
+#include <stdexcept><br>
+#include <type_traits><br>
+#include <utility><br>
+<br>
+#if !defined(_LIBCPP_HAS_NO_PRAGMA<wbr>_SYSTEM_HEADER)<br>
+#pragma GCC system_header<br>
+#endif<br>
+<br>
+namespace std  // purposefully not using versioning namespace<br>
+{<br>
+<br>
+class _LIBCPP_EXCEPTION_ABI bad_optional_access<br>
+    : public logic_error<br>
+{<br>
+public:<br>
+    _LIBCPP_INLINE_VISIBILITY<br>
+    bad_optional_access() : logic_error("bad optional access") {}<br>
+<br>
+    // Get the key function ~bad_optional_access() into the dylib<br>
+    _LIBCPP_FUNC_VIS<br>
+    virtual ~bad_optional_access() _NOEXCEPT;<br>
+};<br>
+<br>
+}  // std<br>
+<br>
+#if _LIBCPP_STD_VER > 14<br>
+<br>
+_LIBCPP_BEGIN_NAMESPACE_STD<br>
+<br>
+_LIBCPP_NORETURN<br>
+inline _LIBCPP_INLINE_VISIBILITY<br>
+void __throw_bad_optional_access() {<br>
+#ifndef _LIBCPP_NO_EXCEPTIONS<br>
+        throw bad_optional_access();<br>
+#else<br>
+        _VSTD::abort();<br>
+#endif<br>
+}<br>
+<br>
+struct nullopt_t<br>
+{<br>
+    struct __secret_tag { _LIBCPP_INLINE_VISIBILITY explicit __secret_tag() = default; };<br>
+    _LIBCPP_INLINE_VISIBILITY constexpr explicit nullopt_t(__secret_tag, __secret_tag) noexcept {}<br>
+};<br>
+<br>
+/* inline */ constexpr nullopt_t nullopt{nullopt_t::__secret_ta<wbr>g{}, nullopt_t::__secret_tag{}};<br>
+<br>
+template <class _Tp, bool = is_trivially_destructible<_Tp><wbr>::value><br>
+struct __optional_destruct_base;<br>
+<br>
+template <class _Tp><br>
+struct __optional_destruct_base<_Tp, false><br>
+{<br>
+    typedef _Tp value_type;<br>
+    static_assert(is_object_v<valu<wbr>e_type>,<br>
+        "instantiation of optional with a non-object type is undefined behavior");<br>
+    union<br>
+    {<br>
+        char __null_state_;<br>
+        value_type __val_;<br>
+    };<br>
+    bool __engaged_;<br>
+<br>
+    _LIBCPP_INLINE_VISIBILITY<br>
+    ~__optional_destruct_base()<br>
+    {<br>
+        if (__engaged_)<br>
+            __val_.~value_type();<br>
+    }<br>
+<br>
+    _LIBCPP_INLINE_VISIBILITY<br>
+    constexpr __optional_destruct_base() noexcept<br>
+        :  __null_state_(),<br>
+           __engaged_(false) {}<br>
+<br>
+    template <class... _Args><br>
+    _LIBCPP_INLINE_VISIBILITY<br>
+    constexpr explicit __optional_destruct_base(in_pl<wbr>ace_t, _Args&&... __args)<br>
+        :  __val_(_VSTD::forward<_Args>(_<wbr>_args)...),<br>
+           __engaged_(true) {}<br>
+<br>
+    _LIBCPP_INLINE_VISIBILITY<br>
+    void reset() noexcept<br>
+    {<br>
+        if (__engaged_)<br>
+        {<br>
+            __val_.~value_type();<br>
+            __engaged_ = false;<br>
+        }<br>
+    }<br>
+};<br>
+<br>
+template <class _Tp><br>
+struct __optional_destruct_base<_Tp, true><br>
+{<br>
+    typedef _Tp value_type;<br>
+    static_assert(is_object_v<valu<wbr>e_type>,<br>
+        "instantiation of optional with a non-object type is undefined behavior");<br>
+    union<br>
+    {<br>
+        char __null_state_;<br>
+        value_type __val_;<br>
+    };<br>
+    bool __engaged_;<br>
+<br>
+    _LIBCPP_INLINE_VISIBILITY<br>
+    constexpr __optional_destruct_base() noexcept<br>
+        :  __null_state_(),<br>
+           __engaged_(false) {}<br>
+<br>
+    template <class... _Args><br>
+    _LIBCPP_INLINE_VISIBILITY<br>
+    constexpr explicit __optional_destruct_base(in_pl<wbr>ace_t, _Args&&... __args)<br>
+        :  __val_(_VSTD::forward<_Args>(_<wbr>_args)...),<br>
+           __engaged_(true) {}<br>
+<br>
+    _LIBCPP_INLINE_VISIBILITY<br>
+    void reset() noexcept<br>
+    {<br>
+        if (__engaged_)<br>
+        {<br>
+            __engaged_ = false;<br>
+        }<br>
+    }<br>
+};<br>
+<br>
+template <class _Tp, bool = is_reference<_Tp>::value><br>
+struct __optional_storage_base : __optional_destruct_base<_Tp><br>
+{<br>
+    using __base = __optional_destruct_base<_Tp>;<br>
+    using value_type = _Tp;<br>
+    using __base::__base;<br>
+<br>
+    _LIBCPP_INLINE_VISIBILITY<br>
+    constexpr bool has_value() const noexcept<br>
+    {<br>
+        return this->__engaged_;<br>
+    }<br>
+<br>
+    _LIBCPP_INLINE_VISIBILITY<br>
+    constexpr value_type& __get() & noexcept<br>
+    {<br>
+        return this->__val_;<br>
+    }<br>
+    _LIBCPP_INLINE_VISIBILITY<br>
+    constexpr const value_type& __get() const& noexcept<br>
+    {<br>
+        return this->__val_;<br>
+    }<br>
+    _LIBCPP_INLINE_VISIBILITY<br>
+    constexpr value_type&& __get() && noexcept<br>
+    {<br>
+        return _VSTD::move(this->__val_);<br>
+    }<br>
+    _LIBCPP_INLINE_VISIBILITY<br>
+    constexpr const value_type&& __get() const&& noexcept<br>
+    {<br>
+        return _VSTD::move(this->__val_);<br>
+    }<br>
+<br>
+    template <class... _Args><br>
+    _LIBCPP_INLINE_VISIBILITY<br>
+    void __construct(_Args&&... __args)<br>
+    {<br>
+        _LIBCPP_ASSERT(!has_value(), "__construct called for engaged __optional_storage");<br>
+        ::new((void*)_VSTD::addressof(<wbr>this->__val_)) value_type(_VSTD::forward<_Arg<wbr>s>(__args)...);<br>
+        this->__engaged_ = true;<br>
+    }<br>
+<br>
+    template <class _That><br>
+    _LIBCPP_INLINE_VISIBILITY<br>
+    void __construct_from(_That&& __opt)<br>
+    {<br>
+        if (__opt.has_value())<br>
+            __construct(_VSTD::forward<_Th<wbr>at>(__opt).__get());<br>
+    }<br>
+<br>
+    template <class _That><br>
+    _LIBCPP_INLINE_VISIBILITY<br>
+    void __assign_from(_That&& __opt)<br>
+    {<br>
+        if (this->__engaged_ == __opt.has_value())<br>
+        {<br>
+            if (this->__engaged_)<br>
+                this->__val_ = _VSTD::forward<_That>(__opt)._<wbr>_get();<br>
+        }<br>
+        else<br>
+        {<br>
+            if (this->__engaged_)<br>
+                this->reset();<br>
+            else<br>
+                __construct(_VSTD::forward<_Th<wbr>at>(__opt).__get());<br>
+        }<br>
+    }<br>
+};<br>
+<br>
+// optional<T&> is currently required ill-formed, however it may to be in the<br>
+// future. For this reason it has already been implemented to ensure we can<br>
+// make the change in an ABI compatible manner.<br>
+template <class _Tp><br>
+struct __optional_storage_base<_Tp, true><br>
+{<br>
+    using value_type = _Tp;<br>
+    using __raw_type = remove_reference_t<_Tp>;<br>
+    __raw_type* __value_;<br>
+<br>
+    template <class _Up><br>
+    static constexpr bool __can_bind_reference() {<br>
+        using _RawUp = typename remove_reference<_Up>::type;<br>
+        using _UpPtr = _RawUp*;<br>
+        using _RawTp = typename remove_reference<_Tp>::type;<br>
+        using _TpPtr = _RawTp*;<br>
+        using _CheckLValueArg = integral_constant<bool,<br>
+            (is_lvalue_reference<_Up>::val<wbr>ue && is_convertible<_UpPtr, _TpPtr>::value)<br>
+        ||  is_same<_RawUp, reference_wrapper<_RawTp>>::va<wbr>lue<br>
+        ||  is_same<_RawUp, reference_wrapper<typename remove_const<_RawTp>::type>>::<wbr>value<br>
+        >;<br>
+        return (is_lvalue_reference<_Tp>::val<wbr>ue && _CheckLValueArg::value)<br>
+            || (is_rvalue_reference<_Tp>::val<wbr>ue && !is_lvalue_reference<_Up>::val<wbr>ue &&<br>
+                is_convertible<_UpPtr, _TpPtr>::value);<br>
+    }<br>
+<br>
+    _LIBCPP_INLINE_VISIBILITY<br>
+    constexpr __optional_storage_base() noexcept<br>
+        :  __value_(nullptr) {}<br>
+<br>
+    template <class _UArg><br>
+    _LIBCPP_INLINE_VISIBILITY<br>
+    constexpr explicit __optional_storage_base(in_pla<wbr>ce_t, _UArg&& __uarg)<br>
+        :  __value_(_VSTD::addressof(__ua<wbr>rg))<br>
+    {<br>
+      static_assert(__can_bind_refer<wbr>ence<_UArg>(),<br>
+        "Attempted to construct a reference element in tuple from a "<br>
+        "possible temporary");<br>
+    }<br>
+<br>
+    _LIBCPP_INLINE_VISIBILITY<br>
+    void reset() noexcept { __value_ = nullptr; }<br>
+<br>
+    _LIBCPP_INLINE_VISIBILITY<br>
+    constexpr bool has_value() const noexcept<br>
+      { return __value_ != nullptr; }<br>
+<br>
+    _LIBCPP_INLINE_VISIBILITY<br>
+    constexpr value_type& __get() const& noexcept<br>
+      { return *__value_; }<br>
+<br>
+    _LIBCPP_INLINE_VISIBILITY<br>
+    constexpr value_type&& __get() const&& noexcept<br>
+      { return _VSTD::forward<value_type>(*__<wbr>value_); }<br>
+<br>
+    template <class _UArg><br>
+    _LIBCPP_INLINE_VISIBILITY<br>
+    void __construct(_UArg&& __val)<br>
+    {<br>
+        _LIBCPP_ASSERT(!has_value(), "__construct called for engaged __optional_storage");<br>
+        static_assert(__can_bind_refer<wbr>ence<_UArg>(),<br>
+            "Attempted to construct a reference element in tuple from a "<br>
+            "possible temporary");<br>
+        __value_ = _VSTD::addressof(__val);<br>
+    }<br>
+<br>
+    template <class _That><br>
+    _LIBCPP_INLINE_VISIBILITY<br>
+    void __construct_from(_That&& __opt)<br>
+    {<br>
+        if (__opt.has_value())<br>
+            __construct(_VSTD::forward<_Th<wbr>at>(__opt).__get());<br>
+    }<br>
+<br>
+    template <class _That><br>
+    _LIBCPP_INLINE_VISIBILITY<br>
+    void __assign_from(_That&& __opt)<br>
+    {<br>
+        if (has_value() == __opt.has_value())<br>
+        {<br>
+            if (has_value())<br>
+                *__value_ = _VSTD::forward<_That>(__opt)._<wbr>_get();<br>
+        }<br>
+        else<br>
+        {<br>
+            if (has_value())<br>
+                reset();<br>
+            else<br>
+                __construct(_VSTD::forward<_Th<wbr>at>(__opt).__get());<br>
+        }<br>
+    }<br>
+};<br>
+<br>
+template <class _Tp, bool = is_trivially_copyable<_Tp>::va<wbr>lue><br>
+struct __optional_storage;<br>
+<br>
+template <class _Tp><br>
+struct __optional_storage<_Tp, true> : __optional_storage_base<_Tp><br>
+{<br>
+    using __optional_storage_base<_Tp>::<wbr>__optional_storage_base;<br>
+};<br>
+<br>
+template <class _Tp><br>
+struct __optional_storage<_Tp, false> : __optional_storage_base<_Tp><br>
+{<br>
+    using value_type = _Tp;<br>
+    using __optional_storage_base<_Tp>::<wbr>__optional_storage_base;<br>
+<br>
+    _LIBCPP_INLINE_VISIBILITY<br>
+    __optional_storage() = default;<br>
+<br>
+    _LIBCPP_INLINE_VISIBILITY<br>
+    __optional_storage(const __optional_storage& __opt)<br>
+    {<br>
+        this->__construct_from(__opt);<br>
+    }<br>
+<br>
+    _LIBCPP_INLINE_VISIBILITY<br>
+    __optional_storage(__optional_<wbr>storage&& __opt)<br>
+        noexcept(is_nothrow_move_const<wbr>ructible_v<value_type>)<br>
+    {<br>
+        this->__construct_from(_VSTD::<wbr>move(__opt));<br>
+    }<br>
+<br>
+    _LIBCPP_INLINE_VISIBILITY<br>
+    __optional_storage& operator=(const __optional_storage& __opt)<br>
+    {<br>
+        this->__assign_from(__opt);<br>
+        return *this;<br>
+    }<br>
+<br>
+    _LIBCPP_INLINE_VISIBILITY<br>
+    __optional_storage& operator=(__optional_storage&& __opt)<br>
+        noexcept(is_nothrow_move_assig<wbr>nable_v<value_type> &&<br>
+                 is_nothrow_move_<wbr>constructible_v<value_type>)<br>
+    {<br>
+        this->__assign_from(_VSTD::mov<wbr>e(__opt));<br>
+        return *this;<br>
+    }<br>
+};<br>
+<br>
+template <class _Tp><br>
+using __optional_sfinae_ctor_base_t = __sfinae_ctor_base<<br>
+    is_copy_constructible<_Tp>::va<wbr>lue,<br>
+    is_move_constructible<_Tp>::va<wbr>lue<br>
+>;<br>
+<br>
+template <class _Tp><br>
+using __optional_sfinae_assign_base_<wbr>t = __sfinae_assign_base<<br>
+    (is_copy_constructible<_Tp>::v<wbr>alue && is_copy_assignable<_Tp>::value<wbr>),<br>
+    (is_move_constructible<_Tp>::v<wbr>alue && is_move_assignable<_Tp>::value<wbr>)<br>
+>;<br>
+<br>
+template <class _Tp><br>
+class optional<br>
+    : private __optional_storage<_Tp><br>
+    , private __optional_sfinae_ctor_base_t<<wbr>_Tp><br>
+    , private __optional_sfinae_assign_base_<wbr>t<_Tp><br>
+{<br>
+    using __base = __optional_storage<_Tp>;<br>
+public:<br>
+    using value_type = _Tp;<br>
+<br>
+private:<br>
+     // Disable the reference extension using this static assert.<br>
+    static_assert(!is_same_v<value<wbr>_type, in_place_t>,<br>
+        "instantiation of optional with in_place_t is ill-formed");<br>
+    static_assert(!is_same_v<__unc<wbr>vref_t<value_type>, nullopt_t>,<br>
+        "instantiation of optional with nullopt_t is ill-formed");<br>
+    static_assert(!is_reference_v<<wbr>value_type>,<br>
+        "instantiation of optional with a reference type is ill-formed");<br>
+    static_assert(is_destructible_<wbr>v<value_type>,<br>
+        "instantiation of optional with a non-destructible type is ill-formed");<br>
+<br>
+    // LWG2756: conditionally explicit conversion from _Up<br>
+    struct _CheckOptionalArgsConstructor {<br>
+      template <class _Up><br>
+      static constexpr bool __enable_implicit() {<br>
+          return is_constructible_v<_Tp, _Up&&> &&<br>
+                 is_convertible_v<_Up&&, _Tp>;<br>
+      }<br>
+<br>
+      template <class _Up><br>
+      static constexpr bool __enable_explicit() {<br>
+          return is_constructible_v<_Tp, _Up&&> &&<br>
+                 !is_convertible_v<_Up&&, _Tp>;<br>
+      }<br>
+    };<br>
+    template <class _Up><br>
+    using _CheckOptionalArgsCtor = conditional_t<<br>
+        !is_same_v<in_place_t, _Up> &&<br>
+        !is_same_v<decay_t<_Up>, optional>,<br>
+        _CheckOptionalArgsConstructor,<br>
+        __check_tuple_constructor_fail<br>
+    >;<br>
+    template <class _QualUp><br>
+    struct _CheckOptionalLikeConstructor {<br>
+      template <class _Up, class _Opt = optional<_Up>><br>
+      using __check_constructible_from_opt = __lazy_or<<br>
+          is_constructible<_Tp, _Opt&>,<br>
+          is_constructible<_Tp, _Opt const&>,<br>
+          is_constructible<_Tp, _Opt&&>,<br>
+          is_constructible<_Tp, _Opt const&&>,<br>
+          is_convertible<_Opt&, _Tp>,<br>
+          is_convertible<_Opt const&, _Tp>,<br>
+          is_convertible<_Opt&&, _Tp>,<br>
+          is_convertible<_Opt const&&, _Tp><br>
+      >;<br>
+      template <class _Up, class _Opt = optional<_Up>><br>
+      using __check_assignable_from_opt = __lazy_or<<br>
+          is_assignable<_Tp&, _Opt&>,<br>
+          is_assignable<_Tp&, _Opt const&>,<br>
+          is_assignable<_Tp&, _Opt&&>,<br>
+          is_assignable<_Tp&, _Opt const&&><br>
+      >;<br>
+      template <class _Up, class _QUp = _QualUp><br>
+      static constexpr bool __enable_implicit() {<br>
+          return is_convertible<_QUp, _Tp>::value &&<br>
+              !__check_constructible_from_op<wbr>t<_Up>::value;<br>
+      }<br>
+      template <class _Up, class _QUp = _QualUp><br>
+      static constexpr bool __enable_explicit() {<br>
+          return !is_convertible<_QUp, _Tp>::value &&<br>
+              !__check_constructible_from_op<wbr>t<_Up>::value;<br>
+      }<br>
+      template <class _Up, class _QUp = _QualUp><br>
+      static constexpr bool __enable_assign() {<br>
+          // Construction and assignability of _Qup to _Tp has already been<br>
+          // checked.<br>
+          return !__check_constructible_from_op<wbr>t<_Up>::value &&<br>
+              !__check_assignable_from_opt<_<wbr>Up>::value;<br>
+      }<br>
+    };<br>
+<br>
+    template <class _Up, class _QualUp><br>
+    using _CheckOptionalLikeCtor = conditional_t<<br>
+      __lazy_and<<br>
+          __lazy_not<is_same<_Up, _Tp>>,<br>
+          is_constructible<_Tp, _QualUp><br>
+      >::value,<br>
+      _CheckOptionalLikeConstructor<<wbr>_QualUp>,<br>
+      __check_tuple_constructor_fail<br>
+    >;<br>
+    template <class _Up, class _QualUp><br>
+    using _CheckOptionalLikeAssign = conditional_t<<br>
+      __lazy_and<<br>
+          __lazy_not<is_same<_Up, _Tp>>,<br>
+          is_constructible<_Tp, _QualUp>,<br>
+          is_assignable<_Tp&, _QualUp><br>
+      >::value,<br>
+      _CheckOptionalLikeConstructor<<wbr>_QualUp>,<br>
+      __check_tuple_constructor_fail<br>
+    >;<br>
+public:<br>
+<br>
+    _LIBCPP_INLINE_VISIBILITY constexpr optional() noexcept {}<br>
+    _LIBCPP_INLINE_VISIBILITY optional(const optional&) = default;<br>
+    _LIBCPP_INLINE_VISIBILITY optional(optional&&) = default;<br>
+    _LIBCPP_INLINE_VISIBILITY constexpr optional(nullopt_t) noexcept {}<br>
+<br>
+    template <class... _Args, class = enable_if_t<<br>
+        is_constructible_v<value_type, _Args...>><br>
+    ><br>
+    _LIBCPP_INLINE_VISIBILITY<br>
+    constexpr explicit optional(in_place_t, _Args&&... __args)<br>
+        : __base(in_place, _VSTD::forward<_Args>(__args).<wbr>..) {}<br>
+<br>
+    template <class _Up, class... _Args, class = enable_if_t<<br>
+        is_constructible_v<value_type, initializer_list<_Up>&, _Args...>><br>
+    ><br>
+    _LIBCPP_INLINE_VISIBILITY<br>
+    constexpr explicit optional(in_place_t, initializer_list<_Up> __il, _Args&&... __args)<br>
+        : __base(in_place, __il, _VSTD::forward<_Args>(__args).<wbr>..) {}<br>
+<br>
+    template <class _Up = value_type, enable_if_t<<br>
+        _CheckOptionalArgsCtor<_Up>::t<wbr>emplate __enable_implicit<_Up>()<br>
+    , int> = 0><br>
+    _LIBCPP_INLINE_VISIBILITY<br>
+    constexpr optional(_Up&& __v)<br>
+        : __base(in_place, _VSTD::forward<_Up>(__v)) {}<br>
+<br>
+    template <class _Up, enable_if_t<<br>
+        _CheckOptionalArgsCtor<_Up>::t<wbr>emplate __enable_explicit<_Up>()<br>
+    , int> = 0><br>
+    _LIBCPP_INLINE_VISIBILITY<br>
+    constexpr explicit optional(_Up&& __v)<br>
+        : __base(in_place, _VSTD::forward<_Up>(__v)) {}<br>
+<br>
+    // LWG2756: conditionally explicit conversion from const optional<_Up>&<br>
+    template <class _Up, enable_if_t<<br>
+        _CheckOptionalLikeCtor<_Up, _Up const&>::template __enable_implicit<_Up>()<br>
+    , int> = 0><br>
+    _LIBCPP_INLINE_VISIBILITY<br>
+    optional(const optional<_Up>& __v)<br>
+    {<br>
+        this->__construct_from(__v);<br>
+    }<br>
+    template <class _Up, enable_if_t<<br>
+        _CheckOptionalLikeCtor<_Up, _Up const&>::template __enable_explicit<_Up>()<br>
+    , int> = 0><br>
+    _LIBCPP_INLINE_VISIBILITY<br>
+    explicit optional(const optional<_Up>& __v)<br>
+    {<br>
+        this->__construct_from(__v);<br>
+    }<br>
+<br>
+    // LWG2756: conditionally explicit conversion from optional<_Up>&&<br>
+    template <class _Up, enable_if_t<<br>
+        _CheckOptionalLikeCtor<_Up, _Up &&>::template __enable_implicit<_Up>()<br>
+    , int> = 0><br>
+    _LIBCPP_INLINE_VISIBILITY<br>
+    optional(optional<_Up>&& __v)<br>
+    {<br>
+        this->__construct_from(_VSTD::<wbr>move(__v));<br>
+    }<br>
+    template <class _Up, enable_if_t<<br>
+        _CheckOptionalLikeCtor<_Up, _Up &&>::template __enable_explicit<_Up>()<br>
+    , int> = 0><br>
+    _LIBCPP_INLINE_VISIBILITY<br>
+    explicit optional(optional<_Up>&& __v)<br>
+    {<br>
+        this->__construct_from(_VSTD::<wbr>move(__v));<br>
+    }<br>
+<br>
+    _LIBCPP_INLINE_VISIBILITY<br>
+    optional& operator=(nullopt_t) noexcept<br>
+    {<br>
+        reset();<br>
+        return *this;<br>
+    }<br>
+<br>
+    _LIBCPP_INLINE_VISIBILITY optional& operator=(const optional&) = default;<br>
+    _LIBCPP_INLINE_VISIBILITY optional& operator=(optional&&) = default;<br>
+<br>
+    // LWG2756<br>
+    template <class _Up = value_type,<br>
+              class = enable_if_t<br>
+                      <<br>
+                          !is_same_v<_Up, optional> &&<br>
+                          !(is_same_v<_Up, value_type> && is_scalar_v<value_type>) &&<br>
+                          is_constructible_v<value_type, _Up> &&<br>
+                          is_assignable_v<value_type&, _Up><br>
+                      ><br>
+             ><br>
+    _LIBCPP_INLINE_VISIBILITY<br>
+    optional&<br>
+    operator=(_Up&& __v)<br>
+    {<br>
+        if (this->has_value())<br>
+            this->__get() = _VSTD::forward<_Up>(__v);<br>
+        else<br>
+            this->__construct(_VSTD::forwa<wbr>rd<_Up>(__v));<br>
+        return *this;<br>
+    }<br>
+<br>
+    // LWG2756<br>
+    template <class _Up, enable_if_t<<br>
+        _CheckOptionalLikeAssign<_Up, _Up const&>::template __enable_assign<_Up>()<br>
+    , int> = 0><br>
+    _LIBCPP_INLINE_VISIBILITY<br>
+    optional&<br>
+    operator=(const optional<_Up>& __v)<br>
+    {<br>
+        this->__assign_from(__v);<br>
+        return *this;<br>
+    }<br>
+<br>
+    // LWG2756<br>
+    template <class _Up, enable_if_t<<br>
+        _CheckOptionalLikeCtor<_Up, _Up &&>::template __enable_assign<_Up>()<br>
+    , int> = 0><br>
+    _LIBCPP_INLINE_VISIBILITY<br>
+    optional&<br>
+    operator=(optional<_Up>&& __v)<br>
+    {<br>
+        this->__assign_from(_VSTD::mov<wbr>e(__v));<br>
+        return *this;<br>
+    }<br>
+<br>
+    template <class... _Args,<br>
+              class = enable_if_t<br>
+                      <<br>
+                          is_constructible_v<value_type, _Args...><br>
+                      ><br>
+             ><br>
+    _LIBCPP_INLINE_VISIBILITY<br>
+    void<br>
+    emplace(_Args&&... __args)<br>
+    {<br>
+        reset();<br>
+        this->__construct(_VSTD::forwa<wbr>rd<_Args>(__args)...);<br>
+    }<br>
+<br>
+    template <class _Up, class... _Args,<br>
+              class = enable_if_t<br>
+                      <<br>
+                          is_constructible_v<value_type, initializer_list<_Up>&, _Args...><br>
+                      ><br>
+             ><br>
+    _LIBCPP_INLINE_VISIBILITY<br>
+    void<br>
+    emplace(initializer_list<_Up> __il, _Args&&... __args)<br>
+    {<br>
+        reset();<br>
+        this->__construct(__il, _VSTD::forward<_Args>(__args).<wbr>..);<br>
+    }<br>
+<br>
+    _LIBCPP_INLINE_VISIBILITY<br>
+    void swap(optional& __opt)<br>
+        noexcept(is_nothrow_move_const<wbr>ructible_v<value_type> &&<br>
+                 is_nothrow_swappable_v<value_<wbr>type>)<br>
+    {<br>
+        if (this->has_value() == __opt.has_value())<br>
+        {<br>
+            using _VSTD::swap;<br>
+            if (this->has_value())<br>
+                swap(this->__get(), __opt.__get());<br>
+        }<br>
+        else<br>
+        {<br>
+            if (this->has_value())<br>
+            {<br>
+                __opt.__construct(_VSTD::move(<wbr>this->__get()));<br>
+                reset();<br>
+            }<br>
+            else<br>
+            {<br>
+                this->__construct(_VSTD::move(<wbr>__opt.__get()));<br>
+                __opt.reset();<br>
+            }<br>
+        }<br>
+    }<br>
+<br>
+    _LIBCPP_INLINE_VISIBILITY<br>
+    constexpr<br>
+    add_pointer_t<value_type const><br>
+    operator->() const<br>
+    {<br>
+        _LIBCPP_ASSERT(this->has_value<wbr>(), "optional operator-> called for disengaged value");<br>
+#ifndef _LIBCPP_HAS_NO_BUILTIN_ADDRESS<wbr>OF<br>
+        return _VSTD::addressof(this->__get()<wbr>);<br>
+#else<br>
+        return __operator_arrow(__has_operato<wbr>r_addressof<value_type>{}, this->__get());<br>
+#endif<br>
+    }<br>
+<br>
+    _LIBCPP_INLINE_VISIBILITY<br>
+    constexpr<br>
+    add_pointer_t<value_type><br>
+    operator->()<br>
+    {<br>
+        _LIBCPP_ASSERT(this->has_value<wbr>(), "optional operator-> called for disengaged value");<br>
+#ifndef _LIBCPP_HAS_NO_BUILTIN_ADDRESS<wbr>OF<br>
+        return _VSTD::addressof(this->__get()<wbr>);<br>
+#else<br>
+        return __operator_arrow(__has_operato<wbr>r_addressof<value_type>{}, this->__get());<br>
+#endif<br>
+    }<br>
+<br>
+    _LIBCPP_INLINE_VISIBILITY<br>
+    constexpr<br>
+    const value_type&<br>
+    operator*() const&<br>
+    {<br>
+        _LIBCPP_ASSERT(this->has_value<wbr>(), "optional operator* called for disengaged value");<br>
+        return this->__get();<br>
+    }<br>
+<br>
+    _LIBCPP_INLINE_VISIBILITY<br>
+    constexpr<br>
+    value_type&<br>
+    operator*() &<br>
+    {<br>
+        _LIBCPP_ASSERT(this->has_value<wbr>(), "optional operator* called for disengaged value");<br>
+        return this->__get();<br>
+    }<br>
+<br>
+    _LIBCPP_INLINE_VISIBILITY<br>
+    constexpr<br>
+    value_type&&<br>
+    operator*() &&<br>
+    {<br>
+        _LIBCPP_ASSERT(this->has_value<wbr>(), "optional operator* called for disengaged value");<br>
+        return _VSTD::move(this->__get());<br>
+    }<br>
+<br>
+    _LIBCPP_INLINE_VISIBILITY<br>
+    constexpr<br>
+    const value_type&&<br>
+    operator*() const&&<br>
+    {<br>
+        _LIBCPP_ASSERT(this->has_value<wbr>(), "optional operator* called for disengaged value");<br>
+        return _VSTD::move(this->__get());<br>
+    }<br>
+<br>
+    _LIBCPP_INLINE_VISIBILITY<br>
+    constexpr explicit operator bool() const noexcept { return has_value(); }<br>
+<br>
+    using __base::has_value;<br>
+    using __base::__get;<br>
+<br>
+    _LIBCPP_INLINE_VISIBILITY<br>
+    constexpr value_type const& value() const&<br>
+    {<br>
+        if (!this->has_value())<br>
+            __throw_bad_optional_access();<br>
+        return this->__get();<br>
+    }<br>
+<br>
+    _LIBCPP_INLINE_VISIBILITY<br>
+    constexpr value_type& value() &<br>
+    {<br>
+        if (!this->has_value())<br>
+            __throw_bad_optional_access();<br>
+        return this->__get();<br>
+    }<br>
+<br>
+    _LIBCPP_INLINE_VISIBILITY<br>
+    constexpr value_type&& value() &&<br>
+    {<br>
+        if (!this->has_value())<br>
+            __throw_bad_optional_access();<br>
+        return _VSTD::move(this->__get());<br>
+    }<br>
+<br>
+    _LIBCPP_INLINE_VISIBILITY<br>
+    constexpr value_type const&& value() const&&<br>
+    {<br>
+        if (!this->has_value())<br>
+            __throw_bad_optional_access();<br>
+        return _VSTD::move(this->__get());<br>
+    }<br>
+<br>
+    template <class _Up><br>
+    _LIBCPP_INLINE_VISIBILITY<br>
+    constexpr value_type value_or(_Up&& __v) const&<br>
+    {<br>
+        static_assert(is_copy_construc<wbr>tible_v<value_type>,<br>
+                      "optional<T>::value_or: T must be copy constructible");<br>
+        static_assert(is_convertible_v<wbr><_Up, value_type>,<br>
+                      "optional<T>::value_or: U must be convertible to T");<br>
+        return this->has_value() ? this->__get() :<br>
+                                  static_cast<value_type>(_VSTD:<wbr>:forward<_Up>(__v));<br>
+    }<br>
+<br>
+    template <class _Up><br>
+    _LIBCPP_INLINE_VISIBILITY<br>
+    value_type value_or(_Up&& __v) &&<br>
+    {<br>
+        static_assert(is_move_construc<wbr>tible_v<value_type>,<br>
+                      "optional<T>::value_or: T must be move constructible");<br>
+        static_assert(is_convertible_v<wbr><_Up, value_type>,<br>
+                      "optional<T>::value_or: U must be convertible to T");<br>
+        return this->has_value() ? _VSTD::move(this->__get()) :<br>
+                                  static_cast<value_type>(_VSTD:<wbr>:forward<_Up>(__v));<br>
+    }<br>
+<br>
+    using __base::reset;<br>
+<br>
+private:<br>
+    template <class _Up><br>
+    _LIBCPP_INLINE_VISIBILITY<br>
+    static _Up*<br>
+    __operator_arrow(true_type, _Up& __x)<br>
+    {<br>
+        return _VSTD::addressof(__x);<br>
+    }<br>
+<br>
+    template <class _Up><br>
+    _LIBCPP_INLINE_VISIBILITY<br>
+    static constexpr _Up*<br>
+    __operator_arrow(false_type, _Up& __x)<br>
+    {<br>
+        return &__x;<br>
+    }<br>
+};<br>
+<br>
+// Comparisons between optionals<br>
+template <class _Tp><br>
+_LIBCPP_INLINE_VISIBILITY constexpr<br>
+enable_if_t<<br>
+    is_convertible_v<decltype(_VST<wbr>D::declval<const _Tp&>() ==<br>
+        _VSTD::declval<const _Tp&>()), bool>,<br>
+    bool<br>
+><br>
+operator==(const optional<_Tp>& __x, const optional<_Tp>& __y)<br>
+{<br>
+    if (static_cast<bool>(__x) != static_cast<bool>(__y))<br>
+        return false;<br>
+    if (!static_cast<bool>(__x))<br>
+        return true;<br>
+    return *__x == *__y;<br>
+}<br>
+<br>
+template <class _Tp><br>
+_LIBCPP_INLINE_VISIBILITY constexpr<br>
+enable_if_t<<br>
+    is_convertible_v<decltype(_VST<wbr>D::declval<const _Tp&>() !=<br>
+        _VSTD::declval<const _Tp&>()), bool>,<br>
+    bool<br>
+><br>
+operator!=(const optional<_Tp>& __x, const optional<_Tp>& __y)<br>
+{<br>
+    if (static_cast<bool>(__x) != static_cast<bool>(__y))<br>
+        return true;<br>
+    if (!static_cast<bool>(__x))<br>
+        return false;<br>
+    return *__x != *__y;<br>
+}<br>
+<br>
+template <class _Tp><br>
+_LIBCPP_INLINE_VISIBILITY constexpr<br>
+enable_if_t<<br>
+    is_convertible_v<decltype(_VST<wbr>D::declval<const _Tp&>() <<br>
+        _VSTD::declval<const _Tp&>()), bool>,<br>
+    bool<br>
+><br>
+operator<(const optional<_Tp>& __x, const optional<_Tp>& __y)<br>
+{<br>
+    if (!static_cast<bool>(__y))<br>
+        return false;<br>
+    if (!static_cast<bool>(__x))<br>
+        return true;<br>
+    return *__x < *__y;<br>
+}<br>
+<br>
+template <class _Tp><br>
+_LIBCPP_INLINE_VISIBILITY constexpr<br>
+enable_if_t<<br>
+    is_convertible_v<decltype(_VST<wbr>D::declval<const _Tp&>() ><br>
+        _VSTD::declval<const _Tp&>()), bool>,<br>
+    bool<br>
+><br>
+operator>(const optional<_Tp>& __x, const optional<_Tp>& __y)<br>
+{<br>
+    if (!static_cast<bool>(__x))<br>
+        return false;<br>
+    if (!static_cast<bool>(__y))<br>
+        return true;<br>
+    return *__x > *__y;<br>
+}<br>
+<br>
+template <class _Tp><br>
+_LIBCPP_INLINE_VISIBILITY constexpr<br>
+enable_if_t<<br>
+    is_convertible_v<decltype(_VST<wbr>D::declval<const _Tp&>() <=<br>
+        _VSTD::declval<const _Tp&>()), bool>,<br>
+    bool<br>
+><br>
+operator<=(const optional<_Tp>& __x, const optional<_Tp>& __y)<br>
+{<br>
+    if (!static_cast<bool>(__x))<br>
+        return true;<br>
+    if (!static_cast<bool>(__y))<br>
+        return false;<br>
+    return *__x <= *__y;<br>
+}<br>
+<br>
+template <class _Tp><br>
+_LIBCPP_INLINE_VISIBILITY constexpr<br>
+enable_if_t<<br>
+    is_convertible_v<decltype(_VST<wbr>D::declval<const _Tp&>() >=<br>
+        _VSTD::declval<const _Tp&>()), bool>,<br>
+    bool<br>
+><br>
+operator>=(const optional<_Tp>& __x, const optional<_Tp>& __y)<br>
+{<br>
+    if (!static_cast<bool>(__y))<br>
+        return true;<br>
+    if (!static_cast<bool>(__x))<br>
+        return false;<br>
+    return *__x >= *__y;<br>
+}<br>
+<br>
+// Comparisons with nullopt<br>
+template <class _Tp><br>
+_LIBCPP_INLINE_VISIBILITY constexpr<br>
+bool<br>
+operator==(const optional<_Tp>& __x, nullopt_t) noexcept<br>
+{<br>
+    return !static_cast<bool>(__x);<br>
+}<br>
+<br>
+template <class _Tp><br>
+_LIBCPP_INLINE_VISIBILITY constexpr<br>
+bool<br>
+operator==(nullopt_t, const optional<_Tp>& __x) noexcept<br>
+{<br>
+    return !static_cast<bool>(__x);<br>
+}<br>
+<br>
+template <class _Tp><br>
+_LIBCPP_INLINE_VISIBILITY constexpr<br>
+bool<br>
+operator!=(const optional<_Tp>& __x, nullopt_t) noexcept<br>
+{<br>
+    return static_cast<bool>(__x);<br>
+}<br>
+<br>
+template <class _Tp><br>
+_LIBCPP_INLINE_VISIBILITY constexpr<br>
+bool<br>
+operator!=(nullopt_t, const optional<_Tp>& __x) noexcept<br>
+{<br>
+    return static_cast<bool>(__x);<br>
+}<br>
+<br>
+template <class _Tp><br>
+_LIBCPP_INLINE_VISIBILITY constexpr<br>
+bool<br>
+operator<(const optional<_Tp>&, nullopt_t) noexcept<br>
+{<br>
+    return false;<br>
+}<br>
+<br>
+template <class _Tp><br>
+_LIBCPP_INLINE_VISIBILITY constexpr<br>
+bool<br>
+operator<(nullopt_t, const optional<_Tp>& __x) noexcept<br>
+{<br>
+    return static_cast<bool>(__x);<br>
+}<br>
+<br>
+template <class _Tp><br>
+_LIBCPP_INLINE_VISIBILITY constexpr<br>
+bool<br>
+operator<=(const optional<_Tp>& __x, nullopt_t) noexcept<br>
+{<br>
+    return !static_cast<bool>(__x);<br>
+}<br>
+<br>
+template <class _Tp><br>
+_LIBCPP_INLINE_VISIBILITY constexpr<br>
+bool<br>
+operator<=(nullopt_t, const optional<_Tp>& __x) noexcept<br>
+{<br>
+    return true;<br>
+}<br>
+<br>
+template <class _Tp><br>
+_LIBCPP_INLINE_VISIBILITY constexpr<br>
+bool<br>
+operator>(const optional<_Tp>& __x, nullopt_t) noexcept<br>
+{<br>
+    return static_cast<bool>(__x);<br>
+}<br>
+<br>
+template <class _Tp><br>
+_LIBCPP_INLINE_VISIBILITY constexpr<br>
+bool<br>
+operator>(nullopt_t, const optional<_Tp>& __x) noexcept<br>
+{<br>
+    return false;<br>
+}<br>
+<br>
+template <class _Tp><br>
+_LIBCPP_INLINE_VISIBILITY constexpr<br>
+bool<br>
+operator>=(const optional<_Tp>&, nullopt_t) noexcept<br>
+{<br>
+    return true;<br>
+}<br>
+<br>
+template <class _Tp><br>
+_LIBCPP_INLINE_VISIBILITY constexpr<br>
+bool<br>
+operator>=(nullopt_t, const optional<_Tp>& __x) noexcept<br>
+{<br>
+    return !static_cast<bool>(__x);<br>
+}<br>
+<br>
+// Comparisons with T<br>
+template <class _Tp><br>
+_LIBCPP_INLINE_VISIBILITY constexpr<br>
+enable_if_t<<br>
+    is_convertible_v<decltype(_VST<wbr>D::declval<const _Tp&>() ==<br>
+        _VSTD::declval<const _Tp&>()), bool>,<br>
+    bool<br>
+><br>
+operator==(const optional<_Tp>& __x, const _Tp& __v)<br>
+{<br>
+    return static_cast<bool>(__x) ? *__x == __v : false;<br>
+}<br>
+<br>
+template <class _Tp><br>
+_LIBCPP_INLINE_VISIBILITY constexpr<br>
+enable_if_t<<br>
+    is_convertible_v<decltype(_VST<wbr>D::declval<const _Tp&>() ==<br>
+        _VSTD::declval<const _Tp&>()), bool>,<br>
+    bool<br>
+><br>
+operator==(const _Tp& __v, const optional<_Tp>& __x)<br>
+{<br>
+    return static_cast<bool>(__x) ? __v == *__x : false;<br>
+}<br>
+<br>
+template <class _Tp><br>
+_LIBCPP_INLINE_VISIBILITY constexpr<br>
+enable_if_t<<br>
+    is_convertible_v<decltype(_VST<wbr>D::declval<const _Tp&>() !=<br>
+        _VSTD::declval<const _Tp&>()), bool>,<br>
+    bool<br>
+><br>
+operator!=(const optional<_Tp>& __x, const _Tp& __v)<br>
+{<br>
+    return static_cast<bool>(__x) ? *__x != __v : true;<br>
+}<br>
+<br>
+template <class _Tp><br>
+_LIBCPP_INLINE_VISIBILITY constexpr<br>
+enable_if_t<<br>
+    is_convertible_v<decltype(_VST<wbr>D::declval<const _Tp&>() !=<br>
+        _VSTD::declval<const _Tp&>()), bool>,<br>
+    bool<br>
+><br>
+operator!=(const _Tp& __v, const optional<_Tp>& __x)<br>
+{<br>
+    return static_cast<bool>(__x) ? __v != *__x : true;<br>
+}<br>
+<br>
+template <class _Tp><br>
+_LIBCPP_INLINE_VISIBILITY constexpr<br>
+enable_if_t<<br>
+    is_convertible_v<decltype(_VST<wbr>D::declval<const _Tp&>() <<br>
+        _VSTD::declval<const _Tp&>()), bool>,<br>
+    bool<br>
+><br>
+operator<(const optional<_Tp>& __x, const _Tp& __v)<br>
+{<br>
+    return static_cast<bool>(__x) ? *__x < __v : true;<br>
+}<br>
+<br>
+template <class _Tp><br>
+_LIBCPP_INLINE_VISIBILITY constexpr<br>
+enable_if_t<<br>
+    is_convertible_v<decltype(_VST<wbr>D::declval<const _Tp&>() <<br>
+        _VSTD::declval<const _Tp&>()), bool>,<br>
+    bool<br>
+><br>
+operator<(const _Tp& __v, const optional<_Tp>& __x)<br>
+{<br>
+    return static_cast<bool>(__x) ? __v < *__x : false;<br>
+}<br>
+<br>
+template <class _Tp><br>
+_LIBCPP_INLINE_VISIBILITY constexpr<br>
+enable_if_t<<br>
+    is_convertible_v<decltype(_VST<wbr>D::declval<const _Tp&>() <=<br>
+        _VSTD::declval<const _Tp&>()), bool>,<br>
+    bool<br>
+><br>
+operator<=(const optional<_Tp>& __x, const _Tp& __v)<br>
+{<br>
+    return static_cast<bool>(__x) ? *__x <= __v : true;<br>
+}<br>
+<br>
+template <class _Tp><br>
+_LIBCPP_INLINE_VISIBILITY constexpr<br>
+enable_if_t<<br>
+    is_convertible_v<decltype(_VST<wbr>D::declval<const _Tp&>() <=<br>
+        _VSTD::declval<const _Tp&>()), bool>,<br>
+    bool<br>
+><br>
+operator<=(const _Tp& __v, const optional<_Tp>& __x)<br>
+{<br>
+    return static_cast<bool>(__x) ? __v <= *__x : false;<br>
+}<br>
+<br>
+template <class _Tp><br>
+_LIBCPP_INLINE_VISIBILITY constexpr<br>
+enable_if_t<<br>
+    is_convertible_v<decltype(_VST<wbr>D::declval<const _Tp&>() ><br>
+        _VSTD::declval<const _Tp&>()), bool>,<br>
+    bool<br>
+><br>
+operator>(const optional<_Tp>& __x, const _Tp& __v)<br>
+{<br>
+    return static_cast<bool>(__x) ? *__x > __v : false;<br>
+}<br>
+<br>
+template <class _Tp><br>
+_LIBCPP_INLINE_VISIBILITY constexpr<br>
+enable_if_t<<br>
+    is_convertible_v<decltype(_VST<wbr>D::declval<const _Tp&>() ><br>
+        _VSTD::declval<const _Tp&>()), bool>,<br>
+    bool<br>
+><br>
+operator>(const _Tp& __v, const optional<_Tp>& __x)<br>
+{<br>
+    return static_cast<bool>(__x) ? __v > *__x : true;<br>
+}<br>
+<br>
+template <class _Tp><br>
+_LIBCPP_INLINE_VISIBILITY constexpr<br>
+enable_if_t<<br>
+    is_convertible_v<decltype(_VST<wbr>D::declval<const _Tp&>() >=<br>
+        _VSTD::declval<const _Tp&>()), bool>,<br>
+    bool<br>
+><br>
+operator>=(const optional<_Tp>& __x, const _Tp& __v)<br>
+{<br>
+    return static_cast<bool>(__x) ? *__x >= __v : false;<br>
+}<br>
+<br>
+template <class _Tp><br>
+_LIBCPP_INLINE_VISIBILITY constexpr<br>
+enable_if_t<<br>
+    is_convertible_v<decltype(_VST<wbr>D::declval<const _Tp&>() >=<br>
+        _VSTD::declval<const _Tp&>()), bool>,<br>
+    bool<br>
+><br>
+operator>=(const _Tp& __v, const optional<_Tp>& __x)<br>
+{<br>
+    return static_cast<bool>(__x) ? __v >= *__x : true;<br>
+}<br>
+<br>
+<br>
+template <class _Tp><br>
+inline _LIBCPP_INLINE_VISIBILITY<br>
+enable_if_t<<br>
+    is_move_constructible_v<_Tp> && is_swappable_v<_Tp>,<br>
+    void<br>
+><br>
+swap(optional<_Tp>& __x, optional<_Tp>& __y) noexcept(noexcept(__x.swap(__y<wbr>)))<br>
+{<br>
+    __x.swap(__y);<br>
+}<br>
+<br>
+template <class _Tp><br>
+_LIBCPP_INLINE_VISIBILITY constexpr<br>
+optional<decay_t<_Tp>> make_optional(_Tp&& __v)<br>
+{<br>
+    return optional<decay_t<_Tp>>(_VSTD::<wbr>forward<_Tp>(__v));<br>
+}<br>
+<br>
+template <class _Tp, class... _Args><br>
+_LIBCPP_INLINE_VISIBILITY constexpr<br>
+optional<_Tp> make_optional(_Args&&... __args)<br>
+{<br>
+    return optional<_Tp>(in_place, _VSTD::forward<_Args>(__args).<wbr>..);<br>
+}<br>
+<br>
+template <class _Tp, class _Up, class... _Args><br>
+_LIBCPP_INLINE_VISIBILITY constexpr<br>
+optional<_Tp> make_optional(initializer_list<wbr><_Up> __il,  _Args&&... __args)<br>
+{<br>
+    return optional<_Tp>(in_place, __il, _VSTD::forward<_Args>(__args).<wbr>..);<br>
+}<br>
+<br>
+template <class _Tp><br>
+struct _LIBCPP_TYPE_VIS_ONLY hash<optional<_Tp> ><br>
+{<br>
+    typedef optional<_Tp> argument_type;<br>
+    typedef size_t        result_type;<br>
+<br>
+    _LIBCPP_INLINE_VISIBILITY<br>
+    result_type operator()(const argument_type& __opt) const _NOEXCEPT<br>
+    {<br>
+        return static_cast<bool>(__opt) ? hash<_Tp>()(*__opt) : 0;<br>
+    }<br>
+};<br>
+<br>
+_LIBCPP_END_NAMESPACE_STD<br>
+<br>
+#endif  // _LIBCPP_STD_VER > 14<br>
+<br>
+#endif  // _LIBCPP_OPTIONAL<br>
<br>
Modified: libcxx/trunk/include/type_trai<wbr>ts<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/libcxx/trunk/include/type_traits?rev=283980&r1=283979&r2=283980&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-pr<wbr>oject/libcxx/trunk/include/typ<wbr>e_traits?rev=283980&r1=283979&<wbr>r2=283980&view=diff</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- libcxx/trunk/include/type_trai<wbr>ts (original)<br>
+++ libcxx/trunk/include/type_trai<wbr>ts Wed Oct 12 02:46:20 2016<br>
@@ -425,7 +425,7 @@ template <bool _Bp, class _Tp = void> us<br>
 #endif<br>
<br>
 // addressof<br>
-#if __has_builtin(__builtin_addres<wbr>sof) || _GNUC_VER >= 700<br>
+#ifndef _LIBCPP_HAS_NO_BUILTIN_ADDRESS<wbr>OF<br>
<br>
 template <class _Tp><br>
 inline _LIBCPP_CONSTEXPR_AFTER_CXX14<br>
@@ -446,7 +446,7 @@ addressof(_Tp& __x) _NOEXCEPT<br>
     return (_Tp*)&reinterpret_cast<const volatile char&>(__x);<br>
 }<br>
<br>
-#endif // __has_builtin(__builtin_addres<wbr>sof)<br>
+#endif // _LIBCPP_HAS_NO_BUILTIN_ADDRESS<wbr>OF<br>
<br>
 #if defined(_LIBCPP_HAS_OBJC_ARC) && !defined(_LIBCPP_PREDEFINED_OB<wbr>JC_ARC_ADDRESSOF)<br>
 // Objective-C++ Automatic Reference Counting uses qualified pointers<br>
<br>
Modified: libcxx/trunk/src/optional.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/libcxx/trunk/src/optional.cpp?rev=283980&r1=283979&r2=283980&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-pr<wbr>oject/libcxx/trunk/src/optiona<wbr>l.cpp?rev=283980&r1=283979&r2=<wbr>283980&view=diff</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- libcxx/trunk/src/optional.cpp (original)<br>
+++ libcxx/trunk/src/optional.cpp Wed Oct 12 02:46:20 2016<br>
@@ -7,18 +7,18 @@<br>
 //<br>
 //===------------------------<wbr>------------------------------<wbr>----------------===//<br>
<br>
+#include "optional"<br>
 #include "experimental/optional"<br>
<br>
-_LIBCPP_BEGIN_NAMESPACE_EXPER<wbr>IMENTAL<br>
+namespace std<br>
+{<br>
<br>
-#ifdef _LIBCPP_HAS_NO_DEFAULTED_FUNCT<wbr>IONS<br>
+bad_optional_access::~bad_opt<wbr>ional_access() _NOEXCEPT = default;<br>
<br>
-bad_optional_access::~bad_opt<wbr>ional_access() _NOEXCEPT {}<br>
+} // std<br>
<br>
-#else<br>
+_LIBCPP_BEGIN_NAMESPACE_EXPER<wbr>IMENTAL<br>
<br>
 bad_optional_access::~bad_opt<wbr>ional_access() _NOEXCEPT = default;<br>
<br>
-#endif<br>
-<br>
 _LIBCPP_END_NAMESPACE_EXPERIM<wbr>ENTAL<br>
<br>
Added: libcxx/trunk/test/libcxx/utili<wbr>ties/optional/optional.object/<wbr>optional.object.assign/copy.<wbr>pass.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/libcxx/utilities/optional/optional.object/optional.object.assign/copy.pass.cpp?rev=283980&view=auto" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-pr<wbr>oject/libcxx/trunk/test/libcxx<wbr>/utilities/optional/optional.<wbr>object/optional.object.assign/<wbr>copy.pass.cpp?rev=283980&view=<wbr>auto</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- libcxx/trunk/test/libcxx/utili<wbr>ties/optional/optional.object/<wbr>optional.object.assign/copy.<wbr>pass.cpp (added)<br>
+++ libcxx/trunk/test/libcxx/utili<wbr>ties/optional/optional.object/<wbr>optional.object.assign/copy.<wbr>pass.cpp Wed Oct 12 02:46:20 2016<br>
@@ -0,0 +1,81 @@<br>
+//===------------------------<wbr>------------------------------<wbr>----------------===//<br>
+//<br>
+//                     The LLVM Compiler Infrastructure<br>
+//<br>
+// This file is dual licensed under the MIT and the University of Illinois Open<br>
+// Source Licenses. See LICENSE.TXT for details.<br>
+//<br>
+//===------------------------<wbr>------------------------------<wbr>----------------===//<br>
+<br>
+// UNSUPPORTED: c++98, c++03, c++11, c++14<br>
+// XFAIL: libcpp-no-exceptions<br>
+// <optional><br>
+<br>
+// optional<T>& operator=(const optional<T>& rhs);<br>
+<br>
+#include <optional><br>
+#include <string><br>
+#include <type_traits><br>
+<br>
+using std::optional;<br>
+<br>
+struct X {};<br>
+<br>
+struct Y<br>
+{<br>
+    Y() = default;<br>
+    Y& operator=(const Y&) { return *this; }<br>
+};<br>
+<br>
+struct Z1<br>
+{<br>
+    Z1() = default;<br>
+    Z1(Z1&&) = default;<br>
+    Z1(const Z1&) = default;<br>
+    Z1& operator=(Z1&&) = default;<br>
+    Z1& operator=(const Z1&) = delete;<br>
+};<br>
+<br>
+struct Z2<br>
+{<br>
+    Z2() = default;<br>
+    Z2(Z2&&) = default;<br>
+    Z2(const Z2&) = delete;<br>
+    Z2& operator=(Z2&&) = default;<br>
+    Z2& operator=(const Z2&) = default;<br>
+};<br>
+<br>
+#if __cplusplus >= 201402<br>
+template <class T><br>
+constexpr bool<br>
+test()<br>
+{<br>
+    optional<T> opt;<br>
+    optional<T> opt2;<br>
+    opt = opt2;<br>
+    return true;<br>
+}<br>
+#endif<br>
+<br>
+int main()<br>
+{<br>
+    {<br>
+        using T = int;<br>
+        static_assert((std::is_trivial<wbr>ly_copy_assignable<optional<T><wbr>>::value), "");<br>
+#if __cplusplus >= 201402<br>
+        static_assert(test<T>(), "");<br>
+#endif<br>
+    }<br>
+    {<br>
+        using T = X;<br>
+        static_assert((std::is_trivial<wbr>ly_copy_assignable<optional<T><wbr>>::value), "");<br>
+#if __cplusplus >= 201402<br>
+        static_assert(test<T>(), "");<br>
+#endif<br>
+    }<br>
+    static_assert(!(std::is_trivia<wbr>lly_copy_assignable<optional<<wbr>Y>>::value), "");<br>
+    static_assert(!(std::is_trivia<wbr>lly_copy_assignable<optional<<wbr>std::string>>::value), "");<br>
+<br>
+    static_assert(!(std::is_copy_a<wbr>ssignable<optional<Z1>>::value<wbr>), "");<br>
+    static_assert(!(std::is_copy_a<wbr>ssignable<optional<Z2>>::value<wbr>), "");<br>
+}<br>
<br>
Added: libcxx/trunk/test/libcxx/utili<wbr>ties/optional/optional.object/<wbr>optional.object.assign/move.<wbr>pass.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/libcxx/utilities/optional/optional.object/optional.object.assign/move.pass.cpp?rev=283980&view=auto" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-pr<wbr>oject/libcxx/trunk/test/libcxx<wbr>/utilities/optional/optional.<wbr>object/optional.object.assign/<wbr>move.pass.cpp?rev=283980&view=<wbr>auto</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- libcxx/trunk/test/libcxx/utili<wbr>ties/optional/optional.object/<wbr>optional.object.assign/move.<wbr>pass.cpp (added)<br>
+++ libcxx/trunk/test/libcxx/utili<wbr>ties/optional/optional.object/<wbr>optional.object.assign/move.<wbr>pass.cpp Wed Oct 12 02:46:20 2016<br>
@@ -0,0 +1,78 @@<br>
+//===------------------------<wbr>------------------------------<wbr>----------------===//<br>
+//<br>
+//                     The LLVM Compiler Infrastructure<br>
+//<br>
+// This file is dual licensed under the MIT and the University of Illinois Open<br>
+// Source Licenses. See LICENSE.TXT for details.<br>
+//<br>
+//===------------------------<wbr>------------------------------<wbr>----------------===//<br>
+<br>
+// UNSUPPORTED: c++98, c++03, c++11, c++14<br>
+// XFAIL: libcpp-no-exceptions<br>
+// <optional><br>
+<br>
+// optional<T>& operator=(optional<T>&& rhs);<br>
+<br>
+#include <optional><br>
+#include <string><br>
+#include <type_traits><br>
+#include <utility><br>
+<br>
+using std::optional;<br>
+<br>
+struct X {};<br>
+<br>
+struct Y<br>
+{<br>
+    Y() = default;<br>
+    Y& operator=(Y&&) { return *this; }<br>
+};<br>
+<br>
+struct Z1<br>
+{<br>
+    Z1() = default;<br>
+    Z1(Z1&&) = default;<br>
+    Z1& operator=(Z1&&) = delete;<br>
+};<br>
+<br>
+struct Z2<br>
+{<br>
+    Z2() = default;<br>
+    Z2(Z2&&) = delete;<br>
+    Z2& operator=(Z2&&) = default;<br>
+};<br>
+<br>
+#if __cplusplus >= 201402<br>
+template <class T><br>
+constexpr bool<br>
+test()<br>
+{<br>
+    optional<T> opt;<br>
+    optional<T> opt2;<br>
+    opt = std::move(opt2);<br>
+    return true;<br>
+}<br>
+#endif<br>
+<br>
+int main()<br>
+{<br>
+    {<br>
+        using T = int;<br>
+        static_assert((std::is_trivial<wbr>ly_copy_constructible<optional<wbr><T>>::value), "");<br>
+#if __cplusplus >= 201402<br>
+        static_assert(test<T>(), "");<br>
+#endif<br>
+    }<br>
+    {<br>
+        using T = X;<br>
+        static_assert((std::is_trivial<wbr>ly_copy_constructible<optional<wbr><T>>::value), "");<br>
+#if __cplusplus >= 201402<br>
+        static_assert(test<T>(), "");<br>
+#endif<br>
+    }<br>
+    static_assert(!(std::is_trivia<wbr>lly_move_assignable<optional<<wbr>Y>>::value), "");<br>
+    static_assert(!(std::is_trivia<wbr>lly_move_assignable<optional<<wbr>std::string>>::value), "");<br>
+<br>
+    static_assert(!(std::is_move_a<wbr>ssignable<optional<Z1>>::value<wbr>), "");<br>
+    static_assert(!(std::is_move_a<wbr>ssignable<optional<Z2>>::value<wbr>), "");<br>
+}<br>
<br>
Added: libcxx/trunk/test/libcxx/utili<wbr>ties/optional/optional.object/<wbr>optional.object.ctor/copy.<wbr>pass.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/libcxx/utilities/optional/optional.object/optional.object.ctor/copy.pass.cpp?rev=283980&view=auto" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-pr<wbr>oject/libcxx/trunk/test/libcxx<wbr>/utilities/optional/optional.<wbr>object/optional.object.ctor/<wbr>copy.pass.cpp?rev=283980&view=<wbr>auto</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- libcxx/trunk/test/libcxx/utili<wbr>ties/optional/optional.object/<wbr>optional.object.ctor/copy.<wbr>pass.cpp (added)<br>
+++ libcxx/trunk/test/libcxx/utili<wbr>ties/optional/optional.object/<wbr>optional.object.ctor/copy.<wbr>pass.cpp Wed Oct 12 02:46:20 2016<br>
@@ -0,0 +1,59 @@<br>
+//===------------------------<wbr>------------------------------<wbr>----------------===//<br>
+//<br>
+//                     The LLVM Compiler Infrastructure<br>
+//<br>
+// This file is dual licensed under the MIT and the University of Illinois Open<br>
+// Source Licenses. See LICENSE.TXT for details.<br>
+//<br>
+//===------------------------<wbr>------------------------------<wbr>----------------===//<br>
+<br>
+// UNSUPPORTED: c++98, c++03, c++11, c++14<br>
+// XFAIL: libcpp-no-exceptions<br>
+// <optional><br>
+<br>
+// optional(const optional<T>& rhs);<br>
+<br>
+#include <optional><br>
+#include <string><br>
+#include <type_traits><br>
+<br>
+using std::optional;<br>
+<br>
+struct X {};<br>
+<br>
+struct Y<br>
+{<br>
+    Y() = default;<br>
+    Y(const Y&) {}<br>
+};<br>
+<br>
+struct Z<br>
+{<br>
+    Z() = default;<br>
+    Z(Z&&) = delete;<br>
+    Z(const Z&) = delete;<br>
+    Z& operator=(Z&&) = delete;<br>
+    Z& operator=(const Z&) = delete;<br>
+};<br>
+<br>
+int main()<br>
+{<br>
+    {<br>
+        using T = int;<br>
+        static_assert((std::is_trivial<wbr>ly_copy_constructible<optional<wbr><T>>::value), "");<br>
+        constexpr optional<T> opt;<br>
+        constexpr optional<T> opt2 = opt;<br>
+        (void)opt2;<br>
+    }<br>
+    {<br>
+        using T = X;<br>
+        static_assert((std::is_trivial<wbr>ly_copy_constructible<optional<wbr><T>>::value), "");<br>
+        constexpr optional<T> opt;<br>
+        constexpr optional<T> opt2 = opt;<br>
+        (void)opt2;<br>
+    }<br>
+    static_assert(!(std::is_trivia<wbr>lly_copy_constructible<optiona<wbr>l<Y>>::value), "");<br>
+    static_assert(!(std::is_trivia<wbr>lly_copy_constructible<optiona<wbr>l<std::string>>::value), "");<br>
+<br>
+    static_assert(!(std::is_copy_c<wbr>onstructible<optional<Z>>::val<wbr>ue), "");<br>
+}<br>
<br>
Added: libcxx/trunk/test/libcxx/utili<wbr>ties/optional/optional.object/<wbr>optional.object.ctor/move.<wbr>pass.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/libcxx/utilities/optional/optional.object/optional.object.ctor/move.pass.cpp?rev=283980&view=auto" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-pr<wbr>oject/libcxx/trunk/test/libcxx<wbr>/utilities/optional/optional.<wbr>object/optional.object.ctor/<wbr>move.pass.cpp?rev=283980&view=<wbr>auto</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- libcxx/trunk/test/libcxx/utili<wbr>ties/optional/optional.object/<wbr>optional.object.ctor/move.<wbr>pass.cpp (added)<br>
+++ libcxx/trunk/test/libcxx/utili<wbr>ties/optional/optional.object/<wbr>optional.object.ctor/move.<wbr>pass.cpp Wed Oct 12 02:46:20 2016<br>
@@ -0,0 +1,60 @@<br>
+//===------------------------<wbr>------------------------------<wbr>----------------===//<br>
+//<br>
+//                     The LLVM Compiler Infrastructure<br>
+//<br>
+// This file is dual licensed under the MIT and the University of Illinois Open<br>
+// Source Licenses. See LICENSE.TXT for details.<br>
+//<br>
+//===------------------------<wbr>------------------------------<wbr>----------------===//<br>
+<br>
+// UNSUPPORTED: c++98, c++03, c++11, c++14<br>
+// XFAIL: libcpp-no-exceptions<br>
+// <optional><br>
+<br>
+// optional(optional<T>&& rhs);<br>
+<br>
+#include <optional><br>
+#include <string><br>
+#include <type_traits><br>
+#include <utility><br>
+<br>
+using std::optional;<br>
+<br>
+struct X {};<br>
+<br>
+struct Y<br>
+{<br>
+    Y() = default;<br>
+    Y(Y&&) {}<br>
+};<br>
+<br>
+struct Z<br>
+{<br>
+    Z() = default;<br>
+    Z(Z&&) = delete;<br>
+    Z(const Z&) = delete;<br>
+    Z& operator=(Z&&) = delete;<br>
+    Z& operator=(const Z&) = delete;<br>
+};<br>
+<br>
+int main()<br>
+{<br>
+    {<br>
+        using T = int;<br>
+        static_assert((std::is_trivial<wbr>ly_copy_constructible<optional<wbr><T>>::value), "");<br>
+        constexpr optional<T> opt;<br>
+        constexpr optional<T> opt2 = std::move(opt);<br>
+        (void)opt2;<br>
+    }<br>
+    {<br>
+        using T = X;<br>
+        static_assert((std::is_trivial<wbr>ly_copy_constructible<optional<wbr><T>>::value), "");<br>
+        constexpr optional<T> opt;<br>
+        constexpr optional<T> opt2 = std::move(opt);<br>
+        (void)opt2;<br>
+    }<br>
+    static_assert(!(std::is_trivia<wbr>lly_move_constructible<optiona<wbr>l<Y>>::value), "");<br>
+    static_assert(!(std::is_trivia<wbr>lly_move_constructible<optiona<wbr>l<std::string>>::value), "");<br>
+<br>
+    static_assert(!(std::is_move_c<wbr>onstructible<optional<Z>>::val<wbr>ue), "");<br>
+}<br>
<br>
Added: libcxx/trunk/test/libcxx/utili<wbr>ties/optional/optional.object/<wbr>special_member_gen.pass.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/libcxx/utilities/optional/optional.object/special_member_gen.pass.cpp?rev=283980&view=auto" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-pr<wbr>oject/libcxx/trunk/test/libcxx<wbr>/utilities/optional/optional.<wbr>object/special_member_gen.<wbr>pass.cpp?rev=283980&view=auto</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- libcxx/trunk/test/libcxx/utili<wbr>ties/optional/optional.object/<wbr>special_member_gen.pass.cpp (added)<br>
+++ libcxx/trunk/test/libcxx/utili<wbr>ties/optional/optional.object/<wbr>special_member_gen.pass.cpp Wed Oct 12 02:46:20 2016<br>
@@ -0,0 +1,66 @@<br>
+//===------------------------<wbr>------------------------------<wbr>----------------===//<br>
+//<br>
+//                     The LLVM Compiler Infrastructure<br>
+//<br>
+// This file is dual licensed under the MIT and the University of Illinois Open<br>
+// Source Licenses. See LICENSE.TXT for details.<br>
+//<br>
+//===------------------------<wbr>------------------------------<wbr>----------------===//<br>
+<br>
+// UNSUPPORTED: c++98, c++03, c++11, c++14<br>
+// <optional><br>
+<br>
+<br>
+#include <optional><br>
+#include <type_traits><br>
+#include <cassert><br>
+<br>
+#include "archetypes.hpp"<br>
+<br>
+template <class T><br>
+struct SpecialMemberTest {<br>
+    using O = std::optional<T>;<br>
+<br>
+    template <template <class> class TestMF><br>
+    static constexpr bool check_same() {<br>
+        return TestMF<O>::value == TestMF<T>::value;<br>
+    }<br>
+<br>
+    // Test that optional inherits the correct trivial/non-trivial members<br>
+    static_assert(check_same<std::<wbr>is_trivially_destructible>(), "");<br>
+    static_assert(check_same<std::<wbr>is_trivially_copyable>(), "");<br>
+};<br>
+<br>
+template <class ...Args> static void sink(Args&&...) {}<br>
+<br>
+template <class ...TestTypes><br>
+struct DoTestsMetafunction {<br>
+    DoTestsMetafunction() { sink(SpecialMemberTest<TestTyp<wbr>es>{}...); }<br>
+};<br>
+<br>
+struct TrivialMoveNonTrivialCopy {<br>
+    TrivialMoveNonTrivialCopy() = default;<br>
+    TrivialMoveNonTrivialCopy(cons<wbr>t TrivialMoveNonTrivialCopy&) {}<br>
+    TrivialMoveNonTrivialCopy(Triv<wbr>ialMoveNonTrivialCopy&&) = default;<br>
+    TrivialMoveNonTrivialCopy& operator=(const TrivialMoveNonTrivialCopy&) { return *this; }<br>
+    TrivialMoveNonTrivialCopy& operator=(TrivialMoveNonTrivia<wbr>lCopy&&) = default;<br>
+};<br>
+<br>
+struct TrivialCopyNonTrivialMove {<br>
+    TrivialCopyNonTrivialMove() = default;<br>
+    TrivialCopyNonTrivialMove(cons<wbr>t TrivialCopyNonTrivialMove&) = default;<br>
+    TrivialCopyNonTrivialMove(Triv<wbr>ialCopyNonTrivialMove&&) {}<br>
+    TrivialCopyNonTrivialMove& operator=(const TrivialCopyNonTrivialMove&) = default;<br>
+    TrivialCopyNonTrivialMove& operator=(TrivialCopyNonTrivia<wbr>lMove&&) { return *this; }<br>
+};<br>
+<br>
+int main()<br>
+{<br>
+    sink(<br>
+        ImplicitTypes::ApplyTypes<DoTe<wbr>stsMetafunction>{},<br>
+        ExplicitTypes::ApplyTypes<DoTe<wbr>stsMetafunction>{},<br>
+        NonLiteralTypes::ApplyTypes<Do<wbr>TestsMetafunction>{},<br>
+        NonTrivialTypes::ApplyTypes<Do<wbr>TestsMetafunction>{},<br>
+        DoTestsMetafunction<TrivialMov<wbr>eNonTrivialCopy, TrivialCopyNonTrivialMove>{}<br>
+    );<br>
+}<br>
<br>
Added: libcxx/trunk/test/libcxx/utili<wbr>ties/optional/version.pass.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/libcxx/utilities/optional/version.pass.cpp?rev=283980&view=auto" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-pr<wbr>oject/libcxx/trunk/test/libcxx<wbr>/utilities/optional/version.<wbr>pass.cpp?rev=283980&view=auto</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- libcxx/trunk/test/libcxx/utili<wbr>ties/optional/version.pass.cpp (added)<br>
+++ libcxx/trunk/test/libcxx/utili<wbr>ties/optional/version.pass.cpp Wed Oct 12 02:46:20 2016<br>
@@ -0,0 +1,20 @@<br>
+//===------------------------<wbr>------------------------------<wbr>----------------===//<br>
+//<br>
+//                     The LLVM Compiler Infrastructure<br>
+//<br>
+// This file is dual licensed under the MIT and the University of Illinois Open<br>
+// Source Licenses. See LICENSE.TXT for details.<br>
+//<br>
+//===------------------------<wbr>------------------------------<wbr>----------------===//<br>
+<br>
+// <optional><br>
+<br>
+#include <optional><br>
+<br>
+#ifndef _LIBCPP_VERSION<br>
+#error _LIBCPP_VERSION not defined<br>
+#endif<br>
+<br>
+int main()<br>
+{<br>
+}<br>
<br>
Modified: libcxx/trunk/test/std/utilitie<wbr>s/meta/meta.unary/meta.unary.<wbr>prop/is_nothrow_swappable_<wbr>with.pass.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/std/utilities/meta/meta.unary/meta.unary.prop/is_nothrow_swappable_with.pass.cpp?rev=283980&r1=283979&r2=283980&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-pr<wbr>oject/libcxx/trunk/test/std/ut<wbr>ilities/meta/meta.unary/meta.<wbr>unary.prop/is_nothrow_swappabl<wbr>e_with.pass.cpp?rev=283980&r1=<wbr>283979&r2=283980&view=diff</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- libcxx/trunk/test/std/utilitie<wbr>s/meta/meta.unary/meta.unary.<wbr>prop/is_nothrow_swappable_<wbr>with.pass.cpp (original)<br>
+++ libcxx/trunk/test/std/utilitie<wbr>s/meta/meta.unary/meta.unary.<wbr>prop/is_nothrow_swappable_<wbr>with.pass.cpp Wed Oct 12 02:46:20 2016<br>
@@ -59,7 +59,7 @@ int main()<br>
                       !std::is_nothrow_swappable_wi<wbr>th<A&, A&>::value, "");<br>
     }<br>
     {<br>
-        // test that hetrogenius swap is allowed only if both 'swap(A, B)' and<br>
+        // test that heterogeneous swap is allowed only if both 'swap(A, B)' and<br>
         // 'swap(B, A)' are valid.<br>
         static_assert(std::is_<wbr>nothrow_swappable_with<A&, B&>::value, "");<br>
         static_assert(!std::is_nothro<wbr>w_swappable_with<A&, C&>::value &&<br>
<br>
Added: libcxx/trunk/test/std/utilitie<wbr>s/optional/optional.bad_<wbr>optional_access/default.pass.<wbr>cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/std/utilities/optional/optional.bad_optional_access/default.pass.cpp?rev=283980&view=auto" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-pr<wbr>oject/libcxx/trunk/test/std/ut<wbr>ilities/optional/optional.bad_<wbr>optional_access/default.pass.<wbr>cpp?rev=283980&view=auto</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- libcxx/trunk/test/std/utilitie<wbr>s/optional/optional.bad_<wbr>optional_access/default.pass.<wbr>cpp (added)<br>
+++ libcxx/trunk/test/std/utilitie<wbr>s/optional/optional.bad_<wbr>optional_access/default.pass.<wbr>cpp Wed Oct 12 02:46:20 2016<br>
@@ -0,0 +1,23 @@<br>
+//===------------------------<wbr>------------------------------<wbr>----------------===//<br>
+//<br>
+//                     The LLVM Compiler Infrastructure<br>
+//<br>
+// This file is dual licensed under the MIT and the University of Illinois Open<br>
+// Source Licenses. See LICENSE.TXT for details.<br>
+//<br>
+//===------------------------<wbr>------------------------------<wbr>----------------===//<br>
+<br>
+// UNSUPPORTED: c++98, c++03, c++11, c++14<br>
+<br>
+// <optional><br>
+<br>
+// class bad_optional_access is default constructible<br>
+<br>
+#include <optional><br>
+#include <type_traits><br>
+<br>
+int main()<br>
+{<br>
+    using std::bad_optional_access;<br>
+    bad_optional_access ex;<br>
+}<br>
<br>
Added: libcxx/trunk/test/std/utilitie<wbr>s/optional/optional.bad_<wbr>optional_access/derive.pass.<wbr>cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/std/utilities/optional/optional.bad_optional_access/derive.pass.cpp?rev=283980&view=auto" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-pr<wbr>oject/libcxx/trunk/test/std/ut<wbr>ilities/optional/optional.bad_<wbr>optional_access/derive.pass.<wbr>cpp?rev=283980&view=auto</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- libcxx/trunk/test/std/utilitie<wbr>s/optional/optional.bad_<wbr>optional_access/derive.pass.<wbr>cpp (added)<br>
+++ libcxx/trunk/test/std/utilitie<wbr>s/optional/optional.bad_<wbr>optional_access/derive.pass.<wbr>cpp Wed Oct 12 02:46:20 2016<br>
@@ -0,0 +1,25 @@<br>
+//===------------------------<wbr>------------------------------<wbr>----------------===//<br>
+//<br>
+//                     The LLVM Compiler Infrastructure<br>
+//<br>
+// This file is dual licensed under the MIT and the University of Illinois Open<br>
+// Source Licenses. See LICENSE.TXT for details.<br>
+//<br>
+//===------------------------<wbr>------------------------------<wbr>----------------===//<br>
+<br>
+// UNSUPPORTED: c++98, c++03, c++11, c++14<br>
+<br>
+// <optional><br>
+<br>
+// class bad_optional_access : public logic_error<br>
+<br>
+#include <optional><br>
+#include <type_traits><br>
+<br>
+int main()<br>
+{<br>
+    using std::bad_optional_access;<br>
+<br>
+    static_assert(std::is_base_of<<wbr>std::logic_error, bad_optional_access>::value, "");<br>
+    static_assert(std::is_converti<wbr>ble<bad_optional_access*, std::logic_error*>::value, "");<br>
+}<br>
<br>
Added: libcxx/trunk/test/std/utilitie<wbr>s/optional/optional.comp_with_<wbr>t/equal.pass.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/std/utilities/optional/optional.comp_with_t/equal.pass.cpp?rev=283980&view=auto" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-pr<wbr>oject/libcxx/trunk/test/std/ut<wbr>ilities/optional/optional.comp<wbr>_with_t/equal.pass.cpp?rev=<wbr>283980&view=auto</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- libcxx/trunk/test/std/utilitie<wbr>s/optional/optional.comp_with_<wbr>t/equal.pass.cpp (added)<br>
+++ libcxx/trunk/test/std/utilitie<wbr>s/optional/optional.comp_with_<wbr>t/equal.pass.cpp Wed Oct 12 02:46:20 2016<br>
@@ -0,0 +1,53 @@<br>
+//===------------------------<wbr>------------------------------<wbr>----------------===//<br>
+//<br>
+//                     The LLVM Compiler Infrastructure<br>
+//<br>
+// This file is dual licensed under the MIT and the University of Illinois Open<br>
+// Source Licenses. See LICENSE.TXT for details.<br>
+//<br>
+//===------------------------<wbr>------------------------------<wbr>----------------===//<br>
+<br>
+// UNSUPPORTED: c++98, c++03, c++11, c++14<br>
+// <optional><br>
+<br>
+// template <class T> constexpr bool operator==(const optional<T>& x, const T& v);<br>
+// template <class T> constexpr bool operator==(const T& v, const optional<T>& x);<br>
+<br>
+#include <optional><br>
+<br>
+using std::optional;<br>
+<br>
+struct X<br>
+{<br>
+    int i_;<br>
+<br>
+    constexpr X(int i) : i_(i) {}<br>
+};<br>
+<br>
+constexpr bool operator == ( const X &lhs, const X &rhs )<br>
+    { return lhs.i_ == rhs.i_ ; }<br>
+<br>
+int main()<br>
+{<br>
+    {<br>
+    typedef X T;<br>
+    typedef optional<T> O;<br>
+<br>
+    constexpr T val(2);<br>
+    constexpr O o1;       // disengaged<br>
+    constexpr O o2{1};    // engaged<br>
+    constexpr O o3{val};  // engaged<br>
+<br>
+    static_assert ( !(o1 == T(1)), "" );<br>
+    static_assert (  (o2 == T(1)), "" );<br>
+    static_assert ( !(o3 == T(1)), "" );<br>
+    static_assert (  (o3 == T(2)), "" );<br>
+    static_assert (  (o3 == val),  "" );<br>
+<br>
+    static_assert ( !(T(1) == o1), "" );<br>
+    static_assert (  (T(1) == o2), "" );<br>
+    static_assert ( !(T(1) == o3), "" );<br>
+    static_assert (  (T(2) == o3), "" );<br>
+    static_assert (  (val  == o3), "" );<br>
+    }<br>
+}<br>
<br>
Added: libcxx/trunk/test/std/utilitie<wbr>s/optional/optional.comp_with_<wbr>t/greater.pass.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/std/utilities/optional/optional.comp_with_t/greater.pass.cpp?rev=283980&view=auto" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-pr<wbr>oject/libcxx/trunk/test/std/ut<wbr>ilities/optional/optional.comp<wbr>_with_t/greater.pass.cpp?rev=<wbr>283980&view=auto</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- libcxx/trunk/test/std/utilitie<wbr>s/optional/optional.comp_with_<wbr>t/greater.pass.cpp (added)<br>
+++ libcxx/trunk/test/std/utilitie<wbr>s/optional/optional.comp_with_<wbr>t/greater.pass.cpp Wed Oct 12 02:46:20 2016<br>
@@ -0,0 +1,55 @@<br>
+//===------------------------<wbr>------------------------------<wbr>----------------===//<br>
+//<br>
+//                     The LLVM Compiler Infrastructure<br>
+//<br>
+// This file is dual licensed under the MIT and the University of Illinois Open<br>
+// Source Licenses. See LICENSE.TXT for details.<br>
+//<br>
+//===------------------------<wbr>------------------------------<wbr>----------------===//<br>
+<br>
+// UNSUPPORTED: c++98, c++03, c++11, c++14<br>
+// <optional><br>
+<br>
+// template <class T> constexpr bool operator>(const optional<T>& x, const T& v);<br>
+// template <class T> constexpr bool operator>(const T& v, const optional<T>& x);<br>
+<br>
+#include <optional><br>
+<br>
+using std::optional;<br>
+<br>
+struct X<br>
+{<br>
+    int i_;<br>
+<br>
+    constexpr X(int i) : i_(i) {}<br>
+};<br>
+<br>
+constexpr bool operator > ( const X &lhs, const X &rhs )<br>
+    { return lhs.i_ > rhs.i_ ; }<br>
+<br>
+int main()<br>
+{<br>
+    {<br>
+    typedef X T;<br>
+    typedef optional<T> O;<br>
+<br>
+    constexpr T val(2);<br>
+    constexpr O o1;       // disengaged<br>
+    constexpr O o2{1};    // engaged<br>
+    constexpr O o3{val};  // engaged<br>
+<br>
+    static_assert ( !(o1 > T(1)), "" );<br>
+    static_assert ( !(o2 > T(1)), "" );  // equal<br>
+    static_assert (  (o3 > T(1)), "" );<br>
+    static_assert ( !(o2 >  val), "" );<br>
+    static_assert ( !(o3 >  val), "" );  // equal<br>
+    static_assert ( !(o3 > T(3)), "" );<br>
+<br>
+    static_assert (   (T(1) > o1), "" );<br>
+    static_assert (  !(T(1) > o2), "" ); // equal<br>
+    static_assert (  !(T(1) > o3), "" );<br>
+    static_assert (   (val  > o2), "" );<br>
+    static_assert (  !(val  > o3), "" ); // equal<br>
+    static_assert (   (T(3) > o3), "" );<br>
+    }<br>
+}<br>
<br>
Added: libcxx/trunk/test/std/utilitie<wbr>s/optional/optional.comp_with_<wbr>t/greater_equal.pass.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/std/utilities/optional/optional.comp_with_t/greater_equal.pass.cpp?rev=283980&view=auto" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-pr<wbr>oject/libcxx/trunk/test/std/ut<wbr>ilities/optional/optional.comp<wbr>_with_t/greater_equal.pass.<wbr>cpp?rev=283980&view=auto</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- libcxx/trunk/test/std/utilitie<wbr>s/optional/optional.comp_with_<wbr>t/greater_equal.pass.cpp (added)<br>
+++ libcxx/trunk/test/std/utilitie<wbr>s/optional/optional.comp_with_<wbr>t/greater_equal.pass.cpp Wed Oct 12 02:46:20 2016<br>
@@ -0,0 +1,55 @@<br>
+//===------------------------<wbr>------------------------------<wbr>----------------===//<br>
+//<br>
+//                     The LLVM Compiler Infrastructure<br>
+//<br>
+// This file is dual licensed under the MIT and the University of Illinois Open<br>
+// Source Licenses. See LICENSE.TXT for details.<br>
+//<br>
+//===------------------------<wbr>------------------------------<wbr>----------------===//<br>
+<br>
+// UNSUPPORTED: c++98, c++03, c++11, c++14<br>
+// <optional><br>
+<br>
+// template <class T> constexpr bool operator>=(const optional<T>& x, const T& v);<br>
+// template <class T> constexpr bool operator>=(const T& v, const optional<T>& x);<br>
+<br>
+#include <optional><br>
+<br>
+using std::optional;<br>
+<br>
+struct X<br>
+{<br>
+    int i_;<br>
+<br>
+    constexpr X(int i) : i_(i) {}<br>
+};<br>
+<br>
+constexpr bool operator >= ( const X &lhs, const X &rhs )<br>
+    { return lhs.i_ >= rhs.i_ ; }<br>
+<br>
+int main()<br>
+{<br>
+    {<br>
+    typedef X T;<br>
+    typedef optional<T> O;<br>
+<br>
+    constexpr T val(2);<br>
+    constexpr O o1;       // disengaged<br>
+    constexpr O o2{1};    // engaged<br>
+    constexpr O o3{val};  // engaged<br>
+<br>
+    static_assert ( !(o1 >= T(1)), "" );<br>
+    static_assert (  (o2 >= T(1)), "" );  // equal<br>
+    static_assert (  (o3 >= T(1)), "" );<br>
+    static_assert ( !(o2 >=  val), "" );<br>
+    static_assert (  (o3 >=  val), "" );  // equal<br>
+    static_assert ( !(o3 >= T(3)), "" );<br>
+<br>
+    static_assert (   (T(1) >= o1), "" );<br>
+    static_assert (   (T(1) >= o2), "" ); // equal<br>
+    static_assert (  !(T(1) >= o3), "" );<br>
+    static_assert (   (val  >= o2), "" );<br>
+    static_assert (   (val  >= o3), "" ); // equal<br>
+    static_assert (   (T(3) >= o3), "" );<br>
+    }<br>
+}<br>
<br>
Added: libcxx/trunk/test/std/utilitie<wbr>s/optional/optional.comp_with_<wbr>t/less_equal.pass.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/std/utilities/optional/optional.comp_with_t/less_equal.pass.cpp?rev=283980&view=auto" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-pr<wbr>oject/libcxx/trunk/test/std/ut<wbr>ilities/optional/optional.comp<wbr>_with_t/less_equal.pass.cpp?<wbr>rev=283980&view=auto</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- libcxx/trunk/test/std/utilitie<wbr>s/optional/optional.comp_with_<wbr>t/less_equal.pass.cpp (added)<br>
+++ libcxx/trunk/test/std/utilitie<wbr>s/optional/optional.comp_with_<wbr>t/less_equal.pass.cpp Wed Oct 12 02:46:20 2016<br>
@@ -0,0 +1,55 @@<br>
+//===------------------------<wbr>------------------------------<wbr>----------------===//<br>
+//<br>
+//                     The LLVM Compiler Infrastructure<br>
+//<br>
+// This file is dual licensed under the MIT and the University of Illinois Open<br>
+// Source Licenses. See LICENSE.TXT for details.<br>
+//<br>
+//===------------------------<wbr>------------------------------<wbr>----------------===//<br>
+<br>
+// UNSUPPORTED: c++98, c++03, c++11, c++14<br>
+// <optional><br>
+<br>
+// template <class T> constexpr bool operator<=(const optional<T>& x, const T& v);<br>
+// template <class T> constexpr bool operator<=(const T& v, const optional<T>& x);<br>
+<br>
+#include <optional><br>
+<br>
+using std::optional;<br>
+<br>
+struct X<br>
+{<br>
+    int i_;<br>
+<br>
+    constexpr X(int i) : i_(i) {}<br>
+};<br>
+<br>
+constexpr bool operator <= ( const X &lhs, const X &rhs )<br>
+    { return lhs.i_ <= rhs.i_ ; }<br>
+<br>
+int main()<br>
+{<br>
+    {<br>
+    typedef X T;<br>
+    typedef optional<T> O;<br>
+<br>
+    constexpr T val(2);<br>
+    constexpr O o1;       // disengaged<br>
+    constexpr O o2{1};    // engaged<br>
+    constexpr O o3{val};  // engaged<br>
+<br>
+    static_assert (  (o1 <= T(1)), "" );<br>
+    static_assert (  (o2 <= T(1)), "" );  // equal<br>
+    static_assert ( !(o3 <= T(1)), "" );<br>
+    static_assert (  (o2 <=  val), "" );<br>
+    static_assert (  (o3 <=  val), "" );  // equal<br>
+    static_assert (  (o3 <= T(3)), "" );<br>
+<br>
+    static_assert (  !(T(1) <= o1), "" );<br>
+    static_assert (   (T(1) <= o2), "" ); // equal<br>
+    static_assert (   (T(1) <= o3), "" );<br>
+    static_assert (  !(val  <= o2), "" );<br>
+    static_assert (   (val  <= o3), "" ); // equal<br>
+    static_assert (  !(T(3) <= o3), "" );<br>
+    }<br>
+}<br>
<br>
Added: libcxx/trunk/test/std/utilitie<wbr>s/optional/optional.comp_with_<wbr>t/less_than.pass.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/std/utilities/optional/optional.comp_with_t/less_than.pass.cpp?rev=283980&view=auto" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-pr<wbr>oject/libcxx/trunk/test/std/ut<wbr>ilities/optional/optional.comp<wbr>_with_t/less_than.pass.cpp?<wbr>rev=283980&view=auto</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- libcxx/trunk/test/std/utilitie<wbr>s/optional/optional.comp_with_<wbr>t/less_than.pass.cpp (added)<br>
+++ libcxx/trunk/test/std/utilitie<wbr>s/optional/optional.comp_with_<wbr>t/less_than.pass.cpp Wed Oct 12 02:46:20 2016<br>
@@ -0,0 +1,55 @@<br>
+//===------------------------<wbr>------------------------------<wbr>----------------===//<br>
+//<br>
+//                     The LLVM Compiler Infrastructure<br>
+//<br>
+// This file is dual licensed under the MIT and the University of Illinois Open<br>
+// Source Licenses. See LICENSE.TXT for details.<br>
+//<br>
+//===------------------------<wbr>------------------------------<wbr>----------------===//<br>
+<br>
+// UNSUPPORTED: c++98, c++03, c++11, c++14<br>
+// <optional><br>
+<br>
+// template <class T> constexpr bool operator<(const optional<T>& x, const T& v);<br>
+// template <class T> constexpr bool operator<(const T& v, const optional<T>& x);<br>
+<br>
+#include <optional><br>
+<br>
+using std::optional;<br>
+<br>
+struct X<br>
+{<br>
+    int i_;<br>
+<br>
+    constexpr X(int i) : i_(i) {}<br>
+};<br>
+<br>
+constexpr bool operator < ( const X &lhs, const X &rhs )<br>
+    { return lhs.i_ < rhs.i_ ; }<br>
+<br>
+int main()<br>
+{<br>
+    {<br>
+    typedef X T;<br>
+    typedef optional<T> O;<br>
+<br>
+    constexpr T val(2);<br>
+    constexpr O o1;       // disengaged<br>
+    constexpr O o2{1};    // engaged<br>
+    constexpr O o3{val};  // engaged<br>
+<br>
+    static_assert (  (o1 < T(1)), "" );<br>
+    static_assert ( !(o2 < T(1)), "" );  // equal<br>
+    static_assert ( !(o3 < T(1)), "" );<br>
+    static_assert (  (o2 <  val), "" );<br>
+    static_assert ( !(o3 <  val), "" );  // equal<br>
+    static_assert (  (o3 < T(3)), "" );<br>
+<br>
+    static_assert (  !(T(1) < o1), "" );<br>
+    static_assert (  !(T(1) < o2), "" ); // equal<br>
+    static_assert (   (T(1) < o3), "" );<br>
+    static_assert (  !(val  < o2), "" );<br>
+    static_assert (  !(val  < o3), "" ); // equal<br>
+    static_assert (  !(T(3) < o3), "" );<br>
+    }<br>
+}<br>
<br>
Added: libcxx/trunk/test/std/utilitie<wbr>s/optional/optional.comp_with_<wbr>t/not_equal.pass.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/std/utilities/optional/optional.comp_with_t/not_equal.pass.cpp?rev=283980&view=auto" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-pr<wbr>oject/libcxx/trunk/test/std/ut<wbr>ilities/optional/optional.comp<wbr>_with_t/not_equal.pass.cpp?<wbr>rev=283980&view=auto</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- libcxx/trunk/test/std/utilitie<wbr>s/optional/optional.comp_with_<wbr>t/not_equal.pass.cpp (added)<br>
+++ libcxx/trunk/test/std/utilitie<wbr>s/optional/optional.comp_with_<wbr>t/not_equal.pass.cpp Wed Oct 12 02:46:20 2016<br>
@@ -0,0 +1,53 @@<br>
+//===------------------------<wbr>------------------------------<wbr>----------------===//<br>
+//<br>
+//                     The LLVM Compiler Infrastructure<br>
+//<br>
+// This file is dual licensed under the MIT and the University of Illinois Open<br>
+// Source Licenses. See LICENSE.TXT for details.<br>
+//<br>
+//===------------------------<wbr>------------------------------<wbr>----------------===//<br>
+<br>
+// UNSUPPORTED: c++98, c++03, c++11, c++14<br>
+// <optional><br>
+<br>
+// template <class T> constexpr bool operator!=(const optional<T>& x, const T& v);<br>
+// template <class T> constexpr bool operator!=(const T& v, const optional<T>& x);<br>
+<br>
+#include <optional><br>
+<br>
+using std::optional;<br>
+<br>
+struct X<br>
+{<br>
+    int i_;<br>
+<br>
+    constexpr X(int i) : i_(i) {}<br>
+};<br>
+<br>
+constexpr bool operator != ( const X &lhs, const X &rhs )<br>
+    { return lhs.i_ != rhs.i_ ; }<br>
+<br>
+int main()<br>
+{<br>
+    {<br>
+    typedef X T;<br>
+    typedef optional<T> O;<br>
+<br>
+    constexpr T val(2);<br>
+    constexpr O o1;       // disengaged<br>
+    constexpr O o2{1};    // engaged<br>
+    constexpr O o3{val};  // engaged<br>
+<br>
+    static_assert (  (o1 != T(1)), "" );<br>
+    static_assert ( !(o2 != T(1)), "" );<br>
+    static_assert (  (o3 != T(1)), "" );<br>
+    static_assert ( !(o3 != T(2)), "" );<br>
+    static_assert ( !(o3 != val),  "" );<br>
+<br>
+    static_assert (  (T(1) != o1), "" );<br>
+    static_assert ( !(T(1) != o2), "" );<br>
+    static_assert (  (T(1) != o3), "" );<br>
+    static_assert ( !(T(2) != o3), "" );<br>
+    static_assert ( !(val  != o3), "" );<br>
+    }<br>
+}<br>
<br>
Added: libcxx/trunk/test/std/utilitie<wbr>s/optional/optional.hash/hash.<wbr>pass.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/std/utilities/optional/optional.hash/hash.pass.cpp?rev=283980&view=auto" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-pr<wbr>oject/libcxx/trunk/test/std/ut<wbr>ilities/optional/optional.hash<wbr>/hash.pass.cpp?rev=283980&view<wbr>=auto</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- libcxx/trunk/test/std/utilitie<wbr>s/optional/optional.hash/hash.<wbr>pass.cpp (added)<br>
+++ libcxx/trunk/test/std/utilitie<wbr>s/optional/optional.hash/hash.<wbr>pass.cpp Wed Oct 12 02:46:20 2016<br>
@@ -0,0 +1,48 @@<br>
+//===------------------------<wbr>------------------------------<wbr>----------------===//<br>
+//<br>
+//                     The LLVM Compiler Infrastructure<br>
+//<br>
+// This file is dual licensed under the MIT and the University of Illinois Open<br>
+// Source Licenses. See LICENSE.TXT for details.<br>
+//<br>
+//===------------------------<wbr>------------------------------<wbr>----------------===//<br>
+<br>
+// UNSUPPORTED: c++98, c++03, c++11, c++14<br>
+// <optional><br>
+<br>
+// template <class T> struct hash<optional<T>>;<br>
+<br>
+#include <optional><br>
+#include <string><br>
+#include <memory><br>
+#include <cassert><br>
+<br>
+<br>
+int main()<br>
+{<br>
+    using std::optional;<br>
+    const std::size_t nullopt_hash =<br>
+        std::hash<optional<double>>{}(<wbr>optional<double>{});<br>
+<br>
+    {<br>
+        typedef int T;<br>
+        optional<T> opt;<br>
+        assert(std::hash<optional<T>>{<wbr>}(opt) == nullopt_hash);<br>
+        opt = 2;<br>
+        assert(std::hash<optional<T>>{<wbr>}(opt) == std::hash<T>{}(*opt));<br>
+    }<br>
+    {<br>
+        typedef std::string T;<br>
+        optional<T> opt;<br>
+        assert(std::hash<optional<T>>{<wbr>}(opt) == nullopt_hash);<br>
+        opt = std::string("123");<br>
+        assert(std::hash<optional<T>>{<wbr>}(opt) == std::hash<T>{}(*opt));<br>
+    }<br>
+    {<br>
+        typedef std::unique_ptr<int> T;<br>
+        optional<T> opt;<br>
+        assert(std::hash<optional<T>>{<wbr>}(opt) == nullopt_hash);<br>
+        opt = std::unique_ptr<int>(new int(3));<br>
+        assert(std::hash<optional<T>>{<wbr>}(opt) == std::hash<T>{}(*opt));<br>
+    }<br>
+}<br>
<br>
Added: libcxx/trunk/test/std/utilitie<wbr>s/optional/optional.nullops/<wbr>equal.pass.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/std/utilities/optional/optional.nullops/equal.pass.cpp?rev=283980&view=auto" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-pr<wbr>oject/libcxx/trunk/test/std/ut<wbr>ilities/optional/optional.null<wbr>ops/equal.pass.cpp?rev=283980&<wbr>view=auto</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- libcxx/trunk/test/std/utilitie<wbr>s/optional/optional.nullops/<wbr>equal.pass.cpp (added)<br>
+++ libcxx/trunk/test/std/utilitie<wbr>s/optional/optional.nullops/<wbr>equal.pass.cpp Wed Oct 12 02:46:20 2016<br>
@@ -0,0 +1,39 @@<br>
+//===------------------------<wbr>------------------------------<wbr>----------------===//<br>
+//<br>
+//                     The LLVM Compiler Infrastructure<br>
+//<br>
+// This file is dual licensed under the MIT and the University of Illinois Open<br>
+// Source Licenses. See LICENSE.TXT for details.<br>
+//<br>
+//===------------------------<wbr>------------------------------<wbr>----------------===//<br>
+<br>
+// UNSUPPORTED: c++98, c++03, c++11, c++14<br>
+// <optional><br>
+<br>
+// template <class T> constexpr bool operator==(const optional<T>& x, nullopt_t) noexcept;<br>
+// template <class T> constexpr bool operator==(nullopt_t, const optional<T>& x) noexcept;<br>
+<br>
+#include <optional><br>
+<br>
+int main()<br>
+{<br>
+    using std::optional;<br>
+    using std::nullopt_t;<br>
+    using std::nullopt;<br>
+<br>
+    {<br>
+    typedef int T;<br>
+    typedef optional<T> O;<br>
+<br>
+    constexpr O o1;     // disengaged<br>
+    constexpr O o2{1};  // engaged<br>
+<br>
+    static_assert (  (nullopt == o1), "" );<br>
+    static_assert ( !(nullopt == o2), "" );<br>
+    static_assert (  (o1 == nullopt), "" );<br>
+    static_assert ( !(o2 == nullopt), "" );<br>
+<br>
+    static_assert (noexcept(nullopt == o1), "");<br>
+    static_assert (noexcept(o1 == nullopt), "");<br>
+    }<br>
+}<br>
<br>
Added: libcxx/trunk/test/std/utilitie<wbr>s/optional/optional.nullops/<wbr>greater.pass.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/std/utilities/optional/optional.nullops/greater.pass.cpp?rev=283980&view=auto" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-pr<wbr>oject/libcxx/trunk/test/std/ut<wbr>ilities/optional/optional.null<wbr>ops/greater.pass.cpp?rev=28398<wbr>0&view=auto</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- libcxx/trunk/test/std/utilitie<wbr>s/optional/optional.nullops/<wbr>greater.pass.cpp (added)<br>
+++ libcxx/trunk/test/std/utilitie<wbr>s/optional/optional.nullops/<wbr>greater.pass.cpp Wed Oct 12 02:46:20 2016<br>
@@ -0,0 +1,39 @@<br>
+//===------------------------<wbr>------------------------------<wbr>----------------===//<br>
+//<br>
+//                     The LLVM Compiler Infrastructure<br>
+//<br>
+// This file is dual licensed under the MIT and the University of Illinois Open<br>
+// Source Licenses. See LICENSE.TXT for details.<br>
+//<br>
+//===------------------------<wbr>------------------------------<wbr>----------------===//<br>
+<br>
+// UNSUPPORTED: c++98, c++03, c++11, c++14<br>
+// <optional><br>
+<br>
+// template <class T> constexpr bool operator>(const optional<T>& x, nullopt_t) noexcept;<br>
+// template <class T> constexpr bool operator>(nullopt_t, const optional<T>& x) noexcept;<br>
+<br>
+#include <optional><br>
+<br>
+int main()<br>
+{<br>
+    using std::optional;<br>
+    using std::nullopt_t;<br>
+    using std::nullopt;<br>
+<br>
+    {<br>
+    typedef int T;<br>
+    typedef optional<T> O;<br>
+<br>
+    constexpr O o1;     // disengaged<br>
+    constexpr O o2{1};  // engaged<br>
+<br>
+    static_assert ( !(nullopt > o1), "" );<br>
+    static_assert ( !(nullopt > o2), "" );<br>
+    static_assert ( !(o1 > nullopt), "" );<br>
+    static_assert (  (o2 > nullopt), "" );<br>
+<br>
+    static_assert (noexcept(nullopt > o1), "");<br>
+    static_assert (noexcept(o1 > nullopt), "");<br>
+    }<br>
+}<br>
<br>
Added: libcxx/trunk/test/std/utilitie<wbr>s/optional/optional.nullops/<wbr>greater_equal.pass.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/std/utilities/optional/optional.nullops/greater_equal.pass.cpp?rev=283980&view=auto" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-pr<wbr>oject/libcxx/trunk/test/std/ut<wbr>ilities/optional/optional.null<wbr>ops/greater_equal.pass.cpp?<wbr>rev=283980&view=auto</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- libcxx/trunk/test/std/utilitie<wbr>s/optional/optional.nullops/<wbr>greater_equal.pass.cpp (added)<br>
+++ libcxx/trunk/test/std/utilitie<wbr>s/optional/optional.nullops/<wbr>greater_equal.pass.cpp Wed Oct 12 02:46:20 2016<br>
@@ -0,0 +1,39 @@<br>
+//===------------------------<wbr>------------------------------<wbr>----------------===//<br>
+//<br>
+//                     The LLVM Compiler Infrastructure<br>
+//<br>
+// This file is dual licensed under the MIT and the University of Illinois Open<br>
+// Source Licenses. See LICENSE.TXT for details.<br>
+//<br>
+//===------------------------<wbr>------------------------------<wbr>----------------===//<br>
+<br>
+// UNSUPPORTED: c++98, c++03, c++11, c++14<br>
+// <optional><br>
+<br>
+// template <class T> constexpr bool operator>=(const optional<T>& x, nullopt_t) noexcept;<br>
+// template <class T> constexpr bool operator>=(nullopt_t, const optional<T>& x) noexcept;<br>
+<br>
+#include <optional><br>
+<br>
+int main()<br>
+{<br>
+    using std::optional;<br>
+    using std::nullopt_t;<br>
+    using std::nullopt;<br>
+<br>
+    {<br>
+    typedef int T;<br>
+    typedef optional<T> O;<br>
+<br>
+    constexpr O o1;     // disengaged<br>
+    constexpr O o2{1};  // engaged<br>
+<br>
+    static_assert (  (nullopt >= o1), "" );<br>
+    static_assert ( !(nullopt >= o2), "" );<br>
+    static_assert (  (o1 >= nullopt), "" );<br>
+    static_assert (  (o2 >= nullopt), "" );<br>
+<br>
+    static_assert (noexcept(nullopt >= o1), "");<br>
+    static_assert (noexcept(o1 >= nullopt), "");<br>
+    }<br>
+}<br>
<br>
Added: libcxx/trunk/test/std/utilitie<wbr>s/optional/optional.nullops/<wbr>less_equal.pass.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/std/utilities/optional/optional.nullops/less_equal.pass.cpp?rev=283980&view=auto" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-pr<wbr>oject/libcxx/trunk/test/std/ut<wbr>ilities/optional/optional.null<wbr>ops/less_equal.pass.cpp?rev=<wbr>283980&view=auto</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- libcxx/trunk/test/std/utilitie<wbr>s/optional/optional.nullops/<wbr>less_equal.pass.cpp (added)<br>
+++ libcxx/trunk/test/std/utilitie<wbr>s/optional/optional.nullops/<wbr>less_equal.pass.cpp Wed Oct 12 02:46:20 2016<br>
@@ -0,0 +1,40 @@<br>
+//===------------------------<wbr>------------------------------<wbr>----------------===//<br>
+//<br>
+//                     The LLVM Compiler Infrastructure<br>
+//<br>
+// This file is dual licensed under the MIT and the University of Illinois Open<br>
+// Source Licenses. See LICENSE.TXT for details.<br>
+//<br>
+//===------------------------<wbr>------------------------------<wbr>----------------===//<br>
+<br>
+// UNSUPPORTED: c++98, c++03, c++11, c++14<br>
+<br>
+// <optional><br>
+<br>
+// template <class T> constexpr bool operator<=(const optional<T>& x, nullopt_t) noexcept;<br>
+// template <class T> constexpr bool operator<=(nullopt_t, const optional<T>& x) noexcept;<br>
+<br>
+#include <optional><br>
+<br>
+int main()<br>
+{<br>
+    using std::optional;<br>
+    using std::nullopt_t;<br>
+    using std::nullopt;<br>
+<br>
+    {<br>
+    typedef int T;<br>
+    typedef optional<T> O;<br>
+<br>
+    constexpr O o1;     // disengaged<br>
+    constexpr O o2{1};  // engaged<br>
+<br>
+    static_assert (  (nullopt <= o1), "" );<br>
+    static_assert (  (nullopt <= o2), "" );<br>
+    static_assert (  (o1 <= nullopt), "" );<br>
+    static_assert ( !(o2 <= nullopt), "" );<br>
+<br>
+    static_assert (noexcept(nullopt <= o1), "");<br>
+    static_assert (noexcept(o1 <= nullopt), "");<br>
+    }<br>
+}<br>
<br>
Added: libcxx/trunk/test/std/utilitie<wbr>s/optional/optional.nullops/<wbr>less_than.pass.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/std/utilities/optional/optional.nullops/less_than.pass.cpp?rev=283980&view=auto" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-pr<wbr>oject/libcxx/trunk/test/std/ut<wbr>ilities/optional/optional.null<wbr>ops/less_than.pass.cpp?rev=<wbr>283980&view=auto</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- libcxx/trunk/test/std/utilitie<wbr>s/optional/optional.nullops/<wbr>less_than.pass.cpp (added)<br>
+++ libcxx/trunk/test/std/utilitie<wbr>s/optional/optional.nullops/<wbr>less_than.pass.cpp Wed Oct 12 02:46:20 2016<br>
@@ -0,0 +1,39 @@<br>
+//===------------------------<wbr>------------------------------<wbr>----------------===//<br>
+//<br>
+//                     The LLVM Compiler Infrastructure<br>
+//<br>
+// This file is dual licensed under the MIT and the University of Illinois Open<br>
+// Source Licenses. See LICENSE.TXT for details.<br>
+//<br>
+//===------------------------<wbr>------------------------------<wbr>----------------===//<br>
+<br>
+// UNSUPPORTED: c++98, c++03, c++11, c++14<br>
+// <optional><br>
+<br>
+// template <class T> constexpr bool operator<(const optional<T>& x, nullopt_t) noexcept;<br>
+// template <class T> constexpr bool operator<(nullopt_t, const optional<T>& x) noexcept;<br>
+<br>
+#include <optional><br>
+<br>
+int main()<br>
+{<br>
+    using std::optional;<br>
+    using std::nullopt_t;<br>
+    using std::nullopt;<br>
+<br>
+    {<br>
+    typedef int T;<br>
+    typedef optional<T> O;<br>
+<br>
+    constexpr O o1;     // disengaged<br>
+    constexpr O o2{1};  // engaged<br>
+<br>
+    static_assert ( !(nullopt < o1), "" );<br>
+    static_assert (  (nullopt < o2), "" );<br>
+    static_assert ( !(o1 < nullopt), "" );<br>
+    static_assert ( !(o2 < nullopt), "" );<br>
+<br>
+    static_assert (noexcept(nullopt < o1), "");<br>
+    static_assert (noexcept(o1 < nullopt), "");<br>
+    }<br>
+}<br>
<br>
Added: libcxx/trunk/test/std/utilitie<wbr>s/optional/optional.nullops/<wbr>not_equal.pass.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/std/utilities/optional/optional.nullops/not_equal.pass.cpp?rev=283980&view=auto" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-pr<wbr>oject/libcxx/trunk/test/std/ut<wbr>ilities/optional/optional.null<wbr>ops/not_equal.pass.cpp?rev=<wbr>283980&view=auto</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- libcxx/trunk/test/std/utilitie<wbr>s/optional/optional.nullops/<wbr>not_equal.pass.cpp (added)<br>
+++ libcxx/trunk/test/std/utilitie<wbr>s/optional/optional.nullops/<wbr>not_equal.pass.cpp Wed Oct 12 02:46:20 2016<br>
@@ -0,0 +1,39 @@<br>
+//===------------------------<wbr>------------------------------<wbr>----------------===//<br>
+//<br>
+//                     The LLVM Compiler Infrastructure<br>
+//<br>
+// This file is dual licensed under the MIT and the University of Illinois Open<br>
+// Source Licenses. See LICENSE.TXT for details.<br>
+//<br>
+//===------------------------<wbr>------------------------------<wbr>----------------===//<br>
+<br>
+// UNSUPPORTED: c++98, c++03, c++11, c++14<br>
+// <optional><br>
+<br>
+// template <class T> constexpr bool operator!=(const optional<T>& x, nullopt_t) noexcept;<br>
+// template <class T> constexpr bool operator!=(nullopt_t, const optional<T>& x) noexcept;<br>
+<br>
+#include <optional><br>
+<br>
+int main()<br>
+{<br>
+    using std::optional;<br>
+    using std::nullopt_t;<br>
+    using std::nullopt;<br>
+<br>
+    {<br>
+    typedef int T;<br>
+    typedef optional<T> O;<br>
+<br>
+    constexpr O o1;     // disengaged<br>
+    constexpr O o2{1};  // engaged<br>
+<br>
+    static_assert ( !(nullopt != o1), "" );<br>
+    static_assert (  (nullopt != o2), "" );<br>
+    static_assert ( !(o1 != nullopt), "" );<br>
+    static_assert (  (o2 != nullopt), "" );<br>
+<br>
+    static_assert (noexcept(nullopt != o1), "");<br>
+    static_assert (noexcept(o1 != nullopt), "");<br>
+    }<br>
+}<br>
<br>
Added: libcxx/trunk/test/std/utilitie<wbr>s/optional/optional.nullopt/<wbr>not_brace_initializable.fail.<wbr>cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/std/utilities/optional/optional.nullopt/not_brace_initializable.fail.cpp?rev=283980&view=auto" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-pr<wbr>oject/libcxx/trunk/test/std/ut<wbr>ilities/optional/optional.null<wbr>opt/not_brace_initializable.<wbr>fail.cpp?rev=283980&view=auto</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- libcxx/trunk/test/std/utilitie<wbr>s/optional/optional.nullopt/<wbr>not_brace_initializable.fail.<wbr>cpp (added)<br>
+++ libcxx/trunk/test/std/utilitie<wbr>s/optional/optional.nullopt/<wbr>not_brace_initializable.fail.<wbr>cpp Wed Oct 12 02:46:20 2016<br>
@@ -0,0 +1,25 @@<br>
+//===------------------------<wbr>------------------------------<wbr>----------------===//<br>
+//<br>
+//                     The LLVM Compiler Infrastructure<br>
+//<br>
+// This file is dual licensed under the MIT and the University of Illinois Open<br>
+// Source Licenses. See LICENSE.TXT for details.<br>
+//<br>
+//===------------------------<wbr>------------------------------<wbr>----------------===//<br>
+<br>
+// UNSUPPORTED: c++98, c++03, c++11, c++14<br>
+// <optional><br>
+<br>
+// struct nullopt_t{see below};<br>
+<br>
+#include <optional><br>
+<br>
+using std::optional;<br>
+using std::nullopt_t;<br>
+<br>
+int main()<br>
+{<br>
+    // I roughly interpret LWG2736 as "it shall not be possible to copy-list-initialize nullopt_t with an<br>
+    // empty braced-init-list."<br>
+    nullopt_t foo = {};<br>
+}<br>
<br>
Added: libcxx/trunk/test/std/utilitie<wbr>s/optional/optional.nullopt/<wbr>nullopt_t.pass.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/std/utilities/optional/optional.nullopt/nullopt_t.pass.cpp?rev=283980&view=auto" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-pr<wbr>oject/libcxx/trunk/test/std/ut<wbr>ilities/optional/optional.null<wbr>opt/nullopt_t.pass.cpp?rev=<wbr>283980&view=auto</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- libcxx/trunk/test/std/utilitie<wbr>s/optional/optional.nullopt/<wbr>nullopt_t.pass.cpp (added)<br>
+++ libcxx/trunk/test/std/utilitie<wbr>s/optional/optional.nullopt/<wbr>nullopt_t.pass.cpp Wed Oct 12 02:46:20 2016<br>
@@ -0,0 +1,38 @@<br>
+//===------------------------<wbr>------------------------------<wbr>----------------===//<br>
+//<br>
+//                     The LLVM Compiler Infrastructure<br>
+//<br>
+// This file is dual licensed under the MIT and the University of Illinois Open<br>
+// Source Licenses. See LICENSE.TXT for details.<br>
+//<br>
+//===------------------------<wbr>------------------------------<wbr>----------------===//<br>
+<br>
+// UNSUPPORTED: c++98, c++03, c++11, c++14<br>
+// <optional><br>
+<br>
+// struct nullopt_t{see below};<br>
+// constexpr nullopt_t nullopt(unspecified);<br>
+<br>
+#include <optional><br>
+#include <type_traits><br>
+<br>
+using std::optional;<br>
+using std::nullopt_t;<br>
+using std::nullopt;<br>
+<br>
+constexpr<br>
+int<br>
+test(const nullopt_t&)<br>
+{<br>
+    return 3;<br>
+}<br>
+<br>
+int main()<br>
+{<br>
+    static_assert((std::is_class<n<wbr>ullopt_t>::value), "");<br>
+    static_assert((std::is_empty<n<wbr>ullopt_t>::value), "");<br>
+    static_assert((std::is_literal<wbr>_type<nullopt_t>::value), "");<br>
+    static_assert((!std::is_defaul<wbr>t_constructible<nullopt_t>::<wbr>value), "");<br>
+<br>
+    static_assert(test(nullopt) == 3, "");<br>
+}<br>
<br>
Added: libcxx/trunk/test/std/utilitie<wbr>s/optional/optional.object/<wbr>optional.object.assign/assign_<wbr>value.pass.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/std/utilities/optional/optional.object/optional.object.assign/assign_value.pass.cpp?rev=283980&view=auto" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-pr<wbr>oject/libcxx/trunk/test/std/ut<wbr>ilities/optional/optional.obje<wbr>ct/optional.object.assign/assi<wbr>gn_value.pass.cpp?rev=283980&<wbr>view=auto</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- libcxx/trunk/test/std/utilitie<wbr>s/optional/optional.object/<wbr>optional.object.assign/assign_<wbr>value.pass.cpp (added)<br>
+++ libcxx/trunk/test/std/utilitie<wbr>s/optional/optional.object/<wbr>optional.object.assign/assign_<wbr>value.pass.cpp Wed Oct 12 02:46:20 2016<br>
@@ -0,0 +1,261 @@<br>
+//===------------------------<wbr>------------------------------<wbr>----------------===//<br>
+//<br>
+//                     The LLVM Compiler Infrastructure<br>
+//<br>
+// This file is dual licensed under the MIT and the University of Illinois Open<br>
+// Source Licenses. See LICENSE.TXT for details.<br>
+//<br>
+//===------------------------<wbr>------------------------------<wbr>----------------===//<br>
+<br>
+// UNSUPPORTED: c++98, c++03, c++11, c++14<br>
+// <optional><br>
+<br>
+// template <class U> optional<T>& operator=(U&& v);<br>
+<br>
+#include <optional><br>
+#include <type_traits><br>
+#include <cassert><br>
+#include <memory><br>
+<br>
+#include "test_macros.h"<br>
+#include "archetypes.hpp"<br>
+<br>
+using std::optional;<br>
+<br>
+struct ThrowAssign {<br>
+  static int dtor_called;<br>
+  ThrowAssign() = default;<br>
+  ThrowAssign(int) { TEST_THROW(42); }<br>
+  ThrowAssign& operator=(int) {<br>
+      TEST_THROW(42);<br>
+  }<br>
+  ~ThrowAssign() { ++dtor_called; }<br>
+};<br>
+int ThrowAssign::dtor_called = 0;<br>
+<br>
+template <class T, class Arg = T, bool Expect = true><br>
+void assert_assignable() {<br>
+    static_assert(std::is_assignab<wbr>le<optional<T>&, Arg>::value == Expect, "");<br>
+    static_assert(!std::is_assigna<wbr>ble<const optional<T>&, Arg>::value, "");<br>
+}<br>
+<br>
+struct MismatchType {<br>
+  explicit MismatchType(int) {}<br>
+  explicit MismatchType(char*) {}<br>
+  explicit MismatchType(int*) = delete;<br>
+  MismatchType& operator=(int) { return *this; }<br>
+  MismatchType& operator=(int*) { return *this; }<br>
+  MismatchType& operator=(char*) = delete;<br>
+};<br>
+<br>
+void test_sfinae() {<br>
+    using I = TestTypes::TestType;<br>
+    using E = ExplicitTestTypes::TestType;<br>
+    assert_assignable<int>();<br>
+    assert_assignable<int, int&>();<br>
+    assert_assignable<int, int const&>();<br>
+    // Implicit test type<br>
+    assert_assignable<I, I const&>();<br>
+    assert_assignable<I, I&&>();<br>
+    assert_assignable<I, int>();<br>
+    assert_assignable<I, void*, false>();<br>
+    // Explicit test type<br>
+    assert_assignable<E, E const&>();<br>
+    assert_assignable<E, E &&>();<br>
+    assert_assignable<E, int>();<br>
+    assert_assignable<E, void*, false>();<br>
+    // Mismatch type<br>
+    assert_assignable<MismatchType<wbr>, int>();<br>
+    assert_assignable<MismatchType<wbr>, int*, false>();<br>
+    assert_assignable<MismatchType<wbr>, char*, false>();<br>
+}<br>
+<br>
+void test_with_test_type()<br>
+{<br>
+    using T = TestTypes::TestType;<br>
+    T::reset();<br>
+    { // to empty<br>
+        optional<T> opt;<br>
+        opt = 3;<br>
+        assert(T::alive == 1);<br>
+        assert(T::constructed == 1);<br>
+        assert(T::value_constructed == 1);<br>
+        assert(T::assigned == 0);<br>
+        assert(T::destroyed == 0);<br>
+        assert(static_cast<bool>(opt) == true);<br>
+        assert(*opt == T(3));<br>
+    }<br>
+    { // to existing<br>
+        optional<T> opt(42);<br>
+        T::reset_constructors();<br>
+        opt = 3;<br>
+        assert(T::alive == 1);<br>
+        assert(T::constructed == 0);<br>
+        assert(T::assigned == 1);<br>
+        assert(T::value_assigned == 1);<br>
+        assert(T::destroyed == 0);<br>
+        assert(static_cast<bool>(opt) == true);<br>
+        assert(*opt == T(3));<br>
+    }<br>
+    { // test default argument<br>
+        optional<T> opt;<br>
+        T::reset_constructors();<br>
+        opt = {1, 2};<br>
+        assert(T::alive == 1);<br>
+        assert(T::constructed == 2);<br>
+        assert(T::value_constructed == 1);<br>
+        assert(T::move_constructed == 1);<br>
+        assert(T::assigned == 0);<br>
+        assert(T::destroyed == 1);<br>
+        assert(static_cast<bool>(opt) == true);<br>
+        assert(*opt == T(1, 2));<br>
+    }<br>
+    { // test default argument<br>
+        optional<T> opt(42);<br>
+        T::reset_constructors();<br>
+        opt = {1, 2};<br>
+        assert(T::alive == 1);<br>
+        assert(T::constructed == 1);<br>
+        assert(T::value_constructed == 1);<br>
+        assert(T::assigned == 1);<br>
+        assert(T::move_assigned == 1);<br>
+        assert(T::destroyed == 1);<br>
+        assert(static_cast<bool>(opt) == true);<br>
+        assert(*opt == T(1, 2));<br>
+    }<br>
+    { // test default argument<br>
+        optional<T> opt;<br>
+        T::reset_constructors();<br>
+        opt = {1};<br>
+        assert(T::alive == 1);<br>
+        assert(T::constructed == 2);<br>
+        assert(T::value_constructed == 1);<br>
+        assert(T::move_constructed == 1);<br>
+        assert(T::assigned == 0);<br>
+        assert(T::destroyed == 1);<br>
+        assert(static_cast<bool>(opt) == true);<br>
+        assert(*opt == T(1));<br>
+    }<br>
+    { // test default argument<br>
+        optional<T> opt(42);<br>
+        T::reset_constructors();<br>
+        opt = {};<br>
+        assert(static_cast<bool>(opt) == false);<br>
+        assert(T::alive == 0);<br>
+        assert(T::constructed == 0);<br>
+        assert(T::assigned == 0);<br>
+        assert(T::destroyed == 1);<br>
+    }<br>
+}<br>
+<br>
+template <class T, class Value = int><br>
+void test_with_type() {<br>
+    { // to empty<br>
+        optional<T> opt;<br>
+        opt = Value(3);<br>
+        assert(static_cast<bool>(opt) == true);<br>
+        assert(*opt == T(3));<br>
+    }<br>
+    { // to existing<br>
+        optional<T> opt(Value(42));<br>
+        opt = Value(3);<br>
+        assert(static_cast<bool>(opt) == true);<br>
+        assert(*opt == T(3));<br>
+    }<br>
+    { // test const<br>
+        optional<T> opt(Value(42));<br>
+        const T t(Value(3));<br>
+        opt = t;<br>
+        assert(static_cast<bool>(opt) == true);<br>
+        assert(*opt == T(3));<br>
+    }<br>
+    { // test default argument<br>
+        optional<T> opt;<br>
+        opt = {Value(1)};<br>
+        assert(static_cast<bool>(opt) == true);<br>
+        assert(*opt == T(1));<br>
+    }<br>
+    { // test default argument<br>
+        optional<T> opt(Value(42));<br>
+        opt = {};<br>
+        assert(static_cast<bool>(opt) == false);<br>
+    }<br>
+}<br>
+<br>
+template <class T><br>
+void test_with_type_multi() {<br>
+    test_with_type<T>();<br>
+    { // test default argument<br>
+        optional<T> opt;<br>
+        opt = {1, 2};<br>
+        assert(static_cast<bool>(opt) == true);<br>
+        assert(*opt == T(1, 2));<br>
+    }<br>
+    { // test default argument<br>
+        optional<T> opt(42);<br>
+        opt = {1, 2};<br>
+        assert(static_cast<bool>(opt) == true);<br>
+        assert(*opt == T(1, 2));<br>
+    }<br>
+}<br>
+<br>
+void test_throws()<br>
+{<br>
+#ifndef TEST_HAS_NO_EXCEPTIONS<br>
+    using T = ThrowAssign;<br>
+    {<br>
+        using T = ThrowAssign;<br>
+        optional<T> opt;<br>
+        try {<br>
+            opt = 42;<br>
+            assert(false);<br>
+        } catch (int) {}<br>
+        assert(static_cast<bool>(opt) == false);<br>
+    }<br>
+    assert(T::dtor_called == 0);<br>
+    {<br>
+        T::dtor_called = 0;<br>
+        optional<T> opt(std::in_place);<br>
+        try {<br>
+            opt = 42;<br>
+            assert(false);<br>
+        } catch (int) {}<br>
+        assert(static_cast<bool>(opt) == true);<br>
+        assert(T::dtor_called == 0);<br>
+    }<br>
+    assert(T::dtor_called == 1);<br>
+#endif<br>
+}<br>
+<br>
+enum MyEnum { Zero, One, Two, Three, FortyTwo = 42 };<br>
+<br>
+using Fn = void(*)();<br>
+<br>
+int main()<br>
+{<br>
+    test_sfinae();<br>
+    // Test with instrumented type<br>
+    test_with_test_type();<br>
+    // Test with various scalar types<br>
+    test_with_type<int>();<br>
+    test_with_type<MyEnum, MyEnum>();<br>
+    test_with_type<int, MyEnum>();<br>
+    test_with_type<Fn, Fn>();<br>
+    // Test types with multi argument constructors<br>
+    test_with_type_multi<Constexpr<wbr>TestTypes::TestType>();<br>
+    test_with_type_multi<TrivialTe<wbr>stTypes::TestType>();<br>
+    // Test move only types<br>
+    {<br>
+        optional<std::unique_ptr<int>> opt;<br>
+        opt = std::unique_ptr<int>(new int(3));<br>
+        assert(static_cast<bool>(opt) == true);<br>
+        assert(**opt == 3);<br>
+    }<br>
+    {<br>
+        optional<std::unique_ptr<int>> opt(std::unique_ptr<int>(new int(2)));<br>
+        opt = std::unique_ptr<int>(new int(3));<br>
+        assert(static_cast<bool>(opt) == true);<br>
+        assert(**opt == 3);<br>
+    }<br>
+    test_throws();<br>
+}<br>
<br>
Added: libcxx/trunk/test/std/utilitie<wbr>s/optional/optional.object/<wbr>optional.object.assign/const_<wbr>optional_U.pass.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/std/utilities/optional/optional.object/optional.object.assign/const_optional_U.pass.cpp?rev=283980&view=auto" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-pr<wbr>oject/libcxx/trunk/test/std/ut<wbr>ilities/optional/optional.obje<wbr>ct/optional.object.assign/cons<wbr>t_optional_U.pass.cpp?rev=2839<wbr>80&view=auto</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- libcxx/trunk/test/std/utilitie<wbr>s/optional/optional.object/<wbr>optional.object.assign/const_<wbr>optional_U.pass.cpp (added)<br>
+++ libcxx/trunk/test/std/utilitie<wbr>s/optional/optional.object/<wbr>optional.object.assign/const_<wbr>optional_U.pass.cpp Wed Oct 12 02:46:20 2016<br>
@@ -0,0 +1,254 @@<br>
+//===------------------------<wbr>------------------------------<wbr>----------------===//<br>
+//<br>
+//                     The LLVM Compiler Infrastructure<br>
+//<br>
+// This file is dual licensed under the MIT and the University of Illinois Open<br>
+// Source Licenses. See LICENSE.TXT for details.<br>
+//<br>
+//===------------------------<wbr>------------------------------<wbr>----------------===//<br>
+<br>
+// UNSUPPORTED: c++98, c++03, c++11, c++14<br>
+// <optional><br>
+<br>
+// From LWG2451:<br>
+// template<class U><br>
+//   optional<T>& operator=(const optional<U>& rhs);<br>
+<br>
+#include <optional><br>
+#include <type_traits><br>
+#include <cassert><br>
+<br>
+#include "test_macros.h"<br>
+#include "archetypes.hpp"<br>
+<br>
+using std::optional;<br>
+<br>
+struct X<br>
+{<br>
+    static bool throw_now;<br>
+<br>
+    X() = default;<br>
+    X(int)<br>
+    {<br>
+        if (throw_now)<br>
+            TEST_THROW(6);<br>
+    }<br>
+};<br>
+<br>
+bool X::throw_now = false;<br>
+<br>
+struct Y1<br>
+{<br>
+    Y1() = default;<br>
+    Y1(const int&) {}<br>
+    Y1& operator=(const Y1&) = delete;<br>
+};<br>
+<br>
+struct Y2<br>
+{<br>
+    Y2() = default;<br>
+    Y2(const int&) = delete;<br>
+    Y2& operator=(const int&) { return *this; }<br>
+};<br>
+<br>
+template <class T><br>
+struct AssignableFrom {<br>
+  static int type_constructed;<br>
+  static int type_assigned;<br>
+static int int_constructed;<br>
+  static int int_assigned;<br>
+<br>
+  static void reset() {<br>
+      type_constructed = int_constructed = 0;<br>
+      type_assigned = int_assigned = 0;<br>
+  }<br>
+<br>
+  AssignableFrom() = default;<br>
+<br>
+  explicit AssignableFrom(T) { ++type_constructed; }<br>
+  AssignableFrom& operator=(T) { ++type_assigned; return *this; }<br>
+<br>
+  AssignableFrom(int) { ++int_constructed; }<br>
+  AssignableFrom& operator=(int) { ++int_assigned; return *this; }<br>
+private:<br>
+  AssignableFrom(AssignableFrom const&) = delete;<br>
+  AssignableFrom& operator=(AssignableFrom const&) = delete;<br>
+};<br>
+<br>
+template <class T> int AssignableFrom<T>::type_constr<wbr>ucted = 0;<br>
+template <class T> int AssignableFrom<T>::type_assign<wbr>ed = 0;<br>
+template <class T> int AssignableFrom<T>::int_constru<wbr>cted = 0;<br>
+template <class T> int AssignableFrom<T>::int_assigne<wbr>d = 0;<br>
+<br>
+<br>
+void test_with_test_type() {<br>
+    using T = TestTypes::TestType;<br>
+    T::reset();<br>
+    { // non-empty to empty<br>
+        T::reset_constructors();<br>
+        optional<T> opt;<br>
+        const optional<int> other(42);<br>
+        opt = other;<br>
+        assert(T::alive == 1);<br>
+        assert(T::constructed == 1);<br>
+        assert(T::value_constructed == 1);<br>
+        assert(T::assigned == 0);<br>
+        assert(T::destroyed == 0);<br>
+        assert(static_cast<bool>(other<wbr>) == true);<br>
+        assert(*other == 42);<br>
+        assert(static_cast<bool>(opt) == true);<br>
+        assert(*opt == T(42));<br>
+    }<br>
+    assert(T::alive == 0);<br>
+    { // non-empty to non-empty<br>
+        optional<T> opt(101);<br>
+        const optional<int> other(42);<br>
+        T::reset_constructors();<br>
+        opt = other;<br>
+        assert(T::alive == 1);<br>
+        assert(T::constructed == 0);<br>
+        assert(T::assigned == 1);<br>
+        assert(T::value_assigned == 1);<br>
+        assert(T::destroyed == 0);<br>
+        assert(static_cast<bool>(other<wbr>) == true);<br>
+        assert(*other == 42);<br>
+        assert(static_cast<bool>(opt) == true);<br>
+        assert(*opt == T(42));<br>
+    }<br>
+    assert(T::alive == 0);<br>
+    { // empty to non-empty<br>
+        optional<T> opt(101);<br>
+        const optional<int> other;<br>
+        T::reset_constructors();<br>
+        opt = other;<br>
+        assert(T::alive == 0);<br>
+        assert(T::constructed == 0);<br>
+        assert(T::assigned == 0);<br>
+        assert(T::destroyed == 1);<br>
+        assert(static_cast<bool>(other<wbr>) == false);<br>
+        assert(static_cast<bool>(opt) == false);<br>
+    }<br>
+    assert(T::alive == 0);<br>
+    { // empty to empty<br>
+        optional<T> opt;<br>
+        const optional<int> other;<br>
+        T::reset_constructors();<br>
+        opt = other;<br>
+        assert(T::alive == 0);<br>
+        assert(T::constructed == 0);<br>
+        assert(T::assigned == 0);<br>
+        assert(T::destroyed == 0);<br>
+        assert(static_cast<bool>(other<wbr>) == false);<br>
+        assert(static_cast<bool>(opt) == false);<br>
+    }<br>
+    assert(T::alive == 0);<br>
+}<br>
+<br>
+void test_ambigious_assign() {<br>
+    using OptInt = std::optional<int>;<br>
+    {<br>
+        using T = AssignableFrom<OptInt const&>;<br>
+        const OptInt a(42);<br>
+        T::reset();<br>
+        {<br>
+            std::optional<T> t;<br>
+            t = a;<br>
+            assert(T::type_constructed == 1);<br>
+            assert(T::type_assigned == 0);<br>
+            assert(T::int_constructed == 0);<br>
+            assert(T::int_assigned == 0);<br>
+        }<br>
+        T::reset();<br>
+        {<br>
+            std::optional<T> t(42);<br>
+            t = a;<br>
+            assert(T::type_constructed == 0);<br>
+            assert(T::type_assigned == 1);<br>
+            assert(T::int_constructed == 1);<br>
+            assert(T::int_assigned == 0);<br>
+        }<br>
+        T::reset();<br>
+        {<br>
+            std::optional<T> t(42);<br>
+            t = std::move(a);<br>
+            assert(T::type_constructed == 0);<br>
+            assert(T::type_assigned == 1);<br>
+            assert(T::int_constructed == 1);<br>
+            assert(T::int_assigned == 0);<br>
+        }<br>
+    }<br>
+    {<br>
+        using T = AssignableFrom<OptInt&>;<br>
+        OptInt a(42);<br>
+        T::reset();<br>
+        {<br>
+            std::optional<T> t;<br>
+            t = a;<br>
+            assert(T::type_constructed == 1);<br>
+            assert(T::type_assigned == 0);<br>
+            assert(T::int_constructed == 0);<br>
+            assert(T::int_assigned == 0);<br>
+        }<br>
+        {<br>
+            using Opt = std::optional<T>;<br>
+            static_assert(!std::is_assigna<wbr>ble_v<Opt&, OptInt const&>, "");<br>
+        }<br>
+    }<br>
+}<br>
+<br>
+<br>
+int main()<br>
+{<br>
+    test_with_test_type();<br>
+    test_ambigious_assign();<br>
+    {<br>
+        optional<int> opt;<br>
+        constexpr optional<short> opt2;<br>
+        opt = opt2;<br>
+        static_assert(static_cast<bool<wbr>>(opt2) == false, "");<br>
+        assert(static_cast<bool>(opt) == static_cast<bool>(opt2));<br>
+    }<br>
+    {<br>
+        optional<int> opt;<br>
+        constexpr optional<short> opt2(short{2});<br>
+        opt = opt2;<br>
+        static_assert(static_cast<bool<wbr>>(opt2) == true, "");<br>
+        static_assert(*opt2 == 2, "");<br>
+        assert(static_cast<bool>(opt) == static_cast<bool>(opt2));<br>
+        assert(*opt == *opt2);<br>
+    }<br>
+    {<br>
+        optional<int> opt(3);<br>
+        constexpr optional<short> opt2;<br>
+        opt = opt2;<br>
+        static_assert(static_cast<bool<wbr>>(opt2) == false, "");<br>
+        assert(static_cast<bool>(opt) == static_cast<bool>(opt2));<br>
+    }<br>
+    {<br>
+        optional<int> opt(3);<br>
+        constexpr optional<short> opt2(short{2});<br>
+        opt = opt2;<br>
+        static_assert(static_cast<bool<wbr>>(opt2) == true, "");<br>
+        static_assert(*opt2 == 2, "");<br>
+        assert(static_cast<bool>(opt) == static_cast<bool>(opt2));<br>
+        assert(*opt == *opt2);<br>
+    }<br>
+#ifndef TEST_HAS_NO_EXCEPTIONS<br>
+    {<br>
+        optional<X> opt;<br>
+        optional<int> opt2(42);<br>
+        assert(static_cast<bool>(opt2) == true);<br>
+        try<br>
+        {<br>
+            X::throw_now = true;<br>
+            opt = opt2;<br>
+            assert(false);<br>
+        }<br>
+        catch (int i)<br>
+        {<br>
+            assert(i == 6);<br>
+            assert(static_cast<bool>(opt) == false);<br>
+        }<br>
+    }<br>
+#endif<br>
+}<br>
<br>
Added: libcxx/trunk/test/std/utilitie<wbr>s/optional/optional.object/<wbr>optional.object.assign/copy.<wbr>pass.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/std/utilities/optional/optional.object/optional.object.assign/copy.pass.cpp?rev=283980&view=auto" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-pr<wbr>oject/libcxx/trunk/test/std/ut<wbr>ilities/optional/optional.obje<wbr>ct/optional.object.assign/copy<wbr>.pass.cpp?rev=283980&view=auto</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- libcxx/trunk/test/std/utilitie<wbr>s/optional/optional.object/<wbr>optional.object.assign/copy.<wbr>pass.cpp (added)<br>
+++ libcxx/trunk/test/std/utilitie<wbr>s/optional/optional.object/<wbr>optional.object.assign/copy.<wbr>pass.cpp Wed Oct 12 02:46:20 2016<br>
@@ -0,0 +1,102 @@<br>
+//===------------------------<wbr>------------------------------<wbr>----------------===//<br>
+//<br>
+//                     The LLVM Compiler Infrastructure<br>
+//<br>
+// This file is dual licensed under the MIT and the University of Illinois Open<br>
+// Source Licenses. See LICENSE.TXT for details.<br>
+//<br>
+//===------------------------<wbr>------------------------------<wbr>----------------===//<br>
+<br>
+// UNSUPPORTED: c++98, c++03, c++11, c++14<br>
+// <optional><br>
+<br>
+// optional<T>& operator=(const optional<T>& rhs);<br>
+<br>
+#include <optional><br>
+#include <type_traits><br>
+#include <cassert><br>
+<br>
+#include "test_macros.h"<br>
+#include "archetypes.hpp"<br>
+<br>
+using std::optional;<br>
+<br>
+struct X<br>
+{<br>
+    static bool throw_now;<br>
+<br>
+    X() = default;<br>
+    X(const X&)<br>
+    {<br>
+        if (throw_now)<br>
+            TEST_THROW(6);<br>
+    }<br>
+};<br>
+<br>
+bool X::throw_now = false;<br>
+<br>
+template <class Tp><br>
+constexpr bool assign_empty(optional<Tp>&& lhs) {<br>
+    const optional<Tp> rhs;<br>
+    lhs = rhs;<br>
+    return !lhs.has_value() && !rhs.has_value();<br>
+}<br>
+<br>
+template <class Tp><br>
+constexpr bool assign_value(optional<Tp>&& lhs) {<br>
+    const optional<Tp> rhs(101);<br>
+    lhs = rhs;<br>
+    return lhs.has_value() && rhs.has_value() && *lhs == *rhs;<br>
+}<br>
+<br>
+int main()<br>
+{<br>
+    {<br>
+        using O = optional<int>;<br>
+        LIBCPP_STATIC_ASSERT(assign_em<wbr>pty(O{42}), "");<br>
+        LIBCPP_STATIC_ASSERT(assign_va<wbr>lue(O{42}), "");<br>
+        assert(assign_empty(O{42}));<br>
+        assert(assign_value(O{42}));<br>
+    }<br>
+    {<br>
+        using O = optional<TrivialTestTypes::Tes<wbr>tType>;<br>
+        LIBCPP_STATIC_ASSERT(assign_em<wbr>pty(O{42}), "");<br>
+        LIBCPP_STATIC_ASSERT(assign_va<wbr>lue(O{42}), "");<br>
+        assert(assign_empty(O{42}));<br>
+        assert(assign_value(O{42}));<br>
+    }<br>
+    {<br>
+        using O = optional<TestTypes::TestType>;<br>
+        assert(assign_empty(O{42}));<br>
+        assert(assign_value(O{42}));<br>
+    }<br>
+    {<br>
+        using T = TestTypes::TestType;<br>
+        T::reset();<br>
+        optional<T> opt(3);<br>
+        const optional<T> opt2;<br>
+        assert(T::alive == 1);<br>
+        opt = opt2;<br>
+        assert(T::alive == 0);<br>
+        assert(!opt2.has_value());<br>
+        assert(!opt.has_value());<br>
+    }<br>
+#ifndef TEST_HAS_NO_EXCEPTIONS<br>
+    {<br>
+        optional<X> opt;<br>
+        optional<X> opt2(X{});<br>
+        assert(static_cast<bool>(opt2) == true);<br>
+        try<br>
+        {<br>
+            X::throw_now = true;<br>
+            opt = opt2;<br>
+            assert(false);<br>
+        }<br>
+        catch (int i)<br>
+        {<br>
+            assert(i == 6);<br>
+            assert(static_cast<bool>(opt) == false);<br>
+        }<br>
+    }<br>
+#endif<br>
+}<br>
<br>
Added: libcxx/trunk/test/std/utilitie<wbr>s/optional/optional.object/<wbr>optional.object.assign/emplace<wbr>.pass.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/std/utilities/optional/optional.object/optional.object.assign/emplace.pass.cpp?rev=283980&view=auto" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-pr<wbr>oject/libcxx/trunk/test/std/ut<wbr>ilities/optional/optional.obje<wbr>ct/optional.object.assign/empl<wbr>ace.pass.cpp?rev=283980&view=<wbr>auto</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- libcxx/trunk/test/std/utilitie<wbr>s/optional/optional.object/<wbr>optional.object.assign/emplace<wbr>.pass.cpp (added)<br>
+++ libcxx/trunk/test/std/utilitie<wbr>s/optional/optional.object/<wbr>optional.object.assign/emplace<wbr>.pass.cpp Wed Oct 12 02:46:20 2016<br>
@@ -0,0 +1,237 @@<br>
+//===------------------------<wbr>------------------------------<wbr>----------------===//<br>
+//<br>
+//                     The LLVM Compiler Infrastructure<br>
+//<br>
+// This file is dual licensed under the MIT and the University of Illinois Open<br>
+// Source Licenses. See LICENSE.TXT for details.<br>
+//<br>
+//===------------------------<wbr>------------------------------<wbr>----------------===//<br>
+<br>
+// UNSUPPORTED: c++98, c++03, c++11, c++14<br>
+// <optional><br>
+<br>
+// template <class... Args> void optional<T>::emplace(Args&&... args);<br>
+<br>
+#include <optional><br>
+#include <type_traits><br>
+#include <cassert><br>
+#include <memory><br>
+<br>
+#include "test_macros.h"<br>
+#include "archetypes.hpp"<br>
+<br>
+using std::optional;<br>
+<br>
+class X<br>
+{<br>
+    int i_;<br>
+    int j_ = 0;<br>
+public:<br>
+    X() : i_(0) {}<br>
+    X(int i) : i_(i) {}<br>
+    X(int i, int j) : i_(i), j_(j) {}<br>
+<br>
+    friend bool operator==(const X& x, const X& y)<br>
+        {return x.i_ == y.i_ && x.j_ == y.j_;}<br>
+};<br>
+<br>
+class Y<br>
+{<br>
+public:<br>
+    static bool dtor_called;<br>
+    Y() = default;<br>
+    Y(int) { TEST_THROW(6);}<br>
+    ~Y() {dtor_called = true;}<br>
+};<br>
+<br>
+bool Y::dtor_called = false;<br>
+<br>
+template <class T><br>
+void test_one_arg() {<br>
+    using Opt = std::optional<T>;<br>
+    {<br>
+        Opt opt;<br>
+        opt.emplace();<br>
+        assert(static_cast<bool>(opt) == true);<br>
+        assert(*opt == T(0));<br>
+    }<br>
+    {<br>
+        Opt opt;<br>
+        opt.emplace(1);<br>
+        assert(static_cast<bool>(opt) == true);<br>
+        assert(*opt == T(1));<br>
+    }<br>
+    {<br>
+        Opt opt(2);<br>
+        opt.emplace();<br>
+        assert(static_cast<bool>(opt) == true);<br>
+        assert(*opt == T(0));<br>
+    }<br>
+    {<br>
+        Opt opt(2);<br>
+        opt.emplace(1);<br>
+        assert(static_cast<bool>(opt) == true);<br>
+        assert(*opt == T(1));<br>
+    }<br>
+}<br>
+<br>
+<br>
+template <class T><br>
+void test_multi_arg()<br>
+{<br>
+    test_one_arg<T>();<br>
+    using Opt = std::optional<T>;<br>
+    Opt opt;<br>
+    {<br>
+        opt.emplace(101, 41);<br>
+        assert(static_cast<bool>(opt) == true);<br>
+        assert(*opt == T(101, 41));<br>
+    }<br>
+    {<br>
+        Opt opt;<br>
+        opt.emplace({1, 2, 3, 4});<br>
+        assert(static_cast<bool>(opt) == true);<br>
+        assert(*opt == T(4)); // T sets its value to the size of the init list<br>
+    }<br>
+    {<br>
+        Opt opt;<br>
+        opt.emplace({1, 2, 3, 4, 5}, 6);<br>
+        assert(static_cast<bool>(opt) == true);<br>
+        assert(*opt == T(5)); // T sets its value to the size of the init list<br>
+    }<br>
+}<br>
+<br>
+template <class T><br>
+void test_on_test_type() {<br>
+<br>
+    T::reset();<br>
+    optional<T> opt;<br>
+    assert(T::alive == 0);<br>
+    {<br>
+        T::reset_constructors();<br>
+        opt.emplace();<br>
+        assert(T::alive == 1);<br>
+        assert(T::constructed == 1);<br>
+        assert(T::default_constructed == 1);<br>
+        assert(T::destroyed == 0);<br>
+        assert(static_cast<bool>(opt) == true);<br>
+        assert(*opt == T());<br>
+    }<br>
+    {<br>
+        T::reset_constructors();<br>
+        opt.emplace();<br>
+        assert(T::alive == 1);<br>
+        assert(T::constructed == 1);<br>
+        assert(T::default_constructed == 1);<br>
+        assert(T::destroyed == 1);<br>
+        assert(static_cast<bool>(opt) == true);<br>
+        assert(*opt == T());<br>
+    }<br>
+    {<br>
+        T::reset_constructors();<br>
+        opt.emplace(101);<br>
+        assert(T::alive == 1);<br>
+        assert(T::constructed == 1);<br>
+        assert(T::value_constructed == 1);<br>
+        assert(T::destroyed == 1);<br>
+        assert(static_cast<bool>(opt) == true);<br>
+        assert(*opt == T(101));<br>
+    }<br>
+    {<br>
+        T::reset_constructors();<br>
+        opt.emplace(-10, 99);<br>
+        assert(T::alive == 1);<br>
+        assert(T::constructed == 1);<br>
+        assert(T::value_constructed == 1);<br>
+        assert(T::destroyed == 1);<br>
+        assert(static_cast<bool>(opt) == true);<br>
+        assert(*opt == T(-10, 99));<br>
+    }<br>
+    {<br>
+        T::reset_constructors();<br>
+        opt.emplace(-10, 99);<br>
+        assert(T::alive == 1);<br>
+        assert(T::constructed == 1);<br>
+        assert(T::value_constructed == 1);<br>
+        assert(T::destroyed == 1);<br>
+        assert(static_cast<bool>(opt) == true);<br>
+        assert(*opt == T(-10, 99));<br>
+    }<br>
+    {<br>
+        T::reset_constructors();<br>
+        opt.emplace({-10, 99, 42, 1});<br>
+        assert(T::alive == 1);<br>
+        assert(T::constructed == 1);<br>
+        assert(T::value_constructed == 1);<br>
+        assert(T::destroyed == 1);<br>
+        assert(static_cast<bool>(opt) == true);<br>
+        assert(*opt == T(4)); // size of the initializer list<br>
+    }<br>
+    {<br>
+        T::reset_constructors();<br>
+        opt.emplace({-10, 99, 42, 1}, 42);<br>
+        assert(T::alive == 1);<br>
+        assert(T::constructed == 1);<br>
+        assert(T::value_constructed == 1);<br>
+        assert(T::destroyed == 1);<br>
+        assert(static_cast<bool>(opt) == true);<br>
+        assert(*opt == T(4)); // size of the initializer list<br>
+    }<br>
+}<br>
+<br>
+<br>
+<br>
+int main()<br>
+{<br>
+    {<br>
+        test_on_test_type<TestTypes::T<wbr>estType>();<br>
+        test_on_test_type<ExplicitTest<wbr>Types::TestType>();<br>
+    }<br>
+    {<br>
+        using T = int;<br>
+        test_one_arg<T>();<br>
+        test_one_arg<const T>();<br>
+    }<br>
+    {<br>
+        using T = ConstexprTestTypes::TestType;<br>
+        test_multi_arg<T>();<br>
+    }<br>
+    {<br>
+        using T = ExplicitConstexprTestTypes::Te<wbr>stType;<br>
+        test_multi_arg<T>();<br>
+    }<br>
+    {<br>
+        using T = TrivialTestTypes::TestType;<br>
+        test_multi_arg<T>();<br>
+    }<br>
+    {<br>
+        using T = ExplicitTrivialTestTypes::Test<wbr>Type;<br>
+        test_multi_arg<T>();<br>
+    }<br>
+    {<br>
+        optional<const int> opt;<br>
+        opt.emplace(42);<br>
+        assert(*opt == 42);<br>
+        opt.emplace();<br>
+        assert(*opt == 0);<br>
+    }<br>
+#ifndef TEST_HAS_NO_EXCEPTIONS<br>
+    Y::dtor_called = false;<br>
+    {<br>
+        Y y;<br>
+        optional<Y> opt(y);<br>
+        try<br>
+        {<br>
+            assert(static_cast<bool>(opt) == true);<br>
+            assert(Y::dtor_called == false);<br>
+            opt.emplace(1);<br>
+        }<br>
+        catch (int i)<br>
+        {<br>
+            assert(i == 6);<br>
+            assert(static_cast<bool>(opt) == false);<br>
+            assert(Y::dtor_called == true);<br>
+        }<br>
+    }<br>
+#endif<br>
+}<br>
<br>
Added: libcxx/trunk/test/std/utilitie<wbr>s/optional/optional.object/<wbr>optional.object.assign/emplace<wbr>_initializer_list.pass.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/std/utilities/optional/optional.object/optional.object.assign/emplace_initializer_list.pass.cpp?rev=283980&view=auto" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-pr<wbr>oject/libcxx/trunk/test/std/ut<wbr>ilities/optional/optional.obje<wbr>ct/optional.object.assign/empl<wbr>ace_initializer_list.pass.cpp?<wbr>rev=283980&view=auto</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- libcxx/trunk/test/std/utilitie<wbr>s/optional/optional.object/<wbr>optional.object.assign/emplace<wbr>_initializer_list.pass.cpp (added)<br>
+++ libcxx/trunk/test/std/utilitie<wbr>s/optional/optional.object/<wbr>optional.object.assign/emplace<wbr>_initializer_list.pass.cpp Wed Oct 12 02:46:20 2016<br>
@@ -0,0 +1,113 @@<br>
+//===------------------------<wbr>------------------------------<wbr>----------------===//<br>
+//<br>
+//                     The LLVM Compiler Infrastructure<br>
+//<br>
+// This file is dual licensed under the MIT and the University of Illinois Open<br>
+// Source Licenses. See LICENSE.TXT for details.<br>
+//<br>
+//===------------------------<wbr>------------------------------<wbr>----------------===//<br>
+<br>
+// UNSUPPORTED: c++98, c++03, c++11, c++14<br>
+// <optional><br>
+<br>
+// template <class U, class... Args><br>
+//   void optional<T>::emplace(initializ<wbr>er_list<U> il, Args&&... args);<br>
+<br>
+#include <optional><br>
+#include <type_traits><br>
+#include <cassert><br>
+#include <vector><br>
+<br>
+#include "test_macros.h"<br>
+<br>
+using std::optional;<br>
+<br>
+class X<br>
+{<br>
+    int i_;<br>
+    int j_ = 0;<br>
+public:<br>
+    static bool dtor_called;<br>
+    constexpr X() : i_(0) {}<br>
+    constexpr X(int i) : i_(i) {}<br>
+    constexpr X(std::initializer_list<int> il) : i_(il.begin()[0]), j_(il.begin()[1]) {}<br>
+    ~X() {dtor_called = true;}<br>
+<br>
+    friend constexpr bool operator==(const X& x, const X& y)<br>
+        {return x.i_ == y.i_ && x.j_ == y.j_;}<br>
+};<br>
+<br>
+bool X::dtor_called = false;<br>
+<br>
+class Y<br>
+{<br>
+    int i_;<br>
+    int j_ = 0;<br>
+public:<br>
+    constexpr Y() : i_(0) {}<br>
+    constexpr Y(int i) : i_(i) {}<br>
+    constexpr Y(std::initializer_list<int> il) : i_(il.begin()[0]), j_(il.begin()[1]) {}<br>
+<br>
+    friend constexpr bool operator==(const Y& x, const Y& y)<br>
+        {return x.i_ == y.i_ && x.j_ == y.j_;}<br>
+};<br>
+<br>
+class Z<br>
+{<br>
+    int i_;<br>
+    int j_ = 0;<br>
+public:<br>
+    static bool dtor_called;<br>
+    Z() : i_(0) {}<br>
+    Z(int i) : i_(i) {}<br>
+    Z(std::initializer_list<int> il) : i_(il.begin()[0]), j_(il.begin()[1])<br>
+        { TEST_THROW(6);}<br>
+    ~Z() {dtor_called = true;}<br>
+<br>
+    friend bool operator==(const Z& x, const Z& y)<br>
+        {return x.i_ == y.i_ && x.j_ == y.j_;}<br>
+};<br>
+<br>
+bool Z::dtor_called = false;<br>
+<br>
+int main()<br>
+{<br>
+    {<br>
+        X x;<br>
+        optional<X> opt(x);<br>
+        assert(X::dtor_called == false);<br>
+        opt.emplace({1, 2});<br>
+        assert(X::dtor_called == true);<br>
+        assert(*opt == X({1, 2}));<br>
+    }<br>
+    {<br>
+        optional<std::vector<int>> opt;<br>
+        opt.emplace({1, 2, 3}, std::allocator<int>());<br>
+        assert(static_cast<bool>(opt) == true);<br>
+        assert(*opt == std::vector<int>({1, 2, 3}));<br>
+    }<br>
+    {<br>
+        optional<Y> opt;<br>
+        opt.emplace({1, 2});<br>
+        assert(static_cast<bool>(opt) == true);<br>
+        assert(*opt == Y({1, 2}));<br>
+    }<br>
+#ifndef TEST_HAS_NO_EXCEPTIONS<br>
+    {<br>
+        Z z;<br>
+        optional<Z> opt(z);<br>
+        try<br>
+        {<br>
+            assert(static_cast<bool>(opt) == true);<br>
+            assert(Z::dtor_called == false);<br>
+            opt.emplace({1, 2});<br>
+        }<br>
+        catch (int i)<br>
+        {<br>
+            assert(i == 6);<br>
+            assert(static_cast<bool>(opt) == false);<br>
+            assert(Z::dtor_called == true);<br>
+        }<br>
+    }<br>
+#endif<br>
+}<br>
<br>
Added: libcxx/trunk/test/std/utilitie<wbr>s/optional/optional.object/<wbr>optional.object.assign/move.<wbr>pass.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/std/utilities/optional/optional.object/optional.object.assign/move.pass.cpp?rev=283980&view=auto" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-pr<wbr>oject/libcxx/trunk/test/std/ut<wbr>ilities/optional/optional.obje<wbr>ct/optional.object.assign/move<wbr>.pass.cpp?rev=283980&view=auto</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- libcxx/trunk/test/std/utilitie<wbr>s/optional/optional.object/<wbr>optional.object.assign/move.<wbr>pass.cpp (added)<br>
+++ libcxx/trunk/test/std/utilitie<wbr>s/optional/optional.object/<wbr>optional.object.assign/move.<wbr>pass.cpp Wed Oct 12 02:46:20 2016<br>
@@ -0,0 +1,174 @@<br>
+//===------------------------<wbr>------------------------------<wbr>----------------===//<br>
+//<br>
+//                     The LLVM Compiler Infrastructure<br>
+//<br>
+// This file is dual licensed under the MIT and the University of Illinois Open<br>
+// Source Licenses. See LICENSE.TXT for details.<br>
+//<br>
+//===------------------------<wbr>------------------------------<wbr>----------------===//<br>
+<br>
+// UNSUPPORTED: c++98, c++03, c++11, c++14<br>
+// <optional><br>
+<br>
+// optional<T>& operator=(optional<T>&& rhs)<br>
+//     noexcept(is_nothrow_move_assi<wbr>gnable<T>::value &&<br>
+//              is_nothrow_move_constructible<<wbr>T>::value);<br>
+<br>
+#include <optional><br>
+#include <type_traits><br>
+#include <cassert><br>
+<br>
+#include "test_macros.h"<br>
+#include "archetypes.hpp"<br>
+<br>
+using std::optional;<br>
+<br>
+struct X<br>
+{<br>
+    static bool throw_now;<br>
+    static int alive;<br>
+<br>
+    X() { ++alive; }<br>
+    X(X&&)<br>
+    {<br>
+        if (throw_now)<br>
+            TEST_THROW(6);<br>
+        ++alive;<br>
+    }<br>
+<br>
+    X& operator=(X&&)<br>
+    {<br>
+        if (throw_now)<br>
+            TEST_THROW(42);<br>
+        return *this;<br>
+    }<br>
+<br>
+    ~X() { assert(alive > 0); --alive; }<br>
+};<br>
+<br>
+struct Y {};<br>
+<br>
+bool X::throw_now = false;<br>
+int X::alive = 0;<br>
+<br>
+int main()<br>
+{<br>
+    {<br>
+        static_assert(std::is_nothrow_<wbr>move_assignable<optional<int>><wbr>::value, "");<br>
+        optional<int> opt;<br>
+        constexpr optional<int> opt2;<br>
+        opt = std::move(opt2);<br>
+        static_assert(static_cast<bool<wbr>>(opt2) == false, "");<br>
+        assert(static_cast<bool>(opt) == static_cast<bool>(opt2));<br>
+    }<br>
+    {<br>
+        optional<int> opt;<br>
+        constexpr optional<int> opt2(2);<br>
+        opt = std::move(opt2);<br>
+        static_assert(static_cast<bool<wbr>>(opt2) == true, "");<br>
+        static_assert(*opt2 == 2, "");<br>
+        assert(static_cast<bool>(opt) == static_cast<bool>(opt2));<br>
+        assert(*opt == *opt2);<br>
+    }<br>
+    {<br>
+        optional<int> opt(3);<br>
+        constexpr optional<int> opt2;<br>
+        opt = std::move(opt2);<br>
+        static_assert(static_cast<bool<wbr>>(opt2) == false, "");<br>
+        assert(static_cast<bool>(opt) == static_cast<bool>(opt2));<br>
+    }<br>
+    {<br>
+        using T = TestTypes::TestType;<br>
+        T::reset();<br>
+        optional<T> opt(3);<br>
+        optional<T> opt2;<br>
+        assert(T::alive == 1);<br>
+        opt = std::move(opt2);<br>
+        assert(T::alive == 0);<br>
+        assert(static_cast<bool>(opt2) == false);<br>
+        assert(static_cast<bool>(opt) == static_cast<bool>(opt2));<br>
+    }<br>
+    {<br>
+        optional<int> opt(3);<br>
+        constexpr optional<int> opt2(2);<br>
+        opt = std::move(opt2);<br>
+        static_assert(static_cast<bool<wbr>>(opt2) == true, "");<br>
+        static_assert(*opt2 == 2, "");<br>
+        assert(static_cast<bool>(opt) == static_cast<bool>(opt2));<br>
+        assert(*opt == *opt2);<br>
+    }<br>
+#ifndef TEST_HAS_NO_EXCEPTIONS<br>
+    {<br>
+        static_assert(!std::is_nothrow<wbr>_move_assignable<optional<X>>:<wbr>:value, "");<br>
+        X::alive = 0;<br>
+        X::throw_now = false;<br>
+        optional<X> opt;<br>
+        optional<X> opt2(X{});<br>
+        assert(X::alive == 1);<br>
+        assert(static_cast<bool>(opt2) == true);<br>
+        try<br>
+        {<br>
+            X::throw_now = true;<br>
+            opt = std::move(opt2);<br>
+            assert(false);<br>
+        }<br>
+        catch (int i)<br>
+        {<br>
+            assert(i == 6);<br>
+            assert(static_cast<bool>(opt) == false);<br>
+        }<br>
+        assert(X::alive == 1);<br>
+    }<br>
+    assert(X::alive == 0);<br>
+    {<br>
+        static_assert(!std::is_nothrow<wbr>_move_assignable<optional<X>>:<wbr>:value, "");<br>
+        X::throw_now = false;<br>
+        optional<X> opt(X{});<br>
+        optional<X> opt2(X{});<br>
+        assert(X::alive == 2);<br>
+        assert(static_cast<bool>(opt2) == true);<br>
+        try<br>
+        {<br>
+            X::throw_now = true;<br>
+            opt = std::move(opt2);<br>
+            assert(false);<br>
+        }<br>
+        catch (int i)<br>
+        {<br>
+            assert(i == 42);<br>
+            assert(static_cast<bool>(opt) == true);<br>
+        }<br>
+        assert(X::alive == 2);<br>
+    }<br>
+    assert(X::alive == 0);<br>
+#endif // TEST_HAS_NO_EXCEPTIONS<br>
+    {<br>
+        static_assert(std::is_nothrow_<wbr>move_assignable<optional<Y>>::<wbr>value, "");<br>
+    }<br>
+    {<br>
+        struct ThrowsMove {<br>
+          ThrowsMove() noexcept {}<br>
+          ThrowsMove(ThrowsMove const&) noexcept {}<br>
+          ThrowsMove(ThrowsMove &&) noexcept(false) {}<br>
+          ThrowsMove& operator=(ThrowsMove const&) noexcept { return *this; }<br>
+          ThrowsMove& operator=(ThrowsMove &&) noexcept { return *this; }<br>
+        };<br>
+        static_assert(!std::is_nothrow<wbr>_move_assignable<optional<<wbr>ThrowsMove>>::value, "");<br>
+        struct ThrowsMoveAssign {<br>
+          ThrowsMoveAssign() noexcept {}<br>
+          ThrowsMoveAssign(ThrowsMoveAss<wbr>ign const&) noexcept {}<br>
+          ThrowsMoveAssign(ThrowsMoveAss<wbr>ign &&) noexcept {}<br>
+          ThrowsMoveAssign& operator=(ThrowsMoveAssign const&) noexcept { return *this; }<br>
+          ThrowsMoveAssign& operator=(ThrowsMoveAssign &&) noexcept(false) { return *this; }<br>
+        };<br>
+        static_assert(!std::is_nothrow<wbr>_move_assignable<optional<<wbr>ThrowsMoveAssign>>::value, "");<br>
+        struct NoThrowMove {<br>
+          NoThrowMove() noexcept(false) {}<br>
+          NoThrowMove(NoThrowMove const&) noexcept(false) {}<br>
+          NoThrowMove(NoThrowMove &&) noexcept {}<br>
+          NoThrowMove& operator=(NoThrowMove const&) noexcept { return *this; }<br>
+          NoThrowMove& operator=(NoThrowMove&&) noexcept { return *this; }<br>
+        };<br>
+        static_assert(std::is_nothrow_<wbr>move_assignable<optional<NoThr<wbr>owMove>>::value, "");<br>
+    }<br>
+}<br>
<br>
Added: libcxx/trunk/test/std/utilitie<wbr>s/optional/optional.object/<wbr>optional.object.assign/nullopt<wbr>_t.pass.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/std/utilities/optional/optional.object/optional.object.assign/nullopt_t.pass.cpp?rev=283980&view=auto" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-pr<wbr>oject/libcxx/trunk/test/std/ut<wbr>ilities/optional/optional.obje<wbr>ct/optional.object.assign/null<wbr>opt_t.pass.cpp?rev=283980&view<wbr>=auto</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- libcxx/trunk/test/std/utilitie<wbr>s/optional/optional.object/<wbr>optional.object.assign/nullopt<wbr>_t.pass.cpp (added)<br>
+++ libcxx/trunk/test/std/utilitie<wbr>s/optional/optional.object/<wbr>optional.object.assign/nullopt<wbr>_t.pass.cpp Wed Oct 12 02:46:20 2016<br>
@@ -0,0 +1,67 @@<br>
+//===------------------------<wbr>------------------------------<wbr>----------------===//<br>
+//<br>
+//                     The LLVM Compiler Infrastructure<br>
+//<br>
+// This file is dual licensed under the MIT and the University of Illinois Open<br>
+// Source Licenses. See LICENSE.TXT for details.<br>
+//<br>
+//===------------------------<wbr>------------------------------<wbr>----------------===//<br>
+<br>
+// UNSUPPORTED: c++98, c++03, c++11, c++14<br>
+// <optional><br>
+<br>
+// optional<T>& operator=(nullopt_t) noexcept;<br>
+<br>
+#include <optional><br>
+#include <type_traits><br>
+#include <cassert><br>
+<br>
+#include "test_macros.h"<br>
+#include "archetypes.hpp"<br>
+<br>
+using std::optional;<br>
+using std::nullopt_t;<br>
+using std::nullopt;<br>
+<br>
+int main()<br>
+{<br>
+    {<br>
+        optional<int> opt;<br>
+        static_assert(noexcept(opt = nullopt) == true, "");<br>
+        opt = nullopt;<br>
+        assert(static_cast<bool>(opt) == false);<br>
+    }<br>
+    {<br>
+        optional<int> opt(3);<br>
+        opt = nullopt;<br>
+        assert(static_cast<bool>(opt) == false);<br>
+    }<br>
+    using TT = TestTypes::TestType;<br>
+    TT::reset();<br>
+    {<br>
+        optional<TT> opt;<br>
+        static_assert(noexcept(opt = nullopt) == true, "");<br>
+        assert(TT::destroyed == 0);<br>
+        opt = nullopt;<br>
+        assert(TT::constructed == 0);<br>
+        assert(TT::alive == 0);<br>
+        assert(TT::destroyed == 0);<br>
+        assert(static_cast<bool>(opt) == false);<br>
+    }<br>
+    assert(TT::alive == 0);<br>
+    assert(TT::destroyed == 0);<br>
+    TT::reset();<br>
+    {<br>
+        optional<TT> opt(42);<br>
+        assert(TT::destroyed == 0);<br>
+        TT::reset_constructors();<br>
+        opt = nullopt;<br>
+        assert(TT::constructed == 0);<br>
+        assert(TT::alive == 0);<br>
+        assert(TT::destroyed == 1);<br>
+        assert(static_cast<bool>(opt) == false);<br>
+    }<br>
+    assert(TT::alive == 0);<br>
+    assert(TT::destroyed == 1);<br>
+    TT::reset();<br>
+}<br>
<br>
Added: libcxx/trunk/test/std/utilitie<wbr>s/optional/optional.object/<wbr>optional.object.assign/optiona<wbr>l_U.pass.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/std/utilities/optional/optional.object/optional.object.assign/optional_U.pass.cpp?rev=283980&view=auto" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-pr<wbr>oject/libcxx/trunk/test/std/ut<wbr>ilities/optional/optional.obje<wbr>ct/optional.object.assign/opti<wbr>onal_U.pass.cpp?rev=283980&<wbr>view=auto</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- libcxx/trunk/test/std/utilitie<wbr>s/optional/optional.object/<wbr>optional.object.assign/optiona<wbr>l_U.pass.cpp (added)<br>
+++ libcxx/trunk/test/std/utilitie<wbr>s/optional/optional.object/<wbr>optional.object.assign/optiona<wbr>l_U.pass.cpp Wed Oct 12 02:46:20 2016<br>
@@ -0,0 +1,268 @@<br>
+//===------------------------<wbr>------------------------------<wbr>----------------===//<br>
+//<br>
+//                     The LLVM Compiler Infrastructure<br>
+//<br>
+// This file is dual licensed under the MIT and the University of Illinois Open<br>
+// Source Licenses. See LICENSE.TXT for details.<br>
+//<br>
+//===------------------------<wbr>------------------------------<wbr>----------------===//<br>
+<br>
+// UNSUPPORTED: c++98, c++03, c++11, c++14<br>
+// <optional><br>
+<br>
+// From LWG2451:<br>
+// template <class U><br>
+// optional<T>& operator=(optional<U>&& rhs);<br>
+<br>
+#include <optional><br>
+#include <type_traits><br>
+#include <memory><br>
+#include <cassert><br>
+<br>
+#include "test_macros.h"<br>
+#include "archetypes.hpp"<br>
+<br>
+using std::optional;<br>
+<br>
+struct X<br>
+{<br>
+    static bool throw_now;<br>
+<br>
+    X() = default;<br>
+    X(int &&)<br>
+    {<br>
+        if (throw_now)<br>
+            TEST_THROW(6);<br>
+    }<br>
+};<br>
+<br>
+bool X::throw_now = false;<br>
+<br>
+struct Y1<br>
+{<br>
+    Y1() = default;<br>
+    Y1(const int&) {}<br>
+    Y1& operator=(const Y1&) = delete;<br>
+};<br>
+<br>
+struct Y2<br>
+{<br>
+    Y2() = default;<br>
+    Y2(const int&) = delete;<br>
+    Y2& operator=(const int&) { return *this; }<br>
+};<br>
+<br>
+class B {};<br>
+class D : public B {};<br>
+<br>
+<br>
+template <class T><br>
+struct AssignableFrom {<br>
+  static int type_constructed;<br>
+  static int type_assigned;<br>
+static int int_constructed;<br>
+  static int int_assigned;<br>
+<br>
+  static void reset() {<br>
+      type_constructed = int_constructed = 0;<br>
+      type_assigned = int_assigned = 0;<br>
+  }<br>
+<br>
+  AssignableFrom() = default;<br>
+<br>
+  explicit AssignableFrom(T) { ++type_constructed; }<br>
+  AssignableFrom& operator=(T) { ++type_assigned; return *this; }<br>
+<br>
+  AssignableFrom(int) { ++int_constructed; }<br>
+  AssignableFrom& operator=(int) { ++int_assigned; return *this; }<br>
+private:<br>
+  AssignableFrom(AssignableFrom const&) = delete;<br>
+  AssignableFrom& operator=(AssignableFrom const&) = delete;<br>
+};<br>
+<br>
+template <class T> int AssignableFrom<T>::type_constr<wbr>ucted = 0;<br>
+template <class T> int AssignableFrom<T>::type_assign<wbr>ed = 0;<br>
+template <class T> int AssignableFrom<T>::int_constru<wbr>cted = 0;<br>
+template <class T> int AssignableFrom<T>::int_assigne<wbr>d = 0;<br>
+<br>
+void test_with_test_type() {<br>
+    using T = TestTypes::TestType;<br>
+    T::reset();<br>
+    { // non-empty to empty<br>
+        T::reset_constructors();<br>
+        optional<T> opt;<br>
+        optional<int> other(42);<br>
+        opt = std::move(other);<br>
+        assert(T::alive == 1);<br>
+        assert(T::constructed == 1);<br>
+        assert(T::value_constructed == 1);<br>
+        assert(T::assigned == 0);<br>
+        assert(T::destroyed == 0);<br>
+        assert(static_cast<bool>(other<wbr>) == true);<br>
+        assert(*other == 42);<br>
+        assert(static_cast<bool>(opt) == true);<br>
+        assert(*opt == T(42));<br>
+    }<br>
+    assert(T::alive == 0);<br>
+    { // non-empty to non-empty<br>
+        optional<T> opt(101);<br>
+        optional<int> other(42);<br>
+        T::reset_constructors();<br>
+        opt = std::move(other);<br>
+        assert(T::alive == 1);<br>
+        assert(T::constructed == 0);<br>
+        assert(T::assigned == 1);<br>
+        assert(T::value_assigned == 1);<br>
+        assert(T::destroyed == 0);<br>
+        assert(static_cast<bool>(other<wbr>) == true);<br>
+        assert(*other == 42);<br>
+        assert(static_cast<bool>(opt) == true);<br>
+        assert(*opt == T(42));<br>
+    }<br>
+    assert(T::alive == 0);<br>
+    { // empty to non-empty<br>
+        optional<T> opt(101);<br>
+        optional<int> other;<br>
+        T::reset_constructors();<br>
+        opt = std::move(other);<br>
+        assert(T::alive == 0);<br>
+        assert(T::constructed == 0);<br>
+        assert(T::assigned == 0);<br>
+        assert(T::destroyed == 1);<br>
+        assert(static_cast<bool>(other<wbr>) == false);<br>
+        assert(static_cast<bool>(opt) == false);<br>
+    }<br>
+    assert(T::alive == 0);<br>
+    { // empty to empty<br>
+        optional<T> opt;<br>
+        optional<int> other;<br>
+        T::reset_constructors();<br>
+        opt = std::move(other);<br>
+        assert(T::alive == 0);<br>
+        assert(T::constructed == 0);<br>
+        assert(T::assigned == 0);<br>
+        assert(T::destroyed == 0);<br>
+        assert(static_cast<bool>(other<wbr>) == false);<br>
+        assert(static_cast<bool>(opt) == false);<br>
+    }<br>
+    assert(T::alive == 0);<br>
+}<br>
+<br>
+<br>
+void test_ambigious_assign() {<br>
+    using OptInt = std::optional<int>;<br>
+    {<br>
+        using T = AssignableFrom<OptInt&&>;<br>
+        T::reset();<br>
+        {<br>
+            OptInt a(42);<br>
+            std::optional<T> t;<br>
+            t = std::move(a);<br>
+            assert(T::type_constructed == 1);<br>
+            assert(T::type_assigned == 0);<br>
+            assert(T::int_constructed == 0);<br>
+            assert(T::int_assigned == 0);<br>
+        }<br>
+        {<br>
+            using Opt = std::optional<T>;<br>
+            static_assert(!std::is_assigna<wbr>ble<Opt&, const OptInt&&>::value, "");<br>
+            static_assert(!std::is_assigna<wbr>ble<Opt&, const OptInt&>::value, "");<br>
+            static_assert(!std::is_assigna<wbr>ble<Opt&, OptInt&>::value, "");<br>
+        }<br>
+    }<br>
+    {<br>
+        using T = AssignableFrom<OptInt const&&>;<br>
+        T::reset();<br>
+        {<br>
+            const OptInt a(42);<br>
+            std::optional<T> t;<br>
+            t = std::move(a);<br>
+            assert(T::type_constructed == 1);<br>
+            assert(T::type_assigned == 0);<br>
+            assert(T::int_constructed == 0);<br>
+            assert(T::int_assigned == 0);<br>
+        }<br>
+        T::reset();<br>
+        {<br>
+            OptInt a(42);<br>
+            std::optional<T> t;<br>
+            t = std::move(a);<br>
+            assert(T::type_constructed == 1);<br>
+            assert(T::type_assigned == 0);<br>
+            assert(T::int_constructed == 0);<br>
+            assert(T::int_assigned == 0);<br>
+        }<br>
+        {<br>
+            using Opt = std::optional<T>;<br>
+            static_assert(std::is_assignab<wbr>le<Opt&, OptInt&&>::value, "");<br>
+            static_assert(!std::is_assigna<wbr>ble<Opt&, const OptInt&>::value, "");<br>
+            static_assert(!std::is_assigna<wbr>ble<Opt&, OptInt&>::value, "");<br>
+        }<br>
+    }<br>
+}<br>
+<br>
+<br>
+int main()<br>
+{<br>
+    test_with_test_type();<br>
+    test_ambigious_assign();<br>
+    {<br>
+        optional<int> opt;<br>
+        optional<short> opt2;<br>
+        opt = std::move(opt2);<br>
+        assert(static_cast<bool>(opt2) == false);<br>
+        assert(static_cast<bool>(opt) == static_cast<bool>(opt2));<br>
+    }<br>
+    {<br>
+        optional<int> opt;<br>
+        optional<short> opt2(short{2});<br>
+        opt = std::move(opt2);<br>
+        assert(static_cast<bool>(opt2) == true);<br>
+        assert(*opt2 == 2);<br>
+        assert(static_cast<bool>(opt) == static_cast<bool>(opt2));<br>
+        assert(*opt == *opt2);<br>
+    }<br>
+    {<br>
+        optional<int> opt(3);<br>
+        optional<short> opt2;<br>
+        opt = std::move(opt2);<br>
+        assert(static_cast<bool>(opt2) == false);<br>
+        assert(static_cast<bool>(opt) == static_cast<bool>(opt2));<br>
+    }<br>
+    {<br>
+        optional<int> opt(3);<br>
+        optional<short> opt2(short{2});<br>
+        opt = std::move(opt2);<br>
+        assert(static_cast<bool>(opt2) == true);<br>
+        assert(*opt2 == 2);<br>
+        assert(static_cast<bool>(opt) == static_cast<bool>(opt2));<br>
+        assert(*opt == *opt2);<br>
+    }<br>
+    {<br>
+        optional<std::unique_ptr<B>> opt;<br>
+        optional<std::unique_ptr<D>> other(new D());<br>
+        opt = std::move(other);<br>
+        assert(static_cast<bool>(opt) == true);<br>
+        assert(static_cast<bool>(other<wbr>) == true);<br>
+        assert(opt->get() != nullptr);<br>
+        assert(other->get() == nullptr);<br>
+    }<br>
+#ifndef TEST_HAS_NO_EXCEPTIONS<br>
+    {<br>
+        optional<X> opt;<br>
+        optional<int> opt2(42);<br>
+        assert(static_cast<bool>(opt2) == true);<br>
+        try<br>
+        {<br>
+            X::throw_now = true;<br>
+            opt = std::move(opt2);<br>
+            assert(false);<br>
+        }<br>
+        catch (int i)<br>
+        {<br>
+            assert(i == 6);<br>
+            assert(static_cast<bool>(opt) == false);<br>
+        }<br>
+    }<br>
+#endif<br>
+}<br>
<br>
Added: libcxx/trunk/test/std/utilitie<wbr>s/optional/optional.object/<wbr>optional.object.ctor/U.pass.<wbr>cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/std/utilities/optional/optional.object/optional.object.ctor/U.pass.cpp?rev=283980&view=auto" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-pr<wbr>oject/libcxx/trunk/test/std/ut<wbr>ilities/optional/optional.obje<wbr>ct/optional.object.ctor/U.pass<wbr>.cpp?rev=283980&view=auto</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- libcxx/trunk/test/std/utilitie<wbr>s/optional/optional.object/<wbr>optional.object.ctor/U.pass.<wbr>cpp (added)<br>
+++ libcxx/trunk/test/std/utilitie<wbr>s/optional/optional.object/<wbr>optional.object.ctor/U.pass.<wbr>cpp Wed Oct 12 02:46:20 2016<br>
@@ -0,0 +1,137 @@<br>
+//===------------------------<wbr>------------------------------<wbr>----------------===//<br>
+//<br>
+//                     The LLVM Compiler Infrastructure<br>
+//<br>
+// This file is dual licensed under the MIT and the University of Illinois Open<br>
+// Source Licenses. See LICENSE.TXT for details.<br>
+//<br>
+//===------------------------<wbr>------------------------------<wbr>----------------===//<br>
+//<br>
+// UNSUPPORTED: c++98, c++03, c++11, c++14<br>
+<br>
+// <optional><br>
+<br>
+// template <class U><br>
+//   constexpr EXPLICIT optional(U&& u);<br>
+<br>
+#include <optional><br>
+#include <type_traits><br>
+#include <cassert><br>
+<br>
+#include "test_macros.h"<br>
+#include "archetypes.hpp"<br>
+#include "test_convertible.hpp"<br>
+<br>
+<br>
+using std::optional;<br>
+<br>
+struct ImplicitThrow<br>
+{<br>
+    constexpr ImplicitThrow(int x) { if (x != -1) TEST_THROW(6);}<br>
+};<br>
+<br>
+struct ExplicitThrow<br>
+{<br>
+    constexpr explicit ExplicitThrow(int x) { if (x != -1) TEST_THROW(6);}<br>
+};<br>
+<br>
+<br>
+template <class To, class From><br>
+constexpr bool implicit_conversion(optional<T<wbr>o>&& opt, const From& v)<br>
+{<br>
+    using O = optional<To>;<br>
+    static_assert(test_convertible<wbr><O, From>(), "");<br>
+    static_assert(!test_convertibl<wbr>e<O, void*>(), "");<br>
+    static_assert(!test_convertibl<wbr>e<O, From, int>(), "");<br>
+    return opt && *opt == static_cast<To>(v);<br>
+}<br>
+<br>
+template <class To, class Input, class Expect><br>
+constexpr bool explicit_conversion(Input&& in, const Expect& v)<br>
+{<br>
+    using O = optional<To>;<br>
+    static_assert(std::is_construc<wbr>tible<O, Input>::value, "");<br>
+    static_assert(!std::is_convert<wbr>ible<Input, O>::value, "");<br>
+    static_assert(!std::is_constru<wbr>ctible<O, void*>::value, "");<br>
+    static_assert(!std::is_constru<wbr>ctible<O, Input, int>::value, "");<br>
+    optional<To> opt(std::forward<Input>(in));<br>
+    return opt && *opt == static_cast<To>(v);<br>
+}<br>
+<br>
+void test_implicit()<br>
+{<br>
+    {<br>
+        using T = long long;<br>
+        static_assert(implicit_convers<wbr>ion<long long>(42, 42), "");<br>
+    }<br>
+    {<br>
+        using T = long double;<br>
+        static_assert(implicit_convers<wbr>ion<long double>(3.14, 3.14), "");<br>
+    }<br>
+    {<br>
+        using T = TrivialTestTypes::TestType;<br>
+        static_assert(implicit_convers<wbr>ion<T>(42, 42), "");<br>
+    }<br>
+    {<br>
+        using T = TestTypes::TestType;<br>
+        assert(implicit_conversion<T>(<wbr>3, T(3)));<br>
+    }<br>
+#ifndef TEST_HAS_NO_EXCEPTIONS<br>
+    {<br>
+        try {<br>
+            using T = ImplicitThrow;<br>
+            optional<T> t = 42;<br>
+            assert(false);<br>
+        } catch (int) {<br>
+        }<br>
+    }<br>
+#endif<br>
+}<br>
+<br>
+void test_explicit() {<br>
+    {<br>
+        using T = ExplicitTrivialTestTypes::Test<wbr>Type;<br>
+        using O = optional<T>;<br>
+        static_assert(explicit_convers<wbr>ion<T>(42, 42), "");<br>
+    }<br>
+    {<br>
+        using T = ExplicitConstexprTestTypes::Te<wbr>stType;<br>
+        using O = optional<T>;<br>
+        static_assert(explicit_convers<wbr>ion<T>(42, 42), "");<br>
+        static_assert(!std::is_convert<wbr>ible<int, T>::value, "");<br>
+    }<br>
+    {<br>
+        using T = ExplicitTestTypes::TestType;<br>
+        using O = optional<T>;<br>
+        T::reset();<br>
+        {<br>
+            assert(explicit_conversion<T>(<wbr>42, 42));<br>
+            assert(T::alive == 0);<br>
+        }<br>
+        T::reset();<br>
+        {<br>
+            optional<T> t(42);<br>
+            assert(T::alive == 1);<br>
+            assert(T::value_constructed == 1);<br>
+            assert(T::move_constructed == 0);<br>
+            assert(T::copy_constructed == 0);<br>
+            assert(t.value().value == 42);<br>
+        }<br>
+        assert(T::alive == 0);<br>
+    }<br>
+#ifndef TEST_HAS_NO_EXCEPTIONS<br>
+    {<br>
+        try {<br>
+            using T = ExplicitThrow;<br>
+            optional<T> t(42);<br>
+            assert(false);<br>
+        } catch (int) {<br>
+        }<br>
+    }<br>
+#endif<br>
+}<br>
+<br>
+int main() {<br>
+    test_implicit();<br>
+    test_explicit();<br>
+}<br>
<br>
Added: libcxx/trunk/test/std/utilitie<wbr>s/optional/optional.object/<wbr>optional.object.ctor/const_T.<wbr>pass.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/std/utilities/optional/optional.object/optional.object.ctor/const_T.pass.cpp?rev=283980&view=auto" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-pr<wbr>oject/libcxx/trunk/test/std/ut<wbr>ilities/optional/optional.obje<wbr>ct/optional.object.ctor/const_<wbr>T.pass.cpp?rev=283980&view=<wbr>auto</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- libcxx/trunk/test/std/utilitie<wbr>s/optional/optional.object/<wbr>optional.object.ctor/const_T.<wbr>pass.cpp (added)<br>
+++ libcxx/trunk/test/std/utilitie<wbr>s/optional/optional.object/<wbr>optional.object.ctor/const_T.<wbr>pass.cpp Wed Oct 12 02:46:20 2016<br>
@@ -0,0 +1,123 @@<br>
+//===------------------------<wbr>------------------------------<wbr>----------------===//<br>
+//<br>
+//                     The LLVM Compiler Infrastructure<br>
+//<br>
+// This file is dual licensed under the MIT and the University of Illinois Open<br>
+// Source Licenses. See LICENSE.TXT for details.<br>
+//<br>
+//===------------------------<wbr>------------------------------<wbr>----------------===//<br>
+//<br>
+// UNSUPPORTED: c++98, c++03, c++11, c++14<br>
+<br>
+// <optional><br>
+<br>
+// constexpr optional(const T& v);<br>
+<br>
+#include <optional><br>
+#include <type_traits><br>
+#include <cassert><br>
+<br>
+#include "test_macros.h"<br>
+#include "archetypes.hpp"<br>
+<br>
+using std::optional;<br>
+<br>
+int main()<br>
+{<br>
+    {<br>
+        typedef int T;<br>
+        constexpr T t(5);<br>
+        constexpr optional<T> opt(t);<br>
+        static_assert(static_cast<bool<wbr>>(opt) == true, "");<br>
+        static_assert(*opt == 5, "");<br>
+<br>
+        struct test_constexpr_ctor<br>
+            : public optional<T><br>
+        {<br>
+            constexpr test_constexpr_ctor(const T&) {}<br>
+        };<br>
+<br>
+    }<br>
+    {<br>
+        typedef double T;<br>
+        constexpr T t(3);<br>
+        constexpr optional<T> opt(t);<br>
+        static_assert(static_cast<bool<wbr>>(opt) == true, "");<br>
+        static_assert(*opt == 3, "");<br>
+<br>
+        struct test_constexpr_ctor<br>
+            : public optional<T><br>
+        {<br>
+            constexpr test_constexpr_ctor(const T&) {}<br>
+        };<br>
+<br>
+    }<br>
+    {<br>
+        typedef TestTypes::TestType T;<br>
+        T::reset();<br>
+        const T t(3);<br>
+        optional<T> opt = t;<br>
+        assert(T::alive == 2);<br>
+        assert(T::copy_constructed == 1);<br>
+        assert(static_cast<bool>(opt) == true);<br>
+        assert(opt.value().value == 3);<br>
+    }<br>
+    {<br>
+        typedef ExplicitTestTypes::TestType T;<br>
+        static_assert(!std::is_convert<wbr>ible<T const&, optional<T>>::value, "");<br>
+        T::reset();<br>
+        const T t(3);<br>
+        optional<T> opt(t);<br>
+        assert(T::alive == 2);<br>
+        assert(T::copy_constructed == 1);<br>
+        assert(static_cast<bool>(opt) == true);<br>
+        assert(opt.value().value == 3);<br>
+    }<br>
+    {<br>
+        typedef ConstexprTestTypes::TestType T;<br>
+        constexpr T t(3);<br>
+        constexpr optional<T> opt = {t};<br>
+        static_assert(static_cast<bool<wbr>>(opt) == true, "");<br>
+        static_assert(opt.value().valu<wbr>e == 3, "");<br>
+<br>
+        struct test_constexpr_ctor<br>
+            : public optional<T><br>
+        {<br>
+            constexpr test_constexpr_ctor(const T&) {}<br>
+        };<br>
+    }<br>
+    {<br>
+        typedef ExplicitConstexprTestTypes::Te<wbr>stType T;<br>
+        static_assert(!std::is_convert<wbr>ible<const T&, optional<T>>::value, "");<br>
+        constexpr T t(3);<br>
+        constexpr optional<T> opt(t);<br>
+        static_assert(static_cast<bool<wbr>>(opt) == true, "");<br>
+        static_assert(opt.value().valu<wbr>e == 3, "");<br>
+<br>
+        struct test_constexpr_ctor<br>
+            : public optional<T><br>
+        {<br>
+            constexpr test_constexpr_ctor(const T&) {}<br>
+        };<br>
+<br>
+    }<br>
+#ifndef TEST_HAS_NO_EXCEPTIONS<br>
+    {<br>
+        struct Z {<br>
+            Z(int) {}<br>
+            Z(const Z&) {throw 6;}<br>
+        };<br>
+        typedef Z T;<br>
+        try<br>
+        {<br>
+            const T t(3);<br>
+            optional<T> opt(t);<br>
+            assert(false);<br>
+        }<br>
+        catch (int i)<br>
+        {<br>
+            assert(i == 6);<br>
+        }<br>
+    }<br>
+#endif<br>
+}<br>
<br>
Added: libcxx/trunk/test/std/utilitie<wbr>s/optional/optional.object/<wbr>optional.object.ctor/const_<wbr>optional_U.pass.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/std/utilities/optional/optional.object/optional.object.ctor/const_optional_U.pass.cpp?rev=283980&view=auto" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-pr<wbr>oject/libcxx/trunk/test/std/ut<wbr>ilities/optional/optional.obje<wbr>ct/optional.object.ctor/const_<wbr>optional_U.pass.cpp?rev=283980<wbr>&view=auto</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- libcxx/trunk/test/std/utilitie<wbr>s/optional/optional.object/<wbr>optional.object.ctor/const_<wbr>optional_U.pass.cpp (added)<br>
+++ libcxx/trunk/test/std/utilitie<wbr>s/optional/optional.object/<wbr>optional.object.ctor/const_<wbr>optional_U.pass.cpp Wed Oct 12 02:46:20 2016<br>
@@ -0,0 +1,134 @@<br>
+//===------------------------<wbr>------------------------------<wbr>----------------===//<br>
+//<br>
+//                     The LLVM Compiler Infrastructure<br>
+//<br>
+// This file is dual licensed under the MIT and the University of Illinois Open<br>
+// Source Licenses. See LICENSE.TXT for details.<br>
+//<br>
+//===------------------------<wbr>------------------------------<wbr>----------------===//<br>
+<br>
+// UNSUPPORTED: c++98, c++03, c++11, c++14<br>
+// <optional><br>
+<br>
+// template <class U><br>
+//   optional(const optional<U>& rhs);<br>
+<br>
+#include <optional><br>
+#include <type_traits><br>
+#include <cassert><br>
+<br>
+#include "test_macros.h"<br>
+<br>
+using std::optional;<br>
+<br>
+template <class T, class U><br>
+void<br>
+test(const optional<U>& rhs, bool is_going_to_throw = false)<br>
+{<br>
+    bool rhs_engaged = static_cast<bool>(rhs);<br>
+#ifndef TEST_HAS_NO_EXCEPTIONS<br>
+    try<br>
+    {<br>
+        optional<T> lhs = rhs;<br>
+        assert(is_going_to_throw == false);<br>
+        assert(static_cast<bool>(lhs) == rhs_engaged);<br>
+        if (rhs_engaged)<br>
+            assert(*lhs == *rhs);<br>
+    }<br>
+    catch (int i)<br>
+    {<br>
+        assert(i == 6);<br>
+    }<br>
+#else<br>
+    if (is_going_to_throw) return;<br>
+    optional<T> lhs = rhs;<br>
+    assert(static_cast<bool>(lhs) == rhs_engaged);<br>
+    if (rhs_engaged)<br>
+        assert(*lhs == *rhs);<br>
+#endif<br>
+}<br>
+<br>
+class X<br>
+{<br>
+    int i_;<br>
+public:<br>
+    X(int i) : i_(i) {}<br>
+    X(const X& x) : i_(x.i_) {}<br>
+    ~X() {i_ = 0;}<br>
+    friend bool operator==(const X& x, const X& y) {return x.i_ == y.i_;}<br>
+};<br>
+<br>
+class Y<br>
+{<br>
+    int i_;<br>
+public:<br>
+    Y(int i) : i_(i) {}<br>
+<br>
+    friend constexpr bool operator==(const Y& x, const Y& y) {return x.i_ == y.i_;}<br>
+};<br>
+<br>
+int count = 0;<br>
+<br>
+class Z<br>
+{<br>
+    int i_;<br>
+public:<br>
+    Z(int i) : i_(i) {TEST_THROW(6);}<br>
+<br>
+    friend constexpr bool operator==(const Z& x, const Z& y) {return x.i_ == y.i_;}<br>
+};<br>
+<br>
+<br>
+int main()<br>
+{<br>
+    {<br>
+        typedef short U;<br>
+        typedef int T;<br>
+        optional<U> rhs;<br>
+        test<T>(rhs);<br>
+    }<br>
+    {<br>
+        typedef short U;<br>
+        typedef int T;<br>
+        optional<U> rhs(U{3});<br>
+        test<T>(rhs);<br>
+    }<br>
+    {<br>
+        typedef X T;<br>
+        typedef int U;<br>
+        optional<U> rhs;<br>
+        test<T>(rhs);<br>
+    }<br>
+    {<br>
+        typedef X T;<br>
+        typedef int U;<br>
+        optional<U> rhs(U{3});<br>
+        test<T>(rhs);<br>
+    }<br>
+    {<br>
+        typedef Y T;<br>
+        typedef int U;<br>
+        optional<U> rhs;<br>
+        test<T>(rhs);<br>
+    }<br>
+    {<br>
+        typedef Y T;<br>
+        typedef int U;<br>
+        optional<U> rhs(U{3});<br>
+        test<T>(rhs);<br>
+    }<br>
+    {<br>
+        typedef Z T;<br>
+        typedef int U;<br>
+        optional<U> rhs;<br>
+        test<T>(rhs);<br>
+    }<br>
+    {<br>
+        typedef Z T;<br>
+        typedef int U;<br>
+        optional<U> rhs(U{3});<br>
+        test<T>(rhs, true);<br>
+    }<br>
+<br>
+    static_assert(!(std::is_constr<wbr>uctible<optional<X>, const optional<Y>&>::value), "");<br>
+}<br>
<br>
Added: libcxx/trunk/test/std/utilitie<wbr>s/optional/optional.object/<wbr>optional.object.ctor/copy.<wbr>pass.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/std/utilities/optional/optional.object/optional.object.ctor/copy.pass.cpp?rev=283980&view=auto" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-pr<wbr>oject/libcxx/trunk/test/std/ut<wbr>ilities/optional/optional.obje<wbr>ct/optional.object.ctor/copy.<wbr>pass.cpp?rev=283980&view=auto</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- libcxx/trunk/test/std/utilitie<wbr>s/optional/optional.object/<wbr>optional.object.ctor/copy.<wbr>pass.cpp (added)<br>
+++ libcxx/trunk/test/std/utilitie<wbr>s/optional/optional.object/<wbr>optional.object.ctor/copy.<wbr>pass.cpp Wed Oct 12 02:46:20 2016<br>
@@ -0,0 +1,150 @@<br>
+//===------------------------<wbr>------------------------------<wbr>----------------===//<br>
+//<br>
+//                     The LLVM Compiler Infrastructure<br>
+//<br>
+// This file is dual licensed under the MIT and the University of Illinois Open<br>
+// Source Licenses. See LICENSE.TXT for details.<br>
+//<br>
+//===------------------------<wbr>------------------------------<wbr>----------------===//<br>
+<br>
+// UNSUPPORTED: c++98, c++03, c++11, c++14<br>
+// <optional><br>
+<br>
+// optional(const optional<T>& rhs);<br>
+<br>
+#include <optional><br>
+#include <type_traits><br>
+#include <cassert><br>
+<br>
+#include "test_macros.h"<br>
+#include "archetypes.hpp"<br>
+<br>
+using std::optional;<br>
+<br>
+template <class T, class ...InitArgs><br>
+void test(InitArgs&&... args)<br>
+{<br>
+    const optional<T> rhs(std::forward<InitArgs>(arg<wbr>s)...);<br>
+    bool rhs_engaged = static_cast<bool>(rhs);<br>
+    optional<T> lhs = rhs;<br>
+    assert(static_cast<bool>(lhs) == rhs_engaged);<br>
+    if (rhs_engaged)<br>
+        assert(*lhs == *rhs);<br>
+}<br>
+<br>
+void test_throwing_ctor() {<br>
+#ifndef TEST_HAS_NO_EXCEPTIONS<br>
+    struct Z {<br>
+      Z() : count(0) {}<br>
+      Z(Z const& o) : count(o.count + 1)<br>
+      { if (count == 2) throw 6; }<br>
+      int count;<br>
+    };<br>
+    const Z z;<br>
+    const optional<Z> rhs(z);<br>
+    try<br>
+    {<br>
+        optional<Z> lhs(rhs);<br>
+        assert(false);<br>
+    }<br>
+    catch (int i)<br>
+    {<br>
+        assert(i == 6);<br>
+    }<br>
+#endif<br>
+}<br>
+<br>
+template <class T, class ...InitArgs><br>
+void test_ref(InitArgs&&... args)<br>
+{<br>
+    const optional<T> rhs(std::forward<InitArgs>(arg<wbr>s)...);<br>
+    bool rhs_engaged = static_cast<bool>(rhs);<br>
+    optional<T> lhs = rhs;<br>
+    assert(static_cast<bool>(lhs) == rhs_engaged);<br>
+    if (rhs_engaged)<br>
+        assert(&(*lhs) == &(*rhs));<br>
+}<br>
+<br>
+<br>
+void test_reference_extension()<br>
+{<br>
+#if defined(_LIBCPP_VERSION) && 0 // FIXME these extensions are currently disabled.<br>
+    using T = TestTypes::TestType;<br>
+    T::reset();<br>
+    {<br>
+        T t;<br>
+        T::reset_constructors();<br>
+        test_ref<T&>();<br>
+        test_ref<T&>(t);<br>
+        assert(T::alive == 1);<br>
+        assert(T::constructed == 0);<br>
+        assert(T::assigned == 0);<br>
+        assert(T::destroyed == 0);<br>
+    }<br>
+    assert(T::destroyed == 1);<br>
+    assert(T::alive == 0);<br>
+    {<br>
+        T t;<br>
+        const T& ct = t;<br>
+        T::reset_constructors();<br>
+        test_ref<T const&>();<br>
+        test_ref<T const&>(t);<br>
+        test_ref<T const&>(ct);<br>
+        assert(T::alive == 1);<br>
+        assert(T::constructed == 0);<br>
+        assert(T::assigned == 0);<br>
+        assert(T::destroyed == 0);<br>
+    }<br>
+    assert(T::alive == 0);<br>
+    assert(T::destroyed == 1);<br>
+    {<br>
+        static_assert(!std::is_copy_co<wbr>nstructible<std::optional<T&&><wbr>>::value, "");<br>
+        static_assert(!std::is_copy_co<wbr>nstructible<std::optional<T const&&>>::value, "");<br>
+    }<br>
+#endif<br>
+}<br>
+<br>
+int main()<br>
+{<br>
+    test<int>();<br>
+    test<int>(3);<br>
+    {<br>
+        using T = TestTypes::TestType;<br>
+        T::reset();<br>
+        const optional<T> rhs;<br>
+        assert(T::alive == 0);<br>
+        const optional<T> lhs(rhs);<br>
+        assert(lhs.has_value() == false);<br>
+        assert(T::alive == 0);<br>
+    }<br>
+    TestTypes::TestType::reset();<br>
+    {<br>
+        using T = TestTypes::TestType;<br>
+        T::reset();<br>
+        const optional<T> rhs(42);<br>
+        assert(T::alive == 1);<br>
+        assert(T::value_constructed == 1);<br>
+        assert(T::copy_constructed == 0);<br>
+        const optional<T> lhs(rhs);<br>
+        assert(lhs.has_value());<br>
+        assert(T::copy_constructed == 1);<br>
+        assert(T::alive == 2);<br>
+    }<br>
+    TestTypes::TestType::reset();<br>
+    {<br>
+        using namespace ConstexprTestTypes;<br>
+        test<TestType>();<br>
+        test<TestType>(42);<br>
+    }<br>
+    {<br>
+        using namespace TrivialTestTypes;<br>
+        test<TestType>();<br>
+        test<TestType>(42);<br>
+    }<br>
+    {<br>
+        test_throwing_ctor();<br>
+    }<br>
+    {<br>
+        test_reference_extension();<br>
+    }<br>
+}<br>
<br>
Added: libcxx/trunk/test/std/utilitie<wbr>s/optional/optional.object/<wbr>optional.object.ctor/default.<wbr>pass.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/std/utilities/optional/optional.object/optional.object.ctor/default.pass.cpp?rev=283980&view=auto" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-pr<wbr>oject/libcxx/trunk/test/std/ut<wbr>ilities/optional/optional.obje<wbr>ct/optional.object.ctor/defaul<wbr>t.pass.cpp?rev=283980&view=<wbr>auto</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- libcxx/trunk/test/std/utilitie<wbr>s/optional/optional.object/<wbr>optional.object.ctor/default.<wbr>pass.cpp (added)<br>
+++ libcxx/trunk/test/std/utilitie<wbr>s/optional/optional.object/<wbr>optional.object.ctor/default.<wbr>pass.cpp Wed Oct 12 02:46:20 2016<br>
@@ -0,0 +1,81 @@<br>
+//===------------------------<wbr>------------------------------<wbr>----------------===//<br>
+//<br>
+//                     The LLVM Compiler Infrastructure<br>
+//<br>
+// This file is dual licensed under the MIT and the University of Illinois Open<br>
+// Source Licenses. See LICENSE.TXT for details.<br>
+//<br>
+//===------------------------<wbr>------------------------------<wbr>----------------===//<br>
+<br>
+// UNSUPPORTED: c++98, c++03, c++11, c++14<br>
+// <optional><br>
+<br>
+// constexpr optional() noexcept;<br>
+<br>
+#include <optional><br>
+#include <type_traits><br>
+#include <cassert><br>
+<br>
+#include "test_macros.h"<br>
+#include "archetypes.hpp"<br>
+<br>
+using std::optional;<br>
+<br>
+template <class Opt><br>
+void<br>
+test_constexpr()<br>
+{<br>
+    static_assert(std::is_nothrow_<wbr>default_constructible<Opt>::va<wbr>lue, "");<br>
+    static_assert(std::is_triviall<wbr>y_destructible<Opt>::value, "");<br>
+    static_assert(std::is_triviall<wbr>y_destructible<typename Opt::value_type>::value, "");<br>
+<br>
+    constexpr Opt opt;<br>
+    static_assert(static_cast<bool<wbr>>(opt) == false, "");<br>
+<br>
+    struct test_constexpr_ctor<br>
+        : public Opt<br>
+    {<br>
+        constexpr test_constexpr_ctor() {}<br>
+    };<br>
+}<br>
+<br>
+template <class Opt><br>
+void<br>
+test()<br>
+{<br>
+    static_assert(std::is_nothrow_<wbr>default_constructible<Opt>::va<wbr>lue, "");<br>
+    static_assert(!std::is_trivial<wbr>ly_destructible<Opt>::value, "");<br>
+    static_assert(!std::is_trivial<wbr>ly_destructible<typename Opt::value_type>::value, "");<br>
+    {<br>
+        Opt opt;<br>
+        assert(static_cast<bool>(opt) == false);<br>
+    }<br>
+    {<br>
+        const Opt opt;<br>
+        assert(static_cast<bool>(opt) == false);<br>
+    }<br>
+<br>
+    struct test_constexpr_ctor<br>
+        : public Opt<br>
+    {<br>
+        constexpr test_constexpr_ctor() {}<br>
+    };<br>
+}<br>
+<br>
+int main()<br>
+{<br>
+    test_constexpr<optional<int>>(<wbr>);<br>
+    test_constexpr<optional<int*>><wbr>();<br>
+    test_constexpr<optional<Implic<wbr>itTypes::NoCtors>>();<br>
+    test_constexpr<optional<NonTri<wbr>vialTypes::NoCtors>>();<br>
+    test_constexpr<optional<NonCon<wbr>stexprTypes::NoCtors>>();<br>
+    test<optional<NonLiteralTypes:<wbr>:NoCtors>>();<br>
+    // EXTENSIONS<br>
+#if defined(_LIBCPP_VERSION) && 0 // FIXME these extensions are currently disabled.<br>
+    test_constexpr<optional<int&>><wbr>();<br>
+    test_constexpr<optional<const int&>>();<br>
+    test_constexpr<optional<int&>><wbr>();<br>
+    test_constexpr<optional<NonLit<wbr>eralTypes::NoCtors&>>();<br>
+    test_constexpr<optional<NonLit<wbr>eralTypes::NoCtors&&>>();<br>
+#endif<br>
+}<br>
<br>
Added: libcxx/trunk/test/std/utilitie<wbr>s/optional/optional.object/<wbr>optional.object.ctor/explicit_<wbr>const_optional_U.pass.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/std/utilities/optional/optional.object/optional.object.ctor/explicit_const_optional_U.pass.cpp?rev=283980&view=auto" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-pr<wbr>oject/libcxx/trunk/test/std/ut<wbr>ilities/optional/optional.obje<wbr>ct/optional.object.ctor/explic<wbr>it_const_optional_U.pass.cpp?<wbr>rev=283980&view=auto</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- libcxx/trunk/test/std/utilitie<wbr>s/optional/optional.object/<wbr>optional.object.ctor/explicit_<wbr>const_optional_U.pass.cpp (added)<br>
+++ libcxx/trunk/test/std/utilitie<wbr>s/optional/optional.object/<wbr>optional.object.ctor/explicit_<wbr>const_optional_U.pass.cpp Wed Oct 12 02:46:20 2016<br>
@@ -0,0 +1,121 @@<br>
+//===------------------------<wbr>------------------------------<wbr>----------------===//<br>
+//<br>
+//                     The LLVM Compiler Infrastructure<br>
+//<br>
+// This file is dual licensed under the MIT and the University of Illinois Open<br>
+// Source Licenses. See LICENSE.TXT for details.<br>
+//<br>
+//===------------------------<wbr>------------------------------<wbr>----------------===//<br>
+<br>
+// UNSUPPORTED: c++98, c++03, c++11, c++14<br>
+// <optional><br>
+<br>
+// template <class U><br>
+//   explicit optional(const optional<U>& rhs);<br>
+<br>
+#include <optional><br>
+#include <type_traits><br>
+#include <cassert><br>
+<br>
+#include "test_macros.h"<br>
+<br>
+using std::optional;<br>
+<br>
+template <class T, class U><br>
+void<br>
+test(const optional<U>& rhs, bool is_going_to_throw = false)<br>
+{<br>
+    static_assert(!(std::is_conver<wbr>tible<const optional<U>&, optional<T>>::value), "");<br>
+    bool rhs_engaged = static_cast<bool>(rhs);<br>
+#ifndef TEST_HAS_NO_EXCEPTIONS<br>
+    try<br>
+    {<br>
+        optional<T> lhs(rhs);<br>
+        assert(is_going_to_throw == false);<br>
+        assert(static_cast<bool>(lhs) == rhs_engaged);<br>
+        if (rhs_engaged)<br>
+            assert(*lhs == T(*rhs));<br>
+    }<br>
+    catch (int i)<br>
+    {<br>
+        assert(i == 6);<br>
+    }<br>
+#else<br>
+    if (is_going_to_throw) return;<br>
+    optional<T> lhs(rhs);<br>
+    assert(static_cast<bool>(lhs) == rhs_engaged);<br>
+    if (rhs_engaged)<br>
+        assert(*lhs == T(*rhs));<br>
+#endif<br>
+}<br>
+<br>
+class X<br>
+{<br>
+    int i_;<br>
+public:<br>
+    explicit X(int i) : i_(i) {}<br>
+    X(const X& x) : i_(x.i_) {}<br>
+    ~X() {i_ = 0;}<br>
+    friend bool operator==(const X& x, const X& y) {return x.i_ == y.i_;}<br>
+};<br>
+<br>
+class Y<br>
+{<br>
+    int i_;<br>
+public:<br>
+    explicit Y(int i) : i_(i) {}<br>
+<br>
+    friend constexpr bool operator==(const Y& x, const Y& y) {return x.i_ == y.i_;}<br>
+};<br>
+<br>
+int count = 0;<br>
+<br>
+class Z<br>
+{<br>
+    int i_;<br>
+public:<br>
+    explicit Z(int i) : i_(i) { TEST_THROW(6);}<br>
+<br>
+    friend constexpr bool operator==(const Z& x, const Z& y) {return x.i_ == y.i_;}<br>
+};<br>
+<br>
+<br>
+int main()<br>
+{<br>
+    {<br>
+        typedef X T;<br>
+        typedef int U;<br>
+        optional<U> rhs;<br>
+        test<T>(rhs);<br>
+    }<br>
+    {<br>
+        typedef X T;<br>
+        typedef int U;<br>
+        optional<U> rhs(3);<br>
+        test<T>(rhs);<br>
+    }<br>
+    {<br>
+        typedef Y T;<br>
+        typedef int U;<br>
+        optional<U> rhs;<br>
+        test<T>(rhs);<br>
+    }<br>
+    {<br>
+        typedef Y T;<br>
+        typedef int U;<br>
+        optional<U> rhs(3);<br>
+        test<T>(rhs);<br>
+    }<br>
+    {<br>
+        typedef Z T;<br>
+        typedef int U;<br>
+        optional<U> rhs;<br>
+        test<T>(rhs);<br>
+    }<br>
+    {<br>
+        typedef Z T;<br>
+        typedef int U;<br>
+        optional<U> rhs(3);<br>
+        test<T>(rhs, true);<br>
+    }<br>
+}<br>
<br>
Added: libcxx/trunk/test/std/utilitie<wbr>s/optional/optional.object/<wbr>optional.object.ctor/explicit_<wbr>optional_U.pass.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/std/utilities/optional/optional.object/optional.object.ctor/explicit_optional_U.pass.cpp?rev=283980&view=auto" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-pr<wbr>oject/libcxx/trunk/test/std/ut<wbr>ilities/optional/optional.obje<wbr>ct/optional.object.ctor/explic<wbr>it_optional_U.pass.cpp?rev=<wbr>283980&view=auto</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- libcxx/trunk/test/std/utilitie<wbr>s/optional/optional.object/<wbr>optional.object.ctor/explicit_<wbr>optional_U.pass.cpp (added)<br>
+++ libcxx/trunk/test/std/utilitie<wbr>s/optional/optional.object/<wbr>optional.object.ctor/explicit_<wbr>optional_U.pass.cpp Wed Oct 12 02:46:20 2016<br>
@@ -0,0 +1,84 @@<br>
+//===------------------------<wbr>------------------------------<wbr>----------------===//<br>
+//<br>
+//                     The LLVM Compiler Infrastructure<br>
+//<br>
+// This file is dual licensed under the MIT and the University of Illinois Open<br>
+// Source Licenses. See LICENSE.TXT for details.<br>
+//<br>
+//===------------------------<wbr>------------------------------<wbr>----------------===//<br>
+<br>
+// UNSUPPORTED: c++98, c++03, c++11, c++14<br>
+// <optional><br>
+<br>
+// template <class U><br>
+//   explicit optional(optional<U>&& rhs);<br>
+<br>
+#include <optional><br>
+#include <type_traits><br>
+#include <cassert><br>
+<br>
+#include "test_macros.h"<br>
+<br>
+using std::optional;<br>
+<br>
+template <class T, class U><br>
+void<br>
+test(optional<U>&& rhs, bool is_going_to_throw = false)<br>
+{<br>
+    static_assert(!(std::is_conver<wbr>tible<optional<U>&&, optional<T>>::value), "");<br>
+    bool rhs_engaged = static_cast<bool>(rhs);<br>
+#ifndef TEST_HAS_NO_EXCEPTIONS<br>
+    try<br>
+    {<br>
+        optional<T> lhs(std::move(rhs));<br>
+        assert(is_going_to_throw == false);<br>
+        assert(static_cast<bool>(lhs) == rhs_engaged);<br>
+    }<br>
+    catch (int i)<br>
+    {<br>
+        assert(i == 6);<br>
+    }<br>
+#else<br>
+    if (is_going_to_throw) return;<br>
+    optional<T> lhs(std::move(rhs));<br>
+    assert(static_cast<bool>(lhs) == rhs_engaged);<br>
+#endif<br>
+}<br>
+<br>
+class X<br>
+{<br>
+    int i_;<br>
+public:<br>
+    explicit X(int i) : i_(i) {}<br>
+    X(X&& x) : i_(std::exchange(x.i_, 0)) {}<br>
+    ~X() {i_ = 0;}<br>
+    friend bool operator==(const X& x, const X& y) {return x.i_ == y.i_;}<br>
+};<br>
+<br>
+int count = 0;<br>
+<br>
+class Z<br>
+{<br>
+public:<br>
+    explicit Z(int) { TEST_THROW(6); }<br>
+};<br>
+<br>
+int main()<br>
+{<br>
+    {<br>
+        optional<int> rhs;<br>
+        test<X>(std::move(rhs));<br>
+    }<br>
+    {<br>
+        optional<int> rhs(3);<br>
+        test<X>(std::move(rhs));<br>
+    }<br>
+    {<br>
+        optional<int> rhs;<br>
+        test<Z>(std::move(rhs));<br>
+    }<br>
+    {<br>
+        optional<int> rhs(3);<br>
+        test<Z>(std::move(rhs), true);<br>
+    }<br>
+}<br>
<br>
Added: libcxx/trunk/test/std/utilitie<wbr>s/optional/optional.object/<wbr>optional.object.ctor/in_place_<wbr>t.pass.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/std/utilities/optional/optional.object/optional.object.ctor/in_place_t.pass.cpp?rev=283980&view=auto" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-pr<wbr>oject/libcxx/trunk/test/std/ut<wbr>ilities/optional/optional.obje<wbr>ct/optional.object.ctor/in_<wbr>place_t.pass.cpp?rev=283980&<wbr>view=auto</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- libcxx/trunk/test/std/utilitie<wbr>s/optional/optional.object/<wbr>optional.object.ctor/in_place_<wbr>t.pass.cpp (added)<br>
+++ libcxx/trunk/test/std/utilitie<wbr>s/optional/optional.object/<wbr>optional.object.ctor/in_place_<wbr>t.pass.cpp Wed Oct 12 02:46:20 2016<br>
@@ -0,0 +1,144 @@<br>
+//===------------------------<wbr>------------------------------<wbr>----------------===//<br>
+//<br>
+//                     The LLVM Compiler Infrastructure<br>
+//<br>
+// This file is dual licensed under the MIT and the University of Illinois Open<br>
+// Source Licenses. See LICENSE.TXT for details.<br>
+//<br>
+//===------------------------<wbr>------------------------------<wbr>----------------===//<br>
+//<br>
+// UNSUPPORTED: c++98, c++03, c++11, c++14<br>
+<br>
+// <optional><br>
+<br>
+// template <class... Args><br>
+//   constexpr explicit optional(in_place_t, Args&&... args);<br>
+<br>
+#include <optional><br>
+#include <type_traits><br>
+#include <cassert><br>
+<br>
+#include "test_macros.h"<br>
+<br>
+using std::optional;<br>
+using std::in_place_t;<br>
+using std::in_place;<br>
+<br>
+class X<br>
+{<br>
+    int i_;<br>
+    int j_ = 0;<br>
+public:<br>
+    X() : i_(0) {}<br>
+    X(int i) : i_(i) {}<br>
+    X(int i, int j) : i_(i), j_(j) {}<br>
+<br>
+    ~X() {}<br>
+<br>
+    friend bool operator==(const X& x, const X& y)<br>
+        {return x.i_ == y.i_ && x.j_ == y.j_;}<br>
+};<br>
+<br>
+class Y<br>
+{<br>
+    int i_;<br>
+    int j_ = 0;<br>
+public:<br>
+    constexpr Y() : i_(0) {}<br>
+    constexpr Y(int i) : i_(i) {}<br>
+    constexpr Y(int i, int j) : i_(i), j_(j) {}<br>
+<br>
+    friend constexpr bool operator==(const Y& x, const Y& y)<br>
+        {return x.i_ == y.i_ && x.j_ == y.j_;}<br>
+};<br>
+<br>
+class Z<br>
+{<br>
+public:<br>
+    Z(int i) {TEST_THROW(6);}<br>
+};<br>
+<br>
+<br>
+int main()<br>
+{<br>
+    {<br>
+        constexpr optional<int> opt(in_place, 5);<br>
+        static_assert(static_cast<bool<wbr>>(opt) == true, "");<br>
+        static_assert(*opt == 5, "");<br>
+<br>
+        struct test_constexpr_ctor<br>
+            : public optional<int><br>
+        {<br>
+            constexpr test_constexpr_ctor(in_place_t<wbr>, int i)<br>
+                : optional<int>(in_place, i) {}<br>
+        };<br>
+<br>
+    }<br>
+    {<br>
+        const optional<X> opt(in_place);<br>
+        assert(static_cast<bool>(opt) == true);<br>
+        assert(*opt == X());<br>
+    }<br>
+    {<br>
+        const optional<X> opt(in_place, 5);<br>
+        assert(static_cast<bool>(opt) == true);<br>
+        assert(*opt == X(5));<br>
+    }<br>
+    {<br>
+        const optional<X> opt(in_place, 5, 4);<br>
+        assert(static_cast<bool>(opt) == true);<br>
+        assert(*opt == X(5, 4));<br>
+    }<br>
+    {<br>
+        constexpr optional<Y> opt(in_place);<br>
+        static_assert(static_cast<bool<wbr>>(opt) == true, "");<br>
+        static_assert(*opt == Y(), "");<br>
+<br>
+        struct test_constexpr_ctor<br>
+            : public optional<Y><br>
+        {<br>
+            constexpr test_constexpr_ctor(in_place_t<wbr>)<br>
+                : optional<Y>(in_place) {}<br>
+        };<br>
+<br>
+    }<br>
+    {<br>
+        constexpr optional<Y> opt(in_place, 5);<br>
+        static_assert(static_cast<bool<wbr>>(opt) == true, "");<br>
+        static_assert(*opt == Y(5), "");<br>
+<br>
+        struct test_constexpr_ctor<br>
+            : public optional<Y><br>
+        {<br>
+            constexpr test_constexpr_ctor(in_place_t<wbr>, int i)<br>
+                : optional<Y>(in_place, i) {}<br>
+        };<br>
+<br>
+    }<br>
+    {<br>
+        constexpr optional<Y> opt(in_place, 5, 4);<br>
+        static_assert(static_cast<bool<wbr>>(opt) == true, "");<br>
+        static_assert(*opt == Y(5, 4), "");<br>
+<br>
+        struct test_constexpr_ctor<br>
+            : public optional<Y><br>
+        {<br>
+            constexpr test_constexpr_ctor(in_place_t<wbr>, int i, int j)<br>
+                : optional<Y>(in_place, i, j) {}<br>
+        };<br>
+<br>
+    }<br>
+#ifndef TEST_HAS_NO_EXCEPTIONS<br>
+    {<br>
+        try<br>
+        {<br>
+            const optional<Z> opt(in_place, 1);<br>
+            assert(false);<br>
+        }<br>
+        catch (int i)<br>
+        {<br>
+            assert(i == 6);<br>
+        }<br>
+    }<br>
+#endif<br>
+}<br>
<br>
Added: libcxx/trunk/test/std/utilitie<wbr>s/optional/optional.object/<wbr>optional.object.ctor/initializ<wbr>er_list.pass.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/std/utilities/optional/optional.object/optional.object.ctor/initializer_list.pass.cpp?rev=283980&view=auto" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-pr<wbr>oject/libcxx/trunk/test/std/ut<wbr>ilities/optional/optional.obje<wbr>ct/optional.object.ctor/initia<wbr>lizer_list.pass.cpp?rev=283980<wbr>&view=auto</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- libcxx/trunk/test/std/utilitie<wbr>s/optional/optional.object/<wbr>optional.object.ctor/initializ<wbr>er_list.pass.cpp (added)<br>
+++ libcxx/trunk/test/std/utilitie<wbr>s/optional/optional.object/<wbr>optional.object.ctor/initializ<wbr>er_list.pass.cpp Wed Oct 12 02:46:20 2016<br>
@@ -0,0 +1,116 @@<br>
+//===------------------------<wbr>------------------------------<wbr>----------------===//<br>
+//<br>
+//                     The LLVM Compiler Infrastructure<br>
+//<br>
+// This file is dual licensed under the MIT and the University of Illinois Open<br>
+// Source Licenses. See LICENSE.TXT for details.<br>
+//<br>
+//===------------------------<wbr>------------------------------<wbr>----------------===//<br>
+<br>
+// UNSUPPORTED: c++98, c++03, c++11, c++14<br>
+// <optional><br>
+<br>
+// template <class U, class... Args><br>
+//     constexpr<br>
+//     explicit optional(in_place_t, initializer_list<U> il, Args&&... args);<br>
+<br>
+#include <optional><br>
+#include <type_traits><br>
+#include <vector><br>
+#include <cassert><br>
+<br>
+#include "test_macros.h"<br>
+<br>
+using std::optional;<br>
+using std::in_place_t;<br>
+using std::in_place;<br>
+<br>
+class X<br>
+{<br>
+    int i_;<br>
+    int j_ = 0;<br>
+public:<br>
+    X() : i_(0) {}<br>
+    X(int i) : i_(i) {}<br>
+    X(int i, int j) : i_(i), j_(j) {}<br>
+<br>
+    ~X() {}<br>
+<br>
+    friend bool operator==(const X& x, const X& y)<br>
+        {return x.i_ == y.i_ && x.j_ == y.j_;}<br>
+};<br>
+<br>
+class Y<br>
+{<br>
+    int i_;<br>
+    int j_ = 0;<br>
+public:<br>
+    constexpr Y() : i_(0) {}<br>
+    constexpr Y(int i) : i_(i) {}<br>
+    constexpr Y(std::initializer_list<int> il) : i_(il.begin()[0]), j_(il.begin()[1]) {}<br>
+<br>
+    friend constexpr bool operator==(const Y& x, const Y& y)<br>
+        {return x.i_ == y.i_ && x.j_ == y.j_;}<br>
+};<br>
+<br>
+class Z<br>
+{<br>
+    int i_;<br>
+    int j_ = 0;<br>
+public:<br>
+    Z() : i_(0) {}<br>
+    Z(int i) : i_(i) {}<br>
+    Z(std::initializer_list<int> il) : i_(il.begin()[0]), j_(il.begin()[1])<br>
+        {TEST_THROW(6);}<br>
+<br>
+    friend bool operator==(const Z& x, const Z& y)<br>
+        {return x.i_ == y.i_ && x.j_ == y.j_;}<br>
+};<br>
+<br>
+int main()<br>
+{<br>
+    {<br>
+        static_assert(!std::is_constru<wbr>ctible<X, std::initializer_list<int>&>::<wbr>value, "");<br>
+        static_assert(!std::is_constru<wbr>ctible<optional<X>, std::initializer_list<int>&>::<wbr>value, "");<br>
+    }<br>
+    {<br>
+        optional<std::vector<int>> opt(in_place, {3, 1});<br>
+        assert(static_cast<bool>(opt) == true);<br>
+        assert((*opt == std::vector<int>{3, 1}));<br>
+        assert(opt->size() == 2);<br>
+    }<br>
+    {<br>
+        optional<std::vector<int>> opt(in_place, {3, 1}, std::allocator<int>());<br>
+        assert(static_cast<bool>(opt) == true);<br>
+        assert((*opt == std::vector<int>{3, 1}));<br>
+        assert(opt->size() == 2);<br>
+    }<br>
+    {<br>
+        static_assert(std::is_construc<wbr>tible<optional<Y>, std::initializer_list<int>&>::<wbr>value, "");<br>
+        constexpr optional<Y> opt(in_place, {3, 1});<br>
+        static_assert(static_cast<bool<wbr>>(opt) == true, "");<br>
+        static_assert(*opt == Y{3, 1}, "");<br>
+<br>
+        struct test_constexpr_ctor<br>
+            : public optional<Y><br>
+        {<br>
+            constexpr test_constexpr_ctor(in_place_t<wbr>, std::initializer_list<int> i)<br>
+                : optional<Y>(in_place, i) {}<br>
+        };<br>
+<br>
+    }<br>
+#ifndef TEST_HAS_NO_EXCEPTIONS<br>
+    {<br>
+        static_assert(std::is_construc<wbr>tible<optional<Z>, std::initializer_list<int>&>::<wbr>value, "");<br>
+        try<br>
+        {<br>
+            optional<Z> opt(in_place, {3, 1});<br>
+            assert(false);<br>
+        }<br>
+        catch (int i)<br>
+        {<br>
+            assert(i == 6);<br>
+        }<br>
+    }<br>
+#endif<br>
+}<br>
<br>
Added: libcxx/trunk/test/std/utilitie<wbr>s/optional/optional.object/<wbr>optional.object.ctor/move.<wbr>pass.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/std/utilities/optional/optional.object/optional.object.ctor/move.pass.cpp?rev=283980&view=auto" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-pr<wbr>oject/libcxx/trunk/test/std/ut<wbr>ilities/optional/optional.obje<wbr>ct/optional.object.ctor/move.<wbr>pass.cpp?rev=283980&view=auto</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- libcxx/trunk/test/std/utilitie<wbr>s/optional/optional.object/<wbr>optional.object.ctor/move.<wbr>pass.cpp (added)<br>
+++ libcxx/trunk/test/std/utilitie<wbr>s/optional/optional.object/<wbr>optional.object.ctor/move.<wbr>pass.cpp Wed Oct 12 02:46:20 2016<br>
@@ -0,0 +1,196 @@<br>
+//===------------------------<wbr>------------------------------<wbr>----------------===//<br>
+//<br>
+//                     The LLVM Compiler Infrastructure<br>
+//<br>
+// This file is dual licensed under the MIT and the University of Illinois Open<br>
+// Source Licenses. See LICENSE.TXT for details.<br>
+//<br>
+//===------------------------<wbr>------------------------------<wbr>----------------===//<br>
+<br>
+// UNSUPPORTED: c++98, c++03, c++11, c++14<br>
+// <optional><br>
+<br>
+// optional(optional<T>&& rhs);<br>
+<br>
+#include <optional><br>
+#include <type_traits><br>
+#include <cassert><br>
+<br>
+#include "test_macros.h"<br>
+#include "archetypes.hpp"<br>
+<br>
+using std::optional;<br>
+<br>
+template <class T, class ...InitArgs><br>
+void test(InitArgs&&... args)<br>
+{<br>
+    const optional<T> orig(std::forward<InitArgs>(ar<wbr>gs)...);<br>
+    optional<T> rhs(orig);<br>
+    bool rhs_engaged = static_cast<bool>(rhs);<br>
+    optional<T> lhs = std::move(rhs);<br>
+    assert(static_cast<bool>(lhs) == rhs_engaged);<br>
+    if (rhs_engaged)<br>
+        assert(*lhs == *orig);<br>
+}<br>
+<br>
+void test_throwing_ctor() {<br>
+#ifndef TEST_HAS_NO_EXCEPTIONS<br>
+    struct Z {<br>
+      Z() : count(0) {}<br>
+      Z(Z&& o) : count(o.count + 1)<br>
+      { if (count == 2) throw 6; }<br>
+      int count;<br>
+    };<br>
+    Z z;<br>
+    optional<Z> rhs(std::move(z));<br>
+    try<br>
+    {<br>
+        optional<Z> lhs(std::move(rhs));<br>
+        assert(false);<br>
+    }<br>
+    catch (int i)<br>
+    {<br>
+        assert(i == 6);<br>
+    }<br>
+#endif<br>
+}<br>
+<br>
+<br>
+template <class T, class ...InitArgs><br>
+void test_ref(InitArgs&&... args)<br>
+{<br>
+    optional<T> rhs(std::forward<InitArgs>(arg<wbr>s)...);<br>
+    bool rhs_engaged = static_cast<bool>(rhs);<br>
+    optional<T> lhs = std::move(rhs);<br>
+    assert(static_cast<bool>(lhs) == rhs_engaged);<br>
+    if (rhs_engaged)<br>
+        assert(&(*lhs) == &(*rhs));<br>
+}<br>
+<br>
+void test_reference_extension()<br>
+{<br>
+#if defined(_LIBCPP_VERSION) && 0 // FIXME these extensions are currently disabled.<br>
+    using T = TestTypes::TestType;<br>
+    T::reset();<br>
+    {<br>
+        T t;<br>
+        T::reset_constructors();<br>
+        test_ref<T&>();<br>
+        test_ref<T&>(t);<br>
+        assert(T::alive == 1);<br>
+        assert(T::constructed == 0);<br>
+        assert(T::assigned == 0);<br>
+        assert(T::destroyed == 0);<br>
+    }<br>
+    assert(T::destroyed == 1);<br>
+    assert(T::alive == 0);<br>
+    {<br>
+        T t;<br>
+        const T& ct = t;<br>
+        T::reset_constructors();<br>
+        test_ref<T const&>();<br>
+        test_ref<T const&>(t);<br>
+        test_ref<T const&>(ct);<br>
+        assert(T::alive == 1);<br>
+        assert(T::constructed == 0);<br>
+        assert(T::assigned == 0);<br>
+        assert(T::destroyed == 0);<br>
+    }<br>
+    assert(T::alive == 0);<br>
+    assert(T::destroyed == 1);<br>
+    {<br>
+        T t;<br>
+        T::reset_constructors();<br>
+        test_ref<T&&>();<br>
+        test_ref<T&&>(std::move(t));<br>
+        assert(T::alive == 1);<br>
+        assert(T::constructed == 0);<br>
+        assert(T::assigned == 0);<br>
+        assert(T::destroyed == 0);<br>
+    }<br>
+    assert(T::alive == 0);<br>
+    assert(T::destroyed == 1);<br>
+    {<br>
+        T t;<br>
+        const T& ct = t;<br>
+        T::reset_constructors();<br>
+        test_ref<T const&&>();<br>
+        test_ref<T const&&>(std::move(t));<br>
+        test_ref<T const&&>(std::move(ct));<br>
+        assert(T::alive == 1);<br>
+        assert(T::constructed == 0);<br>
+        assert(T::assigned == 0);<br>
+        assert(T::destroyed == 0);<br>
+    }<br>
+    assert(T::alive == 0);<br>
+    assert(T::destroyed == 1);<br>
+    {<br>
+        static_assert(!std::is_copy_co<wbr>nstructible<std::optional<T&&><wbr>>::value, "");<br>
+        static_assert(!std::is_copy_co<wbr>nstructible<std::optional<T const&&>>::value, "");<br>
+    }<br>
+#endif<br>
+}<br>
+<br>
+<br>
+int main()<br>
+{<br>
+    test<int>();<br>
+    test<int>(3);<br>
+    {<br>
+        using T = TestTypes::TestType;<br>
+        T::reset();<br>
+        optional<T> rhs;<br>
+        assert(T::alive == 0);<br>
+        const optional<T> lhs(std::move(rhs));<br>
+        assert(lhs.has_value() == false);<br>
+        assert(rhs.has_value() == false);<br>
+        assert(T::alive == 0);<br>
+    }<br>
+    TestTypes::TestType::reset();<br>
+    {<br>
+        using T = TestTypes::TestType;<br>
+        T::reset();<br>
+        optional<T> rhs(42);<br>
+        assert(T::alive == 1);<br>
+        assert(T::value_constructed == 1);<br>
+        assert(T::move_constructed == 0);<br>
+        const optional<T> lhs(std::move(rhs));<br>
+        assert(lhs.has_value());<br>
+        assert(rhs.has_value());<br>
+        assert(lhs.value().value == 42);<br>
+        assert(rhs.value().value == -1);<br>
+        assert(T::move_constructed == 1);<br>
+        assert(T::alive == 2);<br>
+    }<br>
+    TestTypes::TestType::reset();<br>
+    {<br>
+        using namespace ConstexprTestTypes;<br>
+        test<TestType>();<br>
+        test<TestType>(42);<br>
+    }<br>
+    {<br>
+        using namespace TrivialTestTypes;<br>
+        test<TestType>();<br>
+        test<TestType>(42);<br>
+    }<br>
+    {<br>
+        test_throwing_ctor();<br>
+    }<br>
+    {<br>
+        struct ThrowsMove {<br>
+          ThrowsMove() noexcept(false) {}<br>
+          ThrowsMove(ThrowsMove const&) noexcept(false) {}<br>
+          ThrowsMove(ThrowsMove &&) noexcept(false) {}<br>
+        };<br>
+        static_assert(!std::is_nothrow<wbr>_move_constructible<optional<<wbr>ThrowsMove>>::value, "");<br>
+        struct NoThrowMove {<br>
+          NoThrowMove() noexcept(false) {}<br>
+          NoThrowMove(NoThrowMove const&) noexcept(false) {}<br>
+          NoThrowMove(NoThrowMove &&) noexcept(true) {}<br>
+        };<br>
+        static_assert(std::is_nothrow_<wbr>move_constructible<optional<No<wbr>ThrowMove>>::value, "");<br>
+    }<br>
+    {<br>
+        test_reference_extension();<br>
+    }<br>
+}<br>
<br>
Added: libcxx/trunk/test/std/utilitie<wbr>s/optional/optional.object/<wbr>optional.object.ctor/nullopt_<wbr>t.pass.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/std/utilities/optional/optional.object/optional.object.ctor/nullopt_t.pass.cpp?rev=283980&view=auto" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-pr<wbr>oject/libcxx/trunk/test/std/ut<wbr>ilities/optional/optional.obje<wbr>ct/optional.object.ctor/nullop<wbr>t_t.pass.cpp?rev=283980&view=<wbr>auto</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- libcxx/trunk/test/std/utilitie<wbr>s/optional/optional.object/<wbr>optional.object.ctor/nullopt_<wbr>t.pass.cpp (added)<br>
+++ libcxx/trunk/test/std/utilitie<wbr>s/optional/optional.object/<wbr>optional.object.ctor/nullopt_<wbr>t.pass.cpp Wed Oct 12 02:46:20 2016<br>
@@ -0,0 +1,73 @@<br>
+//===------------------------<wbr>------------------------------<wbr>----------------===//<br>
+//<br>
+//                     The LLVM Compiler Infrastructure<br>
+//<br>
+// This file is dual licensed under the MIT and the University of Illinois Open<br>
+// Source Licenses. See LICENSE.TXT for details.<br>
+//<br>
+//===------------------------<wbr>------------------------------<wbr>----------------===//<br>
+<br>
+// UNSUPPORTED: c++98, c++03, c++11, c++14<br>
+// <optional><br>
+<br>
+// constexpr optional(nullopt_t) noexcept;<br>
+<br>
+#include <optional><br>
+#include <type_traits><br>
+#include <cassert><br>
+<br>
+#include "archetypes.hpp"<br>
+<br>
+using std::optional;<br>
+using std::nullopt_t;<br>
+using std::nullopt;<br>
+<br>
+template <class Opt><br>
+void<br>
+test_constexpr()<br>
+{<br>
+    static_assert(std::is_nothrow_<wbr>constructible<Opt, nullopt_t&>::value, "");<br>
+    static_assert(std::is_triviall<wbr>y_destructible<Opt>::value, "");<br>
+    static_assert(std::is_triviall<wbr>y_destructible<typename Opt::value_type>::value, "");<br>
+<br>
+    constexpr Opt opt(nullopt);<br>
+    static_assert(static_cast<bool<wbr>>(opt) == false, "");<br>
+<br>
+    struct test_constexpr_ctor<br>
+        : public Opt<br>
+    {<br>
+        constexpr test_constexpr_ctor() {}<br>
+    };<br>
+}<br>
+<br>
+template <class Opt><br>
+void<br>
+test()<br>
+{<br>
+    static_assert(std::is_nothrow_<wbr>constructible<Opt, nullopt_t&>::value, "");<br>
+    static_assert(!std::is_trivial<wbr>ly_destructible<Opt>::value, "");<br>
+    static_assert(!std::is_trivial<wbr>ly_destructible<typename Opt::value_type>::value, "");<br>
+    {<br>
+    Opt opt(nullopt);<br>
+    assert(static_cast<bool>(opt) == false);<br>
+    }<br>
+    {<br>
+    const Opt opt(nullopt);<br>
+    assert(static_cast<bool>(opt) == false);<br>
+    }<br>
+    struct test_constexpr_ctor<br>
+        : public Opt<br>
+    {<br>
+        constexpr test_constexpr_ctor() {}<br>
+    };<br>
+}<br>
+<br>
+int main()<br>
+{<br>
+    test_constexpr<optional<int>>(<wbr>);<br>
+    test_constexpr<optional<int*>><wbr>();<br>
+    test_constexpr<optional<Implic<wbr>itTypes::NoCtors>>();<br>
+    test_constexpr<optional<NonTri<wbr>vialTypes::NoCtors>>();<br>
+    test_constexpr<optional<NonCon<wbr>stexprTypes::NoCtors>>();<br>
+    test<optional<NonLiteralTypes:<wbr>:NoCtors>>();<br>
+}<br>
<br>
Added: libcxx/trunk/test/std/utilitie<wbr>s/optional/optional.object/<wbr>optional.object.ctor/optional_<wbr>U.pass.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/std/utilities/optional/optional.object/optional.object.ctor/optional_U.pass.cpp?rev=283980&view=auto" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-pr<wbr>oject/libcxx/trunk/test/std/ut<wbr>ilities/optional/optional.obje<wbr>ct/optional.object.ctor/option<wbr>al_U.pass.cpp?rev=283980&view=<wbr>auto</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- libcxx/trunk/test/std/utilitie<wbr>s/optional/optional.object/<wbr>optional.object.ctor/optional_<wbr>U.pass.cpp (added)<br>
+++ libcxx/trunk/test/std/utilitie<wbr>s/optional/optional.object/<wbr>optional.object.ctor/optional_<wbr>U.pass.cpp Wed Oct 12 02:46:20 2016<br>
@@ -0,0 +1,93 @@<br>
+//===------------------------<wbr>------------------------------<wbr>----------------===//<br>
+//<br>
+//                     The LLVM Compiler Infrastructure<br>
+//<br>
+// This file is dual licensed under the MIT and the University of Illinois Open<br>
+// Source Licenses. See LICENSE.TXT for details.<br>
+//<br>
+//===------------------------<wbr>------------------------------<wbr>----------------===//<br>
+<br>
+// UNSUPPORTED: c++98, c++03, c++11, c++14<br>
+// <optional><br>
+<br>
+// template <class U><br>
+//   optional(optional<U>&& rhs);<br>
+<br>
+#include <optional><br>
+#include <type_traits><br>
+#include <memory><br>
+#include <cassert><br>
+<br>
+#include "test_macros.h"<br>
+<br>
+using std::optional;<br>
+<br>
+template <class T, class U><br>
+void<br>
+test(optional<U>&& rhs, bool is_going_to_throw = false)<br>
+{<br>
+    bool rhs_engaged = static_cast<bool>(rhs);<br>
+#ifndef TEST_HAS_NO_EXCEPTIONS<br>
+    try<br>
+    {<br>
+        optional<T> lhs = std::move(rhs);<br>
+        assert(is_going_to_throw == false);<br>
+        assert(static_cast<bool>(lhs) == rhs_engaged);<br>
+    }<br>
+    catch (int i)<br>
+    {<br>
+        assert(i == 6);<br>
+    }<br>
+#else<br>
+    if (is_going_to_throw) return;<br>
+    optional<T> lhs = std::move(rhs);<br>
+    assert(static_cast<bool>(lhs) == rhs_engaged);<br>
+#endif<br>
+}<br>
+<br>
+class X<br>
+{<br>
+    int i_;<br>
+public:<br>
+    X(int i) : i_(i) {}<br>
+    X(X&& x) : i_(std::exchange(x.i_, 0)) {}<br>
+    ~X() {i_ = 0;}<br>
+    friend bool operator==(const X& x, const X& y) {return x.i_ == y.i_;}<br>
+};<br>
+<br>
+int count = 0;<br>
+<br>
+struct Z<br>
+{<br>
+    Z(int) { TEST_THROW(6); }<br>
+};<br>
+<br>
+int main()<br>
+{<br>
+    {<br>
+        optional<short> rhs;<br>
+        test<int>(std::move(rhs));<br>
+    }<br>
+    {<br>
+        optional<short> rhs(short{3});<br>
+        test<int>(std::move(rhs));<br>
+    }<br>
+    {<br>
+        optional<int> rhs;<br>
+        test<X>(std::move(rhs));<br>
+    }<br>
+    {<br>
+        optional<int> rhs(3);<br>
+        test<X>(std::move(rhs));<br>
+    }<br>
+    {<br>
+        optional<int> rhs;<br>
+        test<Z>(std::move(rhs));<br>
+    }<br>
+    {<br>
+        optional<int> rhs(3);<br>
+        test<Z>(std::move(rhs), true);<br>
+    }<br>
+<br>
+    static_assert(!(std::is_constr<wbr>uctible<optional<X>, optional<Z>>::value), "");<br>
+}<br>
<br>
Added: libcxx/trunk/test/std/utilitie<wbr>s/optional/optional.object/<wbr>optional.object.ctor/rvalue_T.<wbr>pass.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/std/utilities/optional/optional.object/optional.object.ctor/rvalue_T.pass.cpp?rev=283980&view=auto" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-pr<wbr>oject/libcxx/trunk/test/std/ut<wbr>ilities/optional/optional.obje<wbr>ct/optional.object.ctor/rvalue<wbr>_T.pass.cpp?rev=283980&view=<wbr>auto</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- libcxx/trunk/test/std/utilitie<wbr>s/optional/optional.object/<wbr>optional.object.ctor/rvalue_T.<wbr>pass.cpp (added)<br>
+++ libcxx/trunk/test/std/utilitie<wbr>s/optional/optional.object/<wbr>optional.object.ctor/rvalue_T.<wbr>pass.cpp Wed Oct 12 02:46:20 2016<br>
@@ -0,0 +1,148 @@<br>
+//===------------------------<wbr>------------------------------<wbr>----------------===//<br>
+//<br>
+//                     The LLVM Compiler Infrastructure<br>
+//<br>
+// This file is dual licensed under the MIT and the University of Illinois Open<br>
+// Source Licenses. See LICENSE.TXT for details.<br>
+//<br>
+//===------------------------<wbr>------------------------------<wbr>----------------===//<br>
+//<br>
+// UNSUPPORTED: c++98, c++03, c++11, c++14<br>
+<br>
+// <optional><br>
+<br>
+// constexpr optional(T&& v);<br>
+<br>
+#include <optional><br>
+#include <type_traits><br>
+#include <cassert><br>
+<br>
+#include "test_macros.h"<br>
+#include "archetypes.hpp"<br>
+<br>
+<br>
+using std::optional;<br>
+<br>
+<br>
+class Z<br>
+{<br>
+public:<br>
+    Z(int) {}<br>
+    Z(Z&&) {TEST_THROW(6);}<br>
+};<br>
+<br>
+<br>
+int main()<br>
+{<br>
+    {<br>
+        typedef int T;<br>
+        constexpr optional<T> opt(T(5));<br>
+        static_assert(static_cast<bool<wbr>>(opt) == true, "");<br>
+        static_assert(*opt == 5, "");<br>
+<br>
+        struct test_constexpr_ctor<br>
+            : public optional<T><br>
+        {<br>
+            constexpr test_constexpr_ctor(T&&) {}<br>
+        };<br>
+    }<br>
+    {<br>
+        typedef double T;<br>
+        constexpr optional<T> opt(T(3));<br>
+        static_assert(static_cast<bool<wbr>>(opt) == true, "");<br>
+        static_assert(*opt == 3, "");<br>
+<br>
+        struct test_constexpr_ctor<br>
+            : public optional<T><br>
+        {<br>
+            constexpr test_constexpr_ctor(T&&) {}<br>
+        };<br>
+    }<br>
+    {<br>
+        typedef TestTypes::TestType T;<br>
+        T::reset();<br>
+        optional<T> opt = T{3};<br>
+        assert(T::alive == 1);<br>
+        assert(T::move_constructed == 1);<br>
+        assert(static_cast<bool>(opt) == true);<br>
+        assert(opt.value().value == 3);<br>
+    }<br>
+    {<br>
+        typedef ExplicitTestTypes::TestType T;<br>
+        static_assert(!std::is_convert<wbr>ible<T&&, optional<T>>::value, "");<br>
+        T::reset();<br>
+        optional<T> opt(T{3});<br>
+        assert(T::alive == 1);<br>
+        assert(T::move_constructed == 1);<br>
+        assert(static_cast<bool>(opt) == true);<br>
+        assert(opt.value().value == 3);<br>
+    }<br>
+    {<br>
+        typedef TestTypes::TestType T;<br>
+        T::reset();<br>
+        optional<T> opt = {3};<br>
+        assert(T::alive == 1);<br>
+        assert(T::value_constructed == 1);<br>
+        assert(T::copy_constructed == 0);<br>
+        assert(T::move_constructed == 0);<br>
+        assert(static_cast<bool>(opt) == true);<br>
+        assert(opt.value().value == 3);<br>
+    }<br>
+    {<br>
+        typedef ConstexprTestTypes::TestType T;<br>
+        constexpr optional<T> opt = {T(3)};<br>
+        static_assert(static_cast<bool<wbr>>(opt) == true, "");<br>
+        static_assert(opt.value().valu<wbr>e == 3, "");<br>
+<br>
+        struct test_constexpr_ctor<br>
+            : public optional<T><br>
+        {<br>
+            constexpr test_constexpr_ctor(const T&) {}<br>
+        };<br>
+    }<br>
+    {<br>
+        typedef ConstexprTestTypes::TestType T;<br>
+        constexpr optional<T> opt = {3};<br>
+        static_assert(static_cast<bool<wbr>>(opt) == true, "");<br>
+        static_assert(opt.value().valu<wbr>e == 3, "");<br>
+<br>
+        struct test_constexpr_ctor<br>
+            : public optional<T><br>
+        {<br>
+            constexpr test_constexpr_ctor(const T&) {}<br>
+        };<br>
+    }<br>
+    {<br>
+        typedef ExplicitConstexprTestTypes::Te<wbr>stType T;<br>
+        static_assert(!std::is_convert<wbr>ible<T&&, optional<T>>::value, "");<br>
+        constexpr optional<T> opt(T{3});<br>
+        static_assert(static_cast<bool<wbr>>(opt) == true, "");<br>
+        static_assert(opt.value().valu<wbr>e == 3, "");<br>
+<br>
+        struct test_constexpr_ctor<br>
+            : public optional<T><br>
+        {<br>
+            constexpr test_constexpr_ctor(T&&) {}<br>
+        };<br>
+<br>
+    }<br>
+#ifndef TEST_HAS_NO_EXCEPTIONS<br>
+    {<br>
+        struct Z {<br>
+            Z(int) {}<br>
+            Z(Z&&) {throw 6;}<br>
+        };<br>
+        typedef Z T;<br>
+        try<br>
+        {<br>
+            T t(3);<br>
+            optional<T> opt(std::move(t));<br>
+            assert(false);<br>
+        }<br>
+        catch (int i)<br>
+        {<br>
+            assert(i == 6);<br>
+        }<br>
+    }<br>
+#endif<br>
+}<br>
<br>
Added: libcxx/trunk/test/std/utilitie<wbr>s/optional/optional.object/<wbr>optional.object.dtor/dtor.<wbr>pass.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/std/utilities/optional/optional.object/optional.object.dtor/dtor.pass.cpp?rev=283980&view=auto" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-pr<wbr>oject/libcxx/trunk/test/std/ut<wbr>ilities/optional/optional.obje<wbr>ct/optional.object.dtor/dtor.<wbr>pass.cpp?rev=283980&view=auto</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- libcxx/trunk/test/std/utilitie<wbr>s/optional/optional.object/<wbr>optional.object.dtor/dtor.<wbr>pass.cpp (added)<br>
+++ libcxx/trunk/test/std/utilitie<wbr>s/optional/optional.object/<wbr>optional.object.dtor/dtor.<wbr>pass.cpp Wed Oct 12 02:46:20 2016<br>
@@ -0,0 +1,68 @@<br>
+//===------------------------<wbr>------------------------------<wbr>----------------===//<br>
+//<br>
+//                     The LLVM Compiler Infrastructure<br>
+//<br>
+// This file is dual licensed under the MIT and the University of Illinois Open<br>
+// Source Licenses. See LICENSE.TXT for details.<br>
+//<br>
+//===------------------------<wbr>------------------------------<wbr>----------------===//<br>
+<br>
+// UNSUPPORTED: c++98, c++03, c++11, c++14<br>
+// <optional><br>
+<br>
+// ~optional();<br>
+<br>
+#include <optional><br>
+#include <type_traits><br>
+#include <cassert><br>
+<br>
+using std::optional;<br>
+<br>
+struct PODType {<br>
+  int value;<br>
+  int value2;<br>
+};<br>
+<br>
+class X<br>
+{<br>
+public:<br>
+    static bool dtor_called;<br>
+    X() = default;<br>
+    ~X() {dtor_called = true;}<br>
+};<br>
+<br>
+bool X::dtor_called = false;<br>
+<br>
+int main()<br>
+{<br>
+    {<br>
+        typedef int T;<br>
+        static_assert(std::is_triviall<wbr>y_destructible<T>::value, "");<br>
+        static_assert(std::is_triviall<wbr>y_destructible<optional<T>>::<wbr>value, "");<br>
+        static_assert(std::is_literal_<wbr>type<optional<T>>::value, "");<br>
+    }<br>
+    {<br>
+        typedef double T;<br>
+        static_assert(std::is_triviall<wbr>y_destructible<T>::value, "");<br>
+        static_assert(std::is_triviall<wbr>y_destructible<optional<T>>::<wbr>value, "");<br>
+        static_assert(std::is_literal_<wbr>type<optional<T>>::value, "");<br>
+    }<br>
+    {<br>
+        typedef PODType T;<br>
+        static_assert(std::is_triviall<wbr>y_destructible<T>::value, "");<br>
+        static_assert(std::is_triviall<wbr>y_destructible<optional<T>>::<wbr>value, "");<br>
+        static_assert(std::is_literal_<wbr>type<optional<T>>::value, "");<br>
+    }<br>
+    {<br>
+        typedef X T;<br>
+        static_assert(!std::is_trivial<wbr>ly_destructible<T>::value, "");<br>
+        static_assert(!std::is_trivial<wbr>ly_destructible<optional<T>>::<wbr>value, "");<br>
+        static_assert(!std::is_literal<wbr>_type<optional<T>>::value, "");<br>
+        {<br>
+            X x;<br>
+            optional<X> opt{x};<br>
+            assert(X::dtor_called == false);<br>
+        }<br>
+        assert(X::dtor_called == true);<br>
+    }<br>
+}<br>
<br>
Added: libcxx/trunk/test/std/utilitie<wbr>s/optional/optional.object/<wbr>optional.object.mod/reset.<wbr>pass.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/std/utilities/optional/optional.object/optional.object.mod/reset.pass.cpp?rev=283980&view=auto" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-pr<wbr>oject/libcxx/trunk/test/std/ut<wbr>ilities/optional/optional.obje<wbr>ct/optional.object.mod/reset.<wbr>pass.cpp?rev=283980&view=auto</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- libcxx/trunk/test/std/utilitie<wbr>s/optional/optional.object/<wbr>optional.object.mod/reset.<wbr>pass.cpp (added)<br>
+++ libcxx/trunk/test/std/utilitie<wbr>s/optional/optional.object/<wbr>optional.object.mod/reset.<wbr>pass.cpp Wed Oct 12 02:46:20 2016<br>
@@ -0,0 +1,61 @@<br>
+//===------------------------<wbr>------------------------------<wbr>----------------===//<br>
+//<br>
+//                     The LLVM Compiler Infrastructure<br>
+//<br>
+// This file is dual licensed under the MIT and the University of Illinois Open<br>
+// Source Licenses. See LICENSE.TXT for details.<br>
+//<br>
+//===------------------------<wbr>------------------------------<wbr>----------------===//<br>
+<br>
+// UNSUPPORTED: c++98, c++03, c++11, c++14<br>
+<br>
+// <optional><br>
+<br>
+// void reset() noexcept;<br>
+<br>
+#include <optional><br>
+#include <type_traits><br>
+#include <cassert><br>
+<br>
+using std::optional;<br>
+<br>
+struct X<br>
+{<br>
+    static bool dtor_called;<br>
+    ~X() {dtor_called = true;}<br>
+};<br>
+<br>
+bool X::dtor_called = false;<br>
+<br>
+int main()<br>
+{<br>
+    {<br>
+        optional<int> opt;<br>
+        static_assert(noexcept(opt.res<wbr>et()) == true, "");<br>
+        opt.reset();<br>
+        assert(static_cast<bool>(opt) == false);<br>
+    }<br>
+    {<br>
+        optional<int> opt(3);<br>
+        opt.reset();<br>
+        assert(static_cast<bool>(opt) == false);<br>
+    }<br>
+    {<br>
+        optional<X> opt;<br>
+        static_assert(noexcept(opt.res<wbr>et()) == true, "");<br>
+        assert(X::dtor_called == false);<br>
+        opt.reset();<br>
+        assert(X::dtor_called == false);<br>
+        assert(static_cast<bool>(opt) == false);<br>
+    }<br>
+    assert(X::dtor_called == false); // TRANSITION, Clang/C2 VSO#239997<br>
+    {<br>
+        optional<X> opt(X{});<br>
+        X::dtor_called = false;<br>
+        opt.reset();<br>
+        assert(X::dtor_called == true);<br>
+        assert(static_cast<bool>(opt) == false);<br>
+        X::dtor_called = false;<br>
+    }<br>
+    assert(X::dtor_called == false); // TRANSITION, Clang/C2 VSO#239997<br>
+}<br>
<br>
Added: libcxx/trunk/test/std/utilitie<wbr>s/optional/optional.object/<wbr>optional.object.observe/bool.<wbr>pass.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/std/utilities/optional/optional.object/optional.object.observe/bool.pass.cpp?rev=283980&view=auto" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-pr<wbr>oject/libcxx/trunk/test/std/ut<wbr>ilities/optional/optional.obje<wbr>ct/optional.object.observe/<wbr>bool.pass.cpp?rev=283980&view=<wbr>auto</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- libcxx/trunk/test/std/utilitie<wbr>s/optional/optional.object/<wbr>optional.object.observe/bool.<wbr>pass.cpp (added)<br>
+++ libcxx/trunk/test/std/utilitie<wbr>s/optional/optional.object/<wbr>optional.object.observe/bool.<wbr>pass.cpp Wed Oct 12 02:46:20 2016<br>
@@ -0,0 +1,37 @@<br>
+//===------------------------<wbr>------------------------------<wbr>----------------===//<br>
+//<br>
+//                     The LLVM Compiler Infrastructure<br>
+//<br>
+// This file is dual licensed under the MIT and the University of Illinois Open<br>
+// Source Licenses. See LICENSE.TXT for details.<br>
+//<br>
+//===------------------------<wbr>------------------------------<wbr>----------------===//<br>
+<br>
+// UNSUPPORTED: c++98, c++03, c++11, c++14<br>
+// <optional><br>
+<br>
+// constexpr explicit optional<T>::operator bool() const noexcept;<br>
+<br>
+#include <optional><br>
+#include <type_traits><br>
+#include <cassert><br>
+<br>
+#include "test_macros.h"<br>
+<br>
+int main()<br>
+{<br>
+    using std::optional;<br>
+    {<br>
+        const optional<int> opt; ((void)opt);<br>
+        ASSERT_NOEXCEPT(bool(opt));<br>
+        static_assert(!std::is_convert<wbr>ible<optional<int>, bool>::value, "");<br>
+    }<br>
+    {<br>
+        constexpr optional<int> opt;<br>
+        static_assert(!opt, "");<br>
+    }<br>
+    {<br>
+        constexpr optional<int> opt(0);<br>
+        static_assert(opt, "");<br>
+    }<br>
+}<br>
<br>
Added: libcxx/trunk/test/std/utilitie<wbr>s/optional/optional.object/<wbr>optional.object.observe/<wbr>dereference.pass.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/std/utilities/optional/optional.object/optional.object.observe/dereference.pass.cpp?rev=283980&view=auto" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-pr<wbr>oject/libcxx/trunk/test/std/ut<wbr>ilities/optional/optional.obje<wbr>ct/optional.object.observe/<wbr>dereference.pass.cpp?rev=<wbr>283980&view=auto</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- libcxx/trunk/test/std/utilitie<wbr>s/optional/optional.object/<wbr>optional.object.observe/<wbr>dereference.pass.cpp (added)<br>
+++ libcxx/trunk/test/std/utilitie<wbr>s/optional/optional.object/<wbr>optional.object.observe/<wbr>dereference.pass.cpp Wed Oct 12 02:46:20 2016<br>
@@ -0,0 +1,73 @@<br>
+//===------------------------<wbr>------------------------------<wbr>----------------===//<br>
+//<br>
+//                     The LLVM Compiler Infrastructure<br>
+//<br>
+// This file is dual licensed under the MIT and the University of Illinois Open<br>
+// Source Licenses. See LICENSE.TXT for details.<br>
+//<br>
+//===------------------------<wbr>------------------------------<wbr>----------------===//<br>
+<br>
+// UNSUPPORTED: c++98, c++03, c++11, c++14<br>
+// <optional><br>
+<br>
+// constexpr T& optional<T>::operator*() &;<br>
+<br>
+#ifdef _LIBCPP_DEBUG<br>
+#define _LIBCPP_ASSERT(x, m) ((x) ? (void)0 : std::exit(0))<br>
+#endif<br>
+<br>
+#include <optional><br>
+#include <type_traits><br>
+#include <cassert><br>
+<br>
+#include "test_macros.h"<br>
+<br>
+using std::optional;<br>
+<br>
+struct X<br>
+{<br>
+    constexpr int test() const& {return 3;}<br>
+    int test() & {return 4;}<br>
+    constexpr int test() const&& {return 5;}<br>
+    int test() && {return 6;}<br>
+};<br>
+<br>
+struct Y<br>
+{<br>
+    constexpr int test() {return 7;}<br>
+};<br>
+<br>
+constexpr int<br>
+test()<br>
+{<br>
+    optional<Y> opt{Y{}};<br>
+    return (*opt).test();<br>
+}<br>
+<br>
+int main()<br>
+{<br>
+    {<br>
+        optional<X> opt; ((void)opt);<br>
+        ASSERT_SAME_TYPE(decltype(*opt<wbr>), X&);<br>
+        // ASSERT_NOT_NOEXCEPT(*opt);<br>
+        // FIXME: This assertion fails with GCC because it can see that<br>
+        // (A) operator*() is constexpr, and<br>
+        // (B) there is no path through the function that throws.<br>
+        // It's arguable if this is the correct behavior for the noexcept<br>
+        // operator.<br>
+        // Regardless this function should still be noexcept(false) because<br>
+        // it has a narrow contract.<br>
+    }<br>
+    {<br>
+        optional<X> opt(X{});<br>
+        assert((*opt).test() == 4);<br>
+    }<br>
+    static_assert(test() == 7, "");<br>
+#ifdef _LIBCPP_DEBUG<br>
+    {<br>
+        optional<X> opt;<br>
+        assert((*opt).test() == 3);<br>
+        assert(false);<br>
+    }<br>
+#endif  // _LIBCPP_DEBUG<br>
+}<br>
<br>
Added: libcxx/trunk/test/std/utilitie<wbr>s/optional/optional.object/<wbr>optional.object.observe/<wbr>dereference_const.pass.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/std/utilities/optional/optional.object/optional.object.observe/dereference_const.pass.cpp?rev=283980&view=auto" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-pr<wbr>oject/libcxx/trunk/test/std/ut<wbr>ilities/optional/optional.obje<wbr>ct/optional.object.observe/<wbr>dereference_const.pass.cpp?<wbr>rev=283980&view=auto</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- libcxx/trunk/test/std/utilitie<wbr>s/optional/optional.object/<wbr>optional.object.observe/<wbr>dereference_const.pass.cpp (added)<br>
+++ libcxx/trunk/test/std/utilitie<wbr>s/optional/optional.object/<wbr>optional.object.observe/<wbr>dereference_const.pass.cpp Wed Oct 12 02:46:20 2016<br>
@@ -0,0 +1,69 @@<br>
+//===------------------------<wbr>------------------------------<wbr>----------------===//<br>
+//<br>
+//                     The LLVM Compiler Infrastructure<br>
+//<br>
+// This file is dual licensed under the MIT and the University of Illinois Open<br>
+// Source Licenses. See LICENSE.TXT for details.<br>
+//<br>
+//===------------------------<wbr>------------------------------<wbr>----------------===//<br>
+<br>
+// UNSUPPORTED: c++98, c++03, c++11, c++14<br>
+// <optional><br>
+<br>
+// constexpr const T& optional<T>::operator*() const &;<br>
+<br>
+#ifdef _LIBCPP_DEBUG<br>
+#define _LIBCPP_ASSERT(x, m) ((x) ? (void)0 : std::exit(0))<br>
+#endif<br>
+<br>
+#include <optional><br>
+#include <type_traits><br>
+#include <cassert><br>
+<br>
+#include "test_macros.h"<br>
+<br>
+using std::optional;<br>
+<br>
+struct X<br>
+{<br>
+    constexpr int test() const& {return 3;}<br>
+    int test() & {return 4;}<br>
+    constexpr int test() const&& {return 5;}<br>
+    int test() && {return 6;}<br>
+};<br>
+<br>
+struct Y<br>
+{<br>
+    int test() const {return 2;}<br>
+};<br>
+<br>
+int main()<br>
+{<br>
+    {<br>
+        const optional<X> opt; ((void)opt);<br>
+        ASSERT_SAME_TYPE(decltype(*opt<wbr>), X const&);<br>
+        // ASSERT_NOT_NOEXCEPT(*opt);<br>
+        // FIXME: This assertion fails with GCC because it can see that<br>
+        // (A) operator*() is constexpr, and<br>
+        // (B) there is no path through the function that throws.<br>
+        // It's arguable if this is the correct behavior for the noexcept<br>
+        // operator.<br>
+        // Regardless this function should still be noexcept(false) because<br>
+        // it has a narrow contract.<br>
+    }<br>
+    {<br>
+        constexpr optional<X> opt(X{});<br>
+        static_assert((*opt).test() == 3, "");<br>
+    }<br>
+    {<br>
+        constexpr optional<Y> opt(Y{});<br>
+        assert((*opt).test() == 2);<br>
+    }<br>
+#ifdef _LIBCPP_DEBUG<br>
+    {<br>
+        const optional<X> opt;<br>
+        assert((*opt).test() == 3);<br>
+        assert(false);<br>
+    }<br>
+#endif  // _LIBCPP_DEBUG<br>
+}<br>
<br>
Added: libcxx/trunk/test/std/utilitie<wbr>s/optional/optional.object/<wbr>optional.object.observe/<wbr>dereference_const_rvalue.pass.<wbr>cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/std/utilities/optional/optional.object/optional.object.observe/dereference_const_rvalue.pass.cpp?rev=283980&view=auto" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-pr<wbr>oject/libcxx/trunk/test/std/ut<wbr>ilities/optional/optional.obje<wbr>ct/optional.object.observe/<wbr>dereference_const_rvalue.pass.<wbr>cpp?rev=283980&view=auto</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- libcxx/trunk/test/std/utilitie<wbr>s/optional/optional.object/<wbr>optional.object.observe/<wbr>dereference_const_rvalue.pass.<wbr>cpp (added)<br>
+++ libcxx/trunk/test/std/utilitie<wbr>s/optional/optional.object/<wbr>optional.object.observe/<wbr>dereference_const_rvalue.pass.<wbr>cpp Wed Oct 12 02:46:20 2016<br>
@@ -0,0 +1,69 @@<br>
+//===------------------------<wbr>------------------------------<wbr>----------------===//<br>
+//<br>
+//                     The LLVM Compiler Infrastructure<br>
+//<br>
+// This file is dual licensed under the MIT and the University of Illinois Open<br>
+// Source Licenses. See LICENSE.TXT for details.<br>
+//<br>
+//===------------------------<wbr>------------------------------<wbr>----------------===//<br>
+<br>
+// UNSUPPORTED: c++98, c++03, c++11, c++14<br>
+// <optional><br>
+<br>
+// constexpr T&& optional<T>::operator*() const &&;<br>
+<br>
+#ifdef _LIBCPP_DEBUG<br>
+#define _LIBCPP_ASSERT(x, m) ((x) ? (void)0 : std::exit(0))<br>
+#endif<br>
+<br>
+#include <optional><br>
+#include <type_traits><br>
+#include <cassert><br>
+<br>
+#include "test_macros.h"<br>
+<br>
+using std::optional;<br>
+<br>
+struct X<br>
+{<br>
+    constexpr int test() const& {return 3;}<br>
+    int test() & {return 4;}<br>
+    constexpr int test() const&& {return 5;}<br>
+    int test() && {return 6;}<br>
+};<br>
+<br>
+struct Y<br>
+{<br>
+    int test() const && {return 2;}<br>
+};<br>
+<br>
+int main()<br>
+{<br>
+    {<br>
+        const optional<X> opt; ((void)opt);<br>
+        ASSERT_SAME_TYPE(decltype(*std<wbr>::move(opt)), X const &&);<br>
+        // ASSERT_NOT_NOEXCEPT(*std::move<wbr>(opt));<br>
+        // FIXME: This assertion fails with GCC because it can see that<br>
+        // (A) operator*() is constexpr, and<br>
+        // (B) there is no path through the function that throws.<br>
+        // It's arguable if this is the correct behavior for the noexcept<br>
+        // operator.<br>
+        // Regardless this function should still be noexcept(false) because<br>
+        // it has a narrow contract.<br>
+    }<br>
+    {<br>
+        constexpr optional<X> opt(X{});<br>
+        static_assert((*std::move(opt)<wbr>).test() == 5, "");<br>
+    }<br>
+    {<br>
+        constexpr optional<Y> opt(Y{});<br>
+        assert((*std::move(opt)).test(<wbr>) == 2);<br>
+    }<br>
+#ifdef _LIBCPP_DEBUG<br>
+    {<br>
+        optional<X> opt;<br>
+        assert((*std::move(opt)).test(<wbr>) == 5);<br>
+        assert(false);<br>
+    }<br>
+#endif  // _LIBCPP_DEBUG<br>
+}<br>
<br>
Added: libcxx/trunk/test/std/utilitie<wbr>s/optional/optional.object/<wbr>optional.object.observe/<wbr>dereference_rvalue.pass.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/std/utilities/optional/optional.object/optional.object.observe/dereference_rvalue.pass.cpp?rev=283980&view=auto" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-pr<wbr>oject/libcxx/trunk/test/std/ut<wbr>ilities/optional/optional.obje<wbr>ct/optional.object.observe/<wbr>dereference_rvalue.pass.cpp?<wbr>rev=283980&view=auto</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- libcxx/trunk/test/std/utilitie<wbr>s/optional/optional.object/<wbr>optional.object.observe/<wbr>dereference_rvalue.pass.cpp (added)<br>
+++ libcxx/trunk/test/std/utilitie<wbr>s/optional/optional.object/<wbr>optional.object.observe/<wbr>dereference_rvalue.pass.cpp Wed Oct 12 02:46:20 2016<br>
@@ -0,0 +1,73 @@<br>
+//===------------------------<wbr>------------------------------<wbr>----------------===//<br>
+//<br>
+//                     The LLVM Compiler Infrastructure<br>
+//<br>
+// This file is dual licensed under the MIT and the University of Illinois Open<br>
+// Source Licenses. See LICENSE.TXT for details.<br>
+//<br>
+//===------------------------<wbr>------------------------------<wbr>----------------===//<br>
+<br>
+// UNSUPPORTED: c++98, c++03, c++11, c++14<br>
+// <optional><br>
+<br>
+// constexpr T&& optional<T>::operator*() &&;<br>
+<br>
+#ifdef _LIBCPP_DEBUG<br>
+#define _LIBCPP_ASSERT(x, m) ((x) ? (void)0 : std::exit(0))<br>
+#endif<br>
+<br>
+#include <optional><br>
+#include <type_traits><br>
+#include <cassert><br>
+<br>
+#include "test_macros.h"<br>
+<br>
+using std::optional;<br>
+<br>
+struct X<br>
+{<br>
+    constexpr int test() const& {return 3;}<br>
+    int test() & {return 4;}<br>
+    constexpr int test() const&& {return 5;}<br>
+    int test() && {return 6;}<br>
+};<br>
+<br>
+struct Y<br>
+{<br>
+    constexpr int test() && {return 7;}<br>
+};<br>
+<br>
+constexpr int<br>
+test()<br>
+{<br>
+    optional<Y> opt{Y{}};<br>
+    return (*std::move(opt)).test();<br>
+}<br>
+<br>
+int main()<br>
+{<br>
+    {<br>
+        optional<X> opt; ((void)opt);<br>
+        ASSERT_SAME_TYPE(decltype(*std<wbr>::move(opt)), X&&);<br>
+        // ASSERT_NOT_NOEXCEPT(*std::move<wbr>(opt));<br>
+        // FIXME: This assertion fails with GCC because it can see that<br>
+        // (A) operator*() is constexpr, and<br>
+        // (B) there is no path through the function that throws.<br>
+        // It's arguable if this is the correct behavior for the noexcept<br>
+        // operator.<br>
+        // Regardless this function should still be noexcept(false) because<br>
+        // it has a narrow contract.<br>
+    }<br>
+    {<br>
+        optional<X> opt(X{});<br>
+        assert((*std::move(opt)).test(<wbr>) == 6);<br>
+    }<br>
+    static_assert(test() == 7, "");<br>
+#ifdef _LIBCPP_DEBUG<br>
+    {<br>
+        optional<X> opt;<br>
+        assert((*std::move(opt)).test(<wbr>) == 3);<br>
+        assert(false);<br>
+    }<br>
+#endif  // _LIBCPP_DEBUG<br>
+}<br>
<br>
Added: libcxx/trunk/test/std/utilitie<wbr>s/optional/optional.object/<wbr>optional.object.observe/has_<wbr>value.pass.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/std/utilities/optional/optional.object/optional.object.observe/has_value.pass.cpp?rev=283980&view=auto" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-pr<wbr>oject/libcxx/trunk/test/std/ut<wbr>ilities/optional/optional.obje<wbr>ct/optional.object.observe/<wbr>has_value.pass.cpp?rev=283980&<wbr>view=auto</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- libcxx/trunk/test/std/utilitie<wbr>s/optional/optional.object/<wbr>optional.object.observe/has_<wbr>value.pass.cpp (added)<br>
+++ libcxx/trunk/test/std/utilitie<wbr>s/optional/optional.object/<wbr>optional.object.observe/has_<wbr>value.pass.cpp Wed Oct 12 02:46:20 2016<br>
@@ -0,0 +1,37 @@<br>
+//===------------------------<wbr>------------------------------<wbr>----------------===//<br>
+//<br>
+//                     The LLVM Compiler Infrastructure<br>
+//<br>
+// This file is dual licensed under the MIT and the University of Illinois Open<br>
+// Source Licenses. See LICENSE.TXT for details.<br>
+//<br>
+//===------------------------<wbr>------------------------------<wbr>----------------===//<br>
+<br>
+// UNSUPPORTED: c++98, c++03, c++11, c++14<br>
+// <optional><br>
+<br>
+// constexpr bool optional<T>::has_value() const noexcept;<br>
+<br>
+#include <optional><br>
+#include <type_traits><br>
+#include <cassert><br>
+<br>
+#include "test_macros.h"<br>
+<br>
+int main()<br>
+{<br>
+    using std::optional;<br>
+    {<br>
+        const optional<int> opt; ((void)opt);<br>
+        ASSERT_NOEXCEPT(opt.has_value(<wbr>));<br>
+        ASSERT_SAME_TYPE(decltype(opt.<wbr>has_value()), bool);<br>
+    }<br>
+    {<br>
+        constexpr optional<int> opt;<br>
+        static_assert(!opt.has_value()<wbr>, "");<br>
+    }<br>
+    {<br>
+        constexpr optional<int> opt(0);<br>
+        static_assert(opt.has_value(), "");<br>
+    }<br>
+}<br>
<br>
Added: libcxx/trunk/test/std/utilitie<wbr>s/optional/optional.object/<wbr>optional.object.observe/op_<wbr>arrow.pass.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/std/utilities/optional/optional.object/optional.object.observe/op_arrow.pass.cpp?rev=283980&view=auto" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-pr<wbr>oject/libcxx/trunk/test/std/ut<wbr>ilities/optional/optional.obje<wbr>ct/optional.object.observe/op_<wbr>arrow.pass.cpp?rev=283980&<wbr>view=auto</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- libcxx/trunk/test/std/utilitie<wbr>s/optional/optional.object/<wbr>optional.object.observe/op_<wbr>arrow.pass.cpp (added)<br>
+++ libcxx/trunk/test/std/utilitie<wbr>s/optional/optional.object/<wbr>optional.object.observe/op_<wbr>arrow.pass.cpp Wed Oct 12 02:46:20 2016<br>
@@ -0,0 +1,72 @@<br>
+//===------------------------<wbr>------------------------------<wbr>----------------===//<br>
+//<br>
+//                     The LLVM Compiler Infrastructure<br>
+//<br>
+// This file is dual licensed under the MIT and the University of Illinois Open<br>
+// Source Licenses. See LICENSE.TXT for details.<br>
+//<br>
+//===------------------------<wbr>------------------------------<wbr>----------------===//<br>
+<br>
+// UNSUPPORTED: c++98, c++03, c++11, c++14<br>
+// <optional><br>
+<br>
+// constexpr T* optional<T>::operator->();<br>
+<br>
+#ifdef _LIBCPP_DEBUG<br>
+#define _LIBCPP_ASSERT(x, m) ((x) ? (void)0 : std::exit(0))<br>
+#endif<br>
+<br>
+#include <optional><br>
+#include <type_traits><br>
+#include <cassert><br>
+<br>
+#include "test_macros.h"<br>
+<br>
+using std::optional;<br>
+<br>
+struct X<br>
+{<br>
+    int test() noexcept {return 3;}<br>
+};<br>
+<br>
+struct Y<br>
+{<br>
+    constexpr int test() {return 3;}<br>
+};<br>
+<br>
+constexpr int<br>
+test()<br>
+{<br>
+    optional<Y> opt{Y{}};<br>
+    return opt->test();<br>
+}<br>
+<br>
+int main()<br>
+{<br>
+    {<br>
+        std::optional<X> opt; ((void)opt);<br>
+        ASSERT_SAME_TYPE(decltype(opt.<wbr>operator->()), X*);<br>
+        // ASSERT_NOT_NOEXCEPT(opt.operat<wbr>or->());<br>
+        // FIXME: This assertion fails with GCC because it can see that<br>
+        // (A) operator->() is constexpr, and<br>
+        // (B) there is no path through the function that throws.<br>
+        // It's arguable if this is the correct behavior for the noexcept<br>
+        // operator.<br>
+        // Regardless this function should still be noexcept(false) because<br>
+        // it has a narrow contract.<br>
+    }<br>
+    {<br>
+        optional<X> opt(X{});<br>
+        assert(opt->test() == 3);<br>
+    }<br>
+    {<br>
+        static_assert(test() == 3, "");<br>
+    }<br>
+#ifdef _LIBCPP_DEBUG<br>
+    {<br>
+        optional<X> opt;<br>
+        assert(opt->test() == 3);<br>
+        assert(false);<br>
+    }<br>
+#endif  // _LIBCPP_DEBUG<br>
+}<br>
<br>
Added: libcxx/trunk/test/std/utilitie<wbr>s/optional/optional.object/<wbr>optional.object.observe/op_<wbr>arrow_const.pass.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/std/utilities/optional/optional.object/optional.object.observe/op_arrow_const.pass.cpp?rev=283980&view=auto" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-pr<wbr>oject/libcxx/trunk/test/std/ut<wbr>ilities/optional/optional.obje<wbr>ct/optional.object.observe/op_<wbr>arrow_const.pass.cpp?rev=<wbr>283980&view=auto</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- libcxx/trunk/test/std/utilitie<wbr>s/optional/optional.object/<wbr>optional.object.observe/op_<wbr>arrow_const.pass.cpp (added)<br>
+++ libcxx/trunk/test/std/utilitie<wbr>s/optional/optional.object/<wbr>optional.object.observe/op_<wbr>arrow_const.pass.cpp Wed Oct 12 02:46:20 2016<br>
@@ -0,0 +1,76 @@<br>
+//===------------------------<wbr>------------------------------<wbr>----------------===//<br>
+//<br>
+//                     The LLVM Compiler Infrastructure<br>
+//<br>
+// This file is dual licensed under the MIT and the University of Illinois Open<br>
+// Source Licenses. See LICENSE.TXT for details.<br>
+//<br>
+//===------------------------<wbr>------------------------------<wbr>----------------===//<br>
+<br>
+// UNSUPPORTED: c++98, c++03, c++11, c++14<br>
+// <optional><br>
+<br>
+// constexpr const T* optional<T>::operator->() const;<br>
+<br>
+#ifdef _LIBCPP_DEBUG<br>
+#define _LIBCPP_ASSERT(x, m) ((x) ? (void)0 : std::exit(0))<br>
+#endif<br>
+<br>
+#include <optional><br>
+#include <type_traits><br>
+#include <cassert><br>
+<br>
+#include "test_macros.h"<br>
+<br>
+using std::optional;<br>
+<br>
+struct X<br>
+{<br>
+    constexpr int test() const {return 3;}<br>
+};<br>
+<br>
+struct Y<br>
+{<br>
+    int test() const noexcept {return 2;}<br>
+};<br>
+<br>
+struct Z<br>
+{<br>
+    const Z* operator&() const;<br>
+    constexpr int test() const {return 1;}<br>
+};<br>
+<br>
+int main()<br>
+{<br>
+    {<br>
+        const std::optional<X> opt; ((void)opt);<br>
+        ASSERT_SAME_TYPE(decltype(opt.<wbr>operator->()), X const*);<br>
+        // ASSERT_NOT_NOEXCEPT(opt.operat<wbr>or->());<br>
+        // FIXME: This assertion fails with GCC because it can see that<br>
+        // (A) operator->() is constexpr, and<br>
+        // (B) there is no path through the function that throws.<br>
+        // It's arguable if this is the correct behavior for the noexcept<br>
+        // operator.<br>
+        // Regardless this function should still be noexcept(false) because<br>
+        // it has a narrow contract.<br>
+    }<br>
+    {<br>
+        constexpr optional<X> opt(X{});<br>
+        static_assert(opt->test() == 3, "");<br>
+    }<br>
+    {<br>
+        constexpr optional<Y> opt(Y{});<br>
+        assert(opt->test() == 2);<br>
+    }<br>
+    {<br>
+        constexpr optional<Z> opt(Z{});<br>
+        static_assert(opt->test() == 1, "");<br>
+    }<br>
+#ifdef _LIBCPP_DEBUG<br>
+    {<br>
+        const optional<X> opt;<br>
+        assert(opt->test() == 3);<br>
+        assert(false);<br>
+    }<br>
+#endif  // _LIBCPP_DEBUG<br>
+}<br>
<br>
Added: libcxx/trunk/test/std/utilitie<wbr>s/optional/optional.object/<wbr>optional.object.observe/value.<wbr>pass.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/std/utilities/optional/optional.object/optional.object.observe/value.pass.cpp?rev=283980&view=auto" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-pr<wbr>oject/libcxx/trunk/test/std/ut<wbr>ilities/optional/optional.obje<wbr>ct/optional.object.observe/<wbr>value.pass.cpp?rev=283980&<wbr>view=auto</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- libcxx/trunk/test/std/utilitie<wbr>s/optional/optional.object/<wbr>optional.object.observe/value.<wbr>pass.cpp (added)<br>
+++ libcxx/trunk/test/std/utilitie<wbr>s/optional/optional.object/<wbr>optional.object.observe/value.<wbr>pass.cpp Wed Oct 12 02:46:20 2016<br>
@@ -0,0 +1,73 @@<br>
+//===------------------------<wbr>------------------------------<wbr>----------------===//<br>
+//<br>
+//                     The LLVM Compiler Infrastructure<br>
+//<br>
+// This file is dual licensed under the MIT and the University of Illinois Open<br>
+// Source Licenses. See LICENSE.TXT for details.<br>
+//<br>
+//===------------------------<wbr>------------------------------<wbr>----------------===//<br>
+<br>
+// UNSUPPORTED: c++98, c++03, c++11, c++14<br>
+// <optional><br>
+<br>
+// constexpr T& optional<T>::value() &;<br>
+<br>
+#include <optional><br>
+#include <type_traits><br>
+#include <cassert><br>
+<br>
+#include "test_macros.h"<br>
+<br>
+using std::optional;<br>
+using std::bad_optional_access;<br>
+<br>
+struct X<br>
+{<br>
+    X() = default;<br>
+    X(const X&) = delete;<br>
+    constexpr int test() const & {return 3;}<br>
+    int test() & {return 4;}<br>
+    constexpr int test() const && {return 5;}<br>
+    int test() && {return 6;}<br>
+};<br>
+<br>
+struct Y<br>
+{<br>
+    constexpr int test() & {return 7;}<br>
+};<br>
+<br>
+constexpr int<br>
+test()<br>
+{<br>
+    optional<Y> opt{Y{}};<br>
+    return opt.value().test();<br>
+}<br>
+<br>
+<br>
+int main()<br>
+{<br>
+    {<br>
+        optional<X> opt; ((void)opt);<br>
+        ASSERT_NOT_NOEXCEPT(opt.value(<wbr>));<br>
+        ASSERT_SAME_TYPE(decltype(opt.<wbr>value()), X&);<br>
+    }<br>
+    {<br>
+        optional<X> opt;<br>
+        opt.emplace();<br>
+        assert(opt.value().test() == 4);<br>
+    }<br>
+#ifndef TEST_HAS_NO_EXCEPTIONS<br>
+    {<br>
+        optional<X> opt;<br>
+        try<br>
+        {<br>
+            opt.value();<br>
+            assert(false);<br>
+        }<br>
+        catch (const bad_optional_access&)<br>
+        {<br>
+        }<br>
+    }<br>
+#endif<br>
+    static_assert(test() == 7, "");<br>
+}<br>
<br>
Added: libcxx/trunk/test/std/utilitie<wbr>s/optional/optional.object/<wbr>optional.object.observe/value_<wbr>const.fail.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/std/utilities/optional/optional.object/optional.object.observe/value_const.fail.cpp?rev=283980&view=auto" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-pr<wbr>oject/libcxx/trunk/test/std/ut<wbr>ilities/optional/optional.obje<wbr>ct/optional.object.observe/<wbr>value_const.fail.cpp?rev=<wbr>283980&view=auto</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- libcxx/trunk/test/std/utilitie<wbr>s/optional/optional.object/<wbr>optional.object.observe/value_<wbr>const.fail.cpp (added)<br>
+++ libcxx/trunk/test/std/utilitie<wbr>s/optional/optional.object/<wbr>optional.object.observe/value_<wbr>const.fail.cpp Wed Oct 12 02:46:20 2016<br>
@@ -0,0 +1,33 @@<br>
+//===------------------------<wbr>------------------------------<wbr>----------------===//<br>
+//<br>
+//                     The LLVM Compiler Infrastructure<br>
+//<br>
+// This file is dual licensed under the MIT and the University of Illinois Open<br>
+// Source Licenses. See LICENSE.TXT for details.<br>
+//<br>
+//===------------------------<wbr>------------------------------<wbr>----------------===//<br>
+<br>
+// UNSUPPORTED: c++98, c++03, c++11, c++14<br>
+// <optional><br>
+<br>
+// constexpr const T& optional<T>::value() const &;<br>
+<br>
+#include <optional><br>
+#include <type_traits><br>
+#include <cassert><br>
+<br>
+using std::optional;<br>
+<br>
+struct X<br>
+{<br>
+    constexpr int test() const {return 3;}<br>
+    int test() {return 4;}<br>
+};<br>
+<br>
+int main()<br>
+{<br>
+    {<br>
+        constexpr optional<X> opt;<br>
+        static_assert(opt.value().test<wbr>() == 3, "");<br>
+    }<br>
+}<br>
<br>
Added: libcxx/trunk/test/std/utilitie<wbr>s/optional/optional.object/<wbr>optional.object.observe/value_<wbr>const.pass.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/std/utilities/optional/optional.object/optional.object.observe/value_const.pass.cpp?rev=283980&view=auto" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-pr<wbr>oject/libcxx/trunk/test/std/ut<wbr>ilities/optional/optional.obje<wbr>ct/optional.object.observe/<wbr>value_const.pass.cpp?rev=<wbr>283980&view=auto</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- libcxx/trunk/test/std/utilitie<wbr>s/optional/optional.object/<wbr>optional.object.observe/value_<wbr>const.pass.cpp (added)<br>
+++ libcxx/trunk/test/std/utilitie<wbr>s/optional/optional.object/<wbr>optional.object.observe/value_<wbr>const.pass.cpp Wed Oct 12 02:46:20 2016<br>
@@ -0,0 +1,64 @@<br>
+//===------------------------<wbr>------------------------------<wbr>----------------===//<br>
+//<br>
+//                     The LLVM Compiler Infrastructure<br>
+//<br>
+// This file is dual licensed under the MIT and the University of Illinois Open<br>
+// Source Licenses. See LICENSE.TXT for details.<br>
+//<br>
+//===------------------------<wbr>------------------------------<wbr>----------------===//<br>
+<br>
+// UNSUPPORTED: c++98, c++03, c++11, c++14<br>
+// <optional><br>
+<br>
+// constexpr const T& optional<T>::value() const &;<br>
+<br>
+#include <optional><br>
+#include <type_traits><br>
+#include <cassert><br>
+<br>
+#include "test_macros.h"<br>
+<br>
+using std::optional;<br>
+using std::in_place_t;<br>
+using std::in_place;<br>
+using std::bad_optional_access;<br>
+<br>
+struct X<br>
+{<br>
+    X() = default;<br>
+    X(const X&) = delete;<br>
+    constexpr int test() const & {return 3;}<br>
+    int test() & {return 4;}<br>
+    constexpr int test() const && {return 5;}<br>
+    int test() && {return 6;}<br>
+};<br>
+<br>
+int main()<br>
+{<br>
+    {<br>
+        const optional<X> opt; ((void)opt);<br>
+        ASSERT_NOT_NOEXCEPT(opt.value(<wbr>));<br>
+        ASSERT_SAME_TYPE(decltype(opt.<wbr>value()), X const&);<br>
+    }<br>
+    {<br>
+        constexpr optional<X> opt(in_place);<br>
+        static_assert(opt.value().test<wbr>() == 3, "");<br>
+    }<br>
+    {<br>
+        const optional<X> opt(in_place);<br>
+        assert(opt.value().test() == 3);<br>
+    }<br>
+#ifndef TEST_HAS_NO_EXCEPTIONS<br>
+    {<br>
+        const optional<X> opt;<br>
+        try<br>
+        {<br>
+            opt.value();<br>
+            assert(false);<br>
+        }<br>
+        catch (const bad_optional_access&)<br>
+        {<br>
+        }<br>
+    }<br>
+#endif<br>
+}<br>
<br>
Added: libcxx/trunk/test/std/utilitie<wbr>s/optional/optional.object/<wbr>optional.object.observe/value_<wbr>const_rvalue.pass.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/std/utilities/optional/optional.object/optional.object.observe/value_const_rvalue.pass.cpp?rev=283980&view=auto" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-pr<wbr>oject/libcxx/trunk/test/std/ut<wbr>ilities/optional/optional.obje<wbr>ct/optional.object.observe/<wbr>value_const_rvalue.pass.cpp?<wbr>rev=283980&view=auto</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- libcxx/trunk/test/std/utilitie<wbr>s/optional/optional.object/<wbr>optional.object.observe/value_<wbr>const_rvalue.pass.cpp (added)<br>
+++ libcxx/trunk/test/std/utilitie<wbr>s/optional/optional.object/<wbr>optional.object.observe/value_<wbr>const_rvalue.pass.cpp Wed Oct 12 02:46:20 2016<br>
@@ -0,0 +1,64 @@<br>
+//===------------------------<wbr>------------------------------<wbr>----------------===//<br>
+//<br>
+//                     The LLVM Compiler Infrastructure<br>
+//<br>
+// This file is dual licensed under the MIT and the University of Illinois Open<br>
+// Source Licenses. See LICENSE.TXT for details.<br>
+//<br>
+//===------------------------<wbr>------------------------------<wbr>----------------===//<br>
+<br>
+// UNSUPPORTED: c++98, c++03, c++11, c++14<br>
+// <optional><br>
+<br>
+// constexpr const T& optional<T>::value() const &&;<br>
+<br>
+#include <optional><br>
+#include <type_traits><br>
+#include <cassert><br>
+<br>
+#include "test_macros.h"<br>
+<br>
+using std::optional;<br>
+using std::in_place_t;<br>
+using std::in_place;<br>
+using std::bad_optional_access;<br>
+<br>
+struct X<br>
+{<br>
+    X() = default;<br>
+    X(const X&) = delete;<br>
+    constexpr int test() const & {return 3;}<br>
+    int test() & {return 4;}<br>
+    constexpr int test() const && {return 5;}<br>
+    int test() && {return 6;}<br>
+};<br>
+<br>
+int main()<br>
+{<br>
+    {<br>
+        const optional<X> opt; ((void)opt);<br>
+        ASSERT_NOT_NOEXCEPT(std::move(<wbr>opt).value());<br>
+        ASSERT_SAME_TYPE(decltype(std:<wbr>:move(opt).value()), X const&&);<br>
+    }<br>
+    {<br>
+        constexpr optional<X> opt(in_place);<br>
+        static_assert(std::move(opt).v<wbr>alue().test() == 5, "");<br>
+    }<br>
+    {<br>
+        const optional<X> opt(in_place);<br>
+        assert(std::move(opt).value().<wbr>test() == 5);<br>
+    }<br>
+#ifndef TEST_HAS_NO_EXCEPTIONS<br>
+    {<br>
+        const optional<X> opt;<br>
+        try<br>
+        {<br>
+            std::move(opt).value();<br>
+            assert(false);<br>
+        }<br>
+        catch (const bad_optional_access&)<br>
+        {<br>
+        }<br>
+    }<br>
+#endif<br>
+}<br>
<br>
Added: libcxx/trunk/test/std/utilitie<wbr>s/optional/optional.object/<wbr>optional.object.observe/value_<wbr>or.pass.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/std/utilities/optional/optional.object/optional.object.observe/value_or.pass.cpp?rev=283980&view=auto" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-pr<wbr>oject/libcxx/trunk/test/std/ut<wbr>ilities/optional/optional.obje<wbr>ct/optional.object.observe/<wbr>value_or.pass.cpp?rev=283980&<wbr>view=auto</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- libcxx/trunk/test/std/utilitie<wbr>s/optional/optional.object/<wbr>optional.object.observe/value_<wbr>or.pass.cpp (added)<br>
+++ libcxx/trunk/test/std/utilitie<wbr>s/optional/optional.object/<wbr>optional.object.observe/value_<wbr>or.pass.cpp Wed Oct 12 02:46:20 2016<br>
@@ -0,0 +1,68 @@<br>
+//===------------------------<wbr>------------------------------<wbr>----------------===//<br>
+//<br>
+//                     The LLVM Compiler Infrastructure<br>
+//<br>
+// This file is dual licensed under the MIT and the University of Illinois Open<br>
+// Source Licenses. See LICENSE.TXT for details.<br>
+//<br>
+//===------------------------<wbr>------------------------------<wbr>----------------===//<br>
+<br>
+// UNSUPPORTED: c++98, c++03, c++11, c++14<br>
+// <optional><br>
+<br>
+// template <class U> T optional<T>::value_or(U&& v) &&;<br>
+<br>
+#include <optional><br>
+#include <type_traits><br>
+#include <cassert><br>
+<br>
+#include "test_macros.h"<br>
+<br>
+using std::optional;<br>
+using std::in_place_t;<br>
+using std::in_place;<br>
+<br>
+struct Y<br>
+{<br>
+    int i_;<br>
+<br>
+    Y(int i) : i_(i) {}<br>
+};<br>
+<br>
+struct X<br>
+{<br>
+    int i_;<br>
+<br>
+    X(int i) : i_(i) {}<br>
+    X(X&& x) : i_(x.i_) {x.i_ = 0;}<br>
+    X(const Y& y) : i_(y.i_) {}<br>
+    X(Y&& y) : i_(y.i_+1) {}<br>
+    friend constexpr bool operator==(const X& x, const X& y)<br>
+        {return x.i_ == y.i_;}<br>
+};<br>
+<br>
+int main()<br>
+{<br>
+    {<br>
+        optional<X> opt(in_place, 2);<br>
+        Y y(3);<br>
+        assert(std::move(opt).value_or<wbr>(y) == 2);<br>
+        assert(*opt == 0);<br>
+    }<br>
+    {<br>
+        optional<X> opt(in_place, 2);<br>
+        assert(std::move(opt).value_or<wbr>(Y(3)) == 2);<br>
+        assert(*opt == 0);<br>
+    }<br>
+    {<br>
+        optional<X> opt;<br>
+        Y y(3);<br>
+        assert(std::move(opt).value_or<wbr>(y) == 3);<br>
+        assert(!opt);<br>
+    }<br>
+    {<br>
+        optional<X> opt;<br>
+        assert(std::move(opt).value_or<wbr>(Y(3)) == 4);<br>
+        assert(!opt);<br>
+    }<br>
+}<br>
<br>
Added: libcxx/trunk/test/std/utilitie<wbr>s/optional/optional.object/<wbr>optional.object.observe/value_<wbr>or_const.pass.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/std/utilities/optional/optional.object/optional.object.observe/value_or_const.pass.cpp?rev=283980&view=auto" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-pr<wbr>oject/libcxx/trunk/test/std/ut<wbr>ilities/optional/optional.obje<wbr>ct/optional.object.observe/<wbr>value_or_const.pass.cpp?rev=<wbr>283980&view=auto</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- libcxx/trunk/test/std/utilitie<wbr>s/optional/optional.object/<wbr>optional.object.observe/value_<wbr>or_const.pass.cpp (added)<br>
+++ libcxx/trunk/test/std/utilitie<wbr>s/optional/optional.object/<wbr>optional.object.observe/value_<wbr>or_const.pass.cpp Wed Oct 12 02:46:20 2016<br>
@@ -0,0 +1,77 @@<br>
+//===------------------------<wbr>------------------------------<wbr>----------------===//<br>
+//<br>
+//                     The LLVM Compiler Infrastructure<br>
+//<br>
+// This file is dual licensed under the MIT and the University of Illinois Open<br>
+// Source Licenses. See LICENSE.TXT for details.<br>
+//<br>
+//===------------------------<wbr>------------------------------<wbr>----------------===//<br>
+<br>
+// UNSUPPORTED: c++98, c++03, c++11, c++14<br>
+// <optional><br>
+<br>
+// template <class U> constexpr T optional<T>::value_or(U&& v) const&;<br>
+<br>
+#include <optional><br>
+#include <type_traits><br>
+#include <cassert><br>
+<br>
+using std::optional;<br>
+<br>
+struct Y<br>
+{<br>
+    int i_;<br>
+<br>
+    constexpr Y(int i) : i_(i) {}<br>
+};<br>
+<br>
+struct X<br>
+{<br>
+    int i_;<br>
+<br>
+    constexpr X(int i) : i_(i) {}<br>
+    constexpr X(const Y& y) : i_(y.i_) {}<br>
+    constexpr X(Y&& y) : i_(y.i_+1) {}<br>
+    friend constexpr bool operator==(const X& x, const X& y)<br>
+        {return x.i_ == y.i_;}<br>
+};<br>
+<br>
+int main()<br>
+{<br>
+    {<br>
+        constexpr optional<X> opt(2);<br>
+        constexpr Y y(3);<br>
+        static_assert(opt.value_or(y) == 2, "");<br>
+    }<br>
+    {<br>
+        constexpr optional<X> opt(2);<br>
+        static_assert(opt.value_or(Y(3<wbr>)) == 2, "");<br>
+    }<br>
+    {<br>
+        constexpr optional<X> opt;<br>
+        constexpr Y y(3);<br>
+        static_assert(opt.value_or(y) == 3, "");<br>
+    }<br>
+    {<br>
+        constexpr optional<X> opt;<br>
+        static_assert(opt.value_or(Y(3<wbr>)) == 4, "");<br>
+    }<br>
+    {<br>
+        const optional<X> opt(2);<br>
+        const Y y(3);<br>
+        assert(opt.value_or(y) == 2);<br>
+    }<br>
+    {<br>
+        const optional<X> opt(2);<br>
+        assert(opt.value_or(Y(3)) == 2);<br>
+    }<br>
+    {<br>
+        const optional<X> opt;<br>
+        const Y y(3);<br>
+        assert(opt.value_or(y) == 3);<br>
+    }<br>
+    {<br>
+        const optional<X> opt;<br>
+        assert(opt.value_or(Y(3)) == 4);<br>
+    }<br>
+}<br>
<br>
Added: libcxx/trunk/test/std/utilitie<wbr>s/optional/optional.object/<wbr>optional.object.observe/value_<wbr>rvalue.pass.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/std/utilities/optional/optional.object/optional.object.observe/value_rvalue.pass.cpp?rev=283980&view=auto" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-pr<wbr>oject/libcxx/trunk/test/std/ut<wbr>ilities/optional/optional.obje<wbr>ct/optional.object.observe/<wbr>value_rvalue.pass.cpp?rev=<wbr>283980&view=auto</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- libcxx/trunk/test/std/utilitie<wbr>s/optional/optional.object/<wbr>optional.object.observe/value_<wbr>rvalue.pass.cpp (added)<br>
+++ libcxx/trunk/test/std/utilitie<wbr>s/optional/optional.object/<wbr>optional.object.observe/value_<wbr>rvalue.pass.cpp Wed Oct 12 02:46:20 2016<br>
@@ -0,0 +1,72 @@<br>
+//===------------------------<wbr>------------------------------<wbr>----------------===//<br>
+//<br>
+//                     The LLVM Compiler Infrastructure<br>
+//<br>
+// This file is dual licensed under the MIT and the University of Illinois Open<br>
+// Source Licenses. See LICENSE.TXT for details.<br>
+//<br>
+//===------------------------<wbr>------------------------------<wbr>----------------===//<br>
+<br>
+// UNSUPPORTED: c++98, c++03, c++11, c++14<br>
+// <optional><br>
+<br>
+// constexpr T& optional<T>::value() &&;<br>
+<br>
+#include <optional><br>
+#include <type_traits><br>
+#include <cassert><br>
+<br>
+#include "test_macros.h"<br>
+<br>
+using std::optional;<br>
+using std::bad_optional_access;<br>
+<br>
+struct X<br>
+{<br>
+    X() = default;<br>
+    X(const X&) = delete;<br>
+    constexpr int test() const & {return 3;}<br>
+    int test() & {return 4;}<br>
+    constexpr int test() const && {return 5;}<br>
+    int test() && {return 6;}<br>
+};<br>
+<br>
+struct Y<br>
+{<br>
+    constexpr int test() && {return 7;}<br>
+};<br>
+<br>
+constexpr int<br>
+test()<br>
+{<br>
+    optional<Y> opt{Y{}};<br>
+    return std::move(opt).value().test();<br>
+}<br>
+<br>
+int main()<br>
+{<br>
+    {<br>
+        optional<X> opt; ((void)opt);<br>
+        ASSERT_NOT_NOEXCEPT(std::move(<wbr>opt).value());<br>
+        ASSERT_SAME_TYPE(decltype(std:<wbr>:move(opt).value()), X&&);<br>
+    }<br>
+    {<br>
+        optional<X> opt;<br>
+        opt.emplace();<br>
+        assert(std::move(opt).value().<wbr>test() == 6);<br>
+    }<br>
+#ifndef TEST_HAS_NO_EXCEPTIONS<br>
+    {<br>
+        optional<X> opt;<br>
+        try<br>
+        {<br>
+            std::move(opt).value();<br>
+            assert(false);<br>
+        }<br>
+        catch (const bad_optional_access&)<br>
+        {<br>
+        }<br>
+    }<br>
+#endif<br>
+    static_assert(test() == 7, "");<br>
+}<br>
<br>
Added: libcxx/trunk/test/std/utilitie<wbr>s/optional/optional.object/<wbr>optional.object.swap/swap.<wbr>pass.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/std/utilities/optional/optional.object/optional.object.swap/swap.pass.cpp?rev=283980&view=auto" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-pr<wbr>oject/libcxx/trunk/test/std/ut<wbr>ilities/optional/optional.obje<wbr>ct/optional.object.swap/swap.<wbr>pass.cpp?rev=283980&view=auto</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- libcxx/trunk/test/std/utilitie<wbr>s/optional/optional.object/<wbr>optional.object.swap/swap.<wbr>pass.cpp (added)<br>
+++ libcxx/trunk/test/std/utilitie<wbr>s/optional/optional.object/<wbr>optional.object.swap/swap.<wbr>pass.cpp Wed Oct 12 02:46:20 2016<br>
@@ -0,0 +1,306 @@<br>
+//===------------------------<wbr>------------------------------<wbr>----------------===//<br>
+//<br>
+//                     The LLVM Compiler Infrastructure<br>
+//<br>
+// This file is dual licensed under the MIT and the University of Illinois Open<br>
+// Source Licenses. See LICENSE.TXT for details.<br>
+//<br>
+//===------------------------<wbr>------------------------------<wbr>----------------===//<br>
+<br>
+// UNSUPPORTED: c++98, c++03, c++11, c++14<br>
+// <optional><br>
+<br>
+// void swap(optional&)<br>
+//     noexcept(is_nothrow_move_cons<wbr>tructible<T>::value &&<br>
+//              is_nothrow_swappable<T>::value<wbr>)<br>
+<br>
+#include <optional><br>
+#include <type_traits><br>
+#include <cassert><br>
+<br>
+#include "test_macros.h"<br>
+#include "archetypes.hpp"<br>
+<br>
+using std::optional;<br>
+<br>
+class X<br>
+{<br>
+    int i_;<br>
+public:<br>
+    static unsigned dtor_called;<br>
+    X(int i) : i_(i) {}<br>
+    X(X&& x) = default;<br>
+    X& operator=(X&&) = default;<br>
+    ~X() {++dtor_called;}<br>
+<br>
+    friend bool operator==(const X& x, const X& y) {return x.i_ == y.i_;}<br>
+};<br>
+<br>
+unsigned X::dtor_called = 0;<br>
+<br>
+class Y<br>
+{<br>
+    int i_;<br>
+public:<br>
+    static unsigned dtor_called;<br>
+    Y(int i) : i_(i) {}<br>
+    Y(Y&&) = default;<br>
+    ~Y() {++dtor_called;}<br>
+<br>
+    friend constexpr bool operator==(const Y& x, const Y& y) {return x.i_ == y.i_;}<br>
+    friend void swap(Y& x, Y& y) {std::swap(x.i_, y.i_);}<br>
+};<br>
+<br>
+unsigned Y::dtor_called = 0;<br>
+<br>
+class Z<br>
+{<br>
+    int i_;<br>
+public:<br>
+    Z(int i) : i_(i) {}<br>
+    Z(Z&&) {TEST_THROW(7);}<br>
+<br>
+    friend constexpr bool operator==(const Z& x, const Z& y) {return x.i_ == y.i_;}<br>
+    friend void swap(Z& x, Z& y) {TEST_THROW(6);}<br>
+};<br>
+<br>
+<br>
+int main()<br>
+{<br>
+    {<br>
+        optional<int> opt1;<br>
+        optional<int> opt2;<br>
+        static_assert(noexcept(opt1.sw<wbr>ap(opt2)) == true, "");<br>
+        assert(static_cast<bool>(opt1) == false);<br>
+        assert(static_cast<bool>(opt2) == false);<br>
+        opt1.swap(opt2);<br>
+        assert(static_cast<bool>(opt1) == false);<br>
+        assert(static_cast<bool>(opt2) == false);<br>
+    }<br>
+    {<br>
+        optional<int> opt1(1);<br>
+        optional<int> opt2;<br>
+        static_assert(noexcept(opt1.sw<wbr>ap(opt2)) == true, "");<br>
+        assert(static_cast<bool>(opt1) == true);<br>
+        assert(*opt1 == 1);<br>
+        assert(static_cast<bool>(opt2) == false);<br>
+        opt1.swap(opt2);<br>
+        assert(static_cast<bool>(opt1) == false);<br>
+        assert(static_cast<bool>(opt2) == true);<br>
+        assert(*opt2 == 1);<br>
+    }<br>
+    {<br>
+        optional<int> opt1;<br>
+        optional<int> opt2(2);<br>
+        static_assert(noexcept(opt1.sw<wbr>ap(opt2)) == true, "");<br>
+        assert(static_cast<bool>(opt1) == false);<br>
+        assert(static_cast<bool>(opt2) == true);<br>
+        assert(*opt2 == 2);<br>
+        opt1.swap(opt2);<br>
+        assert(static_cast<bool>(opt1) == true);<br>
+        assert(*opt1 == 2);<br>
+        assert(static_cast<bool>(opt2) == false);<br>
+    }<br>
+    {<br>
+        optional<int> opt1(1);<br>
+        optional<int> opt2(2);<br>
+        static_assert(noexcept(opt1.sw<wbr>ap(opt2)) == true, "");<br>
+        assert(static_cast<bool>(opt1) == true);<br>
+        assert(*opt1 == 1);<br>
+        assert(static_cast<bool>(opt2) == true);<br>
+        assert(*opt2 == 2);<br>
+        opt1.swap(opt2);<br>
+        assert(static_cast<bool>(opt1) == true);<br>
+        assert(*opt1 == 2);<br>
+        assert(static_cast<bool>(opt2) == true);<br>
+        assert(*opt2 == 1);<br>
+    }<br>
+    {<br>
+        optional<X> opt1;<br>
+        optional<X> opt2;<br>
+        static_assert(noexcept(opt1.sw<wbr>ap(opt2)) == true, "");<br>
+        assert(static_cast<bool>(opt1) == false);<br>
+        assert(static_cast<bool>(opt2) == false);<br>
+        opt1.swap(opt2);<br>
+        assert(static_cast<bool>(opt1) == false);<br>
+        assert(static_cast<bool>(opt2) == false);<br>
+        assert(X::dtor_called == 0);<br>
+    }<br>
+    {<br>
+        optional<X> opt1(1);<br>
+        optional<X> opt2;<br>
+        static_assert(noexcept(opt1.sw<wbr>ap(opt2)) == true, "");<br>
+        assert(static_cast<bool>(opt1) == true);<br>
+        assert(*opt1 == 1);<br>
+        assert(static_cast<bool>(opt2) == false);<br>
+        X::dtor_called = 0;<br>
+        opt1.swap(opt2);<br>
+        assert(X::dtor_called == 1);<br>
+        assert(static_cast<bool>(opt1) == false);<br>
+        assert(static_cast<bool>(opt2) == true);<br>
+        assert(*opt2 == 1);<br>
+    }<br>
+    {<br>
+        optional<X> opt1;<br>
+        optional<X> opt2(2);<br>
+        static_assert(noexcept(opt1.sw<wbr>ap(opt2)) == true, "");<br>
+        assert(static_cast<bool>(opt1) == false);<br>
+        assert(static_cast<bool>(opt2) == true);<br>
+        assert(*opt2 == 2);<br>
+        X::dtor_called = 0;<br>
+        opt1.swap(opt2);<br>
+        assert(X::dtor_called == 1);<br>
+        assert(static_cast<bool>(opt1) == true);<br>
+        assert(*opt1 == 2);<br>
+        assert(static_cast<bool>(opt2) == false);<br>
+    }<br>
+    {<br>
+        optional<X> opt1(1);<br>
+        optional<X> opt2(2);<br>
+        static_assert(noexcept(opt1.sw<wbr>ap(opt2)) == true, "");<br>
+        assert(static_cast<bool>(opt1) == true);<br>
+        assert(*opt1 == 1);<br>
+        assert(static_cast<bool>(opt2) == true);<br>
+        assert(*opt2 == 2);<br>
+        X::dtor_called = 0;<br>
+        opt1.swap(opt2);<br>
+        assert(X::dtor_called == 1);  // from inside std::swap<br>
+        assert(static_cast<bool>(opt1) == true);<br>
+        assert(*opt1 == 2);<br>
+        assert(static_cast<bool>(opt2) == true);<br>
+        assert(*opt2 == 1);<br>
+    }<br>
+    {<br>
+        optional<Y> opt1;<br>
+        optional<Y> opt2;<br>
+        static_assert(noexcept(opt1.sw<wbr>ap(opt2)) == false, "");<br>
+        assert(static_cast<bool>(opt1) == false);<br>
+        assert(static_cast<bool>(opt2) == false);<br>
+        opt1.swap(opt2);<br>
+        assert(static_cast<bool>(opt1) == false);<br>
+        assert(static_cast<bool>(opt2) == false);<br>
+        assert(Y::dtor_called == 0);<br>
+    }<br>
+    {<br>
+        optional<Y> opt1(1);<br>
+        optional<Y> opt2;<br>
+        static_assert(noexcept(opt1.sw<wbr>ap(opt2)) == false, "");<br>
+        assert(static_cast<bool>(opt1) == true);<br>
+        assert(*opt1 == 1);<br>
+        assert(static_cast<bool>(opt2) == false);<br>
+        Y::dtor_called = 0;<br>
+        opt1.swap(opt2);<br>
+        assert(Y::dtor_called == 1);<br>
+        assert(static_cast<bool>(opt1) == false);<br>
+        assert(static_cast<bool>(opt2) == true);<br>
+        assert(*opt2 == 1);<br>
+    }<br>
+    {<br>
+        optional<Y> opt1;<br>
+        optional<Y> opt2(2);<br>
+        static_assert(noexcept(opt1.sw<wbr>ap(opt2)) == false, "");<br>
+        assert(static_cast<bool>(opt1) == false);<br>
+        assert(static_cast<bool>(opt2) == true);<br>
+        assert(*opt2 == 2);<br>
+        Y::dtor_called = 0;<br>
+        opt1.swap(opt2);<br>
+        assert(Y::dtor_called == 1);<br>
+        assert(static_cast<bool>(opt1) == true);<br>
+        assert(*opt1 == 2);<br>
+        assert(static_cast<bool>(opt2) == false);<br>
+    }<br>
+    {<br>
+        optional<Y> opt1(1);<br>
+        optional<Y> opt2(2);<br>
+        static_assert(noexcept(opt1.sw<wbr>ap(opt2)) == false, "");<br>
+        assert(static_cast<bool>(opt1) == true);<br>
+        assert(*opt1 == 1);<br>
+        assert(static_cast<bool>(opt2) == true);<br>
+        assert(*opt2 == 2);<br>
+        Y::dtor_called = 0;<br>
+        opt1.swap(opt2);<br>
+        assert(Y::dtor_called == 0);<br>
+        assert(static_cast<bool>(opt1) == true);<br>
+        assert(*opt1 == 2);<br>
+        assert(static_cast<bool>(opt2) == true);<br>
+        assert(*opt2 == 1);<br>
+    }<br>
+    {<br>
+        optional<Z> opt1;<br>
+        optional<Z> opt2;<br>
+        static_assert(noexcept(opt1.sw<wbr>ap(opt2)) == false, "");<br>
+        assert(static_cast<bool>(opt1) == false);<br>
+        assert(static_cast<bool>(opt2) == false);<br>
+        opt1.swap(opt2);<br>
+        assert(static_cast<bool>(opt1) == false);<br>
+        assert(static_cast<bool>(opt2) == false);<br>
+    }<br>
+#ifndef TEST_HAS_NO_EXCEPTIONS<br>
+    {<br>
+        optional<Z> opt1;<br>
+        opt1.emplace(1);<br>
+        optional<Z> opt2;<br>
+        static_assert(noexcept(opt1.sw<wbr>ap(opt2)) == false, "");<br>
+        assert(static_cast<bool>(opt1) == true);<br>
+        assert(*opt1 == 1);<br>
+        assert(static_cast<bool>(opt2) == false);<br>
+        try<br>
+        {<br>
+            opt1.swap(opt2);<br>
+            assert(false);<br>
+        }<br>
+        catch (int i)<br>
+        {<br>
+            assert(i == 7);<br>
+        }<br>
+        assert(static_cast<bool>(opt1) == true);<br>
+        assert(*opt1 == 1);<br>
+        assert(static_cast<bool>(opt2) == false);<br>
+    }<br>
+    {<br>
+        optional<Z> opt1;<br>
+        optional<Z> opt2;<br>
+        opt2.emplace(2);<br>
+        static_assert(noexcept(opt1.sw<wbr>ap(opt2)) == false, "");<br>
+        assert(static_cast<bool>(opt1) == false);<br>
+        assert(static_cast<bool>(opt2) == true);<br>
+        assert(*opt2 == 2);<br>
+        try<br>
+        {<br>
+            opt1.swap(opt2);<br>
+            assert(false);<br>
+        }<br>
+        catch (int i)<br>
+        {<br>
+            assert(i == 7);<br>
+        }<br>
+        assert(static_cast<bool>(opt1) == false);<br>
+        assert(static_cast<bool>(opt2) == true);<br>
+        assert(*opt2 == 2);<br>
+    }<br>
+    {<br>
+        optional<Z> opt1;<br>
+        opt1.emplace(1);<br>
+        optional<Z> opt2;<br>
+        opt2.emplace(2);<br>
+        static_assert(noexcept(opt1.sw<wbr>ap(opt2)) == false, "");<br>
+        assert(static_cast<bool>(opt1) == true);<br>
+        assert(*opt1 == 1);<br>
+        assert(static_cast<bool>(opt2) == true);<br>
+        assert(*opt2 == 2);<br>
+        try<br>
+        {<br>
+            opt1.swap(opt2);<br>
+            assert(false);<br>
+        }<br>
+        catch (int i)<br>
+        {<br>
+            assert(i == 6);<br>
+        }<br>
+        assert(static_cast<bool>(opt1) == true);<br>
+        assert(*opt1 == 1);<br>
+        assert(static_cast<bool>(opt2) == true);<br>
+        assert(*opt2 == 2);<br>
+    }<br>
+#endif<br>
+}<br>
<br>
Added: libcxx/trunk/test/std/utilitie<wbr>s/optional/optional.object/<wbr>optional_requires_destructible<wbr>_object.fail.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/std/utilities/optional/optional.object/optional_requires_destructible_object.fail.cpp?rev=283980&view=auto" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-pr<wbr>oject/libcxx/trunk/test/std/ut<wbr>ilities/optional/optional.obje<wbr>ct/optional_requires_destructi<wbr>ble_object.fail.cpp?rev=<wbr>283980&view=auto</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- libcxx/trunk/test/std/utilitie<wbr>s/optional/optional.object/<wbr>optional_requires_destructible<wbr>_object.fail.cpp (added)<br>
+++ libcxx/trunk/test/std/utilitie<wbr>s/optional/optional.object/<wbr>optional_requires_destructible<wbr>_object.fail.cpp Wed Oct 12 02:46:20 2016<br>
@@ -0,0 +1,50 @@<br>
+//===------------------------<wbr>------------------------------<wbr>----------------===//<br>
+//<br>
+//                     The LLVM Compiler Infrastructure<br>
+//<br>
+// This file is dual licensed under the MIT and the University of Illinois Open<br>
+// Source Licenses. See LICENSE.TXT for details.<br>
+//<br>
+//===------------------------<wbr>------------------------------<wbr>----------------===//<br>
+<br>
+// UNSUPPORTED: c++98, c++03, c++11, c++14<br>
+// <optional><br>
+<br>
+// T shall be an object type and shall satisfy the requirements of Destructible<br>
+<br>
+#include <optional><br>
+<br>
+using std::optional;<br>
+<br>
+struct X<br>
+{<br>
+private:<br>
+    ~X() {}<br>
+};<br>
+<br>
+int main()<br>
+{<br>
+    using std::optional;<br>
+    {<br>
+        // expected-error@optional:* 2 {{static_assert failed "instantiation of optional with a reference type is ill-formed}}<br>
+        optional<int&> opt1;<br>
+        optional<int&&> opt2;<br>
+    }<br>
+    {<br>
+        // expected-error@optional:* {{static_assert failed "instantiation of optional with a non-destructible type is ill-formed"}}<br>
+        optional<X> opt3;<br>
+    }<br>
+    {<br>
+        // expected-error@optional:* {{static_assert failed "instantiation of optional with a non-object type is undefined behavior"}}<br>
+        // expected-error@optional:* {{static_assert failed "instantiation of optional with a non-destructible type is ill-formed}}<br>
+        optional<void()> opt4;<br>
+    }<br>
+    {<br>
+        // expected-error@optional:* {{static_assert failed "instantiation of optional with a non-object type is undefined behavior"}}<br>
+        // expected-error@optional:* {{static_assert failed "instantiation of optional with a non-destructible type is ill-formed}}<br>
+        // expected-error@optional:* 1+ {{cannot form a reference to 'void'}}<br>
+        optional<const void> opt4;<br>
+    }<br>
+    // FIXME these are garbage diagnostics that Clang should not produce<br>
+    // expected-error@optional:* 0+ {{is not a base class}}<br>
+}<br>
<br>
Added: libcxx/trunk/test/std/utilitie<wbr>s/optional/optional.object/<wbr>special_member_gen.pass.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/std/utilities/optional/optional.object/special_member_gen.pass.cpp?rev=283980&view=auto" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-pr<wbr>oject/libcxx/trunk/test/std/ut<wbr>ilities/optional/optional.obje<wbr>ct/special_member_gen.pass.<wbr>cpp?rev=283980&view=auto</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- libcxx/trunk/test/std/utilitie<wbr>s/optional/optional.object/<wbr>special_member_gen.pass.cpp (added)<br>
+++ libcxx/trunk/test/std/utilitie<wbr>s/optional/optional.object/<wbr>special_member_gen.pass.cpp Wed Oct 12 02:46:20 2016<br>
@@ -0,0 +1,74 @@<br>
+//===------------------------<wbr>------------------------------<wbr>----------------===//<br>
+//<br>
+//                     The LLVM Compiler Infrastructure<br>
+//<br>
+// This file is dual licensed under the MIT and the University of Illinois Open<br>
+// Source Licenses. See LICENSE.TXT for details.<br>
+//<br>
+//===------------------------<wbr>------------------------------<wbr>----------------===//<br>
+<br>
+// UNSUPPORTED: c++98, c++03, c++11, c++14<br>
+// <optional><br>
+<br>
+<br>
+#include <optional><br>
+#include <type_traits><br>
+#include <cassert><br>
+<br>
+#include "archetypes.hpp"<br>
+<br>
+template <class T><br>
+struct SpecialMemberTest {<br>
+    using O = std::optional<T>;<br>
+<br>
+    static_assert(std::is_default_<wbr>constructible_v<O>,<br>
+        "optional is always default constructible.");<br>
+    static_assert(std::is_copy_con<wbr>structible_v<O> == std::is_copy_constructible_v<T<wbr>>,<br>
+        "optional<T> is copy constructible if and only if T is copy constructible.");<br>
+    static_assert(std::is_move_con<wbr>structible_v<O> ==<br>
+        (std::is_copy_constructible_v<<wbr>T> || std::is_move_constructible_v<T<wbr>>),<br>
+        "optional<T> is move constructible if and only if T is copy or move constructible.");<br>
+    static_assert(std::is_copy_ass<wbr>ignable_v<O> ==<br>
+        (std::is_copy_constructible_v<<wbr>T> && std::is_copy_assignable_v<T>),<br>
+        "optional<T> is copy assignable if and only if T is both copy "<br>
+        "constructible and copy assignable.");<br>
+    static_assert(std::is_move_ass<wbr>ignable_v<O> ==<br>
+        ((std::is_copy_constructible_v<wbr><T> && std::is_copy_assignable_v<T>) ||<br>
+         (std::is_move_constructible_<wbr>v<T> && std::is_move_assignable_v<T>))<wbr>,<br>
+        "optional<T> is move assignable if and only if T is both move assignable and "<br>
+        "move constructible, or both copy constructible and copy assignable.");<br>
+};<br>
+<br>
+template <class ...Args> static void sink(Args&&...) {}<br>
+<br>
+template <class ...TestTypes><br>
+struct DoTestsMetafunction {<br>
+    DoTestsMetafunction() { sink(SpecialMemberTest<TestTyp<wbr>es>{}...); }<br>
+};<br>
+<br>
+struct TrivialMoveNonTrivialCopy {<br>
+    TrivialMoveNonTrivialCopy() = default;<br>
+    TrivialMoveNonTrivialCopy(cons<wbr>t TrivialMoveNonTrivialCopy&) {}<br>
+    TrivialMoveNonTrivialCopy(Triv<wbr>ialMoveNonTrivialCopy&&) = default;<br>
+    TrivialMoveNonTrivialCopy& operator=(const TrivialMoveNonTrivialCopy&) { return *this; }<br>
+    TrivialMoveNonTrivialCopy& operator=(TrivialMoveNonTrivia<wbr>lCopy&&) = default;<br>
+};<br>
+<br>
+struct TrivialCopyNonTrivialMove {<br>
+    TrivialCopyNonTrivialMove() = default;<br>
+    TrivialCopyNonTrivialMove(cons<wbr>t TrivialCopyNonTrivialMove&) = default;<br>
+    TrivialCopyNonTrivialMove(Triv<wbr>ialCopyNonTrivialMove&&) {}<br>
+    TrivialCopyNonTrivialMove& operator=(const TrivialCopyNonTrivialMove&) = default;<br>
+    TrivialCopyNonTrivialMove& operator=(TrivialCopyNonTrivia<wbr>lMove&&) { return *this; }<br>
+};<br>
+<br>
+int main()<br>
+{<br>
+    sink(<br>
+        ImplicitTypes::ApplyTypes<DoTe<wbr>stsMetafunction>{},<br>
+        ExplicitTypes::ApplyTypes<DoTe<wbr>stsMetafunction>{},<br>
+        NonLiteralTypes::ApplyTypes<Do<wbr>TestsMetafunction>{},<br>
+        NonTrivialTypes::ApplyTypes<Do<wbr>TestsMetafunction>{},<br>
+        DoTestsMetafunction<TrivialMov<wbr>eNonTrivialCopy, TrivialCopyNonTrivialMove>{}<br>
+    );<br>
+}<br>
<br>
Added: libcxx/trunk/test/std/utilitie<wbr>s/optional/optional.object/<wbr>types.pass.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/std/utilities/optional/optional.object/types.pass.cpp?rev=283980&view=auto" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-pr<wbr>oject/libcxx/trunk/test/std/ut<wbr>ilities/optional/optional.obje<wbr>ct/types.pass.cpp?rev=283980&<wbr>view=auto</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- libcxx/trunk/test/std/utilitie<wbr>s/optional/optional.object/<wbr>types.pass.cpp (added)<br>
+++ libcxx/trunk/test/std/utilitie<wbr>s/optional/optional.object/<wbr>types.pass.cpp Wed Oct 12 02:46:20 2016<br>
@@ -0,0 +1,38 @@<br>
+//===------------------------<wbr>------------------------------<wbr>----------------===//<br>
+//<br>
+//                     The LLVM Compiler Infrastructure<br>
+//<br>
+// This file is dual licensed under the MIT and the University of Illinois Open<br>
+// Source Licenses. See LICENSE.TXT for details.<br>
+//<br>
+//===------------------------<wbr>------------------------------<wbr>----------------===//<br>
+<br>
+// UNSUPPORTED: c++98, c++03, c++11, c++14<br>
+// <optional><br>
+<br>
+// template <class T><br>
+// class optional<br>
+// {<br>
+// public:<br>
+//     typedef T value_type;<br>
+//     ...<br>
+<br>
+#include <optional><br>
+#include <type_traits><br>
+<br>
+using std::optional;<br>
+<br>
+template <class Opt, class T><br>
+void<br>
+test()<br>
+{<br>
+    static_assert(std::is_same<typ<wbr>ename Opt::value_type, T>::value, "");<br>
+}<br>
+<br>
+int main()<br>
+{<br>
+    test<optional<int>, int>();<br>
+    test<optional<const int>, const int>();<br>
+    test<optional<double>, double>();<br>
+    test<optional<const double>, const double>();<br>
+}<br>
<br>
Added: libcxx/trunk/test/std/utilitie<wbr>s/optional/optional.relops/<wbr>equal.pass.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/std/utilities/optional/optional.relops/equal.pass.cpp?rev=283980&view=auto" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-pr<wbr>oject/libcxx/trunk/test/std/ut<wbr>ilities/optional/optional.relo<wbr>ps/equal.pass.cpp?rev=283980&<wbr>view=auto</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- libcxx/trunk/test/std/utilitie<wbr>s/optional/optional.relops/<wbr>equal.pass.cpp (added)<br>
+++ libcxx/trunk/test/std/utilitie<wbr>s/optional/optional.relops/<wbr>equal.pass.cpp Wed Oct 12 02:46:20 2016<br>
@@ -0,0 +1,74 @@<br>
+//===------------------------<wbr>------------------------------<wbr>----------------===//<br>
+//<br>
+//                     The LLVM Compiler Infrastructure<br>
+//<br>
+// This file is dual licensed under the MIT and the University of Illinois Open<br>
+// Source Licenses. See LICENSE.TXT for details.<br>
+//<br>
+//===------------------------<wbr>------------------------------<wbr>----------------===//<br>
+<br>
+// UNSUPPORTED: c++98, c++03, c++11, c++14<br>
+// <optional><br>
+<br>
+// template <class T> constexpr bool operator==(const optional<T>& x, const optional<T>& y);<br>
+<br>
+#include <optional><br>
+#include <type_traits><br>
+#include <cassert><br>
+<br>
+using std::optional;<br>
+<br>
+struct X<br>
+{<br>
+    int i_;<br>
+<br>
+    constexpr X(int i) : i_(i) {}<br>
+};<br>
+<br>
+constexpr bool operator == ( const X &lhs, const X &rhs )<br>
+    { return lhs.i_ == rhs.i_ ; }<br>
+<br>
+int main()<br>
+{<br>
+    {<br>
+    typedef X T;<br>
+    typedef optional<T> O;<br>
+<br>
+    constexpr O o1;     // disengaged<br>
+    constexpr O o2;     // disengaged<br>
+    constexpr O o3{1};  // engaged<br>
+    constexpr O o4{2};  // engaged<br>
+    constexpr O o5{1};  // engaged<br>
+<br>
+    static_assert (   o1 == o1 , "" );<br>
+    static_assert (   o1 == o2 , "" );<br>
+    static_assert ( !(o1 == o3), "" );<br>
+    static_assert ( !(o1 == o4), "" );<br>
+    static_assert ( !(o1 == o5), "" );<br>
+<br>
+    static_assert (   o2 == o1 , "" );<br>
+    static_assert (   o2 == o2 , "" );<br>
+    static_assert ( !(o2 == o3), "" );<br>
+    static_assert ( !(o2 == o4), "" );<br>
+    static_assert ( !(o2 == o5), "" );<br>
+<br>
+    static_assert ( !(o3 == o1), "" );<br>
+    static_assert ( !(o3 == o2), "" );<br>
+    static_assert (   o3 == o3 , "" );<br>
+    static_assert ( !(o3 == o4), "" );<br>
+    static_assert (   o3 == o5 , "" );<br>
+<br>
+    static_assert ( !(o4 == o1), "" );<br>
+    static_assert ( !(o4 == o2), "" );<br>
+    static_assert ( !(o4 == o3), "" );<br>
+    static_assert (   o4 == o4 , "" );<br>
+    static_assert ( !(o4 == o5), "" );<br>
+<br>
+    static_assert ( !(o5 == o1), "" );<br>
+    static_assert ( !(o5 == o2), "" );<br>
+    static_assert (   o5 == o3 , "" );<br>
+    static_assert ( !(o5 == o4), "" );<br>
+    static_assert (   o5 == o5 , "" );<br>
+<br>
+    }<br>
+}<br>
<br>
Added: libcxx/trunk/test/std/utilitie<wbr>s/optional/optional.relops/<wbr>greater_equal.pass.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/std/utilities/optional/optional.relops/greater_equal.pass.cpp?rev=283980&view=auto" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-pr<wbr>oject/libcxx/trunk/test/std/ut<wbr>ilities/optional/optional.relo<wbr>ps/greater_equal.pass.cpp?rev=<wbr>283980&view=auto</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- libcxx/trunk/test/std/utilitie<wbr>s/optional/optional.relops/<wbr>greater_equal.pass.cpp (added)<br>
+++ libcxx/trunk/test/std/utilitie<wbr>s/optional/optional.relops/<wbr>greater_equal.pass.cpp Wed Oct 12 02:46:20 2016<br>
@@ -0,0 +1,70 @@<br>
+//===------------------------<wbr>------------------------------<wbr>----------------===//<br>
+//<br>
+//                     The LLVM Compiler Infrastructure<br>
+//<br>
+// This file is dual licensed under the MIT and the University of Illinois Open<br>
+// Source Licenses. See LICENSE.TXT for details.<br>
+//<br>
+//===------------------------<wbr>------------------------------<wbr>----------------===//<br>
+<br>
+// UNSUPPORTED: c++98, c++03, c++11, c++14<br>
+// <optional><br>
+<br>
+// template <class T> constexpr bool operator>= (const optional<T>& x, const optional<T>& y);<br>
+<br>
+#include <optional><br>
+<br>
+using std::optional;<br>
+<br>
+struct X<br>
+{<br>
+    int i_;<br>
+<br>
+    constexpr X(int i) : i_(i) {}<br>
+};<br>
+<br>
+constexpr bool operator >= ( const X &lhs, const X &rhs )<br>
+    { return lhs.i_ >= rhs.i_ ; }<br>
+<br>
+int main()<br>
+{<br>
+    {<br>
+    typedef optional<X> O;<br>
+<br>
+    constexpr O o1;     // disengaged<br>
+    constexpr O o2;     // disengaged<br>
+    constexpr O o3{1};  // engaged<br>
+    constexpr O o4{2};  // engaged<br>
+    constexpr O o5{1};  // engaged<br>
+<br>
+    static_assert (  (o1 >= o1), "" );<br>
+    static_assert (  (o1 >= o2), "" );<br>
+    static_assert ( !(o1 >= o3), "" );<br>
+    static_assert ( !(o1 >= o4), "" );<br>
+    static_assert ( !(o1 >= o5), "" );<br>
+<br>
+    static_assert (  (o2 >= o1), "" );<br>
+    static_assert (  (o2 >= o2), "" );<br>
+    static_assert ( !(o2 >= o3), "" );<br>
+    static_assert ( !(o2 >= o4), "" );<br>
+    static_assert ( !(o2 >= o5), "" );<br>
+<br>
+    static_assert (  (o3 >= o1), "" );<br>
+    static_assert (  (o3 >= o2), "" );<br>
+    static_assert (  (o3 >= o3), "" );<br>
+    static_assert ( !(o3 >= o4), "" );<br>
+    static_assert (  (o3 >= o5), "" );<br>
+<br>
+    static_assert (  (o4 >= o1), "" );<br>
+    static_assert (  (o4 >= o2), "" );<br>
+    static_assert (  (o4 >= o3), "" );<br>
+    static_assert (  (o4 >= o4), "" );<br>
+    static_assert (  (o4 >= o5), "" );<br>
+<br>
+    static_assert (  (o5 >= o1), "" );<br>
+    static_assert (  (o5 >= o2), "" );<br>
+    static_assert (  (o5 >= o3), "" );<br>
+    static_assert ( !(o5 >= o4), "" );<br>
+    static_assert (  (o5 >= o5), "" );<br>
+    }<br>
+}<br>
<br>
Added: libcxx/trunk/test/std/utilitie<wbr>s/optional/optional.relops/<wbr>greater_than.pass.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/std/utilities/optional/optional.relops/greater_than.pass.cpp?rev=283980&view=auto" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-pr<wbr>oject/libcxx/trunk/test/std/ut<wbr>ilities/optional/optional.relo<wbr>ps/greater_than.pass.cpp?rev=<wbr>283980&view=auto</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- libcxx/trunk/test/std/utilitie<wbr>s/optional/optional.relops/<wbr>greater_than.pass.cpp (added)<br>
+++ libcxx/trunk/test/std/utilitie<wbr>s/optional/optional.relops/<wbr>greater_than.pass.cpp Wed Oct 12 02:46:20 2016<br>
@@ -0,0 +1,70 @@<br>
+//===------------------------<wbr>------------------------------<wbr>----------------===//<br>
+//<br>
+//                     The LLVM Compiler Infrastructure<br>
+//<br>
+// This file is dual licensed under the MIT and the University of Illinois Open<br>
+// Source Licenses. See LICENSE.TXT for details.<br>
+//<br>
+//===------------------------<wbr>------------------------------<wbr>----------------===//<br>
+<br>
+// UNSUPPORTED: c++98, c++03, c++11, c++14<br>
+// <optional><br>
+<br>
+// template <class T> constexpr bool operator> (const optional<T>& x, const optional<T>& y);<br>
+<br>
+#include <optional><br>
+<br>
+using std::optional;<br>
+<br>
+struct X<br>
+{<br>
+    int i_;<br>
+<br>
+    constexpr X(int i) : i_(i) {}<br>
+};<br>
+<br>
+constexpr bool operator > ( const X &lhs, const X &rhs )<br>
+    { return lhs.i_ > rhs.i_ ; }<br>
+<br>
+int main()<br>
+{<br>
+    {<br>
+    typedef optional<X> O;<br>
+<br>
+    constexpr O o1;     // disengaged<br>
+    constexpr O o2;     // disengaged<br>
+    constexpr O o3{1};  // engaged<br>
+    constexpr O o4{2};  // engaged<br>
+    constexpr O o5{1};  // engaged<br>
+<br>
+    static_assert ( !(o1 > o1), "" );<br>
+    static_assert ( !(o1 > o2), "" );<br>
+    static_assert ( !(o1 > o3), "" );<br>
+    static_assert ( !(o1 > o4), "" );<br>
+    static_assert ( !(o1 > o5), "" );<br>
+<br>
+    static_assert ( !(o2 > o1), "" );<br>
+    static_assert ( !(o2 > o2), "" );<br>
+    static_assert ( !(o2 > o3), "" );<br>
+    static_assert ( !(o2 > o4), "" );<br>
+    static_assert ( !(o2 > o5), "" );<br>
+<br>
+    static_assert (  (o3 > o1), "" );<br>
+    static_assert (  (o3 > o2), "" );<br>
+    static_assert ( !(o3 > o3), "" );<br>
+    static_assert ( !(o3 > o4), "" );<br>
+    static_assert ( !(o3 > o5), "" );<br>
+<br>
+    static_assert (  (o4 > o1), "" );<br>
+    static_assert (  (o4 > o2), "" );<br>
+    static_assert (  (o4 > o3), "" );<br>
+    static_assert ( !(o4 > o4), "" );<br>
+    static_assert (  (o4 > o5), "" );<br>
+<br>
+    static_assert (  (o5 > o1), "" );<br>
+    static_assert (  (o5 > o2), "" );<br>
+    static_assert ( !(o5 > o3), "" );<br>
+    static_assert ( !(o5 > o4), "" );<br>
+    static_assert ( !(o5 > o5), "" );<br>
+    }<br>
+}<br>
<br>
Added: libcxx/trunk/test/std/utilitie<wbr>s/optional/optional.relops/<wbr>less_equal.pass.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/std/utilities/optional/optional.relops/less_equal.pass.cpp?rev=283980&view=auto" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-pr<wbr>oject/libcxx/trunk/test/std/ut<wbr>ilities/optional/optional.relo<wbr>ps/less_equal.pass.cpp?rev=<wbr>283980&view=auto</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- libcxx/trunk/test/std/utilitie<wbr>s/optional/optional.relops/<wbr>less_equal.pass.cpp (added)<br>
+++ libcxx/trunk/test/std/utilitie<wbr>s/optional/optional.relops/<wbr>less_equal.pass.cpp Wed Oct 12 02:46:20 2016<br>
@@ -0,0 +1,70 @@<br>
+//===------------------------<wbr>------------------------------<wbr>----------------===//<br>
+//<br>
+//                     The LLVM Compiler Infrastructure<br>
+//<br>
+// This file is dual licensed under the MIT and the University of Illinois Open<br>
+// Source Licenses. See LICENSE.TXT for details.<br>
+//<br>
+//===------------------------<wbr>------------------------------<wbr>----------------===//<br>
+<br>
+// UNSUPPORTED: c++98, c++03, c++11, c++14<br>
+// <optional><br>
+<br>
+// template <class T> constexpr bool operator<= (const optional<T>& x, const optional<T>& y);<br>
+<br>
+#include <optional><br>
+<br>
+using std::optional;<br>
+<br>
+struct X<br>
+{<br>
+    int i_;<br>
+<br>
+    constexpr X(int i) : i_(i) {}<br>
+};<br>
+<br>
+constexpr bool operator <= ( const X &lhs, const X &rhs )<br>
+    { return lhs.i_ <= rhs.i_ ; }<br>
+<br>
+int main()<br>
+{<br>
+    {<br>
+    typedef optional<X> O;<br>
+<br>
+    constexpr O o1;     // disengaged<br>
+    constexpr O o2;     // disengaged<br>
+    constexpr O o3{1};  // engaged<br>
+    constexpr O o4{2};  // engaged<br>
+    constexpr O o5{1};  // engaged<br>
+<br>
+    static_assert (  (o1 <= o1), "" );<br>
+    static_assert (  (o1 <= o2), "" );<br>
+    static_assert (  (o1 <= o3), "" );<br>
+    static_assert (  (o1 <= o4), "" );<br>
+    static_assert (  (o1 <= o5), "" );<br>
+<br>
+    static_assert (  (o2 <= o1), "" );<br>
+    static_assert (  (o2 <= o2), "" );<br>
+    static_assert (  (o2 <= o3), "" );<br>
+    static_assert (  (o2 <= o4), "" );<br>
+    static_assert (  (o2 <= o5), "" );<br>
+<br>
+    static_assert ( !(o3 <= o1), "" );<br>
+    static_assert ( !(o3 <= o2), "" );<br>
+    static_assert (  (o3 <= o3), "" );<br>
+    static_assert (  (o3 <= o4), "" );<br>
+    static_assert (  (o3 <= o5), "" );<br>
+<br>
+    static_assert ( !(o4 <= o1), "" );<br>
+    static_assert ( !(o4 <= o2), "" );<br>
+    static_assert ( !(o4 <= o3), "" );<br>
+    static_assert (  (o4 <= o4), "" );<br>
+    static_assert ( !(o4 <= o5), "" );<br>
+<br>
+    static_assert ( !(o5 <= o1), "" );<br>
+    static_assert ( !(o5 <= o2), "" );<br>
+    static_assert (  (o5 <= o3), "" );<br>
+    static_assert (  (o5 <= o4), "" );<br>
+    static_assert (  (o5 <= o5), "" );<br>
+    }<br>
+}<br>
<br>
Added: libcxx/trunk/test/std/utilitie<wbr>s/optional/optional.relops/<wbr>less_than.pass.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/std/utilities/optional/optional.relops/less_than.pass.cpp?rev=283980&view=auto" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-pr<wbr>oject/libcxx/trunk/test/std/ut<wbr>ilities/optional/optional.relo<wbr>ps/less_than.pass.cpp?rev=2839<wbr>80&view=auto</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- libcxx/trunk/test/std/utilitie<wbr>s/optional/optional.relops/<wbr>less_than.pass.cpp (added)<br>
+++ libcxx/trunk/test/std/utilitie<wbr>s/optional/optional.relops/<wbr>less_than.pass.cpp Wed Oct 12 02:46:20 2016<br>
@@ -0,0 +1,70 @@<br>
+//===------------------------<wbr>------------------------------<wbr>----------------===//<br>
+//<br>
+//                     The LLVM Compiler Infrastructure<br>
+//<br>
+// This file is dual licensed under the MIT and the University of Illinois Open<br>
+// Source Licenses. See LICENSE.TXT for details.<br>
+//<br>
+//===------------------------<wbr>------------------------------<wbr>----------------===//<br>
+<br>
+// UNSUPPORTED: c++98, c++03, c++11, c++14<br>
+// <optional><br>
+<br>
+// template <class T> constexpr bool operator< (const optional<T>& x, const optional<T>& y);<br>
+<br>
+#include <optional><br>
+<br>
+using std::optional;<br>
+<br>
+struct X<br>
+{<br>
+    int i_;<br>
+<br>
+    constexpr X(int i) : i_(i) {}<br>
+};<br>
+<br>
+constexpr bool operator < ( const X &lhs, const X &rhs )<br>
+    { return lhs.i_ < rhs.i_ ; }<br>
+<br>
+int main()<br>
+{<br>
+    {<br>
+    typedef optional<X> O;<br>
+<br>
+    constexpr O o1;     // disengaged<br>
+    constexpr O o2;     // disengaged<br>
+    constexpr O o3{1};  // engaged<br>
+    constexpr O o4{2};  // engaged<br>
+    constexpr O o5{1};  // engaged<br>
+<br>
+    static_assert ( !(o1 < o1), "" );<br>
+    static_assert ( !(o1 < o2), "" );<br>
+    static_assert (  (o1 < o3), "" );<br>
+    static_assert (  (o1 < o4), "" );<br>
+    static_assert (  (o1 < o5), "" );<br>
+<br>
+    static_assert ( !(o2 < o1), "" );<br>
+    static_assert ( !(o2 < o2), "" );<br>
+    static_assert (  (o2 < o3), "" );<br>
+    static_assert (  (o2 < o4), "" );<br>
+    static_assert (  (o2 < o5), "" );<br>
+<br>
+    static_assert ( !(o3 < o1), "" );<br>
+    static_assert ( !(o3 < o2), "" );<br>
+    static_assert ( !(o3 < o3), "" );<br>
+    static_assert (  (o3 < o4), "" );<br>
+    static_assert ( !(o3 < o5), "" );<br>
+<br>
+    static_assert ( !(o4 < o1), "" );<br>
+    static_assert ( !(o4 < o2), "" );<br>
+    static_assert ( !(o4 < o3), "" );<br>
+    static_assert ( !(o4 < o4), "" );<br>
+    static_assert ( !(o4 < o5), "" );<br>
+<br>
+    static_assert ( !(o5 < o1), "" );<br>
+    static_assert ( !(o5 < o2), "" );<br>
+    static_assert ( !(o5 < o3), "" );<br>
+    static_assert (  (o5 < o4), "" );<br>
+    static_assert ( !(o5 < o5), "" );<br>
+    }<br>
+}<br>
<br>
Added: libcxx/trunk/test/std/utilitie<wbr>s/optional/optional.relops/<wbr>not_equal.pass.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/std/utilities/optional/optional.relops/not_equal.pass.cpp?rev=283980&view=auto" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-pr<wbr>oject/libcxx/trunk/test/std/ut<wbr>ilities/optional/optional.relo<wbr>ps/not_equal.pass.cpp?rev=2839<wbr>80&view=auto</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- libcxx/trunk/test/std/utilitie<wbr>s/optional/optional.relops/<wbr>not_equal.pass.cpp (added)<br>
+++ libcxx/trunk/test/std/utilitie<wbr>s/optional/optional.relops/<wbr>not_equal.pass.cpp Wed Oct 12 02:46:20 2016<br>
@@ -0,0 +1,74 @@<br>
+//===------------------------<wbr>------------------------------<wbr>----------------===//<br>
+//<br>
+//                     The LLVM Compiler Infrastructure<br>
+//<br>
+// This file is dual licensed under the MIT and the University of Illinois Open<br>
+// Source Licenses. See LICENSE.TXT for details.<br>
+//<br>
+//===------------------------<wbr>------------------------------<wbr>----------------===//<br>
+<br>
+// UNSUPPORTED: c++98, c++03, c++11, c++14<br>
+// <optional><br>
+<br>
+// template <class T> constexpr bool operator!=(const optional<T>& x, const optional<T>& y);<br>
+<br>
+#include <optional><br>
+#include <type_traits><br>
+#include <cassert><br>
+<br>
+using std::optional;<br>
+<br>
+struct X<br>
+{<br>
+    int i_;<br>
+<br>
+    constexpr X(int i) : i_(i) {}<br>
+};<br>
+<br>
+constexpr bool operator != ( const X &lhs, const X &rhs )<br>
+    { return lhs.i_ != rhs.i_ ; }<br>
+<br>
+int main()<br>
+{<br>
+    {<br>
+    typedef X T;<br>
+    typedef optional<T> O;<br>
+<br>
+    constexpr O o1;     // disengaged<br>
+    constexpr O o2;     // disengaged<br>
+    constexpr O o3{1};  // engaged<br>
+    constexpr O o4{2};  // engaged<br>
+    constexpr O o5{1};  // engaged<br>
+<br>
+    static_assert ( !(o1 != o1), "" );<br>
+    static_assert ( !(o1 != o2), "" );<br>
+    static_assert (  (o1 != o3), "" );<br>
+    static_assert (  (o1 != o4), "" );<br>
+    static_assert (  (o1 != o5), "" );<br>
+<br>
+    static_assert ( !(o2 != o1), "" );<br>
+    static_assert ( !(o2 != o2), "" );<br>
+    static_assert (  (o2 != o3), "" );<br>
+    static_assert (  (o2 != o4), "" );<br>
+    static_assert (  (o2 != o5), "" );<br>
+<br>
+    static_assert (  (o3 != o1), "" );<br>
+    static_assert (  (o3 != o2), "" );<br>
+    static_assert ( !(o3 != o3), "" );<br>
+    static_assert (  (o3 != o4), "" );<br>
+    static_assert ( !(o3 != o5), "" );<br>
+<br>
+    static_assert (  (o4 != o1), "" );<br>
+    static_assert (  (o4 != o2), "" );<br>
+    static_assert (  (o4 != o3), "" );<br>
+    static_assert ( !(o4 != o4), "" );<br>
+    static_assert (  (o4 != o5), "" );<br>
+<br>
+    static_assert (  (o5 != o1), "" );<br>
+    static_assert (  (o5 != o2), "" );<br>
+    static_assert ( !(o5 != o3), "" );<br>
+    static_assert (  (o5 != o4), "" );<br>
+    static_assert ( !(o5 != o5), "" );<br>
+<br>
+    }<br>
+}<br>
<br>
Added: libcxx/trunk/test/std/utilitie<wbr>s/optional/optional.specalg/<wbr>make_optional.pass.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/std/utilities/optional/optional.specalg/make_optional.pass.cpp?rev=283980&view=auto" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-pr<wbr>oject/libcxx/trunk/test/std/ut<wbr>ilities/optional/optional.spec<wbr>alg/make_optional.pass.cpp?<wbr>rev=283980&view=auto</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- libcxx/trunk/test/std/utilitie<wbr>s/optional/optional.specalg/<wbr>make_optional.pass.cpp (added)<br>
+++ libcxx/trunk/test/std/utilitie<wbr>s/optional/optional.specalg/<wbr>make_optional.pass.cpp Wed Oct 12 02:46:20 2016<br>
@@ -0,0 +1,51 @@<br>
+//===------------------------<wbr>------------------------------<wbr>----------------===//<br>
+//<br>
+//                     The LLVM Compiler Infrastructure<br>
+//<br>
+// This file is dual licensed under the MIT and the University of Illinois Open<br>
+// Source Licenses. See LICENSE.TXT for details.<br>
+//<br>
+//===------------------------<wbr>------------------------------<wbr>----------------===//<br>
+<br>
+// UNSUPPORTED: c++98, c++03, c++11, c++14<br>
+// <optional><br>
+<br>
+// template <class T><br>
+//   constexpr optional<decay_t<T>> make_optional(T&& v);<br>
+<br>
+#include <optional><br>
+#include <string><br>
+#include <memory><br>
+#include <cassert><br>
+<br>
+#include "test_macros.h"<br>
+<br>
+int main()<br>
+{<br>
+    using std::optional;<br>
+    using std::make_optional;<br>
+    {<br>
+        int arr[10]; ((void)arr);<br>
+        ASSERT_SAME_TYPE(decltype(make<wbr>_optional(arr)), optional<int*>);<br>
+    }<br>
+    {<br>
+        constexpr auto opt = make_optional(2);<br>
+        ASSERT_SAME_TYPE(decltype(opt)<wbr>, const optional<int>);<br>
+        static_assert(opt.value() == 2);<br>
+    }<br>
+    {<br>
+        optional<int> opt = make_optional(2);<br>
+        assert(*opt == 2);<br>
+    }<br>
+    {<br>
+        std::string s("123");<br>
+        optional<std::string> opt = make_optional(s);<br>
+        assert(*opt == s);<br>
+    }<br>
+    {<br>
+        std::unique_ptr<int> s(new int(3));<br>
+        optional<std::unique_ptr<int>> opt = make_optional(std::move(s));<br>
+        assert(**opt == 3);<br>
+        assert(s == nullptr);<br>
+    }<br>
+}<br>
<br>
Added: libcxx/trunk/test/std/utilitie<wbr>s/optional/optional.specalg/<wbr>make_optional_explicit.pass.<wbr>cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/std/utilities/optional/optional.specalg/make_optional_explicit.pass.cpp?rev=283980&view=auto" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-pr<wbr>oject/libcxx/trunk/test/std/ut<wbr>ilities/optional/optional.spec<wbr>alg/make_optional_explicit.<wbr>pass.cpp?rev=283980&view=auto</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- libcxx/trunk/test/std/utilitie<wbr>s/optional/optional.specalg/<wbr>make_optional_explicit.pass.<wbr>cpp (added)<br>
+++ libcxx/trunk/test/std/utilitie<wbr>s/optional/optional.specalg/<wbr>make_optional_explicit.pass.<wbr>cpp Wed Oct 12 02:46:20 2016<br>
@@ -0,0 +1,45 @@<br>
+//===------------------------<wbr>------------------------------<wbr>----------------===//<br>
+//<br>
+//                     The LLVM Compiler Infrastructure<br>
+//<br>
+// This file is dual licensed under the MIT and the University of Illinois Open<br>
+// Source Licenses. See LICENSE.TXT for details.<br>
+//<br>
+//===------------------------<wbr>------------------------------<wbr>----------------===//<br>
+<br>
+// UNSUPPORTED: c++98, c++03, c++11, c++14<br>
+// <optional><br>
+<br>
+// template <class T, class... Args><br>
+//   constexpr optional<T> make_optional(Args&&... args);<br>
+<br>
+#include <optional><br>
+#include <string><br>
+#include <memory><br>
+#include <cassert><br>
+<br>
+int main()<br>
+{<br>
+    using std::optional;<br>
+    using std::make_optional;<br>
+<br>
+    {<br>
+        constexpr auto opt = make_optional<int>('a');<br>
+        static_assert(*opt == int('a'), "");<br>
+    }<br>
+    {<br>
+        std::string s("123");<br>
+        auto opt = make_optional<std::string>(s);<br>
+        assert(*opt == s);<br>
+    }<br>
+    {<br>
+        std::unique_ptr<int> s(new int(3));<br>
+        auto opt = make_optional<std::unique_ptr<<wbr>int>>(std::move(s));<br>
+        assert(**opt == 3);<br>
+        assert(s == nullptr);<br>
+    }<br>
+    {<br>
+        auto opt = make_optional<std::string>(4, 'X');<br>
+        assert(*opt == "XXXX");<br>
+    }<br>
+}<br>
<br>
Added: libcxx/trunk/test/std/utilitie<wbr>s/optional/optional.specalg/<wbr>make_optional_explicit_<wbr>initializer_list.pass.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/std/utilities/optional/optional.specalg/make_optional_explicit_initializer_list.pass.cpp?rev=283980&view=auto" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-pr<wbr>oject/libcxx/trunk/test/std/ut<wbr>ilities/optional/optional.spec<wbr>alg/make_optional_explicit_<wbr>initializer_list.pass.cpp?rev=<wbr>283980&view=auto</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- libcxx/trunk/test/std/utilitie<wbr>s/optional/optional.specalg/<wbr>make_optional_explicit_<wbr>initializer_list.pass.cpp (added)<br>
+++ libcxx/trunk/test/std/utilitie<wbr>s/optional/optional.specalg/<wbr>make_optional_explicit_<wbr>initializer_list.pass.cpp Wed Oct 12 02:46:20 2016<br>
@@ -0,0 +1,53 @@<br>
+//===------------------------<wbr>------------------------------<wbr>----------------===//<br>
+//<br>
+//                     The LLVM Compiler Infrastructure<br>
+//<br>
+// This file is dual licensed under the MIT and the University of Illinois Open<br>
+// Source Licenses. See LICENSE.TXT for details.<br>
+//<br>
+//===------------------------<wbr>------------------------------<wbr>----------------===//<br>
+<br>
+// UNSUPPORTED: c++98, c++03, c++11, c++14<br>
+// <optional><br>
+<br>
+// template <class T, class U, class... Args><br>
+//   constexpr optional<T> make_optional(initializer_list<wbr><U> il, Args&&... args);<br>
+<br>
+#include <optional><br>
+#include <string><br>
+#include <memory><br>
+#include <cassert><br>
+<br>
+#include "test_macros.h"<br>
+<br>
+struct TestT {<br>
+  int x;<br>
+  int size;<br>
+  constexpr TestT(std::initializer_list<in<wbr>t> il) : x(*il.begin()), size(il.size()) {}<br>
+  constexpr TestT(std::initializer_list<in<wbr>t> il, const int*)<br>
+      : x(*il.begin()), size(il.size()) {}<br>
+};<br>
+<br>
+int main()<br>
+{<br>
+    using std::make_optional;<br>
+    {<br>
+        constexpr auto opt = make_optional<TestT>({42, 2, 3});<br>
+        ASSERT_SAME_TYPE(decltype(opt)<wbr>, const std::optional<TestT>);<br>
+        static_assert(opt->x == 42, "");<br>
+        static_assert(opt->size == 3, "");<br>
+    }<br>
+    {<br>
+        constexpr auto opt = make_optional<TestT>({42, 2, 3}, nullptr);<br>
+        static_assert(opt->x == 42, "");<br>
+        static_assert(opt->size == 3, "");<br>
+    }<br>
+    {<br>
+        auto opt = make_optional<std::string>({'1<wbr>', '2', '3'});<br>
+        assert(*opt == "123");<br>
+    }<br>
+    {<br>
+        auto opt = make_optional<std::string>({'a<wbr>', 'b', 'c'}, std::allocator<char>{});<br>
+        assert(*opt == "abc");<br>
+    }<br>
+}<br>
<br>
Added: libcxx/trunk/test/std/utilitie<wbr>s/optional/optional.specalg/<wbr>swap.pass.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/std/utilities/optional/optional.specalg/swap.pass.cpp?rev=283980&view=auto" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-pr<wbr>oject/libcxx/trunk/test/std/ut<wbr>ilities/optional/optional.spec<wbr>alg/swap.pass.cpp?rev=283980&<wbr>view=auto</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- libcxx/trunk/test/std/utilitie<wbr>s/optional/optional.specalg/<wbr>swap.pass.cpp (added)<br>
+++ libcxx/trunk/test/std/utilitie<wbr>s/optional/optional.specalg/<wbr>swap.pass.cpp Wed Oct 12 02:46:20 2016<br>
@@ -0,0 +1,352 @@<br>
+//===------------------------<wbr>------------------------------<wbr>----------------===//<br>
+//<br>
+//                     The LLVM Compiler Infrastructure<br>
+//<br>
+// This file is dual licensed under the MIT and the University of Illinois Open<br>
+// Source Licenses. See LICENSE.TXT for details.<br>
+//<br>
+//===------------------------<wbr>------------------------------<wbr>----------------===//<br>
+<br>
+// UNSUPPORTED: c++98, c++03, c++11, c++14<br>
+// <optional><br>
+<br>
+// template <class T> void swap(optional<T>& x, optional<T>& y)<br>
+//     noexcept(noexcept(x.swap(y)))<wbr>;<br>
+<br>
+#include <optional><br>
+#include <type_traits><br>
+#include <cassert><br>
+<br>
+#include "test_macros.h"<br>
+#include "archetypes.hpp"<br>
+<br>
+using std::optional;<br>
+<br>
+class X<br>
+{<br>
+    int i_;<br>
+public:<br>
+    static unsigned dtor_called;<br>
+    X(int i) : i_(i) {}<br>
+    X(X&& x) = default;<br>
+    X& operator=(X&&) = default;<br>
+    ~X() {++dtor_called;}<br>
+<br>
+    friend bool operator==(const X& x, const X& y) {return x.i_ == y.i_;}<br>
+};<br>
+<br>
+unsigned X::dtor_called = 0;<br>
+<br>
+class Y<br>
+{<br>
+    int i_;<br>
+public:<br>
+    static unsigned dtor_called;<br>
+    Y(int i) : i_(i) {}<br>
+    Y(Y&&) = default;<br>
+    ~Y() {++dtor_called;}<br>
+<br>
+    friend constexpr bool operator==(const Y& x, const Y& y) {return x.i_ == y.i_;}<br>
+    friend void swap(Y& x, Y& y) {std::swap(x.i_, y.i_);}<br>
+};<br>
+<br>
+unsigned Y::dtor_called = 0;<br>
+<br>
+class Z<br>
+{<br>
+    int i_;<br>
+public:<br>
+    Z(int i) : i_(i) {}<br>
+    Z(Z&&) { TEST_THROW(7);}<br>
+<br>
+    friend constexpr bool operator==(const Z& x, const Z& y) {return x.i_ == y.i_;}<br>
+    friend void swap(Z& x, Z& y) { TEST_THROW(6);}<br>
+};<br>
+<br>
+<br>
+struct NonSwappable {<br>
+    NonSwappable(NonSwappable const&) = delete;<br>
+};<br>
+void swap(NonSwappable&, NonSwappable&) = delete;<br>
+<br>
+void test_swap_sfinae() {<br>
+    using std::optional;<br>
+    {<br>
+        using T = TestTypes::TestType;<br>
+        static_assert(std::is_swappabl<wbr>e_v<optional<T>>, "");<br>
+    }<br>
+    {<br>
+        using T = TestTypes::MoveOnly;<br>
+        static_assert(std::is_swappabl<wbr>e_v<optional<T>>, "");<br>
+    }<br>
+    {<br>
+        using T = TestTypes::Copyable;<br>
+        static_assert(std::is_swappabl<wbr>e_v<optional<T>>, "");<br>
+    }<br>
+    {<br>
+        using T = TestTypes::NoCtors;<br>
+        static_assert(!std::is_swappab<wbr>le_v<optional<T>>, "");<br>
+    }<br>
+    {<br>
+        using T = NonSwappable;<br>
+        static_assert(!std::is_swappab<wbr>le_v<optional<T>>, "");<br>
+    }<br>
+    {<br>
+        // Even thought CopyOnly has deleted move operations, those operations<br>
+        // cause optional<CopyOnly> to have implicitly deleted move operations<br>
+        // that decay into copies.<br>
+        using T = TestTypes::CopyOnly;<br>
+        using Opt = optional<T>;<br>
+        T::reset();<br>
+        Opt L(101), R(42);<br>
+        T::reset_constructors();<br>
+        std::swap(L, R);<br>
+        assert(L->value == 42);<br>
+        assert(R->value == 101);<br>
+        assert(T::copy_constructed == 1);<br>
+        assert(T::constructed == T::copy_constructed);<br>
+        assert(T::assigned == 2);<br>
+        assert(T::assigned == T::copy_assigned);<br>
+    }<br>
+}<br>
+<br>
+int main()<br>
+{<br>
+    test_swap_sfinae();<br>
+    {<br>
+        optional<int> opt1;<br>
+        optional<int> opt2;<br>
+        static_assert(noexcept(swap(op<wbr>t1, opt2)) == true, "");<br>
+        assert(static_cast<bool>(opt1) == false);<br>
+        assert(static_cast<bool>(opt2) == false);<br>
+        swap(opt1, opt2);<br>
+        assert(static_cast<bool>(opt1) == false);<br>
+        assert(static_cast<bool>(opt2) == false);<br>
+    }<br>
+    {<br>
+        optional<int> opt1(1);<br>
+        optional<int> opt2;<br>
+        static_assert(noexcept(swap(op<wbr>t1, opt2)) == true, "");<br>
+        assert(static_cast<bool>(opt1) == true);<br>
+        assert(*opt1 == 1);<br>
+        assert(static_cast<bool>(opt2) == false);<br>
+        swap(opt1, opt2);<br>
+        assert(static_cast<bool>(opt1) == false);<br>
+        assert(static_cast<bool>(opt2) == true);<br>
+        assert(*opt2 == 1);<br>
+    }<br>
+    {<br>
+        optional<int> opt1;<br>
+        optional<int> opt2(2);<br>
+        static_assert(noexcept(swap(op<wbr>t1, opt2)) == true, "");<br>
+        assert(static_cast<bool>(opt1) == false);<br>
+        assert(static_cast<bool>(opt2) == true);<br>
+        assert(*opt2 == 2);<br>
+        swap(opt1, opt2);<br>
+        assert(static_cast<bool>(opt1) == true);<br>
+        assert(*opt1 == 2);<br>
+        assert(static_cast<bool>(opt2) == false);<br>
+    }<br>
+    {<br>
+        optional<int> opt1(1);<br>
+        optional<int> opt2(2);<br>
+        static_assert(noexcept(swap(op<wbr>t1, opt2)) == true, "");<br>
+        assert(static_cast<bool>(opt1) == true);<br>
+        assert(*opt1 == 1);<br>
+        assert(static_cast<bool>(opt2) == true);<br>
+        assert(*opt2 == 2);<br>
+        swap(opt1, opt2);<br>
+        assert(static_cast<bool>(opt1) == true);<br>
+        assert(*opt1 == 2);<br>
+        assert(static_cast<bool>(opt2) == true);<br>
+        assert(*opt2 == 1);<br>
+    }<br>
+    {<br>
+        optional<X> opt1;<br>
+        optional<X> opt2;<br>
+        static_assert(noexcept(swap(op<wbr>t1, opt2)) == true, "");<br>
+        assert(static_cast<bool>(opt1) == false);<br>
+        assert(static_cast<bool>(opt2) == false);<br>
+        swap(opt1, opt2);<br>
+        assert(static_cast<bool>(opt1) == false);<br>
+        assert(static_cast<bool>(opt2) == false);<br>
+        assert(X::dtor_called == 0);<br>
+    }<br>
+    {<br>
+        optional<X> opt1(1);<br>
+        optional<X> opt2;<br>
+        static_assert(noexcept(swap(op<wbr>t1, opt2)) == true, "");<br>
+        assert(static_cast<bool>(opt1) == true);<br>
+        assert(*opt1 == 1);<br>
+        assert(static_cast<bool>(opt2) == false);<br>
+        X::dtor_called = 0;<br>
+        swap(opt1, opt2);<br>
+        assert(X::dtor_called == 1);<br>
+        assert(static_cast<bool>(opt1) == false);<br>
+        assert(static_cast<bool>(opt2) == true);<br>
+        assert(*opt2 == 1);<br>
+    }<br>
+    {<br>
+        optional<X> opt1;<br>
+        optional<X> opt2(2);<br>
+        static_assert(noexcept(swap(op<wbr>t1, opt2)) == true, "");<br>
+        assert(static_cast<bool>(opt1) == false);<br>
+        assert(static_cast<bool>(opt2) == true);<br>
+        assert(*opt2 == 2);<br>
+        X::dtor_called = 0;<br>
+        swap(opt1, opt2);<br>
+        assert(X::dtor_called == 1);<br>
+        assert(static_cast<bool>(opt1) == true);<br>
+        assert(*opt1 == 2);<br>
+        assert(static_cast<bool>(opt2) == false);<br>
+    }<br>
+    {<br>
+        optional<X> opt1(1);<br>
+        optional<X> opt2(2);<br>
+        static_assert(noexcept(swap(op<wbr>t1, opt2)) == true, "");<br>
+        assert(static_cast<bool>(opt1) == true);<br>
+        assert(*opt1 == 1);<br>
+        assert(static_cast<bool>(opt2) == true);<br>
+        assert(*opt2 == 2);<br>
+        X::dtor_called = 0;<br>
+        swap(opt1, opt2);<br>
+        assert(X::dtor_called == 1);  // from inside std::swap<br>
+        assert(static_cast<bool>(opt1) == true);<br>
+        assert(*opt1 == 2);<br>
+        assert(static_cast<bool>(opt2) == true);<br>
+        assert(*opt2 == 1);<br>
+    }<br>
+    {<br>
+        optional<Y> opt1;<br>
+        optional<Y> opt2;<br>
+        static_assert(noexcept(swap(op<wbr>t1, opt2)) == false, "");<br>
+        assert(static_cast<bool>(opt1) == false);<br>
+        assert(static_cast<bool>(opt2) == false);<br>
+        swap(opt1, opt2);<br>
+        assert(static_cast<bool>(opt1) == false);<br>
+        assert(static_cast<bool>(opt2) == false);<br>
+        assert(Y::dtor_called == 0);<br>
+    }<br>
+    {<br>
+        optional<Y> opt1(1);<br>
+        optional<Y> opt2;<br>
+        static_assert(noexcept(swap(op<wbr>t1, opt2)) == false, "");<br>
+        assert(static_cast<bool>(opt1) == true);<br>
+        assert(*opt1 == 1);<br>
+        assert(static_cast<bool>(opt2) == false);<br>
+        Y::dtor_called = 0;<br>
+        swap(opt1, opt2);<br>
+        assert(Y::dtor_called == 1);<br>
+        assert(static_cast<bool>(opt1) == false);<br>
+        assert(static_cast<bool>(opt2) == true);<br>
+        assert(*opt2 == 1);<br>
+    }<br>
+    {<br>
+        optional<Y> opt1;<br>
+        optional<Y> opt2(2);<br>
+        static_assert(noexcept(swap(op<wbr>t1, opt2)) == false, "");<br>
+        assert(static_cast<bool>(opt1) == false);<br>
+        assert(static_cast<bool>(opt2) == true);<br>
+        assert(*opt2 == 2);<br>
+        Y::dtor_called = 0;<br>
+        swap(opt1, opt2);<br>
+        assert(Y::dtor_called == 1);<br>
+        assert(static_cast<bool>(opt1) == true);<br>
+        assert(*opt1 == 2);<br>
+        assert(static_cast<bool>(opt2) == false);<br>
+    }<br>
+    {<br>
+        optional<Y> opt1(1);<br>
+        optional<Y> opt2(2);<br>
+        static_assert(noexcept(swap(op<wbr>t1, opt2)) == false, "");<br>
+        assert(static_cast<bool>(opt1) == true);<br>
+        assert(*opt1 == 1);<br>
+        assert(static_cast<bool>(opt2) == true);<br>
+        assert(*opt2 == 2);<br>
+        Y::dtor_called = 0;<br>
+        swap(opt1, opt2);<br>
+        assert(Y::dtor_called == 0);<br>
+        assert(static_cast<bool>(opt1) == true);<br>
+        assert(*opt1 == 2);<br>
+        assert(static_cast<bool>(opt2) == true);<br>
+        assert(*opt2 == 1);<br>
+    }<br>
+    {<br>
+        optional<Z> opt1;<br>
+        optional<Z> opt2;<br>
+        static_assert(noexcept(swap(op<wbr>t1, opt2)) == false, "");<br>
+        assert(static_cast<bool>(opt1) == false);<br>
+        assert(static_cast<bool>(opt2) == false);<br>
+        swap(opt1, opt2);<br>
+        assert(static_cast<bool>(opt1) == false);<br>
+        assert(static_cast<bool>(opt2) == false);<br>
+    }<br>
+#ifndef TEST_HAS_NO_EXCEPTIONS<br>
+    {<br>
+        optional<Z> opt1;<br>
+        opt1.emplace(1);<br>
+        optional<Z> opt2;<br>
+        static_assert(noexcept(swap(op<wbr>t1, opt2)) == false, "");<br>
+        assert(static_cast<bool>(opt1) == true);<br>
+        assert(*opt1 == 1);<br>
+        assert(static_cast<bool>(opt2) == false);<br>
+        try<br>
+        {<br>
+            swap(opt1, opt2);<br>
+            assert(false);<br>
+        }<br>
+        catch (int i)<br>
+        {<br>
+            assert(i == 7);<br>
+        }<br>
+        assert(static_cast<bool>(opt1) == true);<br>
+        assert(*opt1 == 1);<br>
+        assert(static_cast<bool>(opt2) == false);<br>
+    }<br>
+    {<br>
+        optional<Z> opt1;<br>
+        optional<Z> opt2;<br>
+        opt2.emplace(2);<br>
+        static_assert(noexcept(swap(op<wbr>t1, opt2)) == false, "");<br>
+        assert(static_cast<bool>(opt1) == false);<br>
+        assert(static_cast<bool>(opt2) == true);<br>
+        assert(*opt2 == 2);<br>
+        try<br>
+        {<br>
+            swap(opt1, opt2);<br>
+            assert(false);<br>
+        }<br>
+        catch (int i)<br>
+        {<br>
+            assert(i == 7);<br>
+        }<br>
+        assert(static_cast<bool>(opt1) == false);<br>
+        assert(static_cast<bool>(opt2) == true);<br>
+        assert(*opt2 == 2);<br>
+    }<br>
+    {<br>
+        optional<Z> opt1;<br>
+        opt1.emplace(1);<br>
+        optional<Z> opt2;<br>
+        opt2.emplace(2);<br>
+        static_assert(noexcept(swap(op<wbr>t1, opt2)) == false, "");<br>
+        assert(static_cast<bool>(opt1) == true);<br>
+        assert(*opt1 == 1);<br>
+        assert(static_cast<bool>(opt2) == true);<br>
+        assert(*opt2 == 2);<br>
+        try<br>
+        {<br>
+            swap(opt1, opt2);<br>
+            assert(false);<br>
+        }<br>
+        catch (int i)<br>
+        {<br>
+            assert(i == 6);<br>
+        }<br>
+        assert(static_cast<bool>(opt1) == true);<br>
+        assert(*opt1 == 1);<br>
+        assert(static_cast<bool>(opt2) == true);<br>
+        assert(*opt2 == 2);<br>
+    }<br>
+#endif // TEST_HAS_NO_EXCEPTIONS<br>
+}<br>
<br>
Added: libcxx/trunk/test/std/utilitie<wbr>s/optional/optional.syn/<wbr>optional_in_place_t.fail.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/std/utilities/optional/optional.syn/optional_in_place_t.fail.cpp?rev=283980&view=auto" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-pr<wbr>oject/libcxx/trunk/test/std/ut<wbr>ilities/optional/optional.syn/<wbr>optional_in_place_t.fail.cpp?<wbr>rev=283980&view=auto</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- libcxx/trunk/test/std/utilitie<wbr>s/optional/optional.syn/<wbr>optional_in_place_t.fail.cpp (added)<br>
+++ libcxx/trunk/test/std/utilitie<wbr>s/optional/optional.syn/<wbr>optional_in_place_t.fail.cpp Wed Oct 12 02:46:20 2016<br>
@@ -0,0 +1,26 @@<br>
+//===------------------------<wbr>------------------------------<wbr>----------------===//<br>
+//<br>
+//                     The LLVM Compiler Infrastructure<br>
+//<br>
+// This file is dual licensed under the MIT and the University of Illinois Open<br>
+// Source Licenses. See LICENSE.TXT for details.<br>
+//<br>
+//===------------------------<wbr>------------------------------<wbr>----------------===//<br>
+<br>
+// UNSUPPORTED: c++98, c++03, c++11, c++14<br>
+// <optional><br>
+<br>
+// A program that necessitates the instantiation of template optional for<br>
+// (possibly cv-qualified) in_place_t is ill-formed.<br>
+<br>
+#include <optional><br>
+<br>
+int main()<br>
+{<br>
+    using std::optional;<br>
+    using std::in_place_t;<br>
+    using std::in_place;<br>
+<br>
+    optional<in_place_t> opt; // expected-note {{requested here}}<br>
+    // expected-error@optional:* {{"instantiation of optional with in_place_t is ill-formed"}}<br>
+}<br>
<br>
Added: libcxx/trunk/test/std/utilitie<wbr>s/optional/optional.syn/<wbr>optional_includes_initializer_<wbr>list.pass.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/std/utilities/optional/optional.syn/optional_includes_initializer_list.pass.cpp?rev=283980&view=auto" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-pr<wbr>oject/libcxx/trunk/test/std/ut<wbr>ilities/optional/optional.syn/<wbr>optional_includes_initializer_<wbr>list.pass.cpp?rev=283980&view=<wbr>auto</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- libcxx/trunk/test/std/utilitie<wbr>s/optional/optional.syn/<wbr>optional_includes_initializer_<wbr>list.pass.cpp (added)<br>
+++ libcxx/trunk/test/std/utilitie<wbr>s/optional/optional.syn/<wbr>optional_includes_initializer_<wbr>list.pass.cpp Wed Oct 12 02:46:20 2016<br>
@@ -0,0 +1,22 @@<br>
+//===------------------------<wbr>------------------------------<wbr>----------------===//<br>
+//<br>
+//                     The LLVM Compiler Infrastructure<br>
+//<br>
+// This file is dual licensed under the MIT and the University of Illinois Open<br>
+// Source Licenses. See LICENSE.TXT for details.<br>
+//<br>
+//===------------------------<wbr>------------------------------<wbr>----------------===//<br>
+<br>
+// UNSUPPORTED: c++98, c++03, c++11, c++14<br>
+// <optional><br>
+<br>
+// #include <initializer_list><br>
+<br>
+#include <optional><br>
+<br>
+int main()<br>
+{<br>
+    using std::optional;<br>
+<br>
+    std::initializer_list<int> list;<br>
+}<br>
<br>
Added: libcxx/trunk/test/std/utilitie<wbr>s/optional/optional.syn/<wbr>optional_nullopt_t.fail.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/std/utilities/optional/optional.syn/optional_nullopt_t.fail.cpp?rev=283980&view=auto" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-pr<wbr>oject/libcxx/trunk/test/std/ut<wbr>ilities/optional/optional.syn/<wbr>optional_nullopt_t.fail.cpp?<wbr>rev=283980&view=auto</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- libcxx/trunk/test/std/utilitie<wbr>s/optional/optional.syn/<wbr>optional_nullopt_t.fail.cpp (added)<br>
+++ libcxx/trunk/test/std/utilitie<wbr>s/optional/optional.syn/<wbr>optional_nullopt_t.fail.cpp Wed Oct 12 02:46:20 2016<br>
@@ -0,0 +1,29 @@<br>
+//===------------------------<wbr>------------------------------<wbr>----------------===//<br>
+//<br>
+//                     The LLVM Compiler Infrastructure<br>
+//<br>
+// This file is dual licensed under the MIT and the University of Illinois Open<br>
+// Source Licenses. See LICENSE.TXT for details.<br>
+//<br>
+//===------------------------<wbr>------------------------------<wbr>----------------===//<br>
+<br>
+// UNSUPPORTED: c++98, c++03, c++11, c++14<br>
+// <optional><br>
+<br>
+// A program that necessitates the instantiation of template optional for<br>
+// (possibly cv-qualified) nullopt_t is ill-formed.<br>
+<br>
+#include <optional><br>
+<br>
+int main()<br>
+{<br>
+    using std::optional;<br>
+    using std::nullopt_t;<br>
+    using std::nullopt;<br>
+<br>
+    optional<nullopt_t> opt; // expected-note 1 {{requested here}}<br>
+    optional<const nullopt_t> opt1; // expected-note 1 {{requested here}}<br>
+    optional<nullopt_t &> opt2; // expected-note 1 {{requested here}}<br>
+    optional<nullopt_t &&> opt3; // expected-note 1 {{requested here}}<br>
+    // expected-error@optional:* 4 {{instantiation of optional with nullopt_t is ill-formed}}<br>
+}<br>
<br>
Modified: libcxx/trunk/test/support/arch<wbr>etypes.hpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/support/archetypes.hpp?rev=283980&r1=283979&r2=283980&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-pr<wbr>oject/libcxx/trunk/test/suppor<wbr>t/archetypes.hpp?rev=283980&<wbr>r1=283979&r2=283980&view=diff</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- libcxx/trunk/test/support/arch<wbr>etypes.hpp (original)<br>
+++ libcxx/trunk/test/support/arch<wbr>etypes.hpp Wed Oct 12 02:46:20 2016<br>
@@ -1,10 +1,186 @@<br>
 #ifndef TEST_SUPPORT_ARCHETYPES_HPP<br>
 #define TEST_SUPPORT_ARCHETYPES_HPP<br>
<br>
+#include <type_traits><br>
+#include <cassert><br>
+<br>
 #include "test_macros.h"<br>
<br>
 #if TEST_STD_VER >= 11<br>
<br>
+namespace ArchetypeBases {<br>
+<br>
+template <bool, class T><br>
+struct DepType : T {};<br>
+<br>
+struct NullBase {};<br>
+<br>
+template <class Derived, bool Explicit = false><br>
+struct TestBase {<br>
+    static int alive;<br>
+    static int constructed;<br>
+    static int value_constructed;<br>
+    static int default_constructed;<br>
+    static int copy_constructed;<br>
+    static int move_constructed;<br>
+    static int assigned;<br>
+    static int value_assigned;<br>
+    static int copy_assigned;<br>
+    static int move_assigned;<br>
+    static int destroyed;<br>
+<br>
+    static void reset() {<br>
+        assert(alive == 0);<br>
+        alive = 0;<br>
+        reset_constructors();<br>
+    }<br>
+<br>
+    static void reset_constructors() {<br>
+      constructed = value_constructed = default_constructed =<br>
+        copy_constructed = move_constructed = 0;<br>
+      assigned = value_assigned = copy_assigned = move_assigned = destroyed = 0;<br>
+    }<br>
+<br>
+    TestBase() noexcept : value(0) {<br>
+        ++alive; ++constructed; ++default_constructed;<br>
+    }<br>
+    template <bool Dummy = true, typename std::enable_if<Dummy && Explicit, bool>::type = true><br>
+    explicit TestBase(int x) noexcept : value(x) {<br>
+        ++alive; ++constructed; ++value_constructed;<br>
+    }<br>
+    template <bool Dummy = true, typename std::enable_if<Dummy && !Explicit, bool>::type = true><br>
+    TestBase(int x) noexcept : value(x) {<br>
+        ++alive; ++constructed; ++value_constructed;<br>
+    }<br>
+    template <bool Dummy = true, typename std::enable_if<Dummy && Explicit, bool>::type = true><br>
+    explicit TestBase(int x, int y) noexcept : value(y) {<br>
+        ++alive; ++constructed; ++value_constructed;<br>
+    }<br>
+    template <bool Dummy = true, typename std::enable_if<Dummy && !Explicit, bool>::type = true><br>
+    TestBase(int x, int y) noexcept : value(y) {<br>
+        ++alive; ++constructed; ++value_constructed;<br>
+    }<br>
+    template <bool Dummy = true, typename std::enable_if<Dummy && Explicit, bool>::type = true><br>
+    explicit TestBase(std::initializer_list<wbr><int>& il, int y = 0) noexcept<br>
+      : value(il.size()) {<br>
+        ++alive; ++constructed; ++value_constructed;<br>
+    }<br>
+    template <bool Dummy = true, typename std::enable_if<Dummy && !Explicit, bool>::type = true><br>
+    TestBase(std::initializer_list<wbr><int>& il, int y = 0) noexcept : value(il.size()) {<br>
+        ++alive; ++constructed; ++value_constructed;<br>
+    }<br>
+    TestBase& operator=(int xvalue) noexcept {<br>
+      value = xvalue;<br>
+      ++assigned; ++value_assigned;<br>
+      return *this;<br>
+    }<br>
+protected:<br>
+    ~TestBase() {<br>
+      assert(value != -999); assert(alive > 0);<br>
+      --alive; ++destroyed; value = -999;<br>
+    }<br>
+    TestBase(TestBase const& o) noexcept : value(o.value) {<br>
+        assert(o.value != -1); assert(o.value != -999);<br>
+        ++alive; ++constructed; ++copy_constructed;<br>
+    }<br>
+    TestBase(TestBase && o) noexcept : value(o.value) {<br>
+        assert(o.value != -1); assert(o.value != -999);<br>
+        ++alive; ++constructed; ++move_constructed;<br>
+        o.value = -1;<br>
+    }<br>
+    TestBase& operator=(TestBase const& o) noexcept {<br>
+      assert(o.value != -1); assert(o.value != -999);<br>
+      ++assigned; ++copy_assigned;<br>
+      value = o.value;<br>
+      return *this;<br>
+    }<br>
+    TestBase& operator=(TestBase&& o) noexcept {<br>
+        assert(o.value != -1); assert(o.value != -999);<br>
+        ++assigned; ++move_assigned;<br>
+        value = o.value;<br>
+        o.value = -1;<br>
+        return *this;<br>
+    }<br>
+public:<br>
+    int value;<br>
+};<br>
+<br>
+template <class D, bool E> int TestBase<D, E>::alive = 0;<br>
+template <class D, bool E> int TestBase<D, E>::constructed = 0;<br>
+template <class D, bool E> int TestBase<D, E>::value_constructed = 0;<br>
+template <class D, bool E> int TestBase<D, E>::default_constructed = 0;<br>
+template <class D, bool E> int TestBase<D, E>::copy_constructed = 0;<br>
+template <class D, bool E> int TestBase<D, E>::move_constructed = 0;<br>
+template <class D, bool E> int TestBase<D, E>::assigned = 0;<br>
+template <class D, bool E> int TestBase<D, E>::value_assigned = 0;<br>
+template <class D, bool E> int TestBase<D, E>::copy_assigned = 0;<br>
+template <class D, bool E> int TestBase<D, E>::move_assigned = 0;<br>
+template <class D, bool E> int TestBase<D, E>::destroyed = 0;<br>
+<br>
+template <bool Explicit = false><br>
+struct ValueBase {<br>
+    template <bool Dummy = true, typename std::enable_if<Dummy && Explicit, bool>::type = true><br>
+    explicit constexpr ValueBase(int x) : value(x) {}<br>
+    template <bool Dummy = true, typename std::enable_if<Dummy && !Explicit, bool>::type = true><br>
+    constexpr ValueBase(int x) : value(x) {}<br>
+    template <bool Dummy = true, typename std::enable_if<Dummy && Explicit, bool>::type = true><br>
+    explicit constexpr ValueBase(int x, int y) : value(y) {}<br>
+    template <bool Dummy = true, typename std::enable_if<Dummy && !Explicit, bool>::type = true><br>
+    constexpr ValueBase(int x, int y) : value(y) {}<br>
+    template <bool Dummy = true, typename std::enable_if<Dummy && Explicit, bool>::type = true><br>
+    explicit constexpr ValueBase(std::initializer_lis<wbr>t<int>& il, int y = 0) : value(il.size()) {}<br>
+    template <bool Dummy = true, typename std::enable_if<Dummy && !Explicit, bool>::type = true><br>
+    constexpr ValueBase(std::initializer_lis<wbr>t<int>& il, int y = 0) : value(il.size()) {}<br>
+    constexpr ValueBase& operator=(int xvalue) noexcept {<br>
+        value = xvalue;<br>
+        return *this;<br>
+    }<br>
+    //~ValueBase() { assert(value != -999); value = -999; }<br>
+    int value;<br>
+protected:<br>
+  constexpr ValueBase() noexcept : value(0) {}<br>
+    constexpr ValueBase(ValueBase const& o) noexcept : value(o.value) {<br>
+        assert(o.value != -1); assert(o.value != -999);<br>
+    }<br>
+    constexpr ValueBase(ValueBase && o) noexcept : value(o.value) {<br>
+        assert(o.value != -1); assert(o.value != -999);<br>
+        o.value = -1;<br>
+    }<br>
+    constexpr ValueBase& operator=(ValueBase const& o) noexcept {<br>
+        assert(o.value != -1); assert(o.value != -999);<br>
+        value = o.value;<br>
+        return *this;<br>
+    }<br>
+    constexpr ValueBase& operator=(ValueBase&& o) noexcept {<br>
+        assert(o.value != -1); assert(o.value != -999);<br>
+        value = o.value;<br>
+        o.value = -1;<br>
+        return *this;<br>
+    }<br>
+};<br>
+<br>
+<br>
+template <bool Explicit = false><br>
+struct TrivialValueBase {<br>
+    template <bool Dummy = true, typename std::enable_if<Dummy && Explicit, bool>::type = true><br>
+    explicit constexpr TrivialValueBase(int x) : value(x) {}<br>
+    template <bool Dummy = true, typename std::enable_if<Dummy && !Explicit, bool>::type = true><br>
+    constexpr TrivialValueBase(int x) : value(x) {}<br>
+    template <bool Dummy = true, typename std::enable_if<Dummy && Explicit, bool>::type = true><br>
+    explicit constexpr TrivialValueBase(int x, int y) : value(y) {}<br>
+    template <bool Dummy = true, typename std::enable_if<Dummy && !Explicit, bool>::type = true><br>
+    constexpr TrivialValueBase(int x, int y) : value(y) {}<br>
+    template <bool Dummy = true, typename std::enable_if<Dummy && Explicit, bool>::type = true><br>
+    explicit constexpr TrivialValueBase(std::initiali<wbr>zer_list<int>& il, int y = 0) : value(il.size()) {}<br>
+    template <bool Dummy = true, typename std::enable_if<Dummy && !Explicit, bool>::type = true><br>
+    constexpr TrivialValueBase(std::initiali<wbr>zer_list<int>& il, int y = 0) : value(il.size()) {};<br>
+    int value;<br>
+protected:<br>
+    constexpr TrivialValueBase() noexcept : value(0) {}<br>
+};<br>
+<br>
+}<br>
+<br>
 //===========================<wbr>==============================<wbr>===================//<br>
 // Trivial Implicit Test Types<br>
 namespace ImplicitTypes {<br>
@@ -18,9 +194,18 @@ namespace ExplicitTypes {<br>
 #include "archetypes.ipp"<br>
 }<br>
<br>
+<br>
+//===========================<wbr>==============================<wbr>===================//<br>
+//<br>
+namespace NonConstexprTypes {<br>
+#define DEFINE_CONSTEXPR<br>
+#include "archetypes.ipp"<br>
+}<br>
+<br>
 //===========================<wbr>==============================<wbr>===================//<br>
-// Non-Trivial Implicit Test Types<br>
+// Non-literal implicit test types<br>
 namespace NonLiteralTypes {<br>
+#define DEFINE_ASSIGN_CONSTEXPR<br>
 #define DEFINE_DTOR(Name) ~Name() {}<br>
 #include "archetypes.ipp"<br>
 }<br>
@@ -29,9 +214,144 @@ namespace NonLiteralTypes {<br>
 // Non-Trivially Copyable Implicit Test Types<br>
 namespace NonTrivialTypes {<br>
 #define DEFINE_CTOR {}<br>
+#define DEFINE_ASSIGN { return *this; }<br>
+#define DEFINE_DEFAULT_CTOR = default<br>
+#include "archetypes.ipp"<br>
+}<br>
+<br>
+//===========================<wbr>==============================<wbr>===================//<br>
+// Implicit counting types<br>
+namespace TestTypes {<br>
+#define DEFINE_CONSTEXPR<br>
+#define DEFINE_BASE(Name) ::ArchetypeBases::TestBase<Nam<wbr>e><br>
+#include "archetypes.ipp"<br>
+<br>
+using TestType = AllCtors;<br>
+<br>
+// Add equality operators<br>
+template <class Tp><br>
+constexpr bool operator==(Tp const& L, Tp const& R) noexcept {<br>
+  return L.value == R.value;<br>
+}<br>
+<br>
+template <class Tp><br>
+constexpr bool operator!=(Tp const& L, Tp const& R) noexcept {<br>
+  return L.value != R.value;<br>
+}<br>
+<br>
+}<br>
+<br>
+//===========================<wbr>==============================<wbr>===================//<br>
+// Implicit counting types<br>
+namespace ExplicitTestTypes {<br>
+#define DEFINE_CONSTEXPR<br>
+#define DEFINE_EXPLICIT explicit<br>
+#define DEFINE_BASE(Name) ::ArchetypeBases::TestBase<Nam<wbr>e, true><br>
+#include "archetypes.ipp"<br>
+<br>
+using TestType = AllCtors;<br>
+<br>
+// Add equality operators<br>
+template <class Tp><br>
+constexpr bool operator==(Tp const& L, Tp const& R) noexcept {<br>
+  return L.value == R.value;<br>
+}<br>
+<br>
+template <class Tp><br>
+constexpr bool operator!=(Tp const& L, Tp const& R) noexcept {<br>
+  return L.value != R.value;<br>
+}<br>
+<br>
+}<br>
+<br>
+//===========================<wbr>==============================<wbr>===================//<br>
+// Implicit value types<br>
+namespace ConstexprTestTypes {<br>
+#define DEFINE_BASE(Name) ::ArchetypeBases::ValueBase<><br>
+#include "archetypes.ipp"<br>
+<br>
+using TestType = AllCtors;<br>
+<br>
+// Add equality operators<br>
+template <class Tp><br>
+constexpr bool operator==(Tp const& L, Tp const& R) noexcept {<br>
+  return L.value == R.value;<br>
+}<br>
+<br>
+template <class Tp><br>
+constexpr bool operator!=(Tp const& L, Tp const& R) noexcept {<br>
+  return L.value != R.value;<br>
+}<br>
+<br>
+} // end namespace ValueTypes<br>
+<br>
+<br>
+//===========================<wbr>==============================<wbr>===================//<br>
+//<br>
+namespace ExplicitConstexprTestTypes {<br>
+#define DEFINE_EXPLICIT explicit<br>
+#define DEFINE_BASE(Name) ::ArchetypeBases::ValueBase<tr<wbr>ue><br>
+#include "archetypes.ipp"<br>
+<br>
+using TestType = AllCtors;<br>
+<br>
+// Add equality operators<br>
+template <class Tp><br>
+constexpr bool operator==(Tp const& L, Tp const& R) noexcept {<br>
+  return L.value == R.value;<br>
+}<br>
+<br>
+template <class Tp><br>
+constexpr bool operator!=(Tp const& L, Tp const& R) noexcept {<br>
+  return L.value != R.value;<br>
+}<br>
+<br>
+} // end namespace ValueTypes<br>
+<br>
+<br>
+//===========================<wbr>==============================<wbr>===================//<br>
+//<br>
+namespace TrivialTestTypes {<br>
+#define DEFINE_BASE(Name) ::ArchetypeBases::TrivialValue<wbr>Base<false><br>
+#include "archetypes.ipp"<br>
+<br>
+using TestType = AllCtors;<br>
+<br>
+// Add equality operators<br>
+template <class Tp><br>
+constexpr bool operator==(Tp const& L, Tp const& R) noexcept {<br>
+  return L.value == R.value;<br>
+}<br>
+<br>
+template <class Tp><br>
+constexpr bool operator!=(Tp const& L, Tp const& R) noexcept {<br>
+  return L.value != R.value;<br>
+}<br>
+<br>
+} // end namespace TrivialValueTypes<br>
+<br>
+//===========================<wbr>==============================<wbr>===================//<br>
+//<br>
+namespace ExplicitTrivialTestTypes {<br>
+#define DEFINE_EXPLICIT explicit<br>
+#define DEFINE_BASE(Name) ::ArchetypeBases::TrivialValue<wbr>Base<true><br>
 #include "archetypes.ipp"<br>
+<br>
+using TestType = AllCtors;<br>
+<br>
+// Add equality operators<br>
+template <class Tp><br>
+constexpr bool operator==(Tp const& L, Tp const& R) noexcept {<br>
+  return L.value == R.value;<br>
 }<br>
<br>
+template <class Tp><br>
+constexpr bool operator!=(Tp const& L, Tp const& R) noexcept {<br>
+  return L.value != R.value;<br>
+}<br>
+<br>
+} // end namespace ExplicitTrivialTestTypes<br>
+<br>
 #endif // TEST_STD_VER >= 11<br>
<br>
 #endif // TEST_SUPPORT_ARCHETYPES_HPP<br>
<br>
Modified: libcxx/trunk/test/support/arch<wbr>etypes.ipp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/support/archetypes.ipp?rev=283980&r1=283979&r2=283980&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-pr<wbr>oject/libcxx/trunk/test/suppor<wbr>t/archetypes.ipp?rev=283980&<wbr>r1=283979&r2=283980&view=diff</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- libcxx/trunk/test/support/arch<wbr>etypes.ipp (original)<br>
+++ libcxx/trunk/test/support/arch<wbr>etypes.ipp Wed Oct 12 02:46:20 2016<br>
@@ -1,10 +1,22 @@<br>
<br>
+#ifndef DEFINE_BASE<br>
+#define DEFINE_BASE(Name) ::ArchetypeBases::NullBase<br>
+#endif<br>
 #ifndef DEFINE_EXPLICIT<br>
 #define DEFINE_EXPLICIT<br>
 #endif<br>
+#ifndef DEFINE_CONSTEXPR<br>
+#define DEFINE_CONSTEXPR constexpr<br>
+#endif<br>
+#ifndef DEFINE_ASSIGN_CONSTEXPR<br>
+#define DEFINE_ASSIGN_CONSTEXPR DEFINE_CONSTEXPR<br>
+#endif<br>
 #ifndef DEFINE_CTOR<br>
 #define DEFINE_CTOR = default<br>
 #endif<br>
+#ifndef DEFINE_DEFAULT_CTOR<br>
+#define DEFINE_DEFAULT_CTOR DEFINE_CTOR<br>
+#endif<br>
 #ifndef DEFINE_ASSIGN<br>
 #define DEFINE_ASSIGN = default<br>
 #endif<br>
@@ -12,78 +24,117 @@<br>
 #define DEFINE_DTOR(Name)<br>
 #endif<br>
<br>
-struct NoDefault {<br>
-  DEFINE_EXPLICIT NoDefault() = delete;<br>
+struct AllCtors : DEFINE_BASE(AllCtors) {<br>
+  using Base = DEFINE_BASE(AllCtors);<br>
+  using Base::Base;<br>
+  using Base::operator=;<br>
+  DEFINE_EXPLICIT DEFINE_CONSTEXPR AllCtors() DEFINE_DEFAULT_CTOR;<br>
+  DEFINE_EXPLICIT DEFINE_CONSTEXPR AllCtors(AllCtors const&) DEFINE_CTOR;<br>
+  DEFINE_EXPLICIT DEFINE_CONSTEXPR AllCtors(AllCtors &&) DEFINE_CTOR;<br>
+  DEFINE_ASSIGN_CONSTEXPR AllCtors& operator=(AllCtors const&) DEFINE_ASSIGN;<br>
+  DEFINE_ASSIGN_CONSTEXPR AllCtors& operator=(AllCtors &&) DEFINE_ASSIGN;<br>
+  DEFINE_DTOR(AllCtors)<br>
+};<br>
+<br>
+struct NoCtors : DEFINE_BASE(NoCtors) {<br>
+  using Base = DEFINE_BASE(NoCtors);<br>
+  using Base::Base;<br>
+  DEFINE_EXPLICIT NoCtors() = delete;<br>
+  DEFINE_EXPLICIT NoCtors(NoCtors const&) = delete;<br>
+  NoCtors& operator=(NoCtors const&) = delete;<br>
+  DEFINE_DTOR(NoCtors)<br>
+};<br>
+<br>
+struct NoDefault : DEFINE_BASE(NoDefault) {<br>
+  using Base = DEFINE_BASE(NoDefault);<br>
+  using Base::Base;<br>
+  DEFINE_EXPLICIT DEFINE_CONSTEXPR NoDefault() = delete;<br>
   DEFINE_DTOR(NoDefault)<br>
 };<br>
<br>
-struct AllCtors {<br>
-  DEFINE_EXPLICIT AllCtors() DEFINE_CTOR;<br>
-  DEFINE_EXPLICIT AllCtors(AllCtors const&) DEFINE_CTOR;<br>
-  DEFINE_EXPLICIT AllCtors(AllCtors &&) DEFINE_CTOR;<br>
-  AllCtors& operator=(AllCtors const&) DEFINE_ASSIGN;<br>
-  AllCtors& operator=(AllCtors &&) DEFINE_ASSIGN;<br>
-  DEFINE_DTOR(AllCtors)<br>
+struct DefaultOnly : DEFINE_BASE(DefaultOnly) {<br>
+  using Base = DEFINE_BASE(DefaultOnly);<br>
+  using Base::Base;<br>
+  DEFINE_EXPLICIT DEFINE_CONSTEXPR DefaultOnly() DEFINE_DEFAULT_CTOR;<br>
+  DefaultOnly(DefaultOnly const&) = delete;<br>
+  DefaultOnly& operator=(DefaultOnly const&) = delete;<br>
+  DEFINE_DTOR(DefaultOnly)<br>
 };<br>
<br>
-struct Copyable {<br>
-  DEFINE_EXPLICIT Copyable() DEFINE_CTOR;<br>
-  DEFINE_EXPLICIT Copyable(Copyable const &) DEFINE_CTOR;<br>
+struct Copyable : DEFINE_BASE(Copyable) {<br>
+  using Base = DEFINE_BASE(Copyable);<br>
+  using Base::Base;<br>
+  DEFINE_EXPLICIT DEFINE_CONSTEXPR Copyable() DEFINE_DEFAULT_CTOR;<br>
+  DEFINE_EXPLICIT DEFINE_CONSTEXPR Copyable(Copyable const &) DEFINE_CTOR;<br>
   Copyable &operator=(Copyable const &) DEFINE_ASSIGN;<br>
   DEFINE_DTOR(Copyable)<br>
 };<br>
<br>
-struct CopyOnly {<br>
-  DEFINE_EXPLICIT CopyOnly() DEFINE_CTOR;<br>
-  DEFINE_EXPLICIT CopyOnly(CopyOnly const &) DEFINE_CTOR;<br>
-  DEFINE_EXPLICIT CopyOnly(CopyOnly &&) = delete;<br>
+struct CopyOnly : DEFINE_BASE(CopyOnly) {<br>
+  using Base = DEFINE_BASE(CopyOnly);<br>
+  using Base::Base;<br>
+  DEFINE_EXPLICIT DEFINE_CONSTEXPR CopyOnly() DEFINE_DEFAULT_CTOR;<br>
+  DEFINE_EXPLICIT DEFINE_CONSTEXPR CopyOnly(CopyOnly const &) DEFINE_CTOR;<br>
+  DEFINE_EXPLICIT DEFINE_CONSTEXPR CopyOnly(CopyOnly &&) = delete;<br>
   CopyOnly &operator=(CopyOnly const &) DEFINE_ASSIGN;<br>
   CopyOnly &operator=(CopyOnly &&) = delete;<br>
   DEFINE_DTOR(CopyOnly)<br>
 };<br>
<br>
-struct NonCopyable {<br>
-  DEFINE_EXPLICIT NonCopyable() DEFINE_CTOR;<br>
-  DEFINE_EXPLICIT NonCopyable(NonCopyable const &) = delete;<br>
+struct NonCopyable : DEFINE_BASE(NonCopyable) {<br>
+  using Base = DEFINE_BASE(NonCopyable);<br>
+  using Base::Base;<br>
+  DEFINE_EXPLICIT DEFINE_CONSTEXPR NonCopyable() DEFINE_DEFAULT_CTOR;<br>
+  DEFINE_EXPLICIT DEFINE_CONSTEXPR NonCopyable(NonCopyable const &) = delete;<br>
   NonCopyable &operator=(NonCopyable const &) = delete;<br>
   DEFINE_DTOR(NonCopyable)<br>
 };<br>
<br>
-struct MoveOnly {<br>
-  DEFINE_EXPLICIT MoveOnly() DEFINE_CTOR;<br>
-  DEFINE_EXPLICIT MoveOnly(MoveOnly &&) DEFINE_CTOR;<br>
+struct MoveOnly : DEFINE_BASE(MoveOnly) {<br>
+  using Base = DEFINE_BASE(MoveOnly);<br>
+  using Base::Base;<br>
+  DEFINE_EXPLICIT DEFINE_CONSTEXPR MoveOnly() DEFINE_DEFAULT_CTOR;<br>
+  DEFINE_EXPLICIT DEFINE_CONSTEXPR MoveOnly(MoveOnly &&) DEFINE_CTOR;<br>
   MoveOnly &operator=(MoveOnly &&) DEFINE_ASSIGN;<br>
   DEFINE_DTOR(MoveOnly)<br>
 };<br>
<br>
-struct CopyAssignable {<br>
-    DEFINE_EXPLICIT CopyAssignable() = delete;<br>
-    CopyAssignable& operator=(CopyAssignable const&) DEFINE_ASSIGN;<br>
-    DEFINE_DTOR(CopyAssignable)<br>
-};<br>
-<br>
-struct CopyAssignOnly {<br>
-    DEFINE_EXPLICIT CopyAssignOnly() = delete;<br>
-    CopyAssignOnly& operator=(CopyAssignOnly const&) DEFINE_ASSIGN;<br>
-    CopyAssignOnly& operator=(CopyAssignOnly &&) = delete;<br>
-    DEFINE_DTOR(CopyAssignOnly)<br>
-};<br>
-<br>
-struct MoveAssignOnly {<br>
-    DEFINE_EXPLICIT MoveAssignOnly() = delete;<br>
-    MoveAssignOnly& operator=(MoveAssignOnly const&) = delete;<br>
-    MoveAssignOnly& operator=(MoveAssignOnly &&) DEFINE_ASSIGN;<br>
-    DEFINE_DTOR(MoveAssignOnly)<br>
-};<br>
-<br>
-struct ConvertingType {<br>
-  DEFINE_EXPLICIT ConvertingType() DEFINE_CTOR;<br>
-  DEFINE_EXPLICIT ConvertingType(ConvertingType const&) DEFINE_CTOR;<br>
-  DEFINE_EXPLICIT ConvertingType(ConvertingType &&) DEFINE_CTOR;<br>
+struct CopyAssignable : DEFINE_BASE(CopyAssignable) {<br>
+  using Base = DEFINE_BASE(CopyAssignable);<br>
+  using Base::Base;<br>
+  DEFINE_EXPLICIT DEFINE_CONSTEXPR CopyAssignable() = delete;<br>
+  CopyAssignable& operator=(CopyAssignable const&) DEFINE_ASSIGN;<br>
+  DEFINE_DTOR(CopyAssignable)<br>
+};<br>
+<br>
+struct CopyAssignOnly : DEFINE_BASE(CopyAssignOnly) {<br>
+  using Base = DEFINE_BASE(CopyAssignOnly);<br>
+  using Base::Base;<br>
+  DEFINE_EXPLICIT DEFINE_CONSTEXPR CopyAssignOnly() = delete;<br>
+  CopyAssignOnly& operator=(CopyAssignOnly const&) DEFINE_ASSIGN;<br>
+  CopyAssignOnly& operator=(CopyAssignOnly &&) = delete;<br>
+  DEFINE_DTOR(CopyAssignOnly)<br>
+};<br>
+<br>
+struct MoveAssignOnly : DEFINE_BASE(MoveAssignOnly) {<br>
+  using Base = DEFINE_BASE(MoveAssignOnly);<br>
+  using Base::Base;<br>
+  DEFINE_EXPLICIT DEFINE_CONSTEXPR MoveAssignOnly() = delete;<br>
+  MoveAssignOnly& operator=(MoveAssignOnly const&) = delete;<br>
+  MoveAssignOnly& operator=(MoveAssignOnly &&) DEFINE_ASSIGN;<br>
+  DEFINE_DTOR(MoveAssignOnly)<br>
+};<br>
+<br>
+struct ConvertingType : DEFINE_BASE(ConvertingType) {<br>
+  using Base = DEFINE_BASE(ConvertingType);<br>
+  using Base::Base;<br>
+  DEFINE_EXPLICIT DEFINE_CONSTEXPR ConvertingType() DEFINE_DEFAULT_CTOR;<br>
+  DEFINE_EXPLICIT DEFINE_CONSTEXPR ConvertingType(ConvertingType const&) DEFINE_CTOR;<br>
+  DEFINE_EXPLICIT DEFINE_CONSTEXPR ConvertingType(ConvertingType &&) DEFINE_CTOR;<br>
   ConvertingType& operator=(ConvertingType const&) DEFINE_ASSIGN;<br>
   ConvertingType& operator=(ConvertingType &&) DEFINE_ASSIGN;<br>
   template <class ...Args><br>
-  DEFINE_EXPLICIT ConvertingType(Args&&...) {}<br>
+  DEFINE_EXPLICIT DEFINE_CONSTEXPR ConvertingType(Args&&...) {}<br>
   template <class Arg><br>
   ConvertingType& operator=(Arg&&) { return *this; }<br>
   DEFINE_DTOR(ConvertingType)<br>
@@ -91,8 +142,10 @@ struct ConvertingType {<br>
<br>
 template <template <class...> class List><br>
 using ApplyTypes = List<<br>
-    NoDefault,<br>
     AllCtors,<br>
+    NoCtors,<br>
+    NoDefault,<br>
+    DefaultOnly,<br>
     Copyable,<br>
     CopyOnly,<br>
     NonCopyable,<br>
@@ -103,7 +156,11 @@ using ApplyTypes = List<<br>
     ConvertingType<br>
   >;<br>
<br>
+#undef DEFINE_BASE<br>
 #undef DEFINE_EXPLICIT<br>
+#undef DEFINE_CONSTEXPR<br>
+#undef DEFINE_ASSIGN_CONSTEXPR<br>
 #undef DEFINE_CTOR<br>
+#undef DEFINE_DEFAULT_CTOR<br>
 #undef DEFINE_ASSIGN<br>
 #undef DEFINE_DTOR<br>
<br>
<br>
______________________________<wbr>_________________<br>
cfe-commits mailing list<br>
<a href="mailto:cfe-commits@lists.llvm.org" target="_blank">cfe-commits@lists.llvm.org</a><br>
<a href="http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits" rel="noreferrer" target="_blank">http://lists.llvm.org/cgi-bin/<wbr>mailman/listinfo/cfe-commits</a><br>
</blockquote></div><br></div></div></div></div>