Home | History | Annotate | Download | only in variant.ctor
      1 // -*- C++ -*-
      2 //===----------------------------------------------------------------------===//
      3 //
      4 //                     The LLVM Compiler Infrastructure
      5 //
      6 // This file is dual licensed under the MIT and the University of Illinois Open
      7 // Source Licenses. See LICENSE.TXT for details.
      8 //
      9 //===----------------------------------------------------------------------===//
     10 
     11 // UNSUPPORTED: c++98, c++03, c++11, c++14
     12 
     13 // <variant>
     14 
     15 // template <class ...Types> class variant;
     16 
     17 // constexpr variant() noexcept(see below);
     18 
     19 #include <cassert>
     20 #include <type_traits>
     21 #include <variant>
     22 
     23 #include "test_macros.h"
     24 #include "variant_test_helpers.hpp"
     25 
     26 struct NonDefaultConstructible {
     27   NonDefaultConstructible(int) {}
     28 };
     29 
     30 struct NotNoexcept {
     31   NotNoexcept() noexcept(false) {}
     32 };
     33 
     34 #ifndef TEST_HAS_NO_EXCEPTIONS
     35 struct DefaultCtorThrows {
     36   DefaultCtorThrows() { throw 42; }
     37 };
     38 #endif
     39 
     40 void test_default_ctor_sfinae() {
     41   {
     42     using V = std::variant<std::monostate, int>;
     43     static_assert(std::is_default_constructible<V>::value, "");
     44   }
     45   {
     46     using V = std::variant<NonDefaultConstructible, int>;
     47     static_assert(!std::is_default_constructible<V>::value, "");
     48   }
     49 #if !defined(TEST_VARIANT_HAS_NO_REFERENCES)
     50   {
     51     using V = std::variant<int &, int>;
     52     static_assert(!std::is_default_constructible<V>::value, "");
     53   }
     54 #endif
     55 }
     56 
     57 void test_default_ctor_noexcept() {
     58   {
     59     using V = std::variant<int>;
     60     static_assert(std::is_nothrow_default_constructible<V>::value, "");
     61   }
     62   {
     63     using V = std::variant<NotNoexcept>;
     64     static_assert(!std::is_nothrow_default_constructible<V>::value, "");
     65   }
     66 }
     67 
     68 void test_default_ctor_throws() {
     69 #ifndef TEST_HAS_NO_EXCEPTIONS
     70   using V = std::variant<DefaultCtorThrows, int>;
     71   try {
     72     V v;
     73     assert(false);
     74   } catch (const int &ex) {
     75     assert(ex == 42);
     76   } catch (...) {
     77     assert(false);
     78   }
     79 #endif
     80 }
     81 
     82 void test_default_ctor_basic() {
     83   {
     84     std::variant<int> v;
     85     assert(v.index() == 0);
     86     assert(std::get<0>(v) == 0);
     87   }
     88   {
     89     std::variant<int, long> v;
     90     assert(v.index() == 0);
     91     assert(std::get<0>(v) == 0);
     92   }
     93   {
     94     using V = std::variant<int, long>;
     95     constexpr V v;
     96     static_assert(v.index() == 0, "");
     97     static_assert(std::get<0>(v) == 0, "");
     98   }
     99   {
    100     using V = std::variant<int, long>;
    101     constexpr V v;
    102     static_assert(v.index() == 0, "");
    103     static_assert(std::get<0>(v) == 0, "");
    104   }
    105 }
    106 
    107 int main() {
    108   test_default_ctor_basic();
    109   test_default_ctor_sfinae();
    110   test_default_ctor_noexcept();
    111   test_default_ctor_throws();
    112 }
    113