]> git.ipfire.org Git - thirdparty/gcc.git/commit
c++: Fix ICE on constexpr virtual function [PR117317]
authorJakub Jelinek <jakub@redhat.com>
Fri, 8 Nov 2024 12:36:05 +0000 (13:36 +0100)
committerJakub Jelinek <jakub@gcc.gnu.org>
Fri, 8 Nov 2024 12:36:05 +0000 (13:36 +0100)
commit5ff9e21c1ec81f8288e74679547e56051e051975
tree2c4abc70506c6977066b1bacc55775be08cba646
parentec86e87439b4a5cf73da6f318757f3561f9f278a
c++: Fix ICE on constexpr virtual function [PR117317]

Since C++20 virtual methods can be constexpr, and if they are
constexpr evaluated, we choose tentative_decl_linkage for those
defer their output and decide at_eof again.
On the following testcases we ICE though, because if
expand_or_defer_fn_1 decides to use tentative_decl_linkage, it
returns true and the caller in that case cals emit_associated_thunks,
where use_thunk which it calls asserts DECL_INTERFACE_KNOWN on the
thunk destination, which isn't the case for tentative_decl_linkage.

The following patch fixes the ICE by not emitting the thunks
for the DECL_DEFER_OUTPUT fns just yet but waiting until at_eof
time when we return to those.
Note, the second testcase ICEs already since r0-110035 with -std=c++0x
before it gets a chance to diagnose constexpr virtual method.

2024-11-08  Jakub Jelinek  <jakub@redhat.com>

PR c++/117317
* semantics.cc (emit_associated_thunks): Do nothing for
!DECL_INTERFACE_KNOWN && DECL_DEFER_OUTPUT fns.

* g++.dg/cpp2a/pr117317-1.C: New test.
* g++.dg/cpp2a/pr117317-2.C: New test.
gcc/cp/semantics.cc
gcc/testsuite/g++.dg/cpp2a/pr117317-1.C [new file with mode: 0644]
gcc/testsuite/g++.dg/cpp2a/pr117317-2.C [new file with mode: 0644]