https://gcc.gnu.org/g:2801a49d1144bce5568b527d1972952ad3420f66
commit r15-3572-g2801a49d1144bce5568b527d1972952ad3420f66 Author: Marek Polacek <pola...@redhat.com> Date: Thu Aug 29 15:13:03 2024 -0400 c++: mutable temps in rodata [PR116369] Here we wrongly mark the reference temporary for g TREE_READONLY, so it's put in .rodata and so we can't modify its subobject even when the subobject is marked mutable. This is so since r9-869. r14-1785 fixed a similar problem, but not in set_up_extended_ref_temp. PR c++/116369 gcc/cp/ChangeLog: * call.cc (set_up_extended_ref_temp): Don't mark a temporary TREE_READONLY if its type is TYPE_HAS_MUTABLE_P. gcc/testsuite/ChangeLog: * g++.dg/tree-ssa/initlist-opt7.C: New test. Diff: --- gcc/cp/call.cc | 4 +++- gcc/testsuite/g++.dg/tree-ssa/initlist-opt7.C | 13 +++++++++++++ 2 files changed, 16 insertions(+), 1 deletion(-) diff --git a/gcc/cp/call.cc b/gcc/cp/call.cc index fa7f05d76f68..d30f36d49ff6 100644 --- a/gcc/cp/call.cc +++ b/gcc/cp/call.cc @@ -13964,7 +13964,9 @@ set_up_extended_ref_temp (tree decl, tree expr, vec<tree, va_gc> **cleanups, init = cp_fully_fold (init); if (TREE_CONSTANT (init)) { - if (literal_type_p (type) && CP_TYPE_CONST_NON_VOLATILE_P (type)) + if (literal_type_p (type) + && CP_TYPE_CONST_NON_VOLATILE_P (type) + && !TYPE_HAS_MUTABLE_P (type)) { /* 5.19 says that a constant expression can include an lvalue-rvalue conversion applied to "a glvalue of literal type diff --git a/gcc/testsuite/g++.dg/tree-ssa/initlist-opt7.C b/gcc/testsuite/g++.dg/tree-ssa/initlist-opt7.C new file mode 100644 index 000000000000..2420db502a67 --- /dev/null +++ b/gcc/testsuite/g++.dg/tree-ssa/initlist-opt7.C @@ -0,0 +1,13 @@ +// PR c++/116369 +// { dg-do run { target c++11 } } + +struct f{ + mutable int t; +}; + +const f &g = {1}; + +int main() +{ + g.t++; +}