<table border="1" cellspacing="0" cellpadding="8">
    <tr>
        <th>Issue</th>
        <td>
            <a href=https://github.com/llvm/llvm-project/issues/62347>62347</a>
        </td>
    </tr>

    <tr>
        <th>Summary</th>
        <td>
            [clang++] Does not generate instantiated template leading to linker failure
        </td>
    </tr>

    <tr>
      <th>Labels</th>
      <td>
            new issue
      </td>
    </tr>

    <tr>
      <th>Assignees</th>
      <td>
      </td>
    </tr>

    <tr>
      <th>Reporter</th>
      <td>
          FerdinandSpitzschnueffler
      </td>
    </tr>
</table>

<pre>
    When compiling the source code below a linker failure occurs despite that the method is correctly defined. Compiling it with gcc-11 works fine.

## Affected Versions

clang-15, clang-16, clang-17

## Source Code

```cxx
// code.cpp
template <typename>
struct Impl {};

template <template <typename> class Type>
struct Trampoline {
    template <typename T>
    using Type_t = Type<T>;
};

template <template <typename> class>
struct A {
    void a();
};

template <>
void A<Impl>::a() {}

using ImplTrampoline = Trampoline<Impl>;
int main() { A<ImplTrampoline::template Type_t>().a(); }
```

## Compile Command And Output

```sh
clang++ code.cpp
/usr/bin/ld: /tmp/code-8e1b12.o: in function `main':
code.cpp:(.text+0x1d): undefined reference to `A<Trampoline<Impl>::Type_t>::a()'
clang++: error: linker command failed with exit code 1 (use -v to see invocation)
```

## Detailed Output

