common: fix bitfield aliasing on GCC/Clang
This commit is contained in:
		| @@ -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 { | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user