c++: Fix wrong error with constexpr destructor [PR97427]
authorMarek Polacek <polacek@redhat.com>
Thu, 19 Nov 2020 22:56:39 +0000 (17:56 -0500)
committerMarek Polacek <polacek@redhat.com>
Sat, 21 Nov 2020 20:27:25 +0000 (15:27 -0500)
commitcaf17f3afa83623c0f538f6c91c7699c4fdd5674
treef461807ad6883933545c9ce7590ead90eace474e
parent62d19588b9a08077dce7990d90dc61033a0b240d
c++: Fix wrong error with constexpr destructor [PR97427]

When I implemented the code to detect modifying const objects in
constexpr contexts, we couldn't have constexpr destructors, so I didn't
consider them.  But now we can and that caused a bogus error in this
testcase: [class.dtor]p5 says that "const and volatile semantics are not
applied on an object under destruction.  They stop being in effect when
the destructor for the most derived object starts." so we have to clear
the TREE_READONLY flag we set on the object after the constructors have
been called to mark it as no-longer-under-construction.  In the ~Foo
call it's now an object under destruction, so don't report those errors.

gcc/cp/ChangeLog:

PR c++/97427
* constexpr.c (cxx_set_object_constness): New function.
(cxx_eval_call_expression): Set new_obj for destructors too.
Call cxx_set_object_constness to set/unset TREE_READONLY of
the object under construction/destruction.

gcc/testsuite/ChangeLog:

PR c++/97427
* g++.dg/cpp2a/constexpr-dtor10.C: New test.
gcc/cp/constexpr.c
gcc/testsuite/g++.dg/cpp2a/constexpr-dtor10.C [new file with mode: 0644]