libstdc++: Add std::to_underlying for C++23
Implement P1682R2 as just approved for C++23. libstdc++-v3/ChangeLog: * include/std/utility (to_underlying): Define. * include/std/version (__cpp_lib_to_underlying): Define. * testsuite/20_util/to_underlying/1.cc: New test. * testsuite/20_util/to_underlying/version.cc: New test.
This commit is contained in:
parent
a21b99e8ce
commit
7244879b88
@ -461,6 +461,15 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
|
||||
else
|
||||
return __t <= make_unsigned_t<_Up>(__int_traits<_Up>::__max);
|
||||
}
|
||||
|
||||
#if __cplusplus > 202002L
|
||||
#define __cpp_lib_to_underlying 202102L
|
||||
/// Convert an object of enumeration type to its underlying type.
|
||||
template<typename _Tp>
|
||||
constexpr underlying_type_t<_Tp>
|
||||
to_underlying(_Tp __value) noexcept
|
||||
{ return static_cast<underlying_type_t<_Tp>>(__value); }
|
||||
#endif // C++23
|
||||
#endif // C++20
|
||||
#endif // C++17
|
||||
|
||||
|
@ -250,7 +250,7 @@
|
||||
#define __cpp_lib_ssize 201902L
|
||||
#define __cpp_lib_starts_ends_with 201711L
|
||||
# if _GLIBCXX_USE_CXX11_ABI
|
||||
// Only supported with cx11-abi
|
||||
// Only supported with cxx11-abi
|
||||
# define __cpp_lib_syncbuf 201803L
|
||||
# endif
|
||||
#define __cpp_lib_to_address 201711L
|
||||
@ -260,6 +260,7 @@
|
||||
#if __cplusplus > 202002L
|
||||
// c++2b
|
||||
#define __cpp_lib_string_contains 202011L
|
||||
#define __cpp_lib_to_underlying 202102L
|
||||
#endif // C++2b
|
||||
#endif // C++20
|
||||
#endif // C++17
|
||||
|
38
libstdc++-v3/testsuite/20_util/to_underlying/1.cc
Normal file
38
libstdc++-v3/testsuite/20_util/to_underlying/1.cc
Normal file
@ -0,0 +1,38 @@
|
||||
// Copyright (C) 2021 Free Software Foundation, Inc.
|
||||
//
|
||||
// This file is part of the GNU ISO C++ Library. This library is free
|
||||
// software; you can redistribute it and/or modify it under the
|
||||
// terms of the GNU General Public License as published by the
|
||||
// Free Software Foundation; either version 3, or (at your option)
|
||||
// any later version.
|
||||
|
||||
// This library is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU General Public License for more details.
|
||||
|
||||
// You should have received a copy of the GNU General Public License along
|
||||
// with this library; see the file COPYING3. If not see
|
||||
// <http://www.gnu.org/licenses/>.
|
||||
|
||||
// { dg-options "-std=gnu++23" }
|
||||
// { dg-do compile { target c++23 } }
|
||||
|
||||
#include <utility>
|
||||
|
||||
#ifndef __cpp_lib_to_underlying
|
||||
# error "Feature-test macro for to_underlying missing in <utility>"
|
||||
#elif __cpp_lib_to_underlying != 202102L
|
||||
# error "Feature-test macro for to_underlying has wrong value in <utility>"
|
||||
#endif
|
||||
|
||||
void
|
||||
test01()
|
||||
{
|
||||
enum E : short { e0, e1, e2 };
|
||||
E e = e0;
|
||||
static_assert( std::is_same_v<decltype(std::to_underlying(e)), short> );
|
||||
static_assert( noexcept(std::to_underlying(e)) );
|
||||
static_assert( std::to_underlying(e1) == 1 );
|
||||
static_assert( std::to_underlying((E)3) == 3 );
|
||||
}
|
27
libstdc++-v3/testsuite/20_util/to_underlying/version.cc
Normal file
27
libstdc++-v3/testsuite/20_util/to_underlying/version.cc
Normal file
@ -0,0 +1,27 @@
|
||||
// Copyright (C) 2021 Free Software Foundation, Inc.
|
||||
//
|
||||
// This file is part of the GNU ISO C++ Library. This library is free
|
||||
// software; you can redistribute it and/or modify it under the
|
||||
// terms of the GNU General Public License as published by the
|
||||
// Free Software Foundation; either version 3, or (at your option)
|
||||
// any later version.
|
||||
|
||||
// This library is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU General Public License for more details.
|
||||
|
||||
// You should have received a copy of the GNU General Public License along
|
||||
// with this library; see the file COPYING3. If not see
|
||||
// <http://www.gnu.org/licenses/>.
|
||||
|
||||
// { dg-options "-std=gnu++23" }
|
||||
// { dg-do compile { target c++23 } }
|
||||
|
||||
#include <version>
|
||||
|
||||
#ifndef __cpp_lib_to_underlying
|
||||
# error "Feature-test macro for to_underlying missing in <version>"
|
||||
#elif __cpp_lib_to_underlying != 202102L
|
||||
# error "Feature-test macro for to_underlying has wrong value in <version>"
|
||||
#endif
|
Loading…
Reference in New Issue
Block a user