https://gcc.gnu.org/bugzilla/show_bug.cgi?id=95349

--- Comment #49 from Christopher Nerz <Christopher.Nerz at de dot bosch.com> ---
Ah, misunderstood and therefore forgot optimization to a constant.

In the current code example, we have the problem that the (second)
initialization does not initialize with a value (ergo undefined behaviour due
to uninitialized variable although it is created in an initialized memory).
In the more complex code - which I am trying to simplify, but so far get the
behaviour only in quite special situations which are hard to reduce to an
example - we have that the buffer is explicitly initialized via `new T{}`
(calling an inline initialization, i.e. not a trivial default constructor, but
T is trivially copy & move constructible), then the buffer is copied (as
std::byte-array) and then std::launder is applied to the resulting byte-array.
To my understanding [basic.types.general].$3

> For two distinct objects obj1 and obj2 of trivially copyable type T, where 
> neither obj1 nor obj2 is a potentially-overlapping subobject, if the 
> underlying bytes (6.7.1) making up obj1 are copied into obj2, obj2 shall 
> subsequently hold the same value as obj1.

guarantees that the copied buffer can be used as `T` via
`*std::launder<T*>(second_buffer)`. Clang, MSVC agree, gcc does not.

Again: Still trying to construct the minimal example for that behavior :-/

Reply via email to