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
This commit is contained in:
Jonathan Wakely 2019-06-18 12:39:43 +01:00 committed by Jonathan Wakely
parent 5ed12b58ef
commit 0c65926ffa
2 changed files with 33 additions and 46 deletions

View File

@ -1,3 +1,8 @@
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

View File

@ -120,71 +120,53 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
template<typename _IntegerType>
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