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.
This commit is contained in:
Iain Buclaw 2025-03-11 17:56:18 +01:00
parent b3becb17b8
commit 81582ca6cb
2 changed files with 25 additions and 1 deletions

View file

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

View file

@ -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" } }