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

Andrew Haley via llvm-dev
Tue, 14 Aug 2018 14:49:26 -0000

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