diff mbox series

[pushed] c++: -fmerge-all-constants vs. destructors [PR91529]

Message ID 20200501175834.8794-1-jason@redhat.com
State New
Headers show
Series [pushed] c++: -fmerge-all-constants vs. destructors [PR91529] | expand

Commit Message

Jason Merrill May 1, 2020, 5:58 p.m. UTC
cp_finish_decl avoids setting TREE_READONLY on TREE_STATIC variables that
have non-constant construction or destruction, but -fmerge-all-constants was
converting an automatic variable to static while leaving TREE_READONLY set.

Fixed by clearing the flag in cp_finish_decl in the presence of
 -fmerge-all-constants.

Tested x86_64-pc-linux-gnu, applying to trunk.

gcc/cp/ChangeLog
2020-05-01  Jason Merrill  <jason@redhat.com>

	PR c++/91529
	* decl.c (cp_finish_decl): Also clear TREE_READONLY if
	-fmerge-all-constants.
---
 gcc/cp/decl.c                       |  5 ++++-
 gcc/testsuite/g++.dg/init/const14.C | 14 ++++++++++++++
 2 files changed, 18 insertions(+), 1 deletion(-)
 create mode 100644 gcc/testsuite/g++.dg/init/const14.C


base-commit: afb9b7108104a73e8ac7a9b8e6875870e5ca4bbb
diff mbox series

Patch

diff --git a/gcc/cp/decl.c b/gcc/cp/decl.c
index 4c0ae1cfa2e..3e7ed98fed3 100644
--- a/gcc/cp/decl.c
+++ b/gcc/cp/decl.c
@@ -7833,7 +7833,10 @@  cp_finish_decl (tree decl, tree init, bool init_const_expr_p,
 	    maybe_commonize_var (decl);
 	}
 
-      if (var_definition_p && TREE_STATIC (decl))
+      if (var_definition_p
+	  /* With -fmerge-all-constants, gimplify_init_constructor
+	     might add TREE_STATIC to the variable.  */
+	  && (TREE_STATIC (decl) || flag_merge_constants >= 2))
 	{
 	  /* If a TREE_READONLY variable needs initialization
 	     at runtime, it is no longer readonly and we need to
diff --git a/gcc/testsuite/g++.dg/init/const14.C b/gcc/testsuite/g++.dg/init/const14.C
new file mode 100644
index 00000000000..f29c7e58cfc
--- /dev/null
+++ b/gcc/testsuite/g++.dg/init/const14.C
@@ -0,0 +1,14 @@ 
+// PR c++/91529
+// { dg-do run }
+// { dg-additional-options -fmerge-all-constants }
+
+struct A
+{
+  int i[2];
+  ~A() { i[0] = 0; }
+};
+
+int main()
+{
+  const A a = { 1,2 };
+}