//===----------------------------------------------------------------------===// // // 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. // //===----------------------------------------------------------------------===// // // template struct pair // Test the SFINAE required by LWG Issue #2367. // is_default_constructible // UNSUPPORTED: c++98, c++03 #include #include #include #include "test_macros.h" #if TEST_STD_VER > 11 #define CONSTEXPR_CXX14 constexpr #define STATIC_ASSERT_CXX14(Pred) static_assert(Pred, "") #else #define CONSTEXPR_CXX14 #define STATIC_ASSERT_CXX14(Pred) assert(Pred) #endif struct DeletedDefault { // A class with a deleted default constructor. Used to test the SFINAE // on std::pair's default constructor. constexpr explicit DeletedDefault(int x) : value(x) {} constexpr DeletedDefault() = delete; int value; }; template struct DependantType: public Tp {}; template using DependantIsDefault = DependantType, Val>; template struct DefaultSFINAES { template ::value >::type > constexpr DefaultSFINAES() : value() {} constexpr explicit DefaultSFINAES(T const& x) : value(x) {} T value; }; struct NoDefault { constexpr NoDefault(int v) : value(v) {} int value; }; template void test_not_is_default_constructible() { { typedef std::pair P; static_assert(!std::is_default_constructible

::value, ""); static_assert(std::is_constructible::value, ""); } { typedef std::pair P; static_assert(!std::is_default_constructible

::value, ""); static_assert(std::is_constructible::value, ""); } { typedef std::pair P; static_assert(!std::is_default_constructible

::value, ""); static_assert(std::is_constructible::value, ""); } } template void test_is_default_constructible() { { typedef std::pair P; static_assert(std::is_default_constructible

::value, ""); } { typedef std::pair P; static_assert(std::is_default_constructible

::value, ""); } { typedef std::pair P; static_assert(std::is_default_constructible

::value, ""); } } template struct IllFormedDefaultImp { constexpr explicit IllFormedDefaultImp(int v) : value(v) {} constexpr IllFormedDefaultImp() : value(T::DoesNotExistAndShouldNotCompile) {} int value; }; typedef IllFormedDefaultImp IllFormedDefault; // A class which provides a constexpr default constructor with a valid // signature but an ill-formed body. The A compile error will be emitted if // the default constructor is instantiated. // Check that the SFINAE on the default constructor is not evaluated when // it isn't needed. If the default constructor of 'IllFormedDefault' is evaluated // in C++11, even with is_default_constructible, then this test should fail to // compile. In C++14 and greater evaluate each test is evaluated as a constant // expression. // See LWG issue #2367 void test_illformed_default() { { typedef std::pair P; static_assert((std::is_constructible::value), ""); CONSTEXPR_CXX14 P p(IllFormedDefault(42), -5); STATIC_ASSERT_CXX14(p.first.value == 42 && p.second == -5); } { typedef std::pair P; static_assert((std::is_constructible::value), ""); CONSTEXPR_CXX14 IllFormedDefault dd(-5); CONSTEXPR_CXX14 P p(42, dd); STATIC_ASSERT_CXX14(p.first == 42 && p.second.value == -5); } { typedef std::pair P; static_assert((std::is_constructible::value), ""); CONSTEXPR_CXX14 P p(IllFormedDefault(42), IllFormedDefault(-5)); STATIC_ASSERT_CXX14(p.first.value == 42 && p.second.value == -5); } } int main() { { // Check that pair can still be used even if // is_default_constructible or is_default_constructible cause // a compilation error. test_illformed_default(); } { // pair::pair() is only disable in C++11 and beyond. test_not_is_default_constructible(); test_not_is_default_constructible(); test_not_is_default_constructible>(); test_not_is_default_constructible>(); test_not_is_default_constructible(); test_not_is_default_constructible(); } { test_is_default_constructible(); test_is_default_constructible>(); } }