```sh
clang++ code.cpp -v
Ubuntu clang version 17.0.0 (++20230417095441+43ac269bdd00-1~exp1~20230417215605.872)
Target: x86_64-pc-linux-gnu
Thread model: posix
InstalledDir: /usr/bin
Found candidate GCC installation: /usr/bin/../lib/gcc/x86_64-linux-gnu/11
Found candidate GCC installation: /usr/bin/../lib/gcc/x86_64-linux-gnu/12
Selected GCC installation: /usr/bin/../lib/gcc/x86_64-linux-gnu/12
Candidate multilib: .;@m64
Selected multilib: .;@m64
 "/usr/lib/llvm-17/bin/clang" -cc1 -triple x86_64-pc-linux-gnu -emit-obj -mrelax-all -disable-free -clear-ast-before-backend -disable-llvm-verifier -discard-value-names -main-file-name code.cpp -mrelocation-model pic -pic-level 2 -pic-is-pie -mframe-pointer=all -fmath-errno -ffp-contract=on -fno-rounding-math -mconstructor-aliases -funwind-tables=2 -target-cpu x86-64 -tune-cpu generic -debugger-tuning=gdb -v -fcoverage-compilation-dir=/home/user/Development/tmp -resource-dir /usr/lib/llvm-17/lib/clang/17 -internal-isystem /usr/bin/../lib/gcc/x86_64-linux-gnu/12/../../../../include/c++/12 -internal-isystem /usr/bin/../lib/gcc/x86_64-linux-gnu/12/../../../../include/x86_64-linux-gnu/c++/12 -internal-isystem /usr/bin/../lib/gcc/x86_64-linux-gnu/12/../../../../include/c++/12/backward -internal-isystem /usr/lib/llvm-17/lib/clang/17/include -internal-isystem /usr/local/include -internal-isystem /usr/bin/../lib/gcc/x86_64-linux-gnu/12/../../../../x86_64-linux-gnu/include -internal-externc-isystem /usr/include/x86_64-linux-gnu -internal-externc-isystem /include -internal-externc-isystem /usr/include -fdeprecated-macro -fdebug-compilation-dir=/home/user/Development/tmp -ferror-limit 19 -fgnuc-version=4.2.1 -fcxx-exceptions -fexceptions -fcolor-diagnostics -faddrsig -D__GCC_HAVE_DWARF2_CFI_ASM=1 -o /tmp/code-2ed433.o -x c++ code.cpp
clang -cc1 version 17.0.0 based upon LLVM 17.0.0 default target x86_64-pc-linux-gnu
ignoring nonexistent directory "/usr/bin/../lib/gcc/x86_64-linux-gnu/12/../../../../x86_64-linux-gnu/include"
ignoring nonexistent directory "/include"
#include "..." search starts here:
#include <...> search starts here:
 /usr/bin/../lib/gcc/x86_64-linux-gnu/12/../../../../include/c++/12
 /usr/bin/../lib/gcc/x86_64-linux-gnu/12/../../../../include/x86_64-linux-gnu/c++/12
 /usr/bin/../lib/gcc/x86_64-linux-gnu/12/../../../../include/c++/12/backward
 /usr/lib/llvm-17/lib/clang/17/include
 /usr/local/include
 /usr/include/x86_64-linux-gnu
 /usr/include
End of search list.
 "/usr/bin/ld" -pie -z relro --hash-style=gnu --build-id --eh-frame-hdr -m elf_x86_64 -dynamic-linker /lib64/ld-linux-x86-64.so.2 -o a.out /lib/x86_64-linux-gnu/Scrt1.o /lib/x86_64-linux-gnu/crti.o /usr/bin/../lib/gcc/x86_64-linux-gnu/12/crtbeginS.o -L/usr/bin/../lib/gcc/x86_64-linux-gnu/12 -L/usr/bin/../lib/gcc/x86_64-linux-gnu/12/../../../../lib64 -L/lib/x86_64-linux-gnu -L/lib/../lib64 -L/usr/lib/x86_64-linux-gnu -L/usr/lib/../lib64 -L/lib -L/usr/lib /tmp/code-2ed433.o -lstdc++ -lm -lgcc_s -lgcc -lc -lgcc_s -lgcc /usr/bin/../lib/gcc/x86_64-linux-gnu/12/crtendS.o /lib/x86_64-linux-gnu/crtn.o
/usr/bin/ld: /tmp/code-2ed433.o: in function `main':
code.cpp:(.text+0x1d): undefined reference to `A<Trampoline<Impl>::Type_t>::a()'
clang++-17: error: linker command failed with exit code 1 (use -v to see invocation)
```
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJzUWEtv4zgS_jXMpUBBouTXIQfHbs820IMFNr09x4AmSxKnKVIgKceZw_z2BSX5EbeTzmanezFA4EhkPb4qFj8Vyb1XlUG8JZM7Mlnf8C7U1t1u0ElluJH3rQp_eFGbDstSo7vZWvl0-1uNBoRtWqWVqSDUCN52TiAIKxG2qO0jcNDKfEUHJVe6cwhWiM55kOhbFRBCzUOv2mCorQTlQVjnUAT9BBJLZVAmsDp6UQEeVaihEoJmGTxa99VDlEpIuibpcvxlOWE5LMsSRUAJX9B5ZY0_lxGam4pmE8JWMD5Pz55nV-zdD-GtrMRns9N0-BP7_UF-Q9imz0Mi2nYYDNi0mgcEkq_CU4uGN0jyD8OkD64TAT42rQYyuyOzNcnvzp08075uKUL3Hj4_td_Y_ex401qtDPbW-ykAgGuW4PNRO4p0PuY9Gn0IQPL1aH_VSx0xvh_vJdTlc4Q7qyRwwuaELd7o7mix112SfBXT2sNdknw5Gjuk-czIEGoUPs9XDPn4em5sBKBMgIYrczJ79HmuF10fUQ7pjFZ6peQUIJwwHcrqSiUOGyKWYtNwI2FpJPyzC20Xrhamr89qnrA7wu4uipOwTecdYZttDGSjJcmXQNgmNC1hmyhL55htM5bYOKMMlJ0RQVkDZJoO4c9ikIOfg-18Sdg8CbgPhN2l-0z2QS6hM-PeBoclOjQCIdhoKqbuerpjAk95O1_K6PoyvugFnbMuPowcJMZsRS5CORAJ7lUYCCsDwuadR6C7iMUjgjI7K3iMMnr57qqsMQyW37kUQHfD5L-3nQndQEWwG8gLslmSJin0IUc1lrI8LbJZupgURUbYXZFzwaaLrZRpSrM_cd9mfx6EWDaZppNkPmPHSD5zV2GI6dnPpw_TgraCamW6Pa1MN4rUDrmExkrUUbC1Xo0U99H4wLVGuVZurJVTAfUSG9sZCYIbqWSs-V9WK1CD1pDSSy22SZJYe2pL2KYSgrDNiOwEi22y7MeaZ4P5e9TDt-Mvtrs6Am46HVTUypeQRDYp0mZaXHh_TQgIY0ckg3utd038dh2QjVXGgAqRAQ1OtRqvrTdQbFSgdvs70Mah5nvKtQYqledbjbR0iECFRu4o94FusbQO6ZaLr2jkSa4HsEOnSoWuHxbcSbrjukMaed8DjWxBS6WHgbPqj47H_Ub7moNWCaCtElTjDjWw4UV52ioE2pSON0hbq0xAR_J1D7lseKgpOmcs0LJsqbAmOC4CydfWAC2NpS4WjzIVjbJAG2HN8PmxjnKtuI84y848KiNpiJF5kq8Z0NBvGiraLmaRTgugoTPYD1Ro0EXAErddVaGLU8pUJF9XchtphZbC7tDxCunQOA2xyriF1oRtattgv6IYl3QdY7ZtgyYMTAzU4dBiRRV4ce2H93HtN9kMaJ8gwzVV_skHbN5ZwaPgxY8yQncyAhcj90bhn-b0itb_Bce502ibi6-P3MnX_H9v4U72X7ViBddvE_0LAr4i-61j3McH8S2Al5ftde3_3gXQUmLrUPCAkjZcONsPbbvqnZuv7PsJqlWjAmQLoGVlOkHH7zPJ10XCkixu8v2e4l5gGx1EInn2Iqy2jkrFK2N9UCKOcSmdVxXQ9cPDL6vVwz-WXz48rH9b_mvDHlabjw_L-19Jvs6A2oumjKEs8jyxQPcgrnZ2QxPR8_9FJ7HlHiV0rTXw6dOXXw_DEkve6QAD1b3cHKjKWBcbZmMN7pUPaAJIFc9u1j09-zj90LKLjt4O6FKJsPxQMISxJPpi4JE7UYMP3AUPNTo8trbn8vkqyucfXpP_GWTzIx19h11_XpAnRr30-XYW_UbzOXNeTr-ShRck--EPRoItD0WhlQ_JlYbteNBifVeDQP8AhzqyFK25r6kPTxpj7xC5kW47pSVVEijFmg6NTy0d0AZQlw8DQKDyyfBG9Xs1nniGbEyL3tMIf-hbEm8TFvmEJ7YLcEzblZW6Fy5kiX1VRrigBpF31YFwYYuVMveRyT69y8p79V6owj5tg83rQZ_PXWqc1-V1vXOJK_4uhF4kfe2DPNA-1Q1QXQnx4If_QLW4GPkf1geNvP9-EZjEvvlC4RDG3-NCIXLLj75TuJG3uVzkC36Dt9l0zoqsKIrspr5N86mQsxLFbDadLXi2yBdlkWU5n5TZfDIXN-p2OOmzSbpgaZElkyzN0vl0WuRiUaRiTooUG650Enkysa66Ud53eDtleTG70XyL2vf3v4wZfIR-MtLVZH3jbntu3XaVJ0Ua-cyfrAQVdH9xfH73MlnD2qIHY8NwKorn3f4QbYKK_djp4lEjl_31sb24Kb7pnL6tQ2h9v-ibWKMq1N02EbYZ-f5A-62zv6OIjVqP2xO26eP6TwAAAP__Gtv2kg">