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

    <tr>
        <th>Summary</th>
        <td>
            false positive: cppcoreguidelines-virtual-class-destructor for templated base and derived class if derived class has another virtual function
        </td>
    </tr>

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

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

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

<pre>
    Heads up: This bug seems to be very specific.

## Version (14.0.6)
```
  LLVM version 14.0.6
  Optimized build.
  Default target: x86_64-pc-linux-gnu
  Host CPU: haswell
```
Unfortunately, I could not get my hands on a newer version.

## Related
- #51759
- #51254

## How to Reproduce
```cpp
// test.cpp
template <class>
struct A {
    virtual ~A() = default;
};

template <class T>
struct B : public A<T> {
    ~B() override = default;
    virtual void f() = 0;
};
```
running:
```bash
clang-tidy --checks="cppcoreguidelines-virtual-class-destructor" test.cpp -- -std=c++20
```
results in:
```
1 warning generated.
test.cpp:8:8: warning: destructor of 'B' is public and non-virtual [cppcoreguidelines-virtual-class-destructor]
struct B : public A<T> {
       ^
test.cpp:8:8: note: make it public and virtual
struct B : public A<T> {
       ^
```

## Why This Bug is So Specific
The false positive vanishes in either of the following cases:
- base class `A` is not a template
- derived class `B` is not a template
- derived class `B` does not have another (`public` or `protected`) virtual member function
- adding the keyword `virtual` to `~B`, but this triggers `cppcoreguidelines-explicit-virtual-functions` instead 

## Further Observation
`clang++ -Werror -Wnon-virtual-dtor -c test.cpp` compiles without errors (and so does `g++`).
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJylVt-PozYQ_mvIywhEIJDkgYdks6utetVVd3u3jyeDB3DXwcg2yaZ_fcf8SDZpKvVaiV2wGc988803Q3LFT9kzMm6ga714Ay-1MJB3FRjEvQGrIEc4oD6BabEQpSgCL9x54Wb8H8V0wXfURqgGvGg1XwRhkHrRejRIw_HqlwCfPn3_zTns7Ufj8dXn1oq9-BM5ARCSB9P-DkvWSQuW6QqtQ_m-Sn-kC78tfCma7t2vmm4yflbGwsPv35xZzcwRpbyL5FtTKm27hlmUJy96gF-gUJ3k0CgLFAb2JzrfEDGEk0GDR9QT7nsUfEFJrviw5xMTcTJfJuurdZQs7px8VkfH8xdsteJdgTdwi7adzJ_oAovGBudNi_vWBQYvfigkM8aLH4c3xuqusLABb7mdyAE4CEqaSdp8JIcrqhOd3AEfKPbi0dRb7i7P9wPBy22oLTjS2y6XooAN2TmL6_AUdjuGVUSmFhzvxv8I9aAEh_ID2PA-zOv66q5pRFMRopvXOTP1sEVpNJVvBT-B7xc1Fm_E3s6LImK3UBqrjuCRwND4Ixa_z9znOGSsNBmfC0JOwDeWk4_CiyjNbRTeh4aGcjUgmr-jG5ZzODLt4JMSG9ROWMFUhrH68WY1_k227vGCDFRJoiPuoyVQS49VIUGTwBv_LINk-xPJJrufrbcrefL4z9Cp2dDd9-wNQdiPMEcU_yfiDatXXfdan4Zht6VhR7evCr6OE26we6kRSiYNQquMsOJAc5A1wtToKgcobI09y9YZKinV0RWsYAbNua4-kNwQhoYhIA6Si-aGDIOppyZbjprC8Iv59j-Yc4XDgZoRZEZPDqdrnzQcmHNWJBC31sR_4cYWcUTdNclij_ucDpVdU1iad1NAxrlL0SX8hqej0tw5mQpFXmmMOU-uyZ3DBxrkNLYdy1aLqqLpCcNEu1EcvreES9iz9KbIpiegMZY-UXCnik-d7tP7nBvUB3YB68K49h4aEfxXGjaUs__6Qf0-d33iF5eRSsEKtW-FJAqPVGBF8PuDxhHoVGnUQDCZjr4H6oIZZvM0XaXzxWq1nPEs5ut4zWZWWInZtY6chv9915G29Ln0fNCTQ3JdfVHebNC371z8qawTq7NOy6y2tu2F2n9WKsq2ywPKnhZSHqabTxL5gyRCS2FMR9KOnpJ1GEezOssxZTFjuFywZVREMSarxSLlEVEQJXFazCTLUZqMhgzNSfqCQu-CnmmSzEQWhVE0n8_TeRquwmWQr_MyoVUYL6KQs9JbhLhnQgYOR6B0NdNZD4l-nhh6KYWx5vKSkhZVg9iHI_-so_rp7NcjM41Qb7M-dtZj_wsMgboV">