brintos

brintos / llvm-project-archived public Read only

0
0
Text · 2.9 KiB · 9abf4d7 Raw
132 lines · cpp
1//===----------------------------------------------------------------------===//2//3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.4// See https://llvm.org/LICENSE.txt for license information.5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception6//7//===----------------------------------------------------------------------===//8 9// UNSUPPORTED: c++03, c++11, c++1410 11// <variant>12 13// template <class ...Types> class variant;14 15// constexpr variant() noexcept(see below);16 17#include <cassert>18#include <type_traits>19#include <variant>20#include <string>21 22#include "test_macros.h"23#include "variant_test_helpers.h"24 25struct NonDefaultConstructible {26  constexpr NonDefaultConstructible(int) {}27};28 29struct NotNoexcept {30  NotNoexcept() noexcept(false) {}31};32 33#ifndef TEST_HAS_NO_EXCEPTIONS34struct DefaultCtorThrows {35  DefaultCtorThrows() { throw 42; }36};37#endif38 39constexpr void test_default_ctor_sfinae() {40  {41    using V = std::variant<std::monostate, int>;42    static_assert(std::is_default_constructible<V>::value, "");43  }44  {45    using V = std::variant<NonDefaultConstructible, int>;46    static_assert(!std::is_default_constructible<V>::value, "");47  }48}49 50constexpr void test_default_ctor_noexcept() {51  {52    using V = std::variant<int>;53    static_assert(std::is_nothrow_default_constructible<V>::value, "");54  }55  {56    using V = std::variant<NotNoexcept>;57    static_assert(!std::is_nothrow_default_constructible<V>::value, "");58  }59}60 61void test_default_ctor_throws() {62#ifndef TEST_HAS_NO_EXCEPTIONS63  using V = std::variant<DefaultCtorThrows, int>;64  try {65    V v;66    assert(false);67  } catch (const int& ex) {68    assert(ex == 42);69  } catch (...) {70    assert(false);71  }72#endif73}74 75constexpr void test_default_ctor_basic() {76  {77    std::variant<int> v;78    assert(v.index() == 0);79    assert(std::get<0>(v) == 0);80  }81  {82    std::variant<int, long> v;83    assert(v.index() == 0);84    assert(std::get<0>(v) == 0);85  }86  {87    std::variant<int, NonDefaultConstructible> v;88    assert(v.index() == 0);89    assert(std::get<0>(v) == 0);90  }91  {92    using V = std::variant<int, long>;93    constexpr V v;94    static_assert(v.index() == 0, "");95    static_assert(std::get<0>(v) == 0, "");96  }97  {98    using V = std::variant<int, long>;99    constexpr V v;100    static_assert(v.index() == 0, "");101    static_assert(std::get<0>(v) == 0, "");102  }103  {104    using V = std::variant<int, NonDefaultConstructible>;105    constexpr V v;106    static_assert(v.index() == 0, "");107    static_assert(std::get<0>(v) == 0, "");108  }109}110 111constexpr void issue_86686() {112#if TEST_STD_VER >= 20113  static_assert(std::variant<std::string>{}.index() == 0);114#endif115}116 117constexpr bool test() {118  test_default_ctor_basic();119  test_default_ctor_sfinae();120  test_default_ctor_noexcept();121  issue_86686();122 123  return true;124}125 126int main(int, char**) {127  test();128  test_default_ctor_throws();129  static_assert(test());130  return 0;131}132