<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">