[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