<table border="1" cellspacing="0" cellpadding="8">
<tr>
<th>Issue</th>
<td>
<a href=https://github.com/llvm/llvm-project/issues/99877>99877</a>
</td>
</tr>
<tr>
<th>Summary</th>
<td>
Crash when evaluating folds involving lambdas and variadic templates
</td>
</tr>
<tr>
<th>Labels</th>
<td>
clang:frontend
</td>
</tr>
<tr>
<th>Assignees</th>
<td>
ilya-biryukov
</td>
</tr>
<tr>
<th>Reporter</th>
<td>
ilya-biryukov
</td>
</tr>
</table>
<pre>
On this code:
```cpp
struct tuple {
int x[3];
};
template <class F>
void apply(F f, tuple v) {
return f(v.x[0], v.x[1], v.x[2]);
}
void Cartesian(auto x, auto y) {
apply([&](auto... xs) {
(apply([xs](auto... ys) {
(ys + ...);
}, y), ...);
}, x);
}
int main() {
auto x = tuple({1, 2, 3});
auto y = tuple({4, 5, 6});
Cartesian(x, y);
}
```
Clang will crash with a following assertion error:
```
clang++: /root/llvm-project/clang/lib/Sema/TreeTransform.h:15248: clang::ExprResult clang::TreeTransform<Derived>::TransformCXXFoldExpr(clang::CXXFoldExpr*) [with Derived = {anonymous}::TemplateInstantiator; clang::ExprResult = clang::ActionResult<clang::Expr*>]: Assertion `!Unexpanded.empty() && "Pack expansion without parameter packs?"' failed.
```
The problem arises because when substituting into inner lambdas, Clang will incorrectly loose the `ContainsUnexpandedPack` dependency on a lambda expression. In turn, this confuses the `CXXFoldExpr` that relies in this flag to distinguish left and right folds, which will pass the `nullptr` expr to `CollectUnexpandedParameterPacks` and cause it to not find any packs when transforming the fold expression, leading to an asssertion.
I have already been working on a fix for a few days and more sophisticated tests, so assigning to myself right away.
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJx8Vd2u2jgQfhpzM2oUHCBwwQVwitSrrXa7Um8HeyDeY-zIdoC8_Wqc0Iae3R6hnDjz-33zY4zRXBzRViz3Qkpje_x0MqHv3v1NSCmWbzPsUuPD9kU0O3ndb_9wkBoTQXlNotqJ8k2UO7Eqh59q2-FLTKFTCVLXWgJR74evAADGJXiI5b4SyzdRjQJRT97zM9G1tZgIRHVQFmOEo6g-D7KbNxqwbW0v5PoIZyEPY6SbkJvXcIFSFxzrrG8Fxy05rjzAcJq_nGQ-bV7SmuSU4x4wJIoGnZBr7JKHB9vnt_41-jPDTPMqu84WRVHAI37IlP9Y46fVI74a9b8YCbnuIwi5h6Iopnn_cFdncJwX__8PrVHj8RvUXLArGsb7IeeBABDV21AA1qn3c3Yp-VFl_68hB6p-tVmw-pIfq19tpow_fuD5mO2zCafJHyy6C9yNtaACxgbuJjWAcPbW-rtxF8AYKSTjHVAIPnzs6eGo2JGQe_5VTP0xeJ-EPFp7u35qg_-HFB9HvaM1JyGPf9EVhTx-C0TfArp49uFaNKLazZdysWZHg361E9Xu86MNf1LsbJp-fbEV1eGNgrmR5mEY5aPs8P370VvNXoRcTzy8CHa5hst95mH0lWsh6j067_qr72Iex-x8nMIvLiZ0yWBihvb_kzW7mUh2imkdZMMUT204lepzXgI72P0oAhMu5387erToNOmCrm3qn70nV0KuQEj5FdU7ZJ3IVozGdwlaDHilRAFaVO9RVEdeaLKGMxpLuvhNp3xrCNrgT5augMFEinAihV0kuDfkIHanmEzqEjeNccmDcY4CWLyeNEbuy0mzGad8CKSS7cF6HwlSQwzu4F1C4-JPhAxFrErQ1JLT5FQP3gGOjhlkoMgoC_jigLdZ3nfDEnbnjjN9Op9UelVCajBBIGsoghn39tniBZIHbSIj6UxswNI5AToNwVyaxLOhM557Y1Qz4Gl5A49RXGdtm3IETo69ZWDWkkpTXGMtvuZSrMocYmDUJLZyPsHZOA3o-qFgA9Xp2dJMNQfljCZEcG6WUGexB3Q8xGMDFdOafoEGbwRoA6Hu4UTk4O7DOxtmjs_mAWcf-I3uoLGPOcmrDwTRtw2TpDCRhkQxZVKih-ECHaNf-0j2PFKHd-yLmd5WelNtcEbbeS3nq2U9X21mzVZvpNKqRKVW1XI-r7UitV6sy5Ncn2tdL2ZmK0u5KGsp54tyVS4KXcu1qubrxanSVKESi5KuaGzBW6fw4TIzMXa03WzWdT2zeCIbx2v9OW7n4F0ip8ebPWzzwjp1lygWpTUxxZ_OkkmWtodhUXIl6Ia2w9zyuSvAuJu3Nz6PfZ_5umEwqI2C560dZ12w2yalNvLEy6OQx4tJTXcqlL-OW_Pj8sxgopDHAc9tK_8NAAD__wg6q7c">