c++: Fix wrong-code with non-constexpr constructor [PR93169]
authorMarek Polacek <polacek@redhat.com>
Wed, 19 Feb 2020 21:36:38 +0000 (16:36 -0500)
committerMarek Polacek <polacek@redhat.com>
Thu, 20 Feb 2020 00:14:29 +0000 (19:14 -0500)
commit8f9dd1b0bdd935592ba151e9d843fddf6193afbc
treee19b0e3022901799a7fae3326655494fc1ad49a6
parentccf86d54cb02ed24bc4568bd9fffdcdbf0bf68a8
c++: Fix wrong-code with non-constexpr constructor [PR93169]

In order to detect modifying constant objects in constexpr evaluation,
which is UB, in r10-2655 I added code that sets TREE_READONLY on
CONSTRUCTORs of const-qualified objects after they have been fully
constructed.  But I never made sure that what we're setting the flag
on actually is a CONSTRUCTOR.  Consequently, as this test case shows,
we could set TREE_READONLY on a VAR_DECL that in fact wasn't constant,
causing problems later.  Fixed by setting the flag on CONSTRUCTORs
only, and only when the evaluation produced something constant.

2020-02-19  Marek Polacek  <polacek@redhat.com>

PR c++/93169 - wrong-code with a non-constexpr constructor.
* constexpr.c (cxx_eval_call_expression): Only set TREE_READONLY
on constant CONSTRUCTORs.

* g++.dg/cpp0x/constexpr-93169.C: New test.
gcc/cp/ChangeLog
gcc/cp/constexpr.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/cpp0x/constexpr-93169.C [new file with mode: 0644]