<table border="1" cellspacing="0" cellpadding="8">
<tr>
<th>Issue</th>
<td>
<a href=https://github.com/llvm/llvm-project/issues/74016>74016</a>
</td>
</tr>
<tr>
<th>Summary</th>
<td>
`-Wundefined-func-template` warns that no definition is available for a pure virtual function
</td>
</tr>
<tr>
<th>Labels</th>
<td>
clang:frontend,
false-positive
</td>
</tr>
<tr>
<th>Assignees</th>
<td>
</td>
</tr>
<tr>
<th>Reporter</th>
<td>
ahatanak
</td>
</tr>
</table>
<pre>
The warning seems incorrect as `B::bar` is pure virtual and its definition isn't needed.
$ cat test.cpp
```
template <typename T> class B {
public:
constexpr void foo(const T &) { bar(1); }
virtual constexpr void bar(unsigned int) = 0;
};
template <typename T> class D : public B<T> {
public:
constexpr void bar(unsigned int) override {}
};
void test() {
auto t = D<int>();
t.foo(0);
}
```
$ clang++ -std=c++20 test.cpp -Wundefined-func-template -c
test.cpp:4:35: warning: instantiation of function 'B<int>::bar' required here, but no definition is available [-Wundefined-func-template]
constexpr void foo(const T &) { bar(1); }
^
test.cpp:5:26: note: forward declaration of template entity is here
virtual constexpr void bar(unsigned int) = 0;
^
test.cpp:4:35: note: add an explicit instantiation declaration to suppress this warning if 'B<int>::bar' is explicitly instantiated in another translation unit
constexpr void foo(const T &) { bar(1); }
^
1 warning generated.
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJysVduS2jgTfpr2TReULGEDF77gMDzBVP3XstUG_Sskr9QmmbffkgHPTLLJZisLFJaE-PQdum2dkj17ogaqPVTHQo98CbHRF83a6z-KNpi35vVC-EVHb_0ZE9E1ofVdiJE6Rp0QarEHtQO1a3WEWqBNOIyR8GYjj9qh9gYtJzTUW2_ZBo82eZBrRk9kyCxBHEHsHt9yhZ1mZEq87IbhsVqLx2eaMl0Hp5kQ1IHfBvL6SvgK6gU7p1PCPcJ6f986jK2zXSY4TRG74BPT1yHiLViDfQggN9MiviLIGuQ2_xuzGrkpQW5BZbzjE-Cp6xug-_7RT44atJ4nJHVEAepBJqPM419SckRQO7yLwD2ow_TbL6v7e1LhRjFaQxPOU9j33CaEnAPIzcOV5zF65IA8qTuCOmRc9XLfNoMgL-_mio-r7-d9jvRD-k77M8g9yD0uEhtQx-4-lWIuC1z8b_RTRZFZ9KPvFrOTi-5p7aOC1G4Faqeq7OSjkPPQ-sTas9VTSYYeM8w0Brnev6uaa1uuMdKfo41k8EKRQB6wHRl9-FzbqG_aOt06Qqj2PyQK1fE_q8l_ekH18p0p2Q9ZZyd8YMrXPsQvOho01DkdZ19mZ8mz5bescJL_-_3wr_i-h_jkq41B7ZG-Ds52lr9J9KMKDpjGYYiUEvLFpvmGZvufpG3TjO3ePqBPclD7wBeKyFH75O7njN7yQ9rvZjpbUM5kz-Qp5uOXhWmU2aqtLqgp16JUW1mV2-LSaCNLYdq-qleqK0VfGbOS2z7vqLSpRGEbKaQqpSjzu6qWsiw7ZepNJ82mU20FK0FXbd3Sudt1GeK5sCmN1KxXoqwLp1tyaXpeSHnvVLXrY_BM3oCUIA8gZa9dosUQkmV7o7xcHYvYZMRFO54TrISzidP7GWzZUQO1-HG71GIyIgeof9p0fYioPz-Dnq1djNE1F-Yh5aDlCeTpbPkytssuXEGeMp_HZTHE8H_qGORpMiCBPE0e_BUAAP__-pkxFA">