On Fri, Dec 19, 2025 at 12:45 PM Jonathan Wakely <[email protected]> wrote:
> On Fri, 19 Dec 2025 at 11:09, Tomasz Kaminski <[email protected]> wrote: > > > > > > > > On Fri, Dec 19, 2025 at 11:57 AM Jonathan Wakely <[email protected]> > wrote: > >> > >> Adjust the return type to be consistent with how it's declared in > >> <mutex>. > >> > >> libstdc++-v3/ChangeLog: > >> > >> * src/c++11/mutex.cc [_GLIBCXX_NO_EXTERN_THREAD_LOCAL] > >> (__get_once_call): Use std::add_lvalue_reference. > >> --- > >> > >> Pushed to trunk. > >> > >> libstdc++-v3/src/c++11/mutex.cc | 2 +- > >> 1 file changed, 1 insertion(+), 1 deletion(-) > >> > >> diff --git a/libstdc++-v3/src/c++11/mutex.cc > b/libstdc++-v3/src/c++11/mutex.cc > >> index 82f0afa4cb4e..91968ab47bd5 100644 > >> --- a/libstdc++-v3/src/c++11/mutex.cc > >> +++ b/libstdc++-v3/src/c++11/mutex.cc > >> @@ -42,7 +42,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION > >> __get_once_callable() noexcept > >> { return __once_callable; } > >> > >> - __typeof__(void (*)())& > >> + std::add_lvalue_reference<void (*)()>::type > > > > Why not simply void(*&)()? > > Because that's not valid C++ syntax :-) > Ah yes, this is in function return. > > See https://gcc.gnu.org/pipermail/gcc-patches/2025-December/703147.html > whre I discussed this. > > To return a pointer to a function you need to write: > > void (*func())(); > > And to return a reference to a pointer to a function it would be: > > void (*&func())(); > > Add in the noexcept and we get: > > void (*&__call_once() noexcept)(); > > This is horrific. To make it not horrific you either need a typedef > for the return type: > > using R = void(*&)(); > R __call_once() noexcept; > > Or to turn the entire type into a single declarator, which is what the > original __typeof__ trick does, but it can also be done by using a > template: > > std::type_identity_t<void(*&)()> > __call_once() noexcept; > > Or what I pushed. > > > >> > >> __get_once_call() noexcept > >> { return __once_call; } > >> > >> -- > >> 2.52.0 > >> > >
