d: Fix -fpreview=in ICEs with forward referenced parameter [PR112285]
commita84b98c62d90bf9e8b01038f624a62725e6a44db
authorIain Buclaw <ibuclaw@gdcproject.org>
Sun, 10 Mar 2024 16:49:06 +0000 (10 17:49 +0100)
committerIain Buclaw <ibuclaw@gdcproject.org>
Sun, 10 Mar 2024 18:06:11 +0000 (10 19:06 +0100)
treeb67edf44624f2abe1af29df34ddec6b0fd441bce
parent8fe27ed193d60f6cd8b34761858a720c95eabbdb
d: Fix -fpreview=in ICEs with forward referenced parameter [PR112285]

The way that the target hook preferPassByRef is implemented, it relied
on the GCC "back-end" tree type to determine whether or not to use `ref'
ABI for D `in' parameters; e.g: prefer by value if it is expected that
the target will pass the type around in registers.

Building the GCC tree type depends on the AST type being complete - all
semantic processing is finished - but as this hook is called from the
front-end, this will not be the case for forward referenced or
self-referencing types.

The consensus in upstream is that `in' parameters should always be
implicitly `ref', but as the front-end does not yet support all types
being rvalue references, limit this just static arrays and structs.

PR d/112285
PR d/112290

gcc/d/ChangeLog:

* d-target.cc (Target::preferPassByRef): Return true for all static
array and struct types.

gcc/testsuite/ChangeLog:

* gdc.dg/pr112285.d: New test.
* gdc.dg/pr112290.d: New test.
gcc/d/d-target.cc
gcc/testsuite/gdc.dg/pr112285.d [new file with mode: 0644]
gcc/testsuite/gdc.dg/pr112290.d [new file with mode: 0644]