public inbox for gcc-bugs@sourceware.org
help / color / mirror / Atom feed
From: "andrew2085 at gmail dot com" <gcc-bugzilla@gcc.gnu.org>
To: gcc-bugs@gcc.gnu.org
Subject: [Bug c++/95349] Using std::launder(p) produces unexpected behavior where (p) produces expected behavior
Date: Tue, 16 Jun 2020 03:27:13 +0000	[thread overview]
Message-ID: <bug-95349-4-3maKayJSPw@http.gcc.gnu.org/bugzilla/> (raw)
In-Reply-To: <bug-95349-4@http.gcc.gnu.org/bugzilla/>

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

--- Comment #38 from Andrew Downing <andrew2085 at gmail dot com> ---
>  int *p;
>  int x;
>  if (<condition>)
>    p = &x;
>  else
>    p = malloc (4);
>  memcpy (p, q, 4);
> 
> there is a single memcpy call and the standard says that both the dynamic
> type transfers (from q) and that it does not (to x).

I would say just that, that it both does and doesn't transfer the effective
type. Meaning that you need to be conservative during optimization and consider
p to alias both int and whatever type q is.

> Note the C++ standard makes the placement new optional.  Do you say that
> your example is incorrect with the placement new elided?

I'm not sure what you mean about the first part about it being optional. It
depends what you mean by elided. I wouldn't expect any code to be generated for
it either way, but I would expect the compiler to now consider the object at
that address as having a different type regardless.

If we pretend for a second that GCC is using pre C++20 rules for memcpy and not
messing with the effective/dynamic type for the destination, then isn't this
example still not going to work if GCC is treating placement new in this case
as doing nothing? In f1 after s1 is called, d is still a double, and u is a
pointer to uint64_t, so pointing u at d and accessing *u is still going to be
UB right? I would expect d = 3.14159 to still be optimized out, because why
would a store to a double affect a load from a uint64_t?

I can't see how this could work in every situation unless the compiler keeps
track of the type of d changing from double -> uint64_t, so it knows that
stores to it when it was a double could affect loads from a uint64_t after it's
type changed to uint64_t. In a more complex scenario where placement new was
used conditionally with many different types, the compiler would have to
consider pointers to any of those types as aliasing d afterwards. I can think
of some situations where the compiler would have a very hard time proving that
the address of some object didn't make it's way to a placement new somewhere
else in the program. This does seem very difficult to do correctly without
being very conservative and disabling a lot of optimizations, or having pretty
advanced static analysis.

  parent reply	other threads:[~2020-06-16  3:27 UTC|newest]

Thread overview: 53+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2020-05-26 20:45 [Bug c++/95349] New: " andrew2085 at gmail dot com
2020-05-27  8:04 ` [Bug c++/95349] " rguenth at gcc dot gnu.org
2020-05-27  9:14 ` redi at gcc dot gnu.org
2020-05-27  9:40 ` rguenther at suse dot de
2020-05-27 11:05 ` redi at gcc dot gnu.org
2020-05-27 14:45 ` andrew2085 at gmail dot com
2020-05-27 15:07 ` redi at gcc dot gnu.org
2020-05-27 15:19 ` andrew2085 at gmail dot com
2020-05-27 16:01 ` andrew2085 at gmail dot com
2020-05-29 10:59 ` ed at catmur dot uk
2020-05-29 11:23 ` rguenth at gcc dot gnu.org
2020-05-29 11:32 ` rguenth at gcc dot gnu.org
2020-05-29 13:53 ` ed at catmur dot uk
2020-05-29 14:15 ` redi at gcc dot gnu.org
2020-05-29 14:24 ` rguenther at suse dot de
2020-05-29 15:05 ` andrew2085 at gmail dot com
2020-05-29 18:07 ` richard-gccbugzilla at metafoo dot co.uk
2020-05-29 21:00 ` andrew2085 at gmail dot com
2020-05-29 21:50 ` richard-gccbugzilla at metafoo dot co.uk
2020-05-29 23:13 ` andrew2085 at gmail dot com
2020-05-29 23:25 ` richard-gccbugzilla at metafoo dot co.uk
2020-06-02 12:09 ` rguenth at gcc dot gnu.org
2020-06-02 12:20 ` rguenth at gcc dot gnu.org
2020-06-02 16:00 ` andrew2085 at gmail dot com
2020-06-02 16:23 ` rguenther at suse dot de
2020-06-02 16:34 ` andrew2085 at gmail dot com
2020-06-02 16:37 ` andrew2085 at gmail dot com
2020-06-02 17:54 ` rguenther at suse dot de
2020-06-02 18:43 ` andrew2085 at gmail dot com
2020-06-02 20:53 ` andrew2085 at gmail dot com
2020-06-03  6:52 ` rguenth at gcc dot gnu.org
2020-06-04  0:27 ` andrew2085 at gmail dot com
2020-06-04  6:14 ` rguenther at suse dot de
2020-06-04 16:05 ` andrew2085 at gmail dot com
2020-06-05  6:52 ` rguenth at gcc dot gnu.org
2020-06-05 14:30 ` andrew2085 at gmail dot com
2020-06-15  9:29 ` rguenth at gcc dot gnu.org
2020-06-15 21:45 ` richard-gccbugzilla at metafoo dot co.uk
2020-06-16  3:27 ` andrew2085 at gmail dot com [this message]
2020-06-16  6:50 ` rguenther at suse dot de
2020-06-16  6:57 ` rguenther at suse dot de
2020-06-16 13:56 ` andrew2085 at gmail dot com
2022-01-11 12:43 ` rguenth at gcc dot gnu.org
2022-01-11 12:48 ` rguenth at gcc dot gnu.org
2022-11-14  4:53 ` andrew2085 at gmail dot com
2024-06-03  8:02 ` Christopher.Nerz at de dot bosch.com
2024-06-03  8:51 ` rguenth at gcc dot gnu.org
2024-06-03  9:13 ` Christopher.Nerz at de dot bosch.com
2024-06-03  9:23 ` rguenth at gcc dot gnu.org
2024-06-03 10:26 ` Christopher.Nerz at de dot bosch.com
2024-06-03 11:19 ` rguenther at suse dot de
2024-06-03 15:53 ` redi at gcc dot gnu.org
2024-06-03 16:00 ` redi at gcc dot gnu.org

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=bug-95349-4-3maKayJSPw@http.gcc.gnu.org/bugzilla/ \
    --to=gcc-bugzilla@gcc.gnu.org \
    --cc=gcc-bugs@gcc.gnu.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).