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:
parent
b3becb17b8
commit
81582ca6cb
2 changed files with 25 additions and 1 deletions
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
24
gcc/testsuite/gdc.dg/pr119139.d
Normal file
24
gcc/testsuite/gdc.dg/pr119139.d
Normal 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" } }
|
Loading…
Add table
Reference in a new issue