[test] variant: enable constexpr construction tests on MSVC STL

* Add a new macro _MSVC_STL_VER to detect when the MSVC STL is being tested
* Workaround C1XX __is_trivially_copyable bug

llvm-svn: 302158
This commit is contained in:
Casey Carter 2017-05-04 15:32:54 +00:00
parent eedae7630a
commit 79053ff795
5 changed files with 58 additions and 4 deletions

View File

@ -21,6 +21,7 @@
#include <variant>
#include "test_macros.h"
#include "test_workarounds.h"
struct NonT {
NonT(int v) : value(v) {}
@ -137,14 +138,21 @@ constexpr bool test_constexpr_copy_ctor_extension_imp(
auto v2 = v;
return v2.index() == v.index() &&
v2.index() == Idx &&
std::get<Idx>(v2) == std::get<Idx>(v);
std::get<Idx>(v2) == std::get<Idx>(v);
}
void test_constexpr_copy_ctor_extension() {
#ifdef _LIBCPP_VERSION
#if defined(_LIBCPP_VER) || defined(_MSVC_STL_VER)
using V = std::variant<long, void*, const int>;
static_assert(std::is_trivially_copyable<V>::value, "");
#ifdef TEST_WORKAROUND_C1XX_BROKEN_IS_TRIVIALLY_COPYABLE
static_assert(std::is_trivially_destructible<V>::value, "");
static_assert(std::is_trivially_copy_constructible<V>::value, "");
static_assert(std::is_trivially_move_constructible<V>::value, "");
static_assert(!std::is_copy_assignable<V>::value, "");
static_assert(!std::is_move_assignable<V>::value, "");
#else
static_assert(std::is_trivially_copyable<V>::value, "");
#endif
static_assert(test_constexpr_copy_ctor_extension_imp<0>(V(42l)), "");
static_assert(test_constexpr_copy_ctor_extension_imp<1>(V(nullptr)), "");
static_assert(test_constexpr_copy_ctor_extension_imp<2>(V(101)), "");

View File

@ -22,6 +22,7 @@
#include <variant>
#include "test_macros.h"
#include "test_workarounds.h"
struct ThrowsMove {
ThrowsMove(ThrowsMove &&) noexcept(false) {}
@ -178,9 +179,17 @@ constexpr bool test_constexpr_ctor_extension_imp(
}
void test_constexpr_move_ctor_extension() {
#ifdef _LIBCPP_VERSION
#if defined(_LIBCPP_VER) || defined(_MSVC_STL_VER)
using V = std::variant<long, void*, const int>;
#ifdef TEST_WORKAROUND_C1XX_BROKEN_IS_TRIVIALLY_COPYABLE
static_assert(std::is_trivially_destructible<V>::value, "");
static_assert(std::is_trivially_copy_constructible<V>::value, "");
static_assert(std::is_trivially_move_constructible<V>::value, "");
static_assert(!std::is_copy_assignable<V>::value, "");
static_assert(!std::is_move_assignable<V>::value, "");
#else
static_assert(std::is_trivially_copyable<V>::value, "");
#endif
static_assert(std::is_trivially_move_constructible<V>::value, "");
static_assert(test_constexpr_ctor_extension_imp<0>(V(42l)), "");
static_assert(test_constexpr_ctor_extension_imp<1>(V(nullptr)), "");

View File

@ -26,6 +26,11 @@
#error This header may not be used when targeting libc++
#endif
// Indicates that we are using the MSVC standard library.
#ifndef _MSVC_STL_VER
#define _MSVC_STL_VER 42
#endif
struct AssertionDialogAvoider {
AssertionDialogAvoider() {
_CrtSetReportMode(_CRT_ASSERT, _CRTDBG_MODE_FILE);

View File

@ -0,0 +1,31 @@
//===----------------------------------------------------------------------===//
//
// The LLVM Compiler Infrastructure
//
// This file is dual licensed under the MIT and the University of Illinois Open
// Source Licenses. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
// UNSUPPORTED: c++98, c++03
// Verify TEST_WORKAROUND_C1XX_BROKEN_IS_TRIVIALLY_COPYABLE.
#include <type_traits>
#include "test_workarounds.h"
struct S {
S(S const&) = default;
S(S&&) = default;
S& operator=(S const&) = delete;
S& operator=(S&&) = delete;
};
int main() {
#if defined(TEST_WORKAROUND_C1XX_BROKEN_IS_TRIVIALLY_COPYABLE)
static_assert(!std::is_trivially_copyable<S>::value, "");
#else
static_assert(std::is_trivially_copyable<S>::value, "");
#endif
}

View File

@ -15,6 +15,7 @@
#if defined(TEST_COMPILER_C1XX)
# define TEST_WORKAROUND_C1XX_BROKEN_NULLPTR_CONVERSION_OPERATOR
# define TEST_WORKAROUND_C1XX_BROKEN_IS_TRIVIALLY_COPYABLE
#endif
#endif // SUPPORT_TEST_WORKAROUNDS_H