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

    <tr>
        <th>Summary</th>
        <td>
            [clang-tidy] `hicpp-ignored-remove-result` matches `std::unique*::release()`-like calls even though it is only supposed to match 3 specific functions
        </td>
    </tr>

    <tr>
      <th>Labels</th>
      <td>
            bug,
            clang-tidy,
            new issue,
            false-positive
      </td>
    </tr>

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

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

<pre>
    [`hicpp-ignored-remove-result`](https://clang.llvm.org/extra/clang-tidy/checks/hicpp/ignored-remove-result.html) is a subclass of [`bugprone-unused-return-value`](https://clang.llvm.org/extra/clang-tidy/checks/bugprone/unused-return-value.html), initialised by passing three very specific functions (as documented) to the matcher regex of the parent check:

https://github.com/llvm/llvm-project/blob/31880df9947d58c160b691160c4714277be7c31e/clang-tools-extra/clang-tidy/hicpp/IgnoredRemoveResultCheck.cpp#L15-L20

However, it looks like the filters do not work. At first, I found a report on `std::unique_ptr<T>::release()`, which (according to the docs), should've only came from `bugprone-unused-return-value`, and **not** from `hicpp-ignored-remove-result`.

The problem goes deeper, however. It looks like when using `hicpp-ignored-remove-result`, it accepts a `release()` function for everything that begins with `std::unique`, whereas it shouldn't care about `release()` functions at all.

The issue appeared from a build of the upstream project on March 28, 14:00-ish UTC. (Last touch of the involved checkers is March 4.) Unfortunately, log rotation in our CI already ate the exact commit hash.

Ping @PiotrZSL, @bjosv, and @felix642, you were poking around this check.

----

## Reproducer

http://godbolt.org/z/brMKGc51n

### Code

```cpp
#include <algorithm>
#include <memory>
#include <mutex>
#include <vector>

void test0()
{
    std::vector<int> V;
    std::remove(V.begin(), V.end(), 42);
}

static std::mutex Mu;

extern void foo();
extern bool condition();

void test1()
{
    std::unique_lock<std::mutex> Lock(Mu);
    foo();
 Lock.release();
}

struct HTTPWorkItem {};

void test2()
{
    std::unique_ptr<HTTPWorkItem> Item(new HTTPWorkItem());
    if (condition())
 Item.release();
}

struct Disposable {
    void* release();
};

struct UniqueDisposable {
    void* release();
};

void test3()
{
    Disposable D;
 D.release();

    UniqueDisposable UD;
 UD.release();
}

namespace std {
    struct unique_disposable {
        void* release();
    };

    struct uniquely_disposable {
        void* release();
    };
}

void test4() {
 std::unique_disposable StdUD;
    StdUD.release();

 std::uniquely_disposable StdUD2;
 StdUD2.release();
}
```

### Outputs

#### `bugprone-unused-return-value`

```
<source>:9:5: warning: the value returned by this function should not be disregarded; neglecting it may lead to errors [bugprone-unused-return-value]
    9 | std::remove(V.begin(), V.end(), 42);
      | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
<source>:30:9: warning: the value returned by this function should not be disregarded; neglecting it may lead to errors [bugprone-unused-return-value]
   30 | Item.release();
      |         ^~~~~~~~~~~~~~
3 warnings generated.
Suppressed 1 warnings (1 with check filters).
```

#### `hicpp-ignored-remove-result`

Except the **first** one, none other should appear!

```
<source>:9:5: warning: the value returned by this function should not be disregarded; neglecting it may lead to errors [hicpp-ignored-remove-result]
    9 | std::remove(V.begin(), V.end(), 42);
      | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
<source>:21:5: warning: the value returned by this function should not be disregarded; neglecting it may lead to errors [hicpp-ignored-remove-result]
   21 |     Lock.release();
 |     ^~~~~~~~~~~~~~
<source>:30:9: warning: the value returned by this function should not be disregarded; neglecting it may lead to errors [hicpp-ignored-remove-result]
   30 |         Item.release();
      | ^~~~~~~~~~~~~~
<source>:62:5: warning: the value returned by this function should not be disregarded; neglecting it may lead to errors [hicpp-ignored-remove-result]
   62 |     StdUD.release();
      | ^~~~~~~~~~~~~~~
<source>:65:5: warning: the value returned by this function should not be disregarded; neglecting it may lead to errors [hicpp-ignored-remove-result]
   65 |     StdUD2.release();
      | ^~~~~~~~~~~~~~~~
6 warnings generated.
Suppressed 1 warnings (1 with check filters).
```


</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJzUWFtv47oR_jX0y8CGREm-POQha296Ft1FF7ubLdCXgiLHFk9oUuXFifvQ316Qkm-J7eSgiyLHCBxLJGfm-2aGHA5zTq404g2pPpBqMWDBN8bePDbStWil3w5qI7ZpdJw1krftUK60sSiGFtdmg0OLLihPxhmpFoROG-9bR4pbQu8IveOK6dVIqc16ZOyK0Dt88pbtBoZeim18aJA_OELvkgJC786qGDV-rQidgXTAwIWaK-YcmCV01tVh1VqjcRh0cGmxD1YPN0wF_DXm7TQQendGx84-QucgtfSSKelQQL2FNtKsV-AbiwgbtFtwLXK5lByWQXMvjXZA6JQ5EIaHNWqPImL1BnyDsGaeN2jB4gqfIuT4smUWtYdkXoSULUjWf5_CXEnfhHrEzZrQu4i2_zdsrfkduY_QlKkJvSvy6TQTy9msnIhqyvNxVo9neT7OeDnJSzqZ1DjhRY4HioxRbniWtp0zP3XO_JZ8-S25ch5NHqXh4nNeDT_T7Nj638wjbtAmIj0oYx4cKPmACfVSKo828gTaeHg09mEEtx6W0jofl3yCpQlaAAOLrbEejAYyzpwXkZDiNmj5r4D_bL0lxfwHKT52ry0qZA4JnUYfjrMo6rGRvEl-4dxYkVzYOUQY7npfu8YEJQidbBCMVlvgbI2wtGYNb4hKOgemBRB6S-itNr77sV9-PeVGx6z9iCFhTa1wDSuDDgRi27HYdISO4NMJnY8NaggpMl_P7s4ZjHNsfUxAMs6eU7aPZVgaC1Hj1jdd3DMPNa6kdvAofXPGH3vG0SJzUVXHqyZ04oEzi8BqE_xVvQ6YB6bUC16kcwGBtS0yi6Jjl0EdpBK7bAqt8xbZGvqkiGHzhVneQFQzh7wkxW2WDaVr4P7HfBTD4jNzHrwJvNlJkXpj1AZFl5UxTqXrxZSjmND3emmsD5p5VNsoV5kVWONZ4k1qMMHC_BMwZZGJLTDfhT0-Me6Bm_VaemiYa04wfk0-LLOv0nj7j--fo2BSZvXvxm32IVZmS1TyaVzS-GprAjyiRWjNQ1zNbMoa30jXGX-iYDgcDo-fCS0ILeAbttaIwNE-330Om48RtVG-32D_Hfca--Wvf-FVrl8KjDLnRuDJyDjr_uJ-sZsrNVdBIJBiztTKWOmbdUzlM-NrXBu7vTQYPD5dGNsg98YeBtP3xkgBHp3P-vDrxiYfuh8AAPvI3gmYS-1J8RF-kuLctC7VCJ3-HKUc6QXTOfwcoRaHx-i42V4GmSyODXMxhPhBakIGX8JhfvrGJ49WQ4KxNKYXvpvTj9bGKOBGCxmj8tmcZzzkr_PQ77jKxHNqfmph5OVzHKDTL-FYTZTw0sA0d3S6AVwkxAbu4bcfP77-3diHTx7XEO2bLC5BoW-G0h0ex6IjjvSfTjU-nmjdOfAUm1zGHeQ5yTvtSdYfwrmQrjWO1QrhxPSILp4ol2WdstGLu09Af5XQPcXFRYqPVB1Ww-ISB_t1Lwy9P1p-f3H9KYeardG1jGP0NDxzfeKjd7y4QMjrpMQZL4l5oUFtf6WOU5R7L5TduiPxzwP8yIbvXhxTCtC9ue6YZ_JOUaX19CCye37VU7tz4Pyx8bfg2-Dd2cE4_oZa7Nyh0z8Wc2eC5diVizNS3FakuIVHZrXUq_gzHtJJEnRiu8o_Haf7sqgraVLdWiMI6SyumBUoSPEBNK4Uch_PYulhzbagkIlYcKK1xrp4zbmKoFocXBR9O_-fj5gu5qIkUn38z6ufs1wVWU_YuyWryBLEKzvugYfd5zkf3bxih9HBCjVa5lH0ZdT30LYWXbwQ5odZhE7zriJOJdfuckPobPSWoO_j-pXK_Wjlx6dYvif6u4tGf2tKd450s52DNhrB-Hjd7F3Q1c2E5n-CDLnGxftMEJq_c65ovg_9K9XXfs751Hg3u8IbQfebwu7zps3hTcjH9J27e0z3yK8d9FdC_zzu6r3jrk5xXypIruV8N2P8_zkGBuKmELNixgZ4k09ymk1oWVWD5qZcLukkQzrJigmblnyClIp6Wi5FPaUlVgN5QzNaZmVG86rMqmo0pZQVecbzvCwEThgpM1wzqfa90UHqoNxMJ0U1GyhWo3KpKUxpHVaEUkLnhNLj_l__Kl6G0tr9myVTDoetcdLLTXpdLQb2JjUk67BypMyUdN4ddHvpVepQH8mvFq-ffH3b1J1rN9Hb822_YeqMcaaUA9ygBt-YsGpidEnX9fdcaFsTPehNpwGKM-3cQbDq5g_3YRNVjtC7xPR_AwAA__8tvUdB">