<table border="1" cellspacing="0" cellpadding="8">
<tr>
<th>Issue</th>
<td>
<a href=https://github.com/llvm/llvm-project/issues/62134>62134</a>
</td>
</tr>
<tr>
<th>Summary</th>
<td>
[Clang] Explicit function template instantiation leads to linker error (Regression)
</td>
</tr>
<tr>
<th>Labels</th>
<td>
new issue
</td>
</tr>
<tr>
<th>Assignees</th>
<td>
</td>
</tr>
<tr>
<th>Reporter</th>
<td>
craffael
</td>
</tr>
</table>
<pre>
## Compiler Information
```
clang++-16 --version
Ubuntu clang version 16.0.1 (++20230328073357+42d1b276f779-1~exp1~20230328073502.65)
Target: x86_64-pc-linux-gnu
Thread model: posix
InstalledDir: /usr/bin
```
## Steps to reproduce
1) You need to create three files:
**main.h**
```
template <typename _Scalar>
struct Matrix {
enum { IsVectorAtCompileTime = true };
};
template <typename Type>
using Vector = Matrix<Type>;
template <
typename PlainObjectType,
int StrideType = PlainObjectType::IsVectorAtCompileTime ? 0 : 1>
class Ref {};
template <class T>
class EigenSparseLU {
public:
template <class SCALAR_RHS>
auto Apply(const Ref<Vector<SCALAR_RHS>>& rhs) const noexcept -> void;
};
```
**main.cc**
```
#include "main.h"
int main() {
auto sparseLu = EigenSparseLU<double>();
Matrix<double> q;
sparseLu.Apply<double>({});
}
```
**main2.cc**
```
#include "main.h"
template <typename Scalar>
struct SparseLUImpl {
typedef Ref<Matrix<Scalar>> BlockScalarVector;
};
template<class T>
template <class SCALAR_RHS>
auto EigenSparseLU<T>::Apply(
const Ref<Vector<SCALAR_RHS>>& rhs) const noexcept
-> void {
}
template auto EigenSparseLU<double>::Apply<double>(
const Ref<Vector<double>>&) const noexcept -> void;
```
2) Compile and link the three files with `clang++-16 main.cc main2.cc`
3) Observe the error message:
```
/usr/bin/ld: /tmp/main-3e89ac.o: in function `main':
main.cc:(.text+0x1a): undefined reference to `void EigenSparseLU<double>::Apply<double>(Ref<Matrix<double>, Vector<double>::IsVectorAtCompileTime?(0) : (1)> const&) const'
clang: error: linker command failed with exit code 1 (use -v to see invocation)
```
Note that this only fails with clang-16 (I don't know about trunk). It works with clang-14 and clang-15. Also gcc compiles it fine.
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJykVlFv2zYQ_jX0y8GCRNqS_eAHx4mxAN06NOmAPRU0dbK5UKRGUonz0t8-kJJl2XWLYgUCR9LdfTze9x153Dm514grMr8j8_sJb_3B2JWwvKo4qsnOlO8rQhmhDDambqRCC4-6MrbmXhpN0nuSrkme9n_xVSiu94TeEXo3zXKYTl_RusH5867VvoXoBL0FsjxJkwwIXXRxNKUsZXSRFozNC0LvZrTMdrTIq6JYTrOveGyyryOneUqTfE7oslvjmds9esLWcFzkX_LZtBFTJXV7nO5127scLPISalOiCo6NcfLYmR6181wpLO-lDSZCt62zhG538vaG-9-uTE8eGwfegMXGmrIV2JkzQpfwt2lBI5bBLixyj-APFhEqqdARtr4EDH81lzo5dM83V_dYNyogEbbx7w1qXiN8eRJccUvYQ-fkvG2Fh9-5t_IIpLjrPgOgbuvwDo_uLxTe2LXviX6WdcC8B29bBFLcE9ZHXTyPfm9m8vze4JBG66TeQ7dQxO4SImxzcrvEHSOeMgYYsP9UXOqPu39Q-BhPR05Se3jyVpYYTHGxa3e2Jmz9vX1vIYXAfjYkLxR3Dj5hFev3TQ3GuXauz1ehD3KP-qnh1uGHzyMSmnanpBjYh2-RnjbrD-tPXz799jRAAvDWG1g3jXondCGMdj4kR9im2xBhm8sw9kBoDvbgghI7f23wKLDxMCXsAV6NLG-TfFvvgzyF-IE-CWVSC9WWCITSk5zpGCpwFQyx_5fnylzs1HWFayOVF6UkbFOadqeigCLEFTVw1tngCP8OTgN00lXzCq4j-xvQ8PFnqkN_uTw3--p2g59K8lg3aqSwEFVi1etjKMYZgz3AnTLipftyEtB3-_2U0Q2p_5R4I6HXHEaM2JMnUffZ_5q2z0fCIPKRwgYSL5O_meBZFaMsr8Tyg4xH4SHbn-vCW9qiIbQ_rYDrEpTUL-APF5cJvEl_AJKnV9dx37AwSPOEzQLqx51D-4oRDK01Fmp0ju_xfDddy3d0OdKtKvsb09cNoduwyJThYslFYoJFaqhaLcLsEHLrmr4YwE-nCVsTukg8Hj2hd-kx47H91tDqEiupsQSLFVrUAsNVSvI00vo_CLvqiJFpA7eY--6VQdiW0EUaz69YgkUWk37oSB4THnY8mpTYuit1eAhMogVh6joQW3GpsOyoxKP0IEyJEAel1iFMX8PuHSJI_WpEN5KdhqCb0vnDxJGDe_AH6cBo9R4X6eUSEwoqIXTxCGVAKzy8aPMGfGdaH2YB_ULoMoFHD2_GvlwGzqIc-5d5AmvlDOyFCBtqoiqlh0BgMilXrFyyJZ_gKssX2awo0iKbHFZLJipWLQTO8xnnVZEu53wn6Cyl-TyjZT6Rqzj4zbJZRufFPEuytMwqXrKcsqIUaUVmKdZcqkSp1zoxdj-RzrW4ymnGZhPFd6hcHHgp1fgG0RhO3Pn9xK5CzHTX7h2ZpUo6784oXnoVJ-VNpG1-Dw_HRkkRtnTS9HCAyDBEai8jJ6CQl3Eo7PntWivKb2_RuY63SWvV6uB9EydBuiV0u5f-0O4SYerQXOr19G_aWBPmGEK3MX9H6Dbu778AAAD__w9sfFc">