[libcxx] r318125 - Implement LWG2950: std::byte operations are misspecified
Marshall Clow via cfe-commits
cfe-commits at lists.llvm.org
Mon Nov 13 17:14:53 PST 2017
Author: marshall
Date: Mon Nov 13 17:14:53 2017
New Revision: 318125
URL: http://llvm.org/viewvc/llvm-project?rev=318125&view=rev
Log:
Implement LWG2950: std::byte operations are misspecified
Modified:
libcxx/trunk/include/cstddef
libcxx/trunk/include/type_traits
libcxx/trunk/www/cxx2a_status.html
Modified: libcxx/trunk/include/cstddef
URL: http://llvm.org/viewvc/llvm-project/libcxx/trunk/include/cstddef?rev=318125&r1=318124&r2=318125&view=diff
==============================================================================
--- libcxx/trunk/include/cstddef (original)
+++ libcxx/trunk/include/cstddef Mon Nov 13 17:14:53 2017
@@ -64,23 +64,46 @@ namespace std // purposefully not versi
{
enum class byte : unsigned char {};
-constexpr byte& operator|=(byte& __lhs, byte __rhs) noexcept
-{ return __lhs = byte(static_cast<unsigned char>(__lhs) | static_cast<unsigned char>(__rhs)); }
constexpr byte operator| (byte __lhs, byte __rhs) noexcept
-{ return byte(static_cast<unsigned char>(__lhs) | static_cast<unsigned char>(__rhs)); }
+{
+ return static_cast<byte>(
+ static_cast<unsigned char>(
+ static_cast<unsigned int>(__lhs) | static_cast<unsigned int>(__rhs)
+ ));
+}
+
+constexpr byte& operator|=(byte& __lhs, byte __rhs) noexcept
+{ return __lhs = __lhs | __rhs; }
-constexpr byte& operator&=(byte& __lhs, byte __rhs) noexcept
-{ return __lhs = byte(static_cast<unsigned char>(__lhs) & static_cast<unsigned char>(__rhs)); }
constexpr byte operator& (byte __lhs, byte __rhs) noexcept
-{ return byte(static_cast<unsigned char>(__lhs) & static_cast<unsigned char>(__rhs)); }
+{
+ return static_cast<byte>(
+ static_cast<unsigned char>(
+ static_cast<unsigned int>(__lhs) & static_cast<unsigned int>(__rhs)
+ ));
+}
+
+constexpr byte& operator&=(byte& __lhs, byte __rhs) noexcept
+{ return __lhs = __lhs & __rhs; }
-constexpr byte& operator^=(byte& __lhs, byte __rhs) noexcept
-{ return __lhs = byte(static_cast<unsigned char>(__lhs) ^ static_cast<unsigned char>(__rhs)); }
constexpr byte operator^ (byte __lhs, byte __rhs) noexcept
-{ return byte(static_cast<unsigned char>(__lhs) ^ static_cast<unsigned char>(__rhs)); }
+{
+ return static_cast<byte>(
+ static_cast<unsigned char>(
+ static_cast<unsigned int>(__lhs) ^ static_cast<unsigned int>(__rhs)
+ ));
+}
+
+constexpr byte& operator^=(byte& __lhs, byte __rhs) noexcept
+{ return __lhs = __lhs ^ __rhs; }
constexpr byte operator~ (byte __b) noexcept
-{ return byte(~static_cast<unsigned char>(__b)); }
+{
+ return static_cast<byte>(
+ static_cast<unsigned char>(
+ ~static_cast<unsigned int>(__b)
+ ));
+}
}
Modified: libcxx/trunk/include/type_traits
URL: http://llvm.org/viewvc/llvm-project/libcxx/trunk/include/type_traits?rev=318125&r1=318124&r2=318125&view=diff
==============================================================================
--- libcxx/trunk/include/type_traits (original)
+++ libcxx/trunk/include/type_traits Mon Nov 13 17:14:53 2017
@@ -4761,26 +4761,26 @@ namespace std // purposefully not versi
template <class _Integer>
constexpr typename enable_if<is_integral_v<_Integer>, byte>::type &
operator<<=(byte& __lhs, _Integer __shift) noexcept
- { return __lhs = byte(static_cast<unsigned char>(__lhs) << __shift); }
+ { return __lhs = __lhs << __shift; }
template <class _Integer>
constexpr typename enable_if<is_integral_v<_Integer>, byte>::type
operator<< (byte __lhs, _Integer __shift) noexcept
- { return byte(static_cast<unsigned char>(__lhs) << __shift); }
+ { return static_cast<byte>(static_cast<unsigned char>(static_cast<unsigned int>(__lhs) << __shift)); }
template <class _Integer>
constexpr typename enable_if<is_integral_v<_Integer>, byte>::type &
operator>>=(byte& __lhs, _Integer __shift) noexcept
- { return __lhs = byte(static_cast<unsigned char>(__lhs) >> __shift); }
+ { return __lhs = __lhs >> __shift; }
template <class _Integer>
constexpr typename enable_if<is_integral_v<_Integer>, byte>::type
operator>> (byte __lhs, _Integer __shift) noexcept
- { return byte(static_cast<unsigned char>(__lhs) >> __shift); }
+ { return static_cast<byte>(static_cast<unsigned char>(static_cast<unsigned int>(__lhs) >> __shift)); }
template <class _Integer>
constexpr typename enable_if<is_integral_v<_Integer>, _Integer>::type
- to_integer(byte __b) noexcept { return _Integer(__b); }
+ to_integer(byte __b) noexcept { return static_cast<_Integer>(__b); }
}
#endif
Modified: libcxx/trunk/www/cxx2a_status.html
URL: http://llvm.org/viewvc/llvm-project/libcxx/trunk/www/cxx2a_status.html?rev=318125&r1=318124&r2=318125&view=diff
==============================================================================
--- libcxx/trunk/www/cxx2a_status.html (original)
+++ libcxx/trunk/www/cxx2a_status.html Mon Nov 13 17:14:53 2017
@@ -107,7 +107,7 @@
<tr><td><a href="https://wg21.link/LWG2944">2944</a></td><td>LWG 2905 accidentally removed requirement that construction of the deleter doesn't throw an exception</td><td>Albuquerque</td><td><i>Nothing to do</i></td></tr>
<tr><td><a href="https://wg21.link/LWG2945">2945</a></td><td>Order of template parameters in optional comparisons</td><td>Albuquerque</td><td>Complete</td></tr>
<tr><td><a href="https://wg21.link/LWG2948">2948</a></td><td>unique_ptr does not define operator<< for stream output</td><td>Albuquerque</td><td></td></tr>
- <tr><td><a href="https://wg21.link/LWG2950">2950</a></td><td>std::byte operations are misspecified</td><td>Albuquerque</td><td></td></tr>
+ <tr><td><a href="https://wg21.link/LWG2950">2950</a></td><td>std::byte operations are misspecified</td><td>Albuquerque</td><td>Complete</td></tr>
<tr><td><a href="https://wg21.link/LWG2952">2952</a></td><td>iterator_traits should work for pointers to cv T</td><td>Albuquerque</td><td>Complete</td></tr>
<tr><td><a href="https://wg21.link/LWG2953">2953</a></td><td>LWG 2853 should apply to deque::erase too</td><td>Albuquerque</td><td></td></tr>
<tr><td><a href="https://wg21.link/LWG2958">2958</a></td><td>Moves improperly defined as deleted</td><td>Albuquerque</td><td></td></tr>
More information about the cfe-commits
mailing list