<p dir="ltr"><br>
On Feb 9, 2013 10:38 PM, "Chris Lattner" <<a href="mailto:sabre@nondot.org">sabre@nondot.org</a>> wrote:<br>
><br>
> Author: lattner<br>
> Date: Sun Feb 10 00:36:29 2013<br>
> New Revision: 174827<br>
><br>
> URL: <a href="http://llvm.org/viewvc/llvm-project?rev=174827&view=rev">http://llvm.org/viewvc/llvm-project?rev=174827&view=rev</a><br>
> Log:<br>
> ok, ok, stop fighting type punning warnings by just using a union.<br>
><br>
> Modified:<br>
>     llvm/trunk/include/llvm/Bitcode/BitstreamReader.h<br>
><br>
> Modified: llvm/trunk/include/llvm/Bitcode/BitstreamReader.h<br>
> URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Bitcode/BitstreamReader.h?rev=174827&r1=174826&r2=174827&view=diff">http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Bitcode/BitstreamReader.h?rev=174827&r1=174826&r2=174827&view=diff</a><br>

> ==============================================================================<br>
> --- llvm/trunk/include/llvm/Bitcode/BitstreamReader.h (original)<br>
> +++ llvm/trunk/include/llvm/Bitcode/BitstreamReader.h Sun Feb 10 00:36:29 2013<br>
> @@ -364,13 +364,16 @@ public:<br>
>      uint32_t R = uint32_t(CurWord);<br>
><br>
>      // Read the next word from the stream.<br>
> -    char buf[sizeof(word_t)] = {0};<br>
> -    BitStream->getBitcodeBytes().readBytes(NextChar, sizeof(buf),<br>
> -                                           (uint8_t*)buf, NULL);<br>
> +    union {<br>
> +      uint8_t ArrayMember[sizeof(word_t)];<br>
> +      support::detail::packed_endian_specific_integral<br>
> +      <word_t, support::little, support::unaligned> EndianMember;<br>
> +    } buf = { { 0 } };<br>
><br>
> -    typedef support::detail::packed_endian_specific_integral<br>
> -       <word_t, support::little, support::unaligned> Endian_T;<br>
> -    CurWord = *(Endian_T*)buf;<br>
> +    BitStream->getBitcodeBytes().readBytes(NextChar, sizeof(buf),<br>
> +                                           buf.ArrayMember, NULL);<br>
> +    // Handle big-endian byte-swapping if necessary.<br>
> +    CurWord = buf.EndianMember;</p>
<p dir="ltr">This is still invalid C++ isn't it (UB to read from the non active member of a union) - why not just use memcpy, the language-sanctioned way to do this operation?</p>
<p dir="ltr">><br>
>      NextChar += sizeof(word_t);<br>
><br>
><br>
><br>
> _______________________________________________<br>
> llvm-commits mailing list<br>
> <a href="mailto:llvm-commits@cs.uiuc.edu">llvm-commits@cs.uiuc.edu</a><br>
> <a href="http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits">http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits</a><br>
</p>