<table border="1" cellspacing="0" cellpadding="8">
<tr>
<th>Issue</th>
<td>
<a href=https://github.com/llvm/llvm-project/issues/115718>115718</a>
</td>
</tr>
<tr>
<th>Summary</th>
<td>
[clang] false diagnostic when expanding two packs simultaniously in nested variadic lambda: `error: a non-type template parameter cannot have type 'auto'`
</td>
</tr>
<tr>
<th>Labels</th>
<td>
clang
</td>
</tr>
<tr>
<th>Assignees</th>
<td>
</td>
</tr>
<tr>
<th>Reporter</th>
<td>
r-braun
</td>
</tr>
</table>
<pre>
clang trunk (`20.0.0` at the point of reporting this issue) fails to compile the following code in C++20 mode with `error: a non-type template parameter cannot have type 'auto'` ([Demo](https://godbolt.org/z/h9vq8aPeq)):
```c++
#include <utility>
template<auto V>
struct Constant{
static constexpr auto value = V;
};
template<auto... Vs>
struct Sequence{
template<class Func>
constexpr auto enumerate(Func = {}) {
[]<std::size_t... Is>(std::index_sequence<Is...>){
(Func{}(Constant<Vs>{}, Constant<Is>{}), ...);
}(std::make_index_sequence<sizeof...(Vs)>{});
}
};
int main() {
Sequence<0,1,2>{}.enumerate([](auto val, auto idx){
static_assert(val.value == idx.value);
});
}
```
The issue seems to stem from a combination of using an auto nttp and doing a simultanious pack-expansion with a nested pack introduced by a lambda that tries to instantiate said type.
The following variations compile succesfully:
- [use concrete type instead of auto for Constant](https://godbolt.org/z/xE1v4za56)
- [use concrete type instead of auto for Sequence](https://godbolt.org/z/deef5n4ar)
- [introduce the nested pack via the function instead of the lambda](https://godbolt.org/z/ndorhf1Ev)
- [pass a pre-instantiated pack of Constants into the lambda](https://godbolt.org/z/ra1Ghfaob)
In particular the last variation can currently be used as a drop in replacement, but makes the code a lot less clear IMO.
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJysVk1v4zYT_jX0ZRBBpvx58CGx1y9yeNECLfYajKhRxIYitfxwkv31xVC27KRbYBeoIcgChzPzzNdDYgj62RLtxPJBLA8zTLFzfufvao_JzmrXvO-UQfsM0Sf7AkJuxKqUZVEWpViVgBFiRzA4bSO4FjwNzkfN-zsdQIeQSMgttKhNgOhAuX7QhrJW64xxr7xZuYZAW9gL-SDkgyyh55VXHTsQq5K8d15U94Bgnb2L7wNBpH4wGAkG9NhTJA8KrXUROjwR5D1CrjFFJ-SasTL25cOBeieWByE3XYxDENW9kEchj8-uqZ2JhfPPQh6_C3nstqdvG_ydvgm55ae6F-VBlPdiVY6PGtGeV2WlrTKpIRDVPkVtdHwX1ZezNL8vmEW1Z1zwdZKH6JOKsHc2RLRRrM9WAQBCxKgVKJbR2-Ah657QJHZ1YCsXDOvD9ftHHouigK_hs9c_6Fsiq-jq9UZNGQwBjsmqSY1BfUJDNvXkWUNueG8GxvbWBy7_1fLYZ6Lah9hwRqv7oL_TU2RkjxmZ3EwibRt6ewoXeNX-MRRFkTdtb0yOLi_eNlMSq_0Y61mwhxvJ461ky0K2zFWezGZjE5YeX-jpH4AYvGuz6uZryPo3VqubKvLSvxSJZ6dHbblBPyQL4Fqbal8KuZ8LuZeTj-I27efMys2lPTio_K2btw8JGxvqCUMgH4XcnNAUUztx4XTzNi78KIibpWtMl5G4DevPjkYCgEDU5-kPkXpovesBmQlqbTFqZ5k5UmAiQDtCtjEOgLaBxuVlCLpPJqLVLgUYUL3c0duANrB2pgkESyFSk4WgbfSuSYoaqN8BwWBfNwixY8LymjIaPXaDZhYJqJtMGgV8juFKUyf0OgMOE4-FpBSFNhnzPhHEHXd5CsRDojzFMxuxO8KGg80xts5fO_KnGOnty_y0-I7LFRfhV11NnfRTrhqidmkX6D-6mvKaCfw24yeNI6knq3JNbzDw-liBn3NuG-e7dv7l9NH5wEyEMHi6uynd2b9rp2QGLr_7Za8e5__rWnT15HV8P1o-Y6JWyaA_Ww3x2gx87oBK3pON5h1qghSoAWSsjXcDH2yeBoOKerKRx7JOPPEv3IYdjacfgnERDIUAyhB6ePz_b8Ws2VXNttrijHbzdTWvqkW13sy6Xa1Wq3m1xbZZlPV6QcvVol6st9sa27VcrOVM72QpF3P-LeZyuSlaLFusVVViXeJ6WYtFST1qUxhz6jkLszyru_l8uZ5vZgZrMiFfC6TMNwAhJd8Q_I4V7ur0HMSiNDrEcDURdTT5LjFqLA_QogkEjcZn6wIfY68dWciz2-RrwqvL9QsfJty8c9LO7ZUT3Wh1KWZ1_5_dCWbJm92nvtCxS3WhXC_kkQM7_90N3v1FKgp5zIkKQh7PuTrt5N8BAAD__xJX6Js">