GCC modified for the FreeChainXenon project
Find a file
Marek Polacek da7f0be91e c++: wrong error initializing empty class [PR115900]
In r14-409, we started handling empty bases first in cxx_fold_indirect_ref_1
so that we don't need to recurse and waste time.

This caused a bogus "modifying a const object" error.  I'm appending my
analysis from the PR, but basically, cxx_fold_indirect_ref now returns
a different object than before, and we mark the wrong thing as const,
but since we're initializing an empty object, we should avoid setting
the object constness.

~~
Pre-r14-409: we're evaluating the call to C::C(), which is in the body of
B::B(), which is the body of D::D(&d):

  C::C ((struct C *) this, NON_LVALUE_EXPR <0>)

It's a ctor so we get here:

 3118   /* Remember the object we are constructing or destructing.  */
 3119   tree new_obj = NULL_TREE;
 3120   if (DECL_CONSTRUCTOR_P (fun) || DECL_DESTRUCTOR_P (fun))
 3121     {
 3122       /* In a cdtor, it should be the first `this' argument.
 3123          At this point it has already been evaluated in the call
 3124          to cxx_bind_parameters_in_call.  */
 3125       new_obj = TREE_VEC_ELT (new_call.bindings, 0);

new_obj=(struct C *) &d.D.2656

 3126       new_obj = cxx_fold_indirect_ref (ctx, loc, DECL_CONTEXT (fun), new_obj);

new_obj=d.D.2656.D.2597

We proceed to evaluate the call, then we get here:

 3317           /* At this point, the object's constructor will have run, so
 3318              the object is no longer under construction, and its possible
 3319              'const' semantics now apply.  Make a note of this fact by
 3320              marking the CONSTRUCTOR TREE_READONLY.  */
 3321           if (new_obj && DECL_CONSTRUCTOR_P (fun))
 3322             cxx_set_object_constness (ctx, new_obj, /*readonly_p=*/true,
 3323                                       non_constant_p, overflow_p);

new_obj is still d.D.2656.D.2597, its type is "C", cxx_set_object_constness
doesn't set anything as const.  This is fine.

After r14-409: on line 3125, new_obj is (struct C *) &d.D.2656 as before,
but we go to cxx_fold_indirect_ref_1:

 5739       if (is_empty_class (type)
 5740           && CLASS_TYPE_P (optype)
 5741           && lookup_base (optype, type, ba_any, NULL, tf_none, off))
 5742         {
 5743           if (empty_base)
 5744             *empty_base = true;
 5745           return op;

type is C, which is an empty class; optype is "const D", and C is a base of D.
So we return the VAR_DECL 'd'.  Then we get to cxx_set_object_constness with
object=d, which is const, so we mark the constructor READONLY.

Then we're evaluating A::A() which has

  ((A*)this)->data = 0;

we evaluate the LHS to d.D.2656.a, for which the initializer is
{.D.2656={.a={.data=}}} which is TREE_READONLY and 'd' is const, so we think
we're modifying a const object and fail the constexpr evaluation.

	PR c++/115900

gcc/cp/ChangeLog:

	* constexpr.cc (cxx_eval_call_expression): Set new_obj to NULL_TREE
	if cxx_fold_indirect_ref set empty_base to true.

gcc/testsuite/ChangeLog:

	* g++.dg/cpp2a/constexpr-init23.C: New test.

(cherry picked from commit d890b04197fb0ddba4fbfb32f88e266fa27e02f3)
2024-07-29 09:43:41 -04:00
.github Minor formatting fix for newly-added file from previous commit 2023-11-01 19:28:56 -04:00
c++tools Update ChangeLog and version files for release 2024-05-07 06:52:35 +00:00
config Update ChangeLog and version files for release 2024-05-07 06:52:35 +00:00
contrib Daily bump. 2024-05-09 11:03:31 +00:00
fixincludes Update ChangeLog and version files for release 2024-05-07 06:52:35 +00:00
gcc c++: wrong error initializing empty class [PR115900] 2024-07-29 09:43:41 -04:00
gnattools Update ChangeLog and version files for release 2024-05-07 06:52:35 +00:00
gotools Update ChangeLog and version files for release 2024-05-07 06:52:35 +00:00
include Update ChangeLog and version files for release 2024-05-07 06:52:35 +00:00
INSTALL
libada Update ChangeLog and version files for release 2024-05-07 06:52:35 +00:00
libatomic Update ChangeLog and version files for release 2024-05-07 06:52:35 +00:00
libbacktrace Update ChangeLog and version files for release 2024-05-07 06:52:35 +00:00
libcc1 Update ChangeLog and version files for release 2024-05-07 06:52:35 +00:00
libcody Update ChangeLog and version files for release 2024-05-07 06:52:35 +00:00
libcpp Update ChangeLog and version files for release 2024-05-07 06:52:35 +00:00
libdecnumber Update ChangeLog and version files for release 2024-05-07 06:52:35 +00:00
libffi Update ChangeLog and version files for release 2024-05-07 06:52:35 +00:00
libgcc Daily bump. 2024-06-22 00:24:39 +00:00
libgfortran Update ChangeLog and version files for release 2024-05-07 06:52:35 +00:00
libgm2 Update ChangeLog and version files for release 2024-05-07 06:52:35 +00:00
libgo libgo: bump libgo version for GCC 14 release 2024-02-05 11:28:30 -08:00
libgomp Daily bump. 2024-05-09 11:03:31 +00:00
libgrust Update ChangeLog and version files for release 2024-05-07 06:52:35 +00:00
libiberty Update ChangeLog and version files for release 2024-05-07 06:52:35 +00:00
libitm Update ChangeLog and version files for release 2024-05-07 06:52:35 +00:00
libobjc Update ChangeLog and version files for release 2024-05-07 06:52:35 +00:00
libphobos Update ChangeLog and version files for release 2024-05-07 06:52:35 +00:00
libquadmath Update ChangeLog and version files for release 2024-05-07 06:52:35 +00:00
libsanitizer Update ChangeLog and version files for release 2024-05-07 06:52:35 +00:00
libssp Update ChangeLog and version files for release 2024-05-07 06:52:35 +00:00
libstdc++-v3 Daily bump. 2024-07-24 00:23:48 +00:00
libvtv Update ChangeLog and version files for release 2024-05-07 06:52:35 +00:00
lto-plugin Update ChangeLog and version files for release 2024-05-07 06:52:35 +00:00
maintainer-scripts Update ChangeLog and version files for release 2024-05-07 06:52:35 +00:00
zlib Update ChangeLog and version files for release 2024-05-07 06:52:35 +00:00
.dir-locals.el dir-locals: Use https for bug references 2021-07-20 11:40:34 +01:00
.gitattributes Add *.md diff=md. 2020-01-15 14:29:53 +01:00
.gitignore *: add modern gettext 2023-11-14 00:47:11 +01:00
ABOUT-NLS intl: New directory; see intl/ChangeLog for details. 2003-07-04 18:18:54 +00:00
ar-lib Update GCC to autoconf 2.69, automake 1.15.1 (PR bootstrap/82856). 2018-10-31 17:03:16 +00:00
ChangeLog Update ChangeLog and version files for release 2024-05-07 06:52:35 +00:00
ChangeLog.jit Merger of dmalcolm/jit branch from git 2014-11-11 21:55:52 +00:00
ChangeLog.tree-ssa Merge tree-ssa-20020619-branch into mainline. 2004-05-13 02:41:07 -04:00
compile Update from upstream Automake files. 2014-11-16 14:07:13 +00:00
config-ml.in LoongArch: Reimplement multilib build option handling. 2023-09-15 10:42:12 +08:00
config.guess config.sub, config.guess : Import upstream 2021-01-25. 2021-02-23 17:21:10 +08:00
config.rpath Remove freebsd1 from libtool.m4 macros and config.rpath. 2011-02-13 11:45:53 +00:00
config.sub config.sub: change mode to 755. 2021-12-21 09:10:57 +01:00
configure build: Use of cargo not yet supported here in Canadian cross configurations 2024-04-16 09:43:47 +02:00
configure.ac build: Use of cargo not yet supported here in Canadian cross configurations 2024-04-16 09:43:47 +02:00
COPYING COPYING, [...]: Sync from upstream sources. 2005-07-14 01:08:13 +00:00
COPYING.LIB Update COPYING.LIB from upstream. Correct last Changelog. 2005-07-14 01:41:54 +00:00
COPYING.RUNTIME Licensing changes to GPLv3 resp. GPLv3 with GCC Runtime Exception. 2009-04-09 17:00:19 +02:00
COPYING3 COPYING_v3: New file. 2007-07-17 08:37:53 +00:00
COPYING3.LIB COPYING_v3: New file. 2007-07-17 08:37:53 +00:00
depcomp Update from upstream Automake files. 2014-11-16 14:07:13 +00:00
install-sh Update from upstream Automake files. 2014-11-16 14:07:13 +00:00
libtool-ldflags re PR sanitizer/56781 (boostrap-asan failure: fixincl fails to link (missing -lasan)) 2014-04-17 14:23:28 +02:00
libtool.m4 Build: fix error in fixinclude configure 2023-11-22 11:54:33 +01:00
ltgcc.m4 libtool.m4: Update to libtool 2.2.6. 2008-09-26 16:21:02 +00:00
ltmain.sh Do not use HAVE_DOS_BASED_FILE_SYSTEM for Cygwin. 2020-04-17 09:22:51 +02:00
ltoptions.m4 Sync from git Libtool and regenerate. 2009-12-05 17:18:53 +00:00
ltsugar.m4 libtool.m4: Update to libtool 2.2.6. 2008-09-26 16:21:02 +00:00
ltversion.m4 Sync from git Libtool and regenerate. 2009-12-05 17:18:53 +00:00
lt~obsolete.m4 Sync from git Libtool and regenerate. 2009-12-05 17:18:53 +00:00
MAINTAINERS MAINTAINERS: Update my email address 2024-04-04 16:39:52 +02:00
Makefile.def gccrs: Fix missing build dependency 2024-01-16 16:23:02 +01:00
Makefile.in Fix up postboot dependencies [PR106472] 2024-04-02 13:40:27 +02:00
Makefile.tpl Fix up postboot dependencies [PR106472] 2024-04-02 13:40:27 +02:00
missing Update from upstream Automake files. 2014-11-16 14:07:13 +00:00
mkdep merge with /cvs/src 2000-07-22 04:08:22 -04:00
mkinstalldirs Update from upstream Automake files. 2014-11-16 14:07:13 +00:00
move-if-change Update move-if-change from gnulib 2014-11-16 16:12:44 +00:00
multilib.am Update GCC to autoconf 2.69, automake 1.15.1 (PR bootstrap/82856). 2018-10-31 17:03:16 +00:00
README * README: Document use of ranges of years in copyright notices. 2012-07-16 15:01:34 +01:00
SECURITY.txt SECURITY.txt: Drop "exploitable" in reference to hardening issues 2024-01-09 10:49:01 -05:00
symlink-tree COPYING, [...]: Sync from upstream sources. 2005-07-14 01:08:13 +00:00
test-driver Update GCC to autoconf 2.69, automake 1.15.1 (PR bootstrap/82856). 2018-10-31 17:03:16 +00:00
ylwrap Update from upstream Automake files. 2014-11-16 14:07:13 +00:00

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.