[llvm-dev] GCC 5 and -Wstrict-aliasing in JSON.h

Andrew Haley via llvm-dev llvm-dev at lists.llvm.org
Tue Aug 14 07:49:26 PDT 2018


On 08/14/2018 11:55 AM, Kim Gräsman wrote:
> On Tue, Aug 14, 2018 at 11:51 AM Andrew Haley <aph at redhat.com> wrote:
>>
>> On 08/12/2018 02:19 PM, Kim Gräsman wrote:
>>> I still feel a little uncomfortable, because I think Jonathan makes an
>>> excellent point -- if GCC thinks there's a strict-aliasing violation
>>> (whether the standard agrees or not) and classifies this as undefined
>>> behavior, we might invoke the optimizers wrath. The warning is a nice
>>> hint that this could happen.
>>
>> Indeed.  And I'm not convinced that the pointer cast is necessary anyway:
>> if the type passed in is a union, why not simply take the union member of
>> the appropriate type?
> 
> As it turns out, Union is not a union ¯\_(ツ)_/¯. (I thought it was, up
> until this point.)
> 
> It's a template producing a char array suitably aligned for any number
> of mutually exclusive types, much like
> https://en.cppreference.com/w/cpp/types/aligned_union.
> 
> I can't tell if that makes the waters less dangerous, but there's an
> invariant for this code that it only reinterpret_casts out Ts from the
> char buffer that it has previously put in there using placement new.

So I think GCC is wrong here. The intent of aligned_union is clearly that
it is a POD-type suitable for any of its declared types.

So what exactly is the type Union?  It has a field called buffer.

-- 
Andrew Haley
Java Platform Lead Engineer
Red Hat UK Ltd. <https://www.redhat.com>
EAC8 43EB D3EF DB98 CC77 2FAD A5CD 6035 332F A671


More information about the llvm-dev mailing list