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

Reply via email to