[gcc r15-3572] c++: mutable temps in rodata [PR116369]
Marek Polacek
mpolacek@gcc.gnu.org
Tue Sep 10 15:48:34 GMT 2024
https://gcc.gnu.org/g:2801a49d1144bce5568b527d1972952ad3420f66
commit r15-3572-g2801a49d1144bce5568b527d1972952ad3420f66
Author: Marek Polacek <polacek@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++;
+}
More information about the Gcc-cvs
mailing list