Implement LWG2950: std::byte operations are misspecified

llvm-svn: 318125
Cr-Mirrored-From: sso://chromium.googlesource.com/_direct/external/github.com/llvm/llvm-project
Cr-Mirrored-Commit: 12de6e9c110d95e4a7efdd604d9a804f003ab19d
diff --git a/include/cstddef b/include/cstddef
index 6258449..adeefda 100644
--- a/include/cstddef
+++ b/include/cstddef
@@ -64,23 +64,46 @@
 {
 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 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 = 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 __lhs = __lhs & __rhs; }
+
+constexpr byte  operator^ (byte  __lhs, byte __rhs) noexcept
+{
+	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 = 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 __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)
+    ));
+}
 
 }