[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