[prev in list] [next in list] [prev in thread] [next in thread]
List: llvm-bugs
Subject: [llvm-bugs] [Bug 61866] Regression libc++: Usage of std::ref compiles in C++17 but not C++20
From: LLVM Bugs via llvm-bugs <llvm-bugs () lists ! llvm ! org>
Date: 2023-03-31 11:08:19
Message-ID: 20230331110819.7c896bd78a777746 () email ! llvm ! org
[Download RAW message or body]
[Attachment #2 (text/html)]
<table border="1" cellspacing="0" cellpadding="8">
<tr>
<th>Issue</th>
<td>
<a href=https://github.com/llvm/llvm-project/issues/61866>61866</a>
</td>
</tr>
<tr>
<th>Summary</th>
<td>
Regression libc++: Usage of std::ref compiles in C++17 but not C++20
</td>
</tr>
<tr>
<th>Labels</th>
<td>
new issue
</td>
</tr>
<tr>
<th>Assignees</th>
<td>
</td>
</tr>
<tr>
<th>Reporter</th>
<td>
PixelRick
</td>
</tr>
</table>
<pre>
Tested with Clang 16.0.0.
Minimal example:
```cpp
//#undef __cplusplus
//#define __cplusplus 201703 // compiles when forcing libc++ as if compiling under \
C++17 #include <functional>
#include <iostream>
#include <type_traits>
template<class Fun>
class y_combinator_result {
Fun fun_;
public:
template<class T>
explicit y_combinator_result(T &&fun): fun_(std::forward<T>(fun)) \
{}
template<class ...Args>
decltype(auto) operator()(Args &&...args) {
return fun_(std::ref(*this), std::forward<Args>(args)...);
}
};
template<class Fun>
decltype(auto) y_combinator(Fun &&fun) {
return y_combinator_result<std::decay_t<Fun>>(std::forward<Fun>(fun));
}
int main()
{
using Type = int; // Using an other integer type such as "unsigned int" \
makes the code compile
auto almost_factorial = [](auto factorial, Type n) -> Type {
if (n == 0) {
return static_cast<Type>(1);
} else {
return static_cast<Type>(n * factorial(n-1));
}
};
auto factorial = y_combinator(std::ref(almost_factorial)); // Not using std::ref \
makes the code compile
//std::cout << factorial(5u) << std::endl; // Uncommenting this line \
makes the code compile std::cout << factorial(5) << std::endl; // Does \
not compile without previous line
return 0;
}
```
Compilation output on \
[cpp.sh](https://cpp.sh/?source=%23include+%3Ciostream%3E%0A%23include+%3Ctype_traits% \
3E%0Ausing+namespace+std%3B%0A%0Aint+main()+%0A%7B%0A++++std%3A%3Acout+%3C%3C+083+%3C%3C+std%3A%3Aendl%3B%0A++++%0A++++return+0%3B%0A%7D):
```
main.cpp:33:42: error: no matching function for call to object of type \
'std::reference_wrapper<y_combinator_result<std::reference_wrapper<(lambda \
at main.cpp:29:29)>>>' return static_cast<Type>(n * \
factorial(n-1)); ^~~~~~~~~
/root/emsdk/upstream/emscripten/cache/sysroot/include/c++/v1/type_traits:3640:23: \
note: in instantiation of function template specialization 'main()::(anonymous \
class)::operator()<std::reference_wrapper<y_combinator_result<std::reference_wrapper<(lambda \
at main.cpp:29:29)>>>>' requested here { return \
static_cast<_Fp&&>(__f)(static_cast<_Args&&>(__args)...); \
} ^
/root/emsdk/upstream/emscripten/cache/sysroot/include/c++/v1/__functional/reference_wrapper.h:60:23: \
note: in instantiation of function template specialization \
'std::__invoke<(lambda at main.cpp:29:29) &, \
std::reference_wrapper<y_combinator_result<std::reference_wrapper<(lambda at \
main.cpp:29:29)>>>, int>' requested here
return _VSTD::__invoke(get(), _VSTD::forward<_ArgTypes>(__args)...);
^
main.cpp:16:16: note: in instantiation of function template specialization \
'std::reference_wrapper<(lambda at \
main.cpp:29:29)>::operator()<std::reference_wrapper<y_combinator_result<std::reference_wrapper<(lambda \
at main.cpp:29:29)>>>, int>' requested here return \
fun_(std::ref(*this), std::forward<Args>(args)...); ^
main.cpp:39:27: note: in instantiation of function template specialization \
'y_combinator_result<std::reference_wrapper<(lambda at \
main.cpp:29:29)>>::operator()<int>' requested here std::cout \
<< factorial(5) << std::endl; // Does not compile without previous line \
^
/root/emsdk/upstream/emscripten/cache/sysroot/include/c++/v1/__functional/reference_wrapper.h:59:5: \
note: candidate template ignored: substitution failure [with _ArgTypes = \
<int>]: no type named 'type' in \
'std::__invoke_of<y_combinator_result<std::reference_wrapper<(lambda at \
main.cpp:29:29)>> &, int>' operator() (_ArgTypes&&... \
__args) const { ^
1 error generated.
```
maybe related to #43743
</pre>
<img width="1px" height="1px" alt="" \
src="http://email.email.llvm.org/o/eJzMWEuT4roV_jVioxqXkcB2L1jwaHZJpW76ZusS8gGUsSVHkru \
HLPLbU0eyjaGZ23Mr0zWhGA8tHZ3Xd16ycE6dNMCKLDdkuZuJzp-NXf1NfYP6NyW_zg6muqxewHmo6JvyZ7qth \
T7ReZakSZqQdEfSdXz-RWnViJrCN9G0NRC-nu6SLI1f2bb9CtuHL-90BUdalrKtO4f_7vYrOCoNUwLK0nmechp \
JqDRNq2pw9O0Mmh6NlUqfaK0OkrANYRsqHFXHngy3UKKl27g7zwd5XGlZdxVQwrfHTkuvjBY14c-PCJRx3oJov \
rPtLy2U3grl3ZUiPD00bS08EL6VtXCO7js9ksSVSylNc1BaeGNLC66rPSX5JpIgPT12uiS8X2m7Q63k6HBKKX0 \
n5GUUgdvwra2VVP6RJMKKF0pYRlh27DRhT4SvozxWOF-hGL4-GvsmbEX4NjBmRU_KnoKi-W5q8XttkiRZ25O70 \
akCWaPXCCtE5w2yMi1Y1IywIjAv8FCvW5IkAln0Ekc2-LHgO6vfKW3hGDit_Vm5wHBLH1g0aMaKXkCSJMENg5S \
refluXP0BcB9YOPU_YQVCO3X9rWm9WY8w49vRkAqkuJS41MsOpjyws9-eYHc15hZApT1thNIRBzrQTFTrHObVy \
6XF4N9RpT3hmyE_fw-bQlPjz2BxE05gKbqCuk6eMT8JY50OtagKpxmjjfgKjvozUGkqGLL8KvP6C71JRd0Y58u \
jkN5YJeqgSCxrvcPpuIfIB2WDk78Q_tzrfh9J6kgJKzTyQnbpLSY9IM4Lr2QphUOvI6Po13l0Kb1lSfIdhdo9E \
DbB-HssMTzWUzsK_WV-B95E0MRZk1AdXXbrq7tYvEube_eOQgeU_2p8HwbTk38CxchnPCxN57GSEr69MXjZBRD \
ixkgNuqqnIaelaRrQHvXBdKc19pCPlPlY-A_I3hlwVBs_sA99E_m1Fl6V6aIuQy25z-70QRIOvXOak9vAXGCPo \
qbzbeep0Rjvsm0Td45Rf_a-dahk0KzfYXvC9850VgKGNVuOjSs0xOWkt7ElRt0Sm9t7qmmLGwlDBBC20aIB1wq \
J1OgotuSbgVMoKIRtriUlsgyb-fBrM3778-vwQGQGDfrHJi34_dLNmQDQRIPN5Hu3EFFAnjcq57vYCB-ONPFPt \
CbB6YavOSd8vWDYOMFaY_GHNrQRXp4xIIfhAmcVKkVdU2-oOfwTpKfmGAsjYfk0j8CCllC-WdG2YAnfftAFHh0 \
hrKhFc6gEFbGe9-oGy_p0fh46Rv45tYksn__Tf8YxzxrjCdtD46qvhO27dog-XJJWtR40hq-QZ8AKcXH9iTEg9 \
3IAcP86J2x_M32tebZI0UIeccDuvKZKU6WdF9qrPomOV1yGNk5dC1KJWv070hCWT4I2OBpLozb60mBih54_bt2 \
NLx-g88mABkyphX91cZg_g51W4XzzGN5y38aBJGJclsc4id1RhZnphu5-dpq0I7J8_kTsy3Iyu7P9O78lZ8LX2 \
c8LiBGhslT61XyFHwImjnlb-ktzfBsHtT-MjEnil__4-8vuzlZWnMAPRXw7JbkOmhgdWCbc92LjPi4mes-z4fH \
zgPof_PZ_l9Z_FsNPuxM9wI4HffOfgd2nevEhqB979RcMi7--cC7Re8sppFLoSlUI24ifOmljAQ2mrjs4r3wXx \
x2h6s4CTqnhXdJYGOJdbXT6ctdPTGESwlGywiCId-ccg-hR3S3N8XPzbajZY2hcY-E2fPDOeC16w-sKOhY-Ko1 \
2_vYCOGI7jzMjPYFGnlAlf3ALaMTlANQCur3CKZIwvuD5gs-qFa-e-JOYwWqeFSnL0uLpaXZeLbMFlwVPD1V6P \
GQLvsjyqsoYy4sq5VIsZ2rFUsZTzufzeVrMn5JcFk_ZocoLked5vsjIIoVGqDqp69cmMfY0U851sMrmRZbNanG \
A2oX3iYxpeKNhkzBGlruZXeGZL4fu5MgirZXz7srFK1_D6jc4WXAOw-X6Bg_D4XcnToD14uZ6Ob77U_r6Qo8eOh-Sql9h6ayz9er2NnRS_twdEmkwZ1CJ_r8vrTU4iWOqoOqOsH0w7b8BAAD__yvgW44">
[Attachment #3 (text/plain)]
_______________________________________________
llvm-bugs mailing list
llvm-bugs@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-bugs
[prev in list] [next in list] [prev in thread] [next in thread]
Configure |
About |
News |
Add a list |
Sponsored by KoreLogic