]> git.ipfire.org Git - thirdparty/gcc.git/commit
calls: Allow musttail calls to noreturn [PR121159]
authorJakub Jelinek <jakub@redhat.com>
Tue, 29 Jul 2025 07:49:55 +0000 (09:49 +0200)
committerJakub Jelinek <jakub@gcc.gnu.org>
Tue, 29 Jul 2025 07:49:55 +0000 (09:49 +0200)
commitf4abe216199930adfa110059c3c8e642c585388b
tree8826c77c0d9380e6a8710ebb197f73be08f6135b
parentea588988c193ee19b61bba5b99e039c9ca267abe
calls: Allow musttail calls to noreturn [PR121159]

In the PR119483 r15-9003 change we've allowed musttail calls to noreturn
functions, after all the decision not to normally tail call noreturn
functions is not because it is not possible to tail call those, but because
it screws up backtraces.  As the following testcase shows, we've done that
only for functions not declared [[noreturn]]/_Noreturn but later on
discovered through IPA as noreturn.  Functions explicitly declared
[[noreturn]] have (for historical reasons) volatile FUNCTION_TYPE and
the FUNCTION_DECLs are volatile as well, so in order to support those
we shouldn't complain on ECF_NORETURN (we've stopped doing so for musttail
in PR119483) but also shouldn't complain about TYPE_VOLATILE on their
FUNCTION_TYPE (something that IPA doesn't change, I think it only sets
TREE_THIS_VOLATILE on the FUNCTION_DECL).  volatile on function type
really means noreturn as well, it has no other meaning.

2025-07-29  Jakub Jelinek  <jakub@redhat.com>

PR middle-end/121159
* calls.cc (can_implement_as_sibling_call_p): Don't reject declared
noreturn functions in musttail calls.

* c-c++-common/pr121159.c: New test.
* gcc.dg/plugin/must-tail-call-2.c (test_5): Don't expect an error.
gcc/calls.cc
gcc/testsuite/c-c++-common/pr121159.c [new file with mode: 0644]
gcc/testsuite/gcc.dg/plugin/must-tail-call-2.c