Commit 0c65926f by Jonathan Wakely Committed by Jonathan Wakely

Avoid undefined behaviour in std::byte operators (LWG 2950)

	* include/c_global/cstddef (std::byte): Perform arithmetic operations
	in unsigned int to avoid promotion (LWG 2950).

From-SVN: r272415
parent 5ed12b58
2019-06-18 Jonathan Wakely <jwakely@redhat.com>
* include/c_global/cstddef (std::byte): Perform arithmetic operations
in unsigned int to avoid promotion (LWG 2950).
2019-06-17 Jonathan Wakely <jwakely@redhat.com>
* testsuite/20_util/allocator/1.cc: Add sized delete, which fixes a
......
......@@ -121,70 +121,52 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
using __byte_op_t = typename __byte_operand<_IntegerType>::__type;
template<typename _IntegerType>
constexpr __byte_op_t<_IntegerType>&
operator<<=(byte& __b, _IntegerType __shift) noexcept
{ return __b = byte(static_cast<unsigned char>(__b) << __shift); }
template<typename _IntegerType>
constexpr __byte_op_t<_IntegerType>
operator<<(byte __b, _IntegerType __shift) noexcept
{ return byte(static_cast<unsigned char>(__b) << __shift); }
template<typename _IntegerType>
constexpr __byte_op_t<_IntegerType>&
operator>>=(byte& __b, _IntegerType __shift) noexcept
{ return __b = byte(static_cast<unsigned char>(__b) >> __shift); }
{ return (byte)(unsigned char)((unsigned)__b << __shift); }
template<typename _IntegerType>
constexpr __byte_op_t<_IntegerType>
operator>>(byte __b, _IntegerType __shift) noexcept
{ return byte(static_cast<unsigned char>(__b) >> __shift); }
constexpr byte&
operator|=(byte& __l, byte __r) noexcept
{
return __l =
byte(static_cast<unsigned char>(__l) | static_cast<unsigned char>(__r));
}
{ return (byte)(unsigned char)((unsigned)__b >> __shift); }
constexpr byte
operator|(byte __l, byte __r) noexcept
{
return
byte(static_cast<unsigned char>(__l) | static_cast<unsigned char>(__r));
}
constexpr byte&
operator&=(byte& __l, byte __r) noexcept
{
return __l =
byte(static_cast<unsigned char>(__l) & static_cast<unsigned char>(__r));
}
{ return (byte)(unsigned char)((unsigned)__l | (unsigned)__r); }
constexpr byte
operator&(byte __l, byte __r) noexcept
{
return
byte(static_cast<unsigned char>(__l) & static_cast<unsigned char>(__r));
}
constexpr byte&
operator^=(byte& __l, byte __r) noexcept
{
return __l =
byte(static_cast<unsigned char>(__l) ^ static_cast<unsigned char>(__r));
}
{ return (byte)(unsigned char)((unsigned)__l & (unsigned)__r); }
constexpr byte
operator^(byte __l, byte __r) noexcept
{
return
byte(static_cast<unsigned char>(__l) ^ static_cast<unsigned char>(__r));
}
{ return (byte)(unsigned char)((unsigned)__l ^ (unsigned)__r); }
constexpr byte
operator~(byte __b) noexcept
{ return byte(~static_cast<unsigned char>(__b)); }
{ return (byte)(unsigned char)~(unsigned)__b; }
template<typename _IntegerType>
constexpr __byte_op_t<_IntegerType>&
operator<<=(byte& __b, _IntegerType __shift) noexcept
{ return __b = __b << __shift; }
template<typename _IntegerType>
constexpr __byte_op_t<_IntegerType>&
operator>>=(byte& __b, _IntegerType __shift) noexcept
{ return __b = __b >> __shift; }
constexpr byte&
operator|=(byte& __l, byte __r) noexcept
{ return __l = __l | __r; }
constexpr byte&
operator&=(byte& __l, byte __r) noexcept
{ return __l = __l & __r; }
constexpr byte&
operator^=(byte& __l, byte __r) noexcept
{ return __l = __l ^ __r; }
template<typename _IntegerType>
constexpr _IntegerType
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment