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)
+ ));
+}
}