mirror of
https://forge.sourceware.org/marek/gcc.git
synced 2026-02-22 03:47:02 -05:00
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:
@@ -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; };
|
||||
|
||||
|
||||
@@ -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 }
|
||||
|
||||
@@ -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>;
|
||||
@@ -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 }
|
||||
|
||||
@@ -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>;
|
||||
@@ -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 }
|
||||
|
||||
Reference in New Issue
Block a user