Skip to content

Commit

Permalink
Googletest export
Browse files Browse the repository at this point in the history
Launder buffer before reference

In GCC, directly casting the Buffer reference to another type results in
strict-aliasing violation errors. This launders the reference using an
intermediate pointer prior to creating the new reference.

PiperOrigin-RevId: 350809323
  • Loading branch information
Abseil Team authored and derekmauro committed Jan 14, 2021
1 parent c13c27a commit 50ce520
Showing 1 changed file with 5 additions and 1 deletion.
6 changes: 5 additions & 1 deletion googletest/include/gtest/gtest-matchers.h
Original file line number Diff line number Diff line change
Expand Up @@ -421,7 +421,11 @@ class MatcherBase : private MatcherDescriberInterface {
template <typename M, bool = IsInlined<M>()>
struct ValuePolicy {
static const M& Get(const MatcherBase& m) {
return reinterpret_cast<const M&>(m.buffer_);
// When inlined along with Init, need to be explicit to avoid violating
// strict aliasing rules.
const M *ptr = static_cast<const M*>(
static_cast<const void*>(&m.buffer_));
return *ptr;
}
static void Init(MatcherBase& m, M impl) {
::new (static_cast<void*>(&m.buffer_)) M(impl);
Expand Down

0 comments on commit 50ce520

Please # to comment.