Browse Source

Merge pull request #8560 from liamwhite/bitfield-may-alias

common: fix bitfield aliasing on GCC/Clang
pull/15/merge
bunnei 3 years ago
committed by GitHub
parent
commit
93a4ca11fa
No known key found for this signature in database GPG Key ID: 4AEE18F83AFDEB23
  1. 9
      src/common/bit_field.h

9
src/common/bit_field.h

@ -146,7 +146,16 @@ public:
} }
constexpr void Assign(const T& value) { constexpr void Assign(const T& value) {
#ifdef _MSC_VER
storage = static_cast<StorageType>((storage & ~mask) | FormatValue(value)); storage = static_cast<StorageType>((storage & ~mask) | FormatValue(value));
#else
// Explicitly reload with memcpy to avoid compiler aliasing quirks
// regarding optimization: GCC/Clang clobber chained stores to
// different bitfields in the same struct with the last value.
StorageTypeWithEndian storage_;
std::memcpy(&storage_, &storage, sizeof(storage_));
storage = static_cast<StorageType>((storage_ & ~mask) | FormatValue(value));
#endif
} }
[[nodiscard]] constexpr T Value() const { [[nodiscard]] constexpr T Value() const {

Loading…
Cancel
Save