Re: [r16-7292 Regression] FAIL: g++.dg/concepts/expression.C -std=gnu++17 (test for excess errors) on Linux/x86_64
Nathan Myers <[email protected]>
| Newsgroups | gmane.comp.gcc.regression,gmane.comp.gcc.patches |
|---|---|
| Message-ID | <[email protected]> |
On 2/6/26 3:35 AM, Jakub Jelinek wrote:
> On Fri, Feb 06, 2026 at 03:30:27AM -0500, Nathan Myers wrote:
>> Fixed in 786e316de5c25a3fddeaa2003f6efb64fb5ab4a9 2026-02-06 03:25:21
>>
>> libstdc++: fix C++17 regression in concept __heterogeneous_key
>>
>> The commit 3f7905550483408a2c4c5096a1adc8d7e863eb12 defined a
>> concept using a name not defined in C++17. This is fixed by
>> using an older name.
>>
>> https://gcc.gnu.org/pipermail/gcc-patches/2026-February/707814.html
>>
>> libstdc++-v3/ChangeLog
>> * include/bits/stl_function.h (__heterogeneous_key): Use
>> C++17-defined remove_cvref<>::type instead.
>
> Does that really work?
It doesn't. I had checked the wrong test results.
I will post a regular [PATCH] and wait for approval.
> remove_cvref is also C++20 like remove_cvref_t, only __remove_cvref_t
> is C++11 and later.
>
> #ifdef __cpp_lib_remove_cvref // C++ >= 20
> # if _GLIBCXX_USE_BUILTIN_TRAIT(__remove_cvref)
> template<typename _Tp>
> struct remove_cvref
> { using type = __remove_cvref(_Tp); };
> # else
> template<typename _Tp>
> struct remove_cvref
> { using type = typename remove_cv<_Tp>::type; };
>
> template<typename _Tp>
> struct remove_cvref<_Tp&>
> { using type = typename remove_cv<_Tp>::type; };
>
> template<typename _Tp>
> struct remove_cvref<_Tp&&>
> { using type = typename remove_cv<_Tp>::type; };
> # endif
>
> template<typename _Tp>
> using remove_cvref_t = typename remove_cvref<_Tp>::type;
> /// @}
> #endif // __cpp_lib_remove_cvref
>
> Jakub
>