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 // XFAIL: availability=macosx10.13
     14 // XFAIL: availability=macosx10.12
     15 // XFAIL: availability=macosx10.11
     16 // XFAIL: availability=macosx10.10
     17 // XFAIL: availability=macosx10.9
     18 // XFAIL: availability=macosx10.8
     19 // XFAIL: availability=macosx10.7
     20 
     21 // <variant>
     22 
     23 // template <class ...Types> class variant;
     24 
     25 // constexpr variant() noexcept(see below);
     26 
     27 #include <cassert>
     28 #include <type_traits>
     29 #include <variant>
     30 
     31 #include "test_macros.h"
     32 #include "variant_test_helpers.hpp"
     33 
     34 struct NonDefaultConstructible {
     35   constexpr NonDefaultConstructible(int) {}
     36 };
     37 
     38 struct NotNoexcept {
     39   NotNoexcept() noexcept(false) {}
     40 };
     41 
     42 #ifndef TEST_HAS_NO_EXCEPTIONS
     43 struct DefaultCtorThrows {
     44   DefaultCtorThrows() { throw 42; }
     45 };
     46 #endif
     47 
     48 void test_default_ctor_sfinae() {
     49   {
     50     using V = std::variant<std::monostate, int>;
     51     static_assert(std::is_default_constructible<V>::value, "");
     52   }
     53   {
     54     using V = std::variant<NonDefaultConstructible, int>;
     55     static_assert(!std::is_default_constructible<V>::value, "");
     56   }
     57 #if !defined(TEST_VARIANT_HAS_NO_REFERENCES)
     58   {
     59     using V = std::variant<int &, int>;
     60     static_assert(!std::is_default_constructible<V>::value, "");
     61   }
     62 #endif
     63 }
     64 
     65 void test_default_ctor_noexcept() {
     66   {
     67     using V = std::variant<int>;
     68     static_assert(std::is_nothrow_default_constructible<V>::value, "");
     69   }
     70   {
     71     using V = std::variant<NotNoexcept>;
     72     static_assert(!std::is_nothrow_default_constructible<V>::value, "");
     73   }
     74 }
     75 
     76 void test_default_ctor_throws() {
     77 #ifndef TEST_HAS_NO_EXCEPTIONS
     78   using V = std::variant<DefaultCtorThrows, int>;
     79   try {
     80     V v;
     81     assert(false);
     82   } catch (const int &ex) {
     83     assert(ex == 42);
     84   } catch (...) {
     85     assert(false);
     86   }
     87 #endif
     88 }
     89 
     90 void test_default_ctor_basic() {
     91   {
     92     std::variant<int> v;
     93     assert(v.index() == 0);
     94     assert(std::get<0>(v) == 0);
     95   }
     96   {
     97     std::variant<int, long> v;
     98     assert(v.index() == 0);
     99     assert(std::get<0>(v) == 0);
    100   }
    101   {
    102     std::variant<int, NonDefaultConstructible> v;
    103     assert(v.index() == 0);
    104     assert(std::get<0>(v) == 0);
    105   }
    106   {
    107     using V = std::variant<int, long>;
    108     constexpr V v;
    109     static_assert(v.index() == 0, "");
    110     static_assert(std::get<0>(v) == 0, "");
    111   }
    112   {
    113     using V = std::variant<int, long>;
    114     constexpr V v;
    115     static_assert(v.index() == 0, "");
    116     static_assert(std::get<0>(v) == 0, "");
    117   }
    118   {
    119     using V = std::variant<int, NonDefaultConstructible>;
    120     constexpr V v;
    121     static_assert(v.index() == 0, "");
    122     static_assert(std::get<0>(v) == 0, "");
    123   }
    124 }
    125 
    126 int main() {
    127   test_default_ctor_basic();
    128   test_default_ctor_sfinae();
    129   test_default_ctor_noexcept();
    130   test_default_ctor_throws();
    131 }
    132