Home | History | Annotate | Download | only in optional.object.ctor
      1 //===----------------------------------------------------------------------===//
      2 //
      3 //                     The LLVM Compiler Infrastructure
      4 //
      5 // This file is dual licensed under the MIT and the University of Illinois Open
      6 // Source Licenses. See LICENSE.TXT for details.
      7 //
      8 //===----------------------------------------------------------------------===//
      9 
     10 // UNSUPPORTED: c++98, c++03, c++11, c++14
     11 // <optional>
     12 
     13 // constexpr optional(nullopt_t) noexcept;
     14 
     15 #include <optional>
     16 #include <type_traits>
     17 #include <cassert>
     18 
     19 #include "archetypes.hpp"
     20 
     21 using std::optional;
     22 using std::nullopt_t;
     23 using std::nullopt;
     24 
     25 template <class Opt>
     26 void
     27 test_constexpr()
     28 {
     29     static_assert(std::is_nothrow_constructible<Opt, nullopt_t&>::value, "");
     30     static_assert(std::is_trivially_destructible<Opt>::value, "");
     31     static_assert(std::is_trivially_destructible<typename Opt::value_type>::value, "");
     32 
     33     constexpr Opt opt(nullopt);
     34     static_assert(static_cast<bool>(opt) == false, "");
     35 
     36     struct test_constexpr_ctor
     37         : public Opt
     38     {
     39         constexpr test_constexpr_ctor() {}
     40     };
     41 }
     42 
     43 template <class Opt>
     44 void
     45 test()
     46 {
     47     static_assert(std::is_nothrow_constructible<Opt, nullopt_t&>::value, "");
     48     static_assert(!std::is_trivially_destructible<Opt>::value, "");
     49     static_assert(!std::is_trivially_destructible<typename Opt::value_type>::value, "");
     50     {
     51     Opt opt(nullopt);
     52     assert(static_cast<bool>(opt) == false);
     53     }
     54     {
     55     const Opt opt(nullopt);
     56     assert(static_cast<bool>(opt) == false);
     57     }
     58     struct test_constexpr_ctor
     59         : public Opt
     60     {
     61         constexpr test_constexpr_ctor() {}
     62     };
     63 }
     64 
     65 int main()
     66 {
     67     test_constexpr<optional<int>>();
     68     test_constexpr<optional<int*>>();
     69     test_constexpr<optional<ImplicitTypes::NoCtors>>();
     70     test_constexpr<optional<NonTrivialTypes::NoCtors>>();
     71     test_constexpr<optional<NonConstexprTypes::NoCtors>>();
     72     test<optional<NonLiteralTypes::NoCtors>>();
     73 }
     74