[Bug c++/97566] [[no_unique_address]] causes miscompiles when mixed with EBO in constexpr context
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=97566 David Seifert changed: What|Removed |Added CC||soap at gentoo dot org --- Comment #7 from David Seifert --- (In reply to Jason Merrill from comment #3) > Fixed for GCC 11. Thanks for the fix Jason! Could we possibly get a backport to 10, seeing that it's needed for building chromium? It appears very related to PR98463, which was backported to GCC 10.
[Bug c++/97566] [[no_unique_address]] causes miscompiles when mixed with EBO in constexpr context
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=97566 --- Comment #6 from CVS Commits --- The releases/gcc-11 branch has been updated by Jason Merrill : https://gcc.gnu.org/g:38fed4dfa25ac4894546f0589340ebfc5eef3bee commit r11-8704-g38fed4dfa25ac4894546f0589340ebfc5eef3bee Author: Jason Merrill Date: Thu Jun 24 17:32:02 2021 -0400 c++: constexpr aggr init of empty class [PR101040] This is basically the aggregate initializer version of PR97566; as in that bug, we are trying to initialize empty field 'obj' in 'single' when there's no CONSTRUCTOR entry for the 'single' base class subobject of 'derived'. As with that bug, the fix is to stop trying to add entries for empty fields, this time in cxx_eval_bare_aggregate. The change to the other function isn't necessary for this version of the patch, but seems worthwhile for robustness anyway. PR c++/101040 PR c++/97566 gcc/cp/ChangeLog: * class.c (is_empty_field): Handle null argument. * constexpr.c (cxx_eval_bare_aggregate): Discard initializer for empty field. gcc/testsuite/ChangeLog: * g++.dg/cpp2a/no_unique_address13.C: New test.
[Bug c++/97566] [[no_unique_address]] causes miscompiles when mixed with EBO in constexpr context
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=97566 --- Comment #5 from CVS Commits --- The master branch has been updated by Jason Merrill : https://gcc.gnu.org/g:2168bfb81448ae1bfa4351760a23d4ec051c2a00 commit r12-1827-g2168bfb81448ae1bfa4351760a23d4ec051c2a00 Author: Jason Merrill Date: Thu Jun 24 17:32:02 2021 -0400 c++: constexpr aggr init of empty class [PR101040] This is basically the aggregate initializer version of PR97566; as in that bug, we are trying to initialize empty field 'obj' in 'single' when there's no CONSTRUCTOR entry for the 'single' base class subobject of 'derived'. As with that bug, the fix is to stop trying to add entries for empty fields, this time in cxx_eval_bare_aggregate. The change to the other function isn't necessary for this version of the patch, but seems worthwhile for robustness anyway. PR c++/101040 PR c++/97566 gcc/cp/ChangeLog: * class.c (is_empty_field): Handle null argument. * constexpr.c (cxx_eval_bare_aggregate): Discard initializer for empty field. gcc/testsuite/ChangeLog: * g++.dg/cpp2a/no_unique_address13.C: New test.
[Bug c++/97566] [[no_unique_address]] causes miscompiles when mixed with EBO in constexpr context
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=97566 --- Comment #4 from CVS Commits --- The master branch has been updated by Jason Merrill : https://gcc.gnu.org/g:a8dd2b3e96590ceccead63d28fc91c956a5f1a73 commit r11-7141-ga8dd2b3e96590ceccead63d28fc91c956a5f1a73 Author: Jason Merrill Date: Mon Feb 8 15:56:11 2021 -0500 c++: constexpr, union, and no_unique_address [PR98994] My second patch for 97566 omits nested CONSTRUCTORs for empty fields, but we do want them for empty union members. gcc/cp/ChangeLog: PR c++/98994 PR c++/97566 * constexpr.c (cxx_eval_store_expression): Only skip empty fields in RECORD_TYPE. gcc/testsuite/ChangeLog: PR c++/98994 * g++.dg/cpp2a/no_unique_address12.C: New test.
[Bug c++/97566] [[no_unique_address]] causes miscompiles when mixed with EBO in constexpr context
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=97566 Jason Merrill changed: What|Removed |Added Target Milestone|--- |11.0 Status|ASSIGNED|RESOLVED Resolution|--- |FIXED --- Comment #3 from Jason Merrill --- Fixed for GCC 11.
[Bug c++/97566] [[no_unique_address]] causes miscompiles when mixed with EBO in constexpr context
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=97566 --- Comment #2 from CVS Commits --- The master branch has been updated by Jason Merrill : https://gcc.gnu.org/g:a4dfd0f089af33f2af57bf422f9859405b9b4a16 commit r11-6918-ga4dfd0f089af33f2af57bf422f9859405b9b4a16 Author: Jason Merrill Date: Sun Jan 24 00:55:49 2021 -0500 c++: constexpr and empty fields [PR97566] In the discussion of PR98463, Jakub pointed out that in C++17 and up, cxx_fold_indirect_ref_1 could use the field we build for an empty base. I tried implementing that, but it broke one of the tuple tests, so I did some more digging. To start with, I generalized the PR98463 patch to handle the case where we do have a field, for an empty base or [[no_unique_address]] member. This is enough also for the no-field case because the member of the empty base must itself be an empty field; if it weren't, the base would not be empty. I looked for related PRs and found 97566, which was also fixed by the patch. After some poking around to figure out why, I noticed that the testcase had been breaking because E, though an empty class, has an ABI nvsize of one byte, and we were giving the [[no_unique_address]] FIELD_DECL that DECL_SIZE, whereas in build_base_field_1 empty base fields always get DECL_SIZE zero, and various places were relying on that to recognize empty fields. So I adjusted both the size and the checking. When I adjusted check_bases I wondered if we were correctly handling bases with only empty data members, but it appears we do. I'm deferring the cxx_fold_indirect_ref_1 change until stage 1, as I don't think it actually fixes anything. gcc/cp/ChangeLog: PR c++/97566 PR c++/98463 * class.c (layout_class_type): An empty field gets size 0. (is_empty_field): New. (check_bases): Check it. * cp-tree.h (is_empty_field): Declare it. * constexpr.c (cxx_eval_store_expression): Check it. (cx_check_missing_mem_inits): Likewise. * init.c (perform_member_init): Likewise. * typeck2.c (process_init_constructor_record): Likewise. gcc/testsuite/ChangeLog: PR c++/97566 * g++.dg/cpp2a/no_unique_address10.C: New test. * g++.dg/cpp2a/no_unique_address9.C: New test.
[Bug c++/97566] [[no_unique_address]] causes miscompiles when mixed with EBO in constexpr context
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=97566 Jason Merrill changed: What|Removed |Added Assignee|unassigned at gcc dot gnu.org |jason at gcc dot gnu.org CC||jason at gcc dot gnu.org Status|NEW |ASSIGNED
[Bug c++/97566] [[no_unique_address]] causes miscompiles when mixed with EBO in constexpr context
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=97566 Jonathan Wakely changed: What|Removed |Added Last reconfirmed||2020-10-29 Status|UNCONFIRMED |NEW Ever confirmed|0 |1 --- Comment #1 from Jonathan Wakely --- I particularly like that you can do this and it compiles and runs OK: assert(test() == 1);// works, unless optimisations enabled static_assert(test() == 0); Or to make it always run OK: #ifdef __OPTIMIZE__ assert(test() == 0); #else assert(test() == 1); #endif static_assert(test() == 0);