Re: Does libstdc++-16 stabilize the C++20 ABI?
Jonathan Wakely via Gcc-help <[email protected]> Mon, 27 Apr 2026 16:27:14 +0100
| Newsgroups | gmane.comp.gcc.help |
|---|---|
| Message-ID | <CAH6eHdQe1TgBtmzAi1D8heE4ipsy7f00wkrCtjFA0MFXR1ePyA@mail.gmail.com> |
On Mon, 27 Apr 2026 at 16:21, Jonathan Wakely <[email protected]> wrote: > > On Mon, 27 Apr 2026 at 15:02, Daniel Grunwald via Gcc-help > <[email protected]> wrote: > > > > I found some contradictory information: > > > > <https://gcc.gnu.org/projects/cxx-status.html#cxx20> claims yes: > > > Some C++20 features are available since GCC 8, but support was > > > experimental and the ABI of C++20 features was not stable until > > > GCC 16. C++20 modules support is still experimental. > > > > But <https://gcc.gnu.org/gcc-16/changes.html#libstdcxx> claims the opposite: > > > As with all experimental support, programs using C++20 components > > > should assume that those components are not compatible between > > > different major releases. > > > > Can you clarify? > > C++20 is stable in GCC 16, I sent a patch to update it which has not > been pushed yetL > https://gcc.gnu.org/pipermail/gcc-patches/2026-April/713215.html I've pushed the patch now, please refresh :-) > > > > > > > > > Additionally, let me ask about a concrete scenario: > > > > 1. We build a shared library with `g++-16 -std=c++20 -fvisibility=hidden` > > 2. The public headers for our library only use C++17 features (and we > > test that C++17 code can consume our library) > > 3. This library ends up being used in an application compiled with > > g++-17 and running with libstdc++-17 (or maybe even with a version > > further in the future). > > > > In this scenario, it seems to me that the interface between our shared > > library and the application does not care about the ABI stability of > > C++20 types, since those are not involved in the interface. C++20 types > > only matter for the stability of the interface between our shared > > library and libstdc++.so.6. > > Correct. > > The objects in your library that are built with GCC 16 mean that the > application must use libstdc++.so.6.0.35 (or later) which is true > whatever -std option you use. > > Because you used -std=c++20, any objects in the entire application > that use -std=c++20 must be built with GCC 16 (or later) because e.g. > std::format in GCC 16 is not compatible with std::format in GCC 15. > > See https://stackoverflow.com/a/49119902/981959 for more info. > > > > Does this mean our library could use experimental language versions > > (e.g. C++23) right now? Or is the libstdc++.so.6 ABI stability also > > restricted to stabilized language versions? I was not able to find any > > documentation on this. In particular, I checked > > <https://gcc.gnu.org/onlinedocs/libstdc++/manual/abi.html> but that > > makes no mention of experimental language versions. > > There are no C++23 symbols in libstdc++.so, precisely so that the > question of their stability doesn't matter. Any non-inline C++23 > symbols are in the libstdc++exp.a static lib, not in libstdc++.so. > > If you use -std=c++23 for any objects in your library, you need to use > the same version of GCC to compile all of those objects. Because the > C++23 components in GCC 16 might not be compatible with the C++23 > components in GCC 15 or GCC 17.