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

    <tr>
        <th>Summary</th>
        <td>
            [C++20] [Modules] Missing vtable for explicit template instantiation in other units
        </td>
    </tr>

    <tr>
      <th>Labels</th>
      <td>
            clang:modules
      </td>
    </tr>

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

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

<pre>
    Reproducer:

```
// RUN: rm -rf %t
// RUN: mkdir %t
// RUN: split-file %s %t

// RUN: %clang_cc1 -std=c++20 %t/a.cppm -triple %itanium_abi_triple -emit-module-interface -o %t/a.pcm
// RUN: %clang_cc1 -std=c++20 %t/a.cc -triple %itanium_abi_triple -fmodule-file=a=%t/a.pcm -emit-llvm -o - | FileCheck %t/a.cc
//
// RUN: %clang_cc1 -std=c++20 %t/a.cppm -triple %itanium_abi_triple -emit-reduced-module-interface -o %t/a.pcm
// RUN: %clang_cc1 -std=c++20 %t/a.cc -triple %itanium_abi_triple -fmodule-file=a=%t/a.pcm -emit-llvm -o - | FileCheck %t/a.cc

//--- a.cppm
export module a;
class base {
public:
    ~base() = default;
 virtual void foo();
};

template <class T>
class a : public base {
public:
    virtual void foo() override;
};

extern template class a<int>;

//--- a.cc
module a:impl;
import a;

template <class T>
void a<T>::foo() {}

template class a<int>;
// CHECK: _ZTVW1a1aIiE
```
</pre>
<img width="1" height="1" alt="" src="http://email.email.llvm.org/o/eJzcVE2PpDYQ_TXFpUTL2M3QfeBAw7QSRZvDavOhXEbGmO7KGkxs05pc8tsjAzM92d1kpUi5RLLUjevjvXquKuk9XUatS8hPkDeJnMPVurK-znL8jX6ej0lru9_L93pytpuVdiAqYMt5YNthFfAz8DO-_-F7EBW6AVPXI_A8fGYbPnbkvmzyk6GQ9mR0tPtXp0_9gOfKyPHypFSGqQ8diEYBPwE_cbZG8bPcqWkaMA2OpjUhBTnSPDzJlp6221QPFNLBdrPRKY1Bu14qjam9Z5nU8K8JqK_B9xt0rBlEI0E0b4E3fsbchsgpRShqPJPR9VWrj2-BXin-52I5Hbug-7-I9sIyTVNcVQBW6efJuoArDkoQJ2CVMtJ7bKXXCEW8mObWkFrHARHxj2gDfgB-RBANdrqXswlrNN7IhVkavFnqsLd2dVyNUDTbH1YFPUxGBo0g6hXyA4jHV3yJUcsV-p_IfBkO7U07R53-HFc_B-1GfIXf4EDUNIbI4MXxL3pFDe8yVTRMZnWkYZFQfr2uhWHEWb5FBaK6843FFc0nGf6G2tpt9TeP9XdRo6dfPvz4UyYz-S09vt1WSVeK7iiOMtFlVohin2eHLE-uJet6nnUPbVf0fM_bA-uKvJV5cdgfNG-Px4RKznjOMp6xo2BZvisyVmRKPOQHzUT_kMOe6UGS2cXm21l3Scj7WZcZF0V2TIxstfHLouV8mQUQm3oeOI_b15UxNG3ni4c9M-SDvycLFMyyp-uXsYG8QchP77YceYPvyHsaL3gLsjUae-tQP0-GFIX729LogxwDyUB2RBrRhqt2OI8UfDI7U15DmHx8i0XTC4Xr3O6UHYCfI5vtJ52c_VWrOE5LnR74eSv1VvI_AwAA__-6V-OG">