<div dir="ltr">This looks like a true aliasing violation though, I think?<br><br>The aliasing rules allow you to take a standard-layout type T and reinterpret_cast a T* to a char* to read/write the bytes - but it doesn't allow for a char[] to be pointed at/referenced by a T*/T&.<br><br>- Dave<br><br><div class="gmail_quote"><div dir="ltr">On Mon, Sep 10, 2018 at 12:58 PM JF Bastien via llvm-commits <<a href="mailto:llvm-commits@lists.llvm.org">llvm-commits@lists.llvm.org</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Author: jfb<br>
Date: Mon Sep 10 12:56:42 2018<br>
New Revision: 341853<br>
<br>
URL: <a href="http://llvm.org/viewvc/llvm-project?rev=341853&view=rev" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project?rev=341853&view=rev</a><br>
Log:<br>
NFC: bit.h don't warn on strict aliasing for GCC <= 7.1<br>
<br>
Summary: Addressed <a href="https://bugs.llvm.org/show_bug.cgi?id=38885" rel="noreferrer" target="_blank">https://bugs.llvm.org/show_bug.cgi?id=38885</a><br>
<br>
Subscribers: dexonsmith, llvm-commits, rsmith, steven_wu, RKSimon, Abhilash, srhines<br>
<br>
Differential Revision: <a href="https://reviews.llvm.org/D51869" rel="noreferrer" target="_blank">https://reviews.llvm.org/D51869</a><br>
<br>
Modified:<br>
    llvm/trunk/include/llvm/ADT/bit.h<br>
<br>
Modified: llvm/trunk/include/llvm/ADT/bit.h<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/ADT/bit.h?rev=341853&r1=341852&r2=341853&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/ADT/bit.h?rev=341853&r1=341852&r2=341853&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/include/llvm/ADT/bit.h (original)<br>
+++ llvm/trunk/include/llvm/ADT/bit.h Mon Sep 10 12:56:42 2018<br>
@@ -26,7 +26,15 @@ template <typename To, typename From,<br>
 inline To bit_cast(const From &from) noexcept {<br>
   alignas(To) unsigned char storage[sizeof(To)];<br>
   std::memcpy(&storage, &from, sizeof(To));<br>
+#if defined(__GNUC__)<br>
+  // Before GCC 7.2, GCC thought that this violated strict aliasing.<br>
+#pragma GCC diagnostic push<br>
+#pragma GCC diagnostic ignored "-Wstrict-aliasing"<br>
+#endif<br>
   return reinterpret_cast<To &>(storage);<br>
+#if defined(__GNUC__)<br>
+#pragma GCC diagnostic pop<br>
+#endif<br>
 }<br>
<br>
 } // namespace llvm<br>
<br>
<br>
_______________________________________________<br>
llvm-commits mailing list<br>
<a href="mailto:llvm-commits@lists.llvm.org" target="_blank">llvm-commits@lists.llvm.org</a><br>
<a href="http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits" rel="noreferrer" target="_blank">http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits</a><br>
</blockquote></div></div>