https://gcc.gnu.org/bugzilla/show_bug.cgi?id=120504
Bug ID: 120504
Summary: [16 Regression] gcc-16 fails to build llvm-20 and
gdb-16.3 unique_ptr.h:91:23: error: invalid
application of 'sizeof' to incomplete type ... since
r16-944-g0629924777ea20
Product: gcc
Version: 16.0
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: c++
Assignee: unassigned at gcc dot gnu.org
Reporter: slyfox at gcc dot gnu.org
Target Milestone: ---
Initially bisected against gdb-16.3 down to r16-944-g0629924777ea20 "c++: add
__is_*destructible builtins [PR107600]"
I'll steal Jonathan's https://gcc.gnu.org/PR107600#c6 example as is. Filing a
bug to make sure it does not get lost.
// $ cat a.cc
struct X;
template<class T>
struct default_delete
{
void operator()(T*) { static_assert(sizeof(T), "type is not incomplete"); }
};
template<class T, class D = default_delete<T>>
struct unique_ptr
{
~unique_ptr() { del(ptr); }
T* ptr;
D del;
};
constexpr bool b = __has_trivial_destructor(unique_ptr<X>);
$ g++-15 -c a.cc
# ok
$ g++-16 -c a.cc
a.cc: In instantiation of 'void default_delete<T>::operator()(T*) [with T =
X]':
a.cc:12:22: required from 'unique_ptr<T, D>::~unique_ptr() [with T = X; D =
default_delete<X>]'
12 | ~unique_ptr() { del(ptr); }
| ~~~^~~~~
a.cc:19:58: required from here
19 | constexpr bool b = __has_trivial_destructor(unique_ptr<X>);
| ^
a.cc:6:39: error: invalid application of 'sizeof' to incomplete type 'X'
6 | void operator()(T*) { static_assert(sizeof(T), "type is not
incomplete"); }
| ^~~~~~~~~