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> _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits