diff options
author | Iain Buclaw <ibuclaw@gdcproject.org> | 2025-03-11 17:56:18 +0100 |
---|---|---|
committer | Iain Buclaw <ibuclaw@gdcproject.org> | 2025-03-11 18:19:51 +0100 |
commit | 81582ca6cb692098c1bda7995aec46c6cbfbfcb3 (patch) | |
tree | 7e6eaec54409b5071e2e7db7dce5849cd8080838 /gcc | |
parent | b3becb17b82cb3ffdb19b0301031b22a486501b0 (diff) | |
download | gcc-81582ca6cb692098c1bda7995aec46c6cbfbfcb3.zip gcc-81582ca6cb692098c1bda7995aec46c6cbfbfcb3.tar.gz gcc-81582ca6cb692098c1bda7995aec46c6cbfbfcb3.tar.bz2 |
d: Fix regression returning from function with invariants [PR119139]
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.
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.
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/d/decl.cc | 2 | ||||
-rw-r--r-- | gcc/testsuite/gdc.dg/pr119139.d | 24 |
2 files changed, 25 insertions, 1 deletions
diff --git a/gcc/d/decl.cc b/gcc/d/decl.cc index 88dc525..1bad186 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 0000000..dc42c41 --- /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" } } |