Ping. On Thu, Aug 29, 2024 at 04:15:41PM -0400, Marek Polacek wrote: > Bootstrapped/regtested on x86_64-pc-linux-gnu, ok for trunk/14/13? > > -- >8 -- > 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. > --- > gcc/cp/call.cc | 4 +++- > gcc/testsuite/g++.dg/tree-ssa/initlist-opt7.C | 13 +++++++++++++ > 2 files changed, 16 insertions(+), 1 deletion(-) > create mode 100644 gcc/testsuite/g++.dg/tree-ssa/initlist-opt7.C > > diff --git a/gcc/cp/call.cc b/gcc/cp/call.cc > index fa7f05d76f6..d30f36d49ff 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 00000000000..2420db502a6 > --- /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++; > +} > > base-commit: 6bfeba12c86b4d0dae27d99b484f64774dd49398 > -- > 2.46.0 >
Marek