From 50ce52016139a4346a94df71249c14c5d286e000 Mon Sep 17 00:00:00 2001 From: Abseil Team Date: Fri, 8 Jan 2021 15:00:47 -0500 Subject: [PATCH] Googletest export 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 --- googletest/include/gtest/gtest-matchers.h | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/googletest/include/gtest/gtest-matchers.h b/googletest/include/gtest/gtest-matchers.h index 6b1bb6af..1bb3140d 100644 --- a/googletest/include/gtest/gtest-matchers.h +++ b/googletest/include/gtest/gtest-matchers.h @@ -421,7 +421,11 @@ class MatcherBase : private MatcherDescriberInterface { template ()> struct ValuePolicy { static const M& Get(const MatcherBase& m) { - return reinterpret_cast(m.buffer_); + // When inlined along with Init, need to be explicit to avoid violating + // strict aliasing rules. + const M *ptr = static_cast( + static_cast(&m.buffer_)); + return *ptr; } static void Init(MatcherBase& m, M impl) { ::new (static_cast(&m.buffer_)) M(impl);