<table border="1" cellspacing="0" cellpadding="8">
    <tr>
        <th>Issue</th>
        <td>
            <a href=https://github.com/llvm/llvm-project/issues/59216>59216</a>
        </td>
    </tr>

    <tr>
        <th>Summary</th>
        <td>
            ICE in explicit return type from lambda inside recursive function template
        </td>
    </tr>

    <tr>
      <th>Labels</th>
      <td>
      </td>
    </tr>

    <tr>
      <th>Assignees</th>
      <td>
      </td>
    </tr>

    <tr>
      <th>Reporter</th>
      <td>
          rollbear
      </td>
    </tr>
</table>

<pre>
    This code, reduced from test in https://github.com/rollbear/lift, causes an ICE in all versions of clang++ from 7.0 to 15.0 and trunk at 437ccf5af9c2aec915a68a164a95d506fbac2324. Clang 6 compiles it.

```C++
#include <functional>

namespace d {
template <typename g, typename c, typename e>
auto compose(std::true_type, g, c f, e) -> decltype(f(0));
}


template <typename c>
auto compose(c) -> c;

template <typename c, typename... i>
auto compose(c f, i... fs) {
  return
      [](auto... h)
          -> decltype(d::compose(
              std::is_invocable<decltype(compose(fs...)), decltype(h)...>{},
              std::bool_constant<(
                  std::is_invocable_v<decltype(compose(fs...), h)> && ...)>{},
              f, compose(fs...))) {};
}

auto j(int k) { return [k](auto l) { return l > k;}; }
auto m = compose(j(2), std::plus{});
static_assert(std::is_same<bool, decltype(m(1, 2))>{});
```

https://godbolt.org/z/hcGsz4hsf

</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJyFVUtvozAQ_jVwGRWBeYUDh5a0q73vPTLGBDcGI2yibX_9jnmFZpUWOSH2vL75xjMpVfWR_2mEBqYq7pACBl6NjFdQD6oFw7UB0UFjTK-d8Nkhb7jOwjRj6THV4mZQUpacDvhTitpYF4yOmmugHfwuXq05lRKufNBCdRpUDUzS7uyQF1xznNTzwSgIYnzTrgIzjN0FqIEoTBmrY1pnjFDOsiCmyYEGSUSzuIr9pC4pIyGJPCisT0gwj7YXEsML4zn-0fGfl-_En1cxB15OSSg6JseKgxMW9dgxgyCpdMLXvXFHW657yjhU4KSLreFtL6mZLM1Hz60SnC0B24592fHNKx0xW4tUaST9oE1lyQ2fMW9-svrWbnLFoLYvPMjgCe2h4kzOGgeUHHwU2BWuCaXHL1k_RsoeoWFbLHZz-52fXY6e54F46HjORVilWtsoG5eA986MQ7fu7OPEL058RDvrxto0NtGdgn3uOVmIvAW9N7DPxrfQJ9FdFaOlxOIUOz83B7XG2AvLiH6nY_FYGaaLeSDxpPg2WqmUPDHsAUM7g-EeoHuI8HT9GWMxs4SkOCTBBYvgB4xTYR7kPJcJTR_csanK72glOgOXRX-ppy3i5VZFkHdiCRbqxbqeAsDme1JvUXzc4bJRyJLnRlEvR70md2sEJNkIdqJa88HsewwZ1XhTkUpbj7uS4kQ7BPaMrH31-r_rbZTsWbgbkaoqlTSeGrCL3z7x07Bf-jNqdD2ruzwPkiSL4yT0M7fKwyoLM-oaYSTPl7HJ__ZSMGFWsizGeV5K2pYVRR0tcHINnI04XK8oXAYYrJ3qjoPMv5neUl7X11M_qHfOkKs3ofXIsUHf4owEidvkUUCDNDvQmpQ-9-sgpXFa07iMAh6xhMaupCWXOp9b1hU58QkJApIGYRgGqReXVVn7dRJn5aHMEuJEPm-pkJ4NbElyh3zCUI5njUIptNE3IRZRnDvOV_94Nxo15OtfjzvhzSew_wCDXPbH">