From: Casey Carter Date: Wed, 10 May 2017 19:10:49 +0000 (+0000) Subject: [test] support machinery changes for EDG & C1XX /Za X-Git-Tag: llvmorg-5.0.0-rc1~5423 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=768a93fbebc6a2936b6dbd78a863cbf791bf27d6;p=platform%2Fupstream%2Fllvm.git [test] support machinery changes for EDG & C1XX /Za This change works around a couple of bugs: 1. EDG doesn't like explicit constexpr in a derived class. This program: struct Base {}; struct Derived : Base { constexpr Derived() = default; }; triggers "error: defaulted default constructor cannot be constexpr." 2. C1XX with /Za has no idea which constructor needs to be valid for copy elision. The change also conditionally disables parts of the msvc_stdlib_force_include.hpp header that conflict with external configuration when _LIBCXX_IN_DEVCRT is defined. Differential Revision: https://reviews.llvm.org/D32778 llvm-svn: 302707 --- diff --git a/libcxx/test/support/archetypes.hpp b/libcxx/test/support/archetypes.hpp index f442b59..533f586 100644 --- a/libcxx/test/support/archetypes.hpp +++ b/libcxx/test/support/archetypes.hpp @@ -5,6 +5,7 @@ #include #include "test_macros.h" +#include "test_workarounds.h" #if TEST_STD_VER >= 11 @@ -14,7 +15,9 @@ template struct DepType : T {}; struct NullBase { +#ifndef TEST_WORKAROUND_C1XX_BROKEN_ZA_CTOR_CHECK protected: +#endif // !TEST_WORKAROUND_C1XX_BROKEN_ZA_CTOR_CHECK NullBase() = default; NullBase(NullBase const&) = default; NullBase& operator=(NullBase const&) = default; @@ -81,7 +84,9 @@ struct TestBase { ++assigned; ++value_assigned; return *this; } +#ifndef TEST_WORKAROUND_C1XX_BROKEN_ZA_CTOR_CHECK protected: +#endif // !TEST_WORKAROUND_C1XX_BROKEN_ZA_CTOR_CHECK ~TestBase() { assert(value != -999); assert(alive > 0); --alive; ++destroyed; value = -999; @@ -144,7 +149,9 @@ struct ValueBase { } //~ValueBase() { assert(value != -999); value = -999; } int value; +#ifndef TEST_WORKAROUND_C1XX_BROKEN_ZA_CTOR_CHECK protected: +#endif // !TEST_WORKAROUND_C1XX_BROKEN_ZA_CTOR_CHECK constexpr static int check_value(int const& val) { #if TEST_STD_VER < 14 return val == -1 || val == 999 ? (TEST_THROW(42), 0) : val; @@ -197,7 +204,9 @@ struct TrivialValueBase { template ::type = true> constexpr TrivialValueBase(std::initializer_list& il, int = 0) : value(static_cast(il.size())) {} int value; +#ifndef TEST_WORKAROUND_C1XX_BROKEN_ZA_CTOR_CHECK protected: +#endif // !TEST_WORKAROUND_C1XX_BROKEN_ZA_CTOR_CHECK constexpr TrivialValueBase() noexcept : value(0) {} }; diff --git a/libcxx/test/support/archetypes.ipp b/libcxx/test/support/archetypes.ipp index d8d1e5a9..3604501 100644 --- a/libcxx/test/support/archetypes.ipp +++ b/libcxx/test/support/archetypes.ipp @@ -6,7 +6,11 @@ #define DEFINE_EXPLICIT #endif #ifndef DEFINE_CONSTEXPR +#ifdef TEST_WORKAROUND_EDG_EXPLICIT_CONSTEXPR +#define DEFINE_CONSTEXPR +#else // TEST_WORKAROUND_EDG_EXPLICIT_CONSTEXPR #define DEFINE_CONSTEXPR constexpr +#endif // TEST_WORKAROUND_EDG_EXPLICIT_CONSTEXPR #endif #ifndef DEFINE_ASSIGN_CONSTEXPR #if TEST_STD_VER >= 14 diff --git a/libcxx/test/support/msvc_stdlib_force_include.hpp b/libcxx/test/support/msvc_stdlib_force_include.hpp index 2b78e50..f29b841 100644 --- a/libcxx/test/support/msvc_stdlib_force_include.hpp +++ b/libcxx/test/support/msvc_stdlib_force_include.hpp @@ -13,11 +13,13 @@ // This header is force-included when running the libc++ tests against the // MSVC standard library. -// Silence warnings about CRT machinery. -#define _CRT_SECURE_NO_WARNINGS +#ifndef _LIBCXX_IN_DEVCRT + // Silence warnings about CRT machinery. + #define _CRT_SECURE_NO_WARNINGS -// Avoid assertion dialogs. -#define _CRT_SECURE_INVALID_PARAMETER(EXPR) ::abort() + // Avoid assertion dialogs. + #define _CRT_SECURE_INVALID_PARAMETER(EXPR) ::abort() +#endif // _LIBCXX_IN_DEVCRT #include #include @@ -31,6 +33,7 @@ #define _MSVC_STL_VER 42 #endif +#ifndef _LIBCXX_IN_DEVCRT struct AssertionDialogAvoider { AssertionDialogAvoider() { _CrtSetReportMode(_CRT_ASSERT, _CRTDBG_MODE_FILE); @@ -42,6 +45,7 @@ struct AssertionDialogAvoider { }; const AssertionDialogAvoider assertion_dialog_avoider{}; +#endif // _LIBCXX_IN_DEVCRT // MSVC frontend only configurations #if !defined(__clang__) @@ -74,8 +78,9 @@ const AssertionDialogAvoider assertion_dialog_avoider{}; #define _HAS_FUNCTION_ASSIGN 1 #define _HAS_OLD_IOSTREAMS_MEMBERS 1 -// Silence warnings about raw pointers and other unchecked iterators. -#define _SCL_SECURE_NO_WARNINGS + // Silence warnings about raw pointers and other unchecked iterators. + #define _SCL_SECURE_NO_WARNINGS +#endif // _LIBCXX_IN_DEVCRT #include diff --git a/libcxx/test/support/test.workarounds/c1xx_broken_za_ctor_check.pass.cpp b/libcxx/test/support/test.workarounds/c1xx_broken_za_ctor_check.pass.cpp new file mode 100644 index 0000000..856574d --- /dev/null +++ b/libcxx/test/support/test.workarounds/c1xx_broken_za_ctor_check.pass.cpp @@ -0,0 +1,41 @@ +//===----------------------------------------------------------------------===// +// +// 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_ZA_CTOR_CHECK. + +#include + +#include "test_workarounds.h" + +struct X { + X(int) {} + + X(X&&) = default; + X& operator=(X&&) = default; + +private: + X(const X&) = default; + X& operator=(const X&) = default; +}; + +void PushFront(X&&) {} + +template +auto test(int) -> decltype(PushFront(std::declval()), std::true_type{}); +auto test(long) -> std::false_type; + +int main() { +#if defined(TEST_WORKAROUND_C1XX_BROKEN_ZA_CTOR_CHECK) + static_assert(!decltype(test(0))::value, ""); +#else + static_assert(decltype(test(0))::value, ""); +#endif +} diff --git a/libcxx/test/support/test_macros.h b/libcxx/test/support/test_macros.h index 46fcb66..6b573d4 100644 --- a/libcxx/test/support/test_macros.h +++ b/libcxx/test/support/test_macros.h @@ -52,10 +52,12 @@ #define TEST_HAS_BUILTIN_IDENTIFIER(X) 0 #endif -#if defined(__clang__) -#define TEST_COMPILER_CLANG +#if defined(__EDG__) +# define TEST_COMPILER_EDG +#elif defined(__clang__) +# define TEST_COMPILER_CLANG # if defined(__apple_build_version__) -# define TEST_COMPILER_APPLE_CLANG +# define TEST_COMPILER_APPLE_CLANG # endif #elif defined(_MSC_VER) # define TEST_COMPILER_C1XX diff --git a/libcxx/test/support/test_workarounds.h b/libcxx/test/support/test_workarounds.h index b24c883..614cec7 100644 --- a/libcxx/test/support/test_workarounds.h +++ b/libcxx/test/support/test_workarounds.h @@ -13,9 +13,16 @@ #include "test_macros.h" +#if defined(TEST_COMPILER_EDG) +# define TEST_WORKAROUND_EDG_EXPLICIT_CONSTEXPR +#endif + #if defined(TEST_COMPILER_C1XX) # define TEST_WORKAROUND_C1XX_BROKEN_NULLPTR_CONVERSION_OPERATOR # define TEST_WORKAROUND_C1XX_BROKEN_IS_TRIVIALLY_COPYABLE +# ifndef _MSC_EXTENSIONS +# define TEST_WORKAROUND_C1XX_BROKEN_ZA_CTOR_CHECK +# endif #endif #endif // SUPPORT_TEST_WORKAROUNDS_H