Hi,
An optimization was added in GDC-12 which sets the TREE_READONLY flag on
all local variables with the storage class `const' assigned. For some
reason, const is also being added by the front-end to `__result'
variables in non-virtual functions, which ends up getting wrong code by
the gimplify pass promoting the local to static storage.
A bug has been raised upstream, as this looks like an error in the AST.
For now, turn off setting TREE_READONLY on all result variables.
Bootstrapped and regression tested on x86_64-linux-gnu/-m32, committed
to mainline.
Will backport the patch to gcc-12 once it has also been tested against
each release.
Regards,
Iain.
---
PR d/119139
gcc/d/ChangeLog:
* decl.cc (get_symbol_decl): Don't set TREE_READONLY for __result
declarations.
gcc/testsuite/ChangeLog:
* gdc.dg/pr119139.d: New test.
---
gcc/d/decl.cc | 2 +-
gcc/testsuite/gdc.dg/pr119139.d | 24 ++++++++++++++++++++++++
2 files changed, 25 insertions(+), 1 deletion(-)
create mode 100644 gcc/testsuite/gdc.dg/pr119139.d
diff --git a/gcc/d/decl.cc b/gcc/d/decl.cc
index 88dc5251bda..1bad1866763 100644
--- a/gcc/d/decl.cc
+++ b/gcc/d/decl.cc
@@ -1323,7 +1323,7 @@ get_symbol_decl (Declaration *decl)
/* `const` applies to data that cannot be changed by the const reference
to that data. It may, however, be changed by another reference to that
same data. */
- if (vd->isConst () && !vd->isDataseg ())
+ if (vd->isConst () && !vd->isResult () && !vd->isDataseg ())
TREE_READONLY (decl->csym) = 1;
}
diff --git a/gcc/testsuite/gdc.dg/pr119139.d b/gcc/testsuite/gdc.dg/pr119139.d
new file mode 100644
index 00000000000..dc42c411e39
--- /dev/null
+++ b/gcc/testsuite/gdc.dg/pr119139.d
@@ -0,0 +1,24 @@
+// https://gcc.gnu.org/bugzilla/show_bug.cgi?id=119139
+// { dg-do compile }
+// { dg-options "-fdump-tree-gimple" }
+string toString()
+{
+ return "1";
+}
+
+struct B
+{
+ ulong n;
+
+ invariant{}
+
+ string str()
+ {
+ if (n == 0)
+ {
+ return "0";
+ }
+ return toString();
+ }
+}
+// { dg-final { scan-tree-dump-not "static const struct __result =" "gimple"
} }
--
2.43.0