From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: by sourceware.org (Postfix, from userid 48) id D6123388703B; Tue, 10 May 2022 08:25:21 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org D6123388703B From: "cvs-commit at gcc dot gnu.org" To: gcc-bugs@gcc.gnu.org Subject: [Bug c++/104568] [10 Regression] ICE [c++20] caused by option "-std=c++20 -Wall" when operand of operator new has size equal to 0 Date: Tue, 10 May 2022 08:25:21 +0000 X-Bugzilla-Reason: CC X-Bugzilla-Type: changed X-Bugzilla-Watch-Reason: None X-Bugzilla-Product: gcc X-Bugzilla-Component: c++ X-Bugzilla-Version: 12.0 X-Bugzilla-Keywords: ice-on-invalid-code X-Bugzilla-Severity: normal X-Bugzilla-Who: cvs-commit at gcc dot gnu.org X-Bugzilla-Status: ASSIGNED X-Bugzilla-Resolution: X-Bugzilla-Priority: P2 X-Bugzilla-Assigned-To: jakub at gcc dot gnu.org X-Bugzilla-Target-Milestone: 10.4 X-Bugzilla-Flags: X-Bugzilla-Changed-Fields: Message-ID: In-Reply-To: References: Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable X-Bugzilla-URL: http://gcc.gnu.org/bugzilla/ Auto-Submitted: auto-generated MIME-Version: 1.0 X-BeenThere: gcc-bugs@gcc.gnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Gcc-bugs mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Tue, 10 May 2022 08:25:21 -0000 https://gcc.gnu.org/bugzilla/show_bug.cgi?id=3D104568 --- Comment #10 from CVS Commits --- The releases/gcc-10 branch has been updated by Jakub Jelinek : https://gcc.gnu.org/g:d7b94c407a2720955927d501c5a67821c010aeed commit r10-10696-gd7b94c407a2720955927d501c5a67821c010aeed Author: Jakub Jelinek 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 =3D new int[2]; auto q1 =3D &p[0]; auto q2 =3D &p[1]; auto q3 =3D &p[2]; auto q4 =3D &p[3]; delete[] p; return true; } constexpr bool a =3D foo (); That doesn't look like a regression so I think we should resolve that f= or 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]) =3D=3D 0 we know that if it has 2 elements i= t 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 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 !=3D 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) : 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)=