<table border="1" cellspacing="0" cellpadding="8">
<tr>
<th>Issue</th>
<td>
<a href=https://github.com/llvm/llvm-project/issues/123033>123033</a>
</td>
</tr>
<tr>
<th>Summary</th>
<td>
[clang] Ambiguity between function declaration and definition when using pack indexing
</td>
</tr>
<tr>
<th>Labels</th>
<td>
clang
</td>
</tr>
<tr>
<th>Assignees</th>
<td>
</td>
</tr>
<tr>
<th>Reporter</th>
<td>
FSK-idk
</td>
</tr>
</table>
<pre>
Godbolt: https://godbolt.org/z/817Kve9zc
It seems that clang can't compile code if I decide to separate the declaration and implementation of a function with pack indexing in some cases. However, if you comment out the declaration, it will compile.
```cpp
#include <concepts>
#include <iostream>
// in requires expression
template <class... Types>
requires std::same_as<Types...[0], int>
void print(double d);
template <class... Types>
requires std::same_as<Types...[0], int>
void print(double d) {
std::cout << "it doesn't work " << static_cast<Types...[0]>(d) << "\n";
}
// in return type
template <class... Types>
Types...[0] convert(double d);
template <class... Types>
Types...[0] convert(double d) {
return static_cast<Types...[0]>(d);
}
int main() {
print<int, int>(12.34);
std::cout << "convert: " << convert<int, int>(12.34) << "\n";
return 0;
}
```
Output
```
<source>:30:5: error: call to 'print' is ambiguous
30 | print<int, int>(12.34);
| ^~~~~~~~~~~~~~~
<source>:9:6: note: candidate function [with Types = <int, int>]
9 | void print(double d);
| ^
<source>:13:6: note: candidate function [with Types = <int, int>]
13 | void print(double d) {
| ^
<source>:31:33: error: call to 'convert' is ambiguous
31 | std::cout << "convert: " << convert<int, int>(12.34) << "\n";
| ^~~~~~~~~~~~~~~~~
<source>:21:13: note: candidate function [with Types = <int, int>]
21 | Types...[0] convert(double d);
| ^
<source>:24:13: note: candidate function [with Types = <int, int>]
24 | Types...[0] convert(double d) {
| ^
2 errors generated.
Compiler returned: 1
```
</pre>
<img width="1" height="1" alt="" src="http://email.email.llvm.org/o/eJzEVktv4zYQ_jXUZRBBIi0_Djooctwu9tBDe19Q5NhmQ5EqSdnrPfS3F5T8SOwkTYqgKwiS-Jrvm_mG1HDv1cYglqS4J8Uy4X3YWleufv96p-Rj0lh5KH-xsrE6EFbBNoTOE1YRuiJ0tRkHUus2hK5-ELqa57OvO1z8ECSrSFZ9CeARWw9hywMIzc0GBDeEzgII23ZKIwgrEdQavoBEoSRCsOCx444HhLDF2K1jS1kD3EhQbaexRRPGLrsGDuveiKG1V2ELHRePoIzE78psQBnwtkUQ3KNP4Ve7xx06QuuIerB9ZBLNge3DNeAwK8BeaX0inI6ukWk23qLrYpMyZYTuJQJhtbBGYBc8YQ83Y8r64JC3x7HxHsIZmTr8q1cOPeD3zqH3kcMwJWDb6RiSaF5z79M0hT8OHR5Bzgt9kFEgVnne4jfuCauHaWmakuI-I8VycMqEcd3OKgmdi206l7ZvNIIkdEHY_c8BBjKLyBdzIupCWE1YDYRSFUBa9GMS7a17jJ2ncR-TQnwT3IcX4NlDhBowzuZIUZv4Gt2dLV_UJPTOQDh0-L6QXOGCsGaH7r8G-F3WTlEDONF9ZyhuHVcmQMuVIXT-xPCoFKsHvc4y0nlOUzY524n4rwl34s2qp4qde1-1_KpYz9zNnjly2pzjtN_60PXhup_V3vZOYERjFcsIq4pIDp2zLn4IrnU8jQidHfN0BsoDbxu16W3vRwIsAzKrI5MPxAiGNaR4-PvZdUtrQVg1jWSMDTiSMlLJmC7nM48U98OxN2gMhC3hhkOxPAIvBuC3N_2F4PhRPNzyytnnEsvZm8SepPe_MWN5fLDXlDzvnlstWX42_X_l8MWXN66bNHkpUWh-UuWTFKFjND5wll2pA2-IRCefzXbyfranZHqZKR3TxsMGDcYiRMY_fj3-_N3xuMGYHpDfHjWJLJlcsAVPsMxnbLpgk-mcJttyjbnAYj2ZrQXNpsV6MhGS4lRkDZdT0TSJKmlGiyzPi2xR5JSm2EghFpjR2COpJJMMW650qvWujTVXorzvscwpyxhLNG9Q-6GOo3QotYZkWyaujAvumn7jySTTygd_MRFU0EPxN64ollANW0KFAzQY9ojmosd1JSZxrYwa664tGuh9rLeeVV9J73R5VTWqsO2bVNiW0FUkcnzddc7-iSIQuhoc84Sujr7tSvpPAAAA___jBB6f">