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
diff --git a/googletest/include/gtest/gtest-matchers.h b/googletest/include/gtest/gtest-matchers.h
index 6b1bb6a..1bb3140 100644
--- a/googletest/include/gtest/gtest-matchers.h
+++ b/googletest/include/gtest/gtest-matchers.h
@@ -421,7 +421,11 @@
   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);