[committed] libstdc++: Use std::add_lvalue_reference in src/c++11/mutex.cc
Jonathan Wakely
jwakely@redhat.com
Fri Dec 19 11:45:34 GMT 2025
On Fri, 19 Dec 2025 at 11:09, Tomasz Kaminski <tkaminsk@redhat.com> wrote:
>
>
>
> On Fri, Dec 19, 2025 at 11:57 AM Jonathan Wakely <jwakely@redhat.com> 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 :-)
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
>>
More information about the Libstdc++
mailing list