Hi
The few tests that are failing in versioned namespace mode are due to
those friend declarations.
This is a fix proposal even if I considered 2 other options:
1. Make __format::_Arg_store a struct and so do not bother with friend
declarations.
2. Consider it as a compiler bug and do nothing. In this case I think we
might still need this patch to avoid a non-working format library in
versioned namespace mode in gcc 14 if compiler bug is not fixed.
I can also define _GLIBCXX_STD_V at <format> level to limit impact.
libstdc++: [_GLIBCXX_INLINE_VERSION] Fix <format> friend declarations
GCC do not consider the inline namespace in friend declarations. We
need
to explicit this namespace.
libstdc++-v3/ChangeLog:
* include/bits/c++config (_GLIBCXX_STD_V): New macro giving
current
std namespace with optionally the version namespace.
* include/std/format (std::__format::_Arg_store): Use
latter on friend
declarations.
Tested under versioned mode.
Ok to commit ?
François
diff --git a/libstdc++-v3/include/bits/c++config b/libstdc++-v3/include/bits/c++config
index 0a41cdd29a9..a917fb58225 100644
--- a/libstdc++-v3/include/bits/c++config
+++ b/libstdc++-v3/include/bits/c++config
@@ -449,6 +449,7 @@ _GLIBCXX_END_NAMESPACE_VERSION
// of some nested namespace within it corresponding to the active mode.
// _GLIBCXX_STD_A
// _GLIBCXX_STD_C
+// _GLIBCXX_STD_V
//
// Macros for opening/closing conditional namespaces.
// _GLIBCXX_BEGIN_NAMESPACE_ALGO
@@ -477,6 +478,12 @@ _GLIBCXX_END_NAMESPACE_VERSION
# define _GLIBCXX_END_NAMESPACE_ALGO
#endif
+#if _GLIBCXX_INLINE_VERSION
+# define _GLIBCXX_STD_V std::__8
+#else
+# define _GLIBCXX_STD_V std
+#endif
+
// GLIBCXX_ABI Deprecated
// Define if compatibility should be provided for -mlong-double-64.
#undef _GLIBCXX_LONG_DOUBLE_COMPAT
diff --git a/libstdc++-v3/include/std/format b/libstdc++-v3/include/std/format
index f3d9ae152f9..94417c321e4 100644
--- a/libstdc++-v3/include/std/format
+++ b/libstdc++-v3/include/std/format
@@ -3429,11 +3429,11 @@ namespace __format
template<typename _Context, typename... _Args>
class __format::_Arg_store
{
- friend std::basic_format_args<_Context>;
+ friend _GLIBCXX_STD_V::basic_format_args<_Context>;
template<typename _Ctx, typename... _Argz>
friend auto
- std::make_format_args(_Argz&&...) noexcept;
+ _GLIBCXX_STD_V::make_format_args(_Argz&&...) noexcept;
// For a sufficiently small number of arguments we only store values.
// basic_format_args can get the types from the _Args pack.