diff mbox series

c++: mutable temps in rodata [PR116369]

Message ID 20240829201541.592487-1-polacek@redhat.com
State New
Headers show
Series c++: mutable temps in rodata [PR116369] | expand

Commit Message

Marek Polacek Aug. 29, 2024, 8:15 p.m. UTC
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


base-commit: 6bfeba12c86b4d0dae27d99b484f64774dd49398

Comments

Marek Polacek Sept. 9, 2024, 4:54 p.m. UTC | #1
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
Jason Merrill Sept. 10, 2024, 2:37 p.m. UTC | #2
On 8/29/24 4:15 PM, Marek Polacek wrote:
> Bootstrapped/regtested on x86_64-pc-linux-gnu, ok for trunk/14/13?

OK.

> -- >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
diff mbox series

Patch

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++;
+}