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.
next prev 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: linkBe 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).