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() noexcept;
     14 
     15 #include <optional>
     16 #include <type_traits>
     17 #include <cassert>
     18 
     19 #include "test_macros.h"
     20 #include "archetypes.hpp"
     21 
     22 using std::optional;
     23 
     24 template <class Opt>
     25 void
     26 test_constexpr()
     27 {
     28     static_assert(std::is_nothrow_default_constructible<Opt>::value, "");
     29     static_assert(std::is_trivially_destructible<Opt>::value, "");
     30     static_assert(std::is_trivially_destructible<typename Opt::value_type>::value, "");
     31 
     32     constexpr Opt opt;
     33     static_assert(static_cast<bool>(opt) == false, "");
     34 
     35     struct test_constexpr_ctor
     36         : public Opt
     37     {
     38         constexpr test_constexpr_ctor() {}
     39     };
     40 }
     41 
     42 template <class Opt>
     43 void
     44 test()
     45 {
     46     static_assert(std::is_nothrow_default_constructible<Opt>::value, "");
     47     static_assert(!std::is_trivially_destructible<Opt>::value, "");
     48     static_assert(!std::is_trivially_destructible<typename Opt::value_type>::value, "");
     49     {
     50         Opt opt;
     51         assert(static_cast<bool>(opt) == false);
     52     }
     53     {
     54         const Opt opt;
     55         assert(static_cast<bool>(opt) == false);
     56     }
     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     // EXTENSIONS
     74 #if defined(_LIBCPP_VERSION) && 0 // FIXME these extensions are currently disabled.
     75     test_constexpr<optional<int&>>();
     76     test_constexpr<optional<const int&>>();
     77     test_constexpr<optional<int&>>();
     78     test_constexpr<optional<NonLiteralTypes::NoCtors&>>();
     79     test_constexpr<optional<NonLiteralTypes::NoCtors&&>>();
     80 #endif
     81 }
     82