[Bug c++/97195] construct_at on a union member is not a constant expression
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=97195 Jakub Jelinek changed: What|Removed |Added Status|ASSIGNED|RESOLVED Resolution|--- |FIXED --- Comment #5 from Jakub Jelinek --- Fixed.
[Bug c++/97195] construct_at on a union member is not a constant expression
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=97195 --- Comment #4 from CVS Commits --- The releases/gcc-10 branch has been updated by Jakub Jelinek : https://gcc.gnu.org/g:355b42c5d9d58d266829d2e44528f7a5ca0eae37 commit r10-8852-g355b42c5d9d58d266829d2e44528f7a5ca0eae37 Author: Jakub Jelinek Date: Thu Oct 1 11:16:44 2020 +0200 c++: Handle std::construct_at on automatic vars during constant evaluation [PR97195] As mentioned in the PR, we only support due to a bug in constant expressions std::construct_at on non-automatic variables, because we VERIFY_CONSTANT the second argument of placement new, which fails verification if it is an address of an automatic variable. The following patch fixes it by not performing that verification, the placement new evaluation later on will verify it after it is dereferenced. 2020-10-01 Jakub Jelinek PR c++/97195 * constexpr.c (cxx_eval_call_expression): Don't VERIFY_CONSTANT the second argument. * g++.dg/cpp2a/constexpr-new14.C: New test. (cherry picked from commit 2805fcb32660bc0cdcd5ba54310f1f02651e039f)
[Bug c++/97195] construct_at on a union member is not a constant expression
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=97195 --- Comment #3 from CVS Commits --- The master branch has been updated by Jakub Jelinek : https://gcc.gnu.org/g:2805fcb32660bc0cdcd5ba54310f1f02651e039f commit r11-3581-g2805fcb32660bc0cdcd5ba54310f1f02651e039f Author: Jakub Jelinek Date: Thu Oct 1 11:16:44 2020 +0200 c++: Handle std::construct_at on automatic vars during constant evaluation [PR97195] As mentioned in the PR, we only support due to a bug in constant expressions std::construct_at on non-automatic variables, because we VERIFY_CONSTANT the second argument of placement new, which fails verification if it is an address of an automatic variable. The following patch fixes it by not performing that verification, the placement new evaluation later on will verify it after it is dereferenced. 2020-10-01 Jakub Jelinek PR c++/97195 * constexpr.c (cxx_eval_call_expression): Don't VERIFY_CONSTANT the second argument. * g++.dg/cpp2a/constexpr-new14.C: New test.
[Bug c++/97195] construct_at on a union member is not a constant expression
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=97195 Jakub Jelinek changed: What|Removed |Added Assignee|unassigned at gcc dot gnu.org |jakub at gcc dot gnu.org Status|NEW |ASSIGNED --- Comment #2 from Jakub Jelinek --- Created attachment 49290 --> https://gcc.gnu.org/bugzilla/attachment.cgi?id=49290=edit gcc11-pr97195.patch Untested fix.
[Bug c++/97195] construct_at on a union member is not a constant expression
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=97195 Jonathan Wakely changed: What|Removed |Added Status|UNCONFIRMED |NEW Ever confirmed|0 |1 Last reconfirmed||2020-09-28 CC||jakub at gcc dot gnu.org
[Bug c++/97195] construct_at on a union member is not a constant expression
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=97195 David Stone changed: What|Removed |Added CC||david at doublewise dot net --- Comment #1 from David Stone --- This is actually a broader bug in construct_at, unrelated to unions: ``` #include constexpr bool test() { int a = 5; std::construct_at( , -1 ); return true; } constexpr bool b = test(); ``` is also rejected. See it live: https://godbolt.org/z/KWK8n1 The real problem here appears to be that std::construct_at is not a constant expression for values with non-constant addresses. The following code, for example, is accepted: ``` #include struct S { constexpr S() { std::construct_at( , -1 ); } int m; }; constexpr S s; ``` See it live: https://godbolt.org/z/Wdx9Kx