<table border="1" cellspacing="0" cellpadding="8">
<tr>
<th>Issue</th>
<td>
<a href=https://github.com/llvm/llvm-project/issues/59756>59756</a>
</td>
</tr>
<tr>
<th>Summary</th>
<td>
Function with two template template parameters is being ignored
</td>
</tr>
<tr>
<th>Labels</th>
<td>
new issue
</td>
</tr>
<tr>
<th>Assignees</th>
<td>
</td>
</tr>
<tr>
<th>Reporter</th>
<td>
bbastin
</td>
</tr>
</table>
<pre>
When creating a function template that takes two template template parameters as well as a template parameter pack, clang states that the template does not fit. This behaviour is inconsistent with the behaviour of both gcc and msvc, both of which correctly select the template. I could not find anything in the standard that would prohibit using two template template parameters in a function template.
Example:
#include <tuple>
#include <vector>
template <template <typename...> typename Tuple, typename... Targs>
auto unmarshal() {
Tuple<Targs...> ret;
return ret;
}
template <template <typename> typename Array,
template <typename...> typename Tuple, typename... Targs>
auto unmarshal() {
Array<Tuple<Targs...>> ret;
return ret;
}
int main() {
[[maybe_unused]] auto fields1 = unmarshal<std::tuple, unsigned, int>();
[[maybe_unused]] auto fields2 = unmarshal<std::vector, std::tuple, unsigned, int>();
}
Error using clang trunk:
<source>:19:37: error: no matching function for call to 'unmarshal'
[[maybe_unused]] auto fields2 = unmarshal<std::vector, std::tuple, unsigned, int>();
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
<source>:5:6: note: candidate template ignored: invalid explicitly-specified argument for template parameter 'Targs'
auto unmarshal() {
^
<source>:12:6: note: candidate template ignored: invalid explicitly-specified argument for template parameter 'Array'
auto unmarshal() {
^
1 error generated.
Example in Compiler Explorer: https://godbolt.org/z/ME6qx5jWE
The same error occurs on my local machine running clang 14.0.6.
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJzMVk9v47gP_TTKhRjDkeOkOeSQ5g_wO_xuBea4oCXG1lSWvBLdNHvYz76QnbZJJ0W7cxisD7FiUXyPTyQljNHUjmglyntRbifYc-PDqqowsnGTyuvT6ntDDlQgZONqQDj0TrHxDpjaziITcIMMjI8UgY_-4vvLoMOALTGFCBjhSNamN94wgA7Vo5AbUBZdDZGRk9cBoLnwqD1FcJ7hYDiDh8ZEqKjBJ-P7ACaCccq7aCKTYzgaboblbyb-AJXnBmqlAJ2GNj6pBDt89Ac4NkY1oHwIpNieIJIldc0hg_-B8r3VZx5OA7oTN0kl4wbTyOg0Bj0GcByMu-AbUxmGPibLTwUz7pbmmci3Il-Pv7tnbDtLolhffgUAELIwTtleE4hiw_1gtfto_okU-3Bt8Dp65ZYcXY5PHTlsKcsyUezg5S88DGByAxcG8IChjlcA2LOH3rUYYoNWyDshlyAW928W6RmdFZth_RkpEIvinV0g7oP7aUostu-V-Sycq1jWIeBJyM012Pj8Pi1GFsXmhhi_qsfFFhvH0KJxH23B0CHuWzxV9Efv-khalFtRbkfWB0NWxymIYnsRQbGJrFNaFmt-kaB3Q8vRaWwcJ_ID4k_cvwIoPwY8J7PcwK9weJcx5zoLwYdz3Y79iUPvHm_VXbGJvg9qqLZiPV2KYl0sRLEGSj7SwHlokdXQLl7L--ADKLQW2IOQi4tcWPyXxCl3f__L50NpSlGs56MenDoYKHTa6KtuaGrnAyWeYNwTWqOBnjtrlGF7-hY7UuZgSAOGum9Tw08y3jhbhFyMRXep5tcaUIr5Jfp3eyt_bwTnXvT1CN6YA8B0TECoyVFAJn3rIElnzsa3nbEUYPfcWR9oyNmGuYspXeReyH3tdeUtZz7UQu7_EnL__938z-fyx_fdpdOHdBCmLjgie6X6EME7aE9gvUILLaYyIAi9c2-1NZ1leTbPJnpV6GWxxAmtpvOFnJW5nN1NmhWVeZkrLZUmRYg0O9CypGWpMZ_N54tqYlYyl3Iqi2k-LfLZXTYvl3m1kKjKPKdiQWKWU4vGZtY-tSmMiYmxp1W5XJTzicWKbBxuRlI6OsIwKaRMF6WwSmu-VX0dxSy3JnJ888KGLa32L0U9Xj8-PefTDWa4O4y5MumDXb0T3HDTV5nyrZD7hHZ-feuC_0GKhdwPHKOQ-yGGfwIAAP__VJwgKQ">