<table border="1" cellspacing="0" cellpadding="8">
<tr>
<th>Issue</th>
<td>
<a href=https://github.com/llvm/llvm-project/issues/98526>98526</a>
</td>
</tr>
<tr>
<th>Summary</th>
<td>
Clang 19 regression: "error: function 'operator()' with deduced return type cannot be used before it is defined"
</td>
</tr>
<tr>
<th>Labels</th>
<td>
clang:frontend,
regression,
rejects-valid
</td>
</tr>
<tr>
<th>Assignees</th>
<td>
</td>
</tr>
<tr>
<th>Reporter</th>
<td>
porglezomp
</td>
</tr>
</table>
<pre>
The following code, based on Barry Revzin's recursive lambda recommendations and reduced from some actual software, compiles with Clang 18.1 but fails with Clang 19.
- ❌ Clang (trunk): https://godbolt.org/z/79hKhaKx3 (Using `14f745074d05fb42f5c8a625c79bf557bb980ebb`)
- ✅ Clang 18.1: https://godbolt.org/z/cvEWEsEd8
```cpp
#include <utility>
template <typename F> struct recursive_lambda {
template <typename... Args> auto operator()(Args&&... args) const { return fn(*this, std::forward<Args>(args)...); }
F fn;
};
template <typename F> recursive_lambda(F) -> recursive_lambda<F>;
struct Tree { Tree *left, *right; };
int sumSize(Tree *tree) {
auto accumulate = recursive_lambda {
[&](auto& self_fn, Tree *element_node) -> int {
if (!tree) return 0;
return 1 + self_fn(tree->left) + self_fn(tree->right);
}
};
return accumulate(tree);
}
```
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJyMVU1z4zYM_TXwBRONBFkWddDB8cdlb-12esxQImSzpUgPSTlNfn2HspI46XZ2PR5bJoGH9x4GsAxBnyxzC9UjVPuVnOLZ-fbi_Mnwqxsvq86pl_b7mXFwxrhnbU_YO8VAO-xkYIXO4qP0_gV_4-urtkB1QM_95IO-Mho5dkqmAzeObJWM2tmA0ir0rKaeFQ7ejRjcyCj7OEmDwQ3xWfq5Ru_GizYc8FnHM-6MtCcsRFZgN0UcpDafb5oM8j3k29vnA8KBoNmD2C0BQCL6yf4N1EC5xXOMlwDlFugIdDw51TkTM-dPQMdXoGPdnL-d5bd_ypT4R0jiYZMX66FeV3m9Vnk1dGsaql7IDVV93XRDVdVd14icuw42eapzT2UHorpT8Ssc-uvhz0M4KHGvLEHP7_5yWU6o1LY3k2KEcjdFbXR8gfJwnxV5vBgZ54j4cmErR8YjlAcM0U99_Ojb09I3qB9vqYiIP0rPsgy3_hQSiJyiQ3dhL6PzQCKJJzHf0gZok2Ll_KvB3tkQEzx6jpO3ONg5YxvPOqTGh6iSKeV2cP5ZegXlbqkDJBaULMvmRj4i1PsPnscEVi7E0837809c-CofSBwT2YcfXpa7lPQFfDHyu2ee1d0eaGt4iEkW0Nbr0zm-kf6crW3EMI2_61cGEm-50TMnGp-aMZst-34ap0XM_iftS6805rSBap9MnKID2mBgMzwl-3fvbNnwyDY-2XnSFwMSuXdAyJuEpwec21a8cVy6md8JmwOX8wKBHj8qipSWwG_2NP9ze3Ns7vQXOfdt_6-dd4U_nFpw7-HeYd7H6h5lpdpSNWUjV9wWNeU1bXISq3M7DL3gvFl3zVqVTAV3dVlKUchhKBqpeKVbymmd10VRNFTnImuqctMJsa6UkM26FrDOeZTaZMZcxzTzKx3CxG0jKtqsjOzYhHk1E_VpaaRx8M5GtgqIgHZA5PnkOQTt7N3RX9zH8HCVRs-B1X7l21TjoZtOAda50SGGj6pRR8Pt2w7FO8hyi0DE3jufnofJ9mmDI1D9ddLr2yZWy1pfjE8Thr201kXsGKf0l9Hx4DyjjqgDKh605URzNXnTflmHOp6nLuvdCHRMdJevh4t3SSPQcXYsAB1vpl1b-jcAAP__WKEJZw">