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:
Jonathan Wakely 2021-02-25 11:20:17 +00:00
parent a21b99e8ce
commit 7244879b88
4 changed files with 76 additions and 1 deletions

View File

@ -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

View File

@ -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

View 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 );
}

View 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