libstdc++: Revert addition of constraints to make_signed/make_unsigned

Constraining the primary template makes it unusable in uninstantiated
contexts.

libstdc++-v3/ChangeLog:

	* include/std/type_traits (make_signed, make_unsigned): Remove
	constraints on primary template.
	* testsuite/20_util/make_signed/requirements/typedefs_neg.cc:
	Undo changes to expected error in C++20 mode.
	* testsuite/20_util/make_unsigned/requirements/typedefs_neg.cc:
	Likewise.
	* testsuite/24_iterators/range_access/range_access_cpp20_neg.cc:
	Likewise.
	* testsuite/20_util/make_signed/requirements/uninstantiated.cc:
	New test.
	* testsuite/20_util/make_unsigned/requirements/uninstantiated.cc:
	New test.
This commit is contained in:
Jonathan Wakely
2022-10-10 15:06:53 +01:00
parent 67efffec94
commit 1d2f07ed4c
6 changed files with 19 additions and 12 deletions

View File

@@ -1802,9 +1802,6 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
// Primary template.
/// make_unsigned
template<typename _Tp>
#if __cpp_concepts
requires is_integral<_Tp>::value || __is_enum(_Tp)
#endif
struct make_unsigned
{ typedef typename __make_unsigned_selector<_Tp>::__type type; };
@@ -1937,9 +1934,6 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
// Primary template.
/// make_signed
template<typename _Tp>
#if __cpp_concepts
requires is_integral<_Tp>::value || __is_enum(_Tp)
#endif
struct make_signed
{ typedef typename __make_signed_selector<_Tp>::__type type; };

View File

@@ -43,5 +43,4 @@ void test01()
using T8 = make_signed<float>::type; // { dg-error "here" }
}
// { dg-error "invalid use of incomplete type" "" { target c++17_down } 0 }
// { dg-error "constraint failure" "" { target c++20 } 0 }
// { dg-error "invalid use of incomplete type" "" { target *-*-* } 0 }

View File

@@ -0,0 +1,8 @@
// { dg-do compile { target c++11 } }
#include <type_traits>
// Check that we can name invalid specializations, just don't instantiate them.
using X = std::make_signed<float>;
using Y = std::make_signed<bool>;
using Z = std::make_signed<void>;

View File

@@ -43,5 +43,4 @@ void test01()
using T8 = make_unsigned<float>::type; // { dg-error "here" }
}
// { dg-error "invalid use of incomplete type" "" { target c++17_down } 0 }
// { dg-error "constraint failure" "" { target c++20 } 0 }
// { dg-error "invalid use of incomplete type" "" { target *-*-* } 0 }

View File

@@ -0,0 +1,8 @@
// { dg-do compile { target c++11 } }
#include <type_traits>
// Check that we can name invalid specializations, just don't instantiate them.
using X = std::make_unsigned<float>;
using Y = std::make_unsigned<bool>;
using Z = std::make_unsigned<void>;

View File

@@ -46,5 +46,4 @@ test03()
C c;
std::ssize(c); // { dg-error "no matching function" }
}
// { dg-error "incomplete type .*make_signed.*S" "" { target c++17_down } 0 }
// { dg-error "constraint failure" "" { target c++20 } 0 }
// { dg-error "incomplete type .*make_signed.*S" "" { target *-*-* } 0 }