Go to file
Jakub Jelinek 0a0c2c3f06 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.cc (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.cc (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.
2022-03-18 19:02:19 +01:00
c++tools c++tools: Work around a BSD bug in getaddrinfo(). 2022-03-18 15:23:49 +00:00
config
contrib Daily bump. 2022-03-11 00:16:39 +00:00
fixincludes
gcc c++: Fix up constexpr evaluation of new with zero sized types [PR104568] 2022-03-18 19:02:19 +01:00
gnattools
gotools
include
INSTALL
intl
libada
libatomic Daily bump. 2022-03-18 00:16:27 +00:00
libbacktrace
libcc1
libcody libcody: Do not use a dummy port number in getaddrinfo(). 2022-03-18 15:23:23 +00:00
libcpp
libdecnumber
libffi
libgcc Daily bump. 2022-03-10 00:16:28 +00:00
libgfortran
libgo libgo: update to final Go 1.18 release 2022-03-16 13:52:32 -07:00
libgomp Fortran/OpenMP: Fix privatization of associated names 2022-03-18 17:40:22 +01:00
libiberty
libitm
libobjc
liboffloadmic
libphobos Daily bump. 2022-03-14 00:16:20 +00:00
libquadmath
libsanitizer Daily bump. 2022-03-15 00:16:49 +00:00
libssp
libstdc++-v3 libstdc++: Simplify constraints for std::any construction [PR104242] 2022-03-18 15:40:03 +00:00
libvtv
lto-plugin Daily bump. 2022-03-12 00:16:27 +00:00
maintainer-scripts
zlib
.dir-locals.el
.gitattributes
.gitignore
ABOUT-NLS
ar-lib
ChangeLog Daily bump. 2022-03-17 00:17:00 +00:00
ChangeLog.jit
ChangeLog.tree-ssa
compile
config-ml.in
config.guess
config.rpath
config.sub
configure top-level: Fix comment about --enable-libstdcxx in configure 2022-03-14 13:08:02 +00:00
configure.ac top-level: Fix comment about --enable-libstdcxx in configure 2022-03-14 13:08:02 +00:00
COPYING
COPYING3
COPYING3.LIB
COPYING.LIB
COPYING.RUNTIME
depcomp
install-sh
libtool-ldflags
libtool.m4
lt~obsolete.m4
ltgcc.m4
ltmain.sh
ltoptions.m4
ltsugar.m4
ltversion.m4
MAINTAINERS MAINTAINERS: Add myself to DCO section 2022-03-16 03:20:00 +00:00
Makefile.def toplevel: Makefile.def: Make configure-sim depend on all-readline 2022-03-09 20:54:37 +01:00
Makefile.in toplevel: Makefile.def: Make configure-sim depend on all-readline 2022-03-09 20:54:37 +01:00
Makefile.tpl
missing
mkdep
mkinstalldirs
move-if-change
multilib.am
README
symlink-tree
test-driver
ylwrap

This directory contains the GNU Compiler Collection (GCC).

The GNU Compiler Collection is free software.  See the files whose
names start with COPYING for copying permission.  The manuals, and
some of the runtime libraries, are under different terms; see the
individual source files for details.

The directory INSTALL contains copies of the installation information
as HTML and plain text.  The source of this information is
gcc/doc/install.texi.  The installation information includes details
of what is included in the GCC sources and what files GCC installs.

See the file gcc/doc/gcc.texi (together with other files that it
includes) for usage and porting information.  An online readable
version of the manual is in the files gcc/doc/gcc.info*.

See http://gcc.gnu.org/bugs/ for how to report bugs usefully.

Copyright years on GCC source files may be listed using range
notation, e.g., 1987-2012, indicating that every year in the range,
inclusive, is a copyrightable year that could otherwise be listed
individually.