https://gcc.gnu.org/bugzilla/show_bug.cgi?id=101227
David Blaikie <dblaikie at gmail dot com> changed: What |Removed |Added ---------------------------------------------------------------------------- CC| |dblaikie at gmail dot com --- Comment #2 from David Blaikie <dblaikie at gmail dot com> --- My guess, libstdc++'s std::optional uses is_default_constructible unconditionally in some way, instantiating the template while the type parameter is incomplete (because the nested class is incomplete until the enclosing class is complete?). Essentially something like this: https://godbolt.org/z/6eohMofdb