Mark the copy constructor and move
authorMarshall Clow <mclow.lists@gmail.com>
Wed, 17 May 2017 15:30:01 +0000 (15:30 +0000)
committerMarshall Clow <mclow.lists@gmail.com>
Wed, 17 May 2017 15:30:01 +0000 (15:30 +0000)
constructor to be constexpr. This only works when the contained type has a constexpr copy/move ctor.

llvm-svn: 303268

libcxx/include/optional
libcxx/test/std/utilities/optional/optional.object/optional.object.ctor/copy.pass.cpp
libcxx/test/std/utilities/optional/optional.object/optional.object.ctor/move.pass.cpp

index 8c7a242..70b6eb4 100644 (file)
@@ -599,8 +599,8 @@ private:
 public:
 
     _LIBCPP_INLINE_VISIBILITY constexpr optional() noexcept {}
-    _LIBCPP_INLINE_VISIBILITY optional(const optional&) = default;
-    _LIBCPP_INLINE_VISIBILITY optional(optional&&) = default;
+    _LIBCPP_INLINE_VISIBILITY constexpr optional(const optional&) = default;
+    _LIBCPP_INLINE_VISIBILITY constexpr optional(optional&&) = default;
     _LIBCPP_INLINE_VISIBILITY constexpr optional(nullopt_t) noexcept {}
 
     template <class... _Args, class = enable_if_t<
index 5906d4e..76c1fb8 100644 (file)
@@ -10,7 +10,7 @@
 // UNSUPPORTED: c++98, c++03, c++11, c++14
 // <optional>
 
-// optional(const optional<T>& rhs);
+// constexpr optional(const optional<T>& rhs);
 
 #include <optional>
 #include <type_traits>
@@ -152,4 +152,9 @@ int main()
     {
         test_reference_extension();
     }
+    {
+    constexpr std::optional<int> o1{4};
+    constexpr std::optional<int> o2 = o1;
+    static_assert( *o2 == 4, "" );
+    }
 }
index 9f23e9b..09aaa05 100644 (file)
@@ -18,7 +18,7 @@
 
 // <optional>
 
-// optional(optional<T>&& rhs);
+// constexpr optional(optional<T>&& rhs);
 
 #include <optional>
 #include <type_traits>
@@ -206,4 +206,9 @@ int main()
     {
         test_reference_extension();
     }
+    {
+    constexpr std::optional<int> o1{4};
+    constexpr std::optional<int> o2 = std::move(o1);
+    static_assert( *o2 == 4, "" );
+    }
 }