https://gcc.gnu.org/bugzilla/show_bug.cgi?id=104653
Bug ID: 104653 Summary: Derived class looks for a definition of its inherited constexpr virtual destructor Product: gcc Version: 12.0 Status: UNCONFIRMED Severity: normal Priority: P3 Component: c++ Assignee: unassigned at gcc dot gnu.org Reporter: lichray at gmail dot com Target Milestone: --- The following -std=c++20 code fails to compile: #include <cstddef> struct B { virtual ~B() = default; }; struct D : B {}; struct C : B {}; bool foo(std::byte *p) { constexpr D obj; return __builtin_memcmp(p, &obj, sizeof(void *)) == 0; } <source>: In function 'bool foo(std::byte*)': <source>:12:17: error: 'virtual constexpr D::~D()' used before its definition 12 | constexpr D obj; | ^~~ The code compiles in MSVC 19.29 and Clang 10. GCC seems to understand that D inherited a defaulted, constexpr virtual destructor, but reports that it needs a definition. The problem doesn't arise if D is dependent. A workaround is the following: struct D : B { virtual constexpr ~D() override; }; constexpr D::~D() = default;