public inbox for gcc-bugs@sourceware.org help / color / mirror / Atom feed
From: "cvs-commit at gcc dot gnu.org" <gcc-bugzilla@gcc.gnu.org> To: gcc-bugs@gcc.gnu.org Subject: [Bug c++/104568] [10/11 Regression] ICE [c++20] caused by option "-std=c++20 -Wall" when operand of operator new has size equal to 0 Date: Tue, 29 Mar 2022 05:54:20 +0000 [thread overview] Message-ID: <bug-104568-4-HWTf4vVm52@http.gcc.gnu.org/bugzilla/> (raw) In-Reply-To: <bug-104568-4@http.gcc.gnu.org/bugzilla/> https://gcc.gnu.org/bugzilla/show_bug.cgi?id=104568 --- Comment #8 from CVS Commits <cvs-commit at gcc dot gnu.org> --- The releases/gcc-11 branch has been updated by Jakub Jelinek <jakub@gcc.gnu.org>: https://gcc.gnu.org/g:18f5bc87bc2eef70991b9c93d1265a7d0ebed58b commit r11-9730-g18f5bc87bc2eef70991b9c93d1265a7d0ebed58b Author: Jakub Jelinek <jakub@redhat.com> Date: Fri Mar 18 18:49:23 2022 +0100 c++: Fix up constexpr evaluation of new with zero sized types [PR104568] The new expression constant expression evaluation right now tries to deduce how many elts the array it uses for the heap or heap [] vars should have (or how many elts should its trailing array have if it has cookie at the start). As new is lowered at that point to (some_type *) ::operator new (size) or so, it computes it by subtracting cookie size if any from size, then divides the result by sizeof (some_type). This works fine for most types, except when sizeof (some_type) is 0, then we divide by zero; size is then equal to cookie_size (or if there is no cookie, to 0). The following patch special cases those cases so that we don't divide by zero and also recover the original outer_nelts from the expression by forcing the size not to be folded in that case but be explicit 0 * outer_nelts or cookie_size + 0 * outer_nelts. Note, we have further issues, we accept-invalid various cases, for both zero sized elt_type and even non-zero sized elts, we aren't able to diagnose out of bounds POINTER_PLUS_EXPR like: constexpr bool foo () { auto p = new int[2]; auto q1 = &p[0]; auto q2 = &p[1]; auto q3 = &p[2]; auto q4 = &p[3]; delete[] p; return true; } constexpr bool a = foo (); That doesn't look like a regression so I think we should resolve that for GCC 13, but there are 2 problems. Figure out why cxx_fold_pointer_plus_expression doesn't deal with the &heap [] etc. cases, and for the zero sized arrays, I think we really need to preserve whether user wrote an array ref or pointer addition, because in the &p[3] case if sizeof(p[0]) == 0 we know that if it has 2 elements it is out of bounds, while if we see p p+ 0 the information if it was p + 2 or p + 3 in the source is lost. clang++ seems to handle it fine even in the zero sized cases or with new expressions. 2022-03-18 Jakub Jelinek <jakub@redhat.com> PR c++/104568 * init.c (build_new_constexpr_heap_type): Remove FULL_SIZE argument and its handling, instead add ITYPE2 argument. Only support COOKIE_SIZE != NULL. (build_new_1): If size is 0, change it to 0 * outer_nelts if outer_nelts is non-NULL. Pass type rather than elt_type to maybe_wrap_new_for_constexpr. * constexpr.c (build_new_constexpr_heap_type): New function. (cxx_eval_constant_expression) <case CONVERT_EXPR>: If elt_size is zero sized type, try to recover outer_nelts from the size argument to operator new/new[] and pass that as arg_size to build_new_constexpr_heap_type. Pass ctx, non_constant_p and overflow_p to that call too. * g++.dg/cpp2a/constexpr-new22.C: New test. (cherry picked from commit 0a0c2c3f06227d46b5e9542dfdd4e0fd2d67d894)
next prev parent reply other threads:[~2022-03-29 5:54 UTC|newest] Thread overview: 13+ messages / expand[flat|nested] mbox.gz Atom feed top 2022-02-16 16:02 [Bug c++/104568] New: ICE [regression c++20] " nickhuang99 at hotmail dot com 2022-02-16 17:51 ` [Bug c++/104568] [10/11/12 Regression] ICE [c++20] " pinskia at gcc dot gnu.org 2022-02-16 17:53 ` pinskia at gcc dot gnu.org 2022-02-16 18:29 ` jakub at gcc dot gnu.org 2022-02-16 19:26 ` jakub at gcc dot gnu.org 2022-02-17 10:08 ` rguenth at gcc dot gnu.org 2022-02-17 15:09 ` jakub at gcc dot gnu.org 2022-03-18 18:02 ` cvs-commit at gcc dot gnu.org 2022-03-18 18:03 ` [Bug c++/104568] [10/11 " jakub at gcc dot gnu.org 2022-03-29 5:54 ` cvs-commit at gcc dot gnu.org [this message] 2022-03-30 8:16 ` [Bug c++/104568] [10 " jakub at gcc dot gnu.org 2022-05-10 8:25 ` cvs-commit at gcc dot gnu.org 2022-05-10 10:23 ` jakub 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-104568-4-HWTf4vVm52@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).