<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">