mirror of
git://gcc.gnu.org/git/gcc.git
synced 2025-04-09 20:31:36 +08:00
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:
parent
5ed12b58ef
commit
0c65926ffa
@ -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
|
||||
|
@ -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
|
||||
|
Loading…
x
Reference in New Issue
Block a user