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

    <tr>
        <th>Summary</th>
        <td>
            clang-tidy 15.0.7-18.0.0git: AllowedTypes can not be used with template specilization
        </td>
    </tr>

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

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

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

<pre>
    Here is simplified example:

```c++
#include <string>

template <typename S> struct Foo {
  double x;
  double y;
  S s;
};

double my_super_func(Foo<std::string> v) { return v.x + v.y; }
```

clang-tidy (15.0.7 from distort and 18.0.0git build by hands) reports:

```
test.cpp:9:39: warning: the parameter 'v' is copied for each invocation but only used as a const reference; consider making it a const reference [performance-unnecessary-value-param]
    9 | double my_super_func(Foo<std::string> v) { return v.x + v.y; }
      | ^
      |                      const &
Suppressed 4 warnings (4 with check filters).
Found compiler error(s).
```

But I have such option in clang-tidy's config:

```
performance-unnecessary-value-param.AllowedTypes: 'Foo<std::basic_string<char>>;Foo<std::string>'
```

The problem looks like here https://github.com/llvm/llvm-project/blob/69e47deca97b9a7f7394e5472095ee32e46f1831/clang-tools-extra/clang-tidy/utils/Matchers.h#L111

`ND.getQualifiedNameAsString()` returns just `Foo`.

But if use for example such code:

```
 std::string QualName;
      llvm::raw_string_ostream OS(QualName);
 ND.getNameForDiagnostic(OS, ND.getASTContext().getPrintingPolicy(), true);
```

then `QualName` == `Foo<std::basic_string<char>>`.

I suppose there is also way to get `Foo<std::string>`, because of `clang -Xclang -ast-dump` generates suitable infromation:

```
FunctionDecl 0x5645b2414700 <line:9:1, col:62> col:8 my_super_func 'double (Foo<std::string>)'
  |-ParmVarDecl 0x5645b2414600 <col:22, col:39> col:39 used v 'Foo<std::string>':'Foo<std::basic_string<char>>' destroyed
```

The whole idea to specify that `std::optional<CertainType>` is ok to copy, but in general case is not ok,
so I can not use `std::optional` in AllowTypes.
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJy0VsFu4zgS_Rr6UrAgU7IkH3xw7BjbwG5vL9JYzC2gqJLFDkUKJOXE8_WDomwn8aQzPYcRBEWhSVXxvVevKLxXB4O4Zss7ttzNxBg669aNOGKvdEA3q21zWv8LHYLy4FU_aNUqbABfRD9oZNmGpTuWXp5FOt2S8Tu6p1GeKSP12CCwbOuDU-bAsvu3CwP2gxYhTginAY3oER5Ydg8-uFEG2FsLrDx_EKCxY60RXlh2O3R6M_QA_vofK3ev7_F5XtCfHv04oHtsRyMZr_bWxiwb2lu2uaYLR8ZXlAM4DKMzcExegPE7OCYUEyjAexDeBpNamMM8qOYEjFeLZZImJbTO9tAoH6wLIEwDiypJk_SgAtSj0g3UJ-iEaTxFdjhYF_zPEL_g6EMih4FlmxXLNhk94Fk4E_ewgdAhDMKJHgM6YLw8Ml4StdIORGtrHaCQHShztFIEZQ3UYwBr9AlGjw0IDwKkNT6AwxYdGom0fRpSDTroxZMyB1Dhz_OALe8GdK11vTAS56MxKNF74U7zo9AjzmNubLm7MAhAkG_hn-IK4kUR2PL-dujDa9oS48U0-2EcBoeekMkvQHuiOIdnFTqQHconaGMxEY3JtGxvR9OAtP2gNDpA56xjvHoz40MV3Y0BvkAnjgh-lB3YITKkDLzqi_GS6DStOnyulV9gItlobZ-x-X4akJRHirnBvBZeyccL8lvZCUe1Tffdz-hhvPxkk99Jo87WGnvQ1j550OoJoSMT6kIYYgnwPeP7gwrdWCfS9ozvtT5e_swHZ3-gDIzva21rxvfFCvOyQSlWZb0SZVtmqxyXecnT1RIx45gX7aLKFozvz0haq_0cX4ITr2MR3f0YlPaM7_8jguzQ-aRjPPv3YrG4wfrrLjlg-N8oJsv8Knrc-IcJA14xvmJFetanhx8jqapICbIiTW5JVy1V31Sek_NOApC2-akHn-V8Az9QQpTLG5-kK8IX5znxfObz0frgUPTw3wfGq-tCvnpdO22ShvfW7ZQ4GOuDotqkNdvz75uH71trAr6Eaec09s0pE5Q5fLNaydMZEb6F4MZ3IT7USOjQEFzXnIoUWLZj2e4C4i9J9AbpL-DHYbAeySenlie0t_AsThAsHDB88PVXVRcp5V-jFMSVbWlyVA7Mfzv_FT7Mm7EfKN8DGnQioAc_qiDI35ShlhBt93NW96ORNGuHUkP6sizyZc3zRV6mhMNWK4PnFrCgnKTVLNsUnKxxeq_eeykV9tljP7HVyFB5UQ0rt_NvwvX_F-42jWJKYwrF-WsK1JDur-9TRzl-4CrvrILK_ddth5fQoA_OnrD5C5d57iyB3qAgev2AUrUnCJ2IPF9jTS4rNMu2W3RBKEN-ODFOGrFPtFza4RT5p3I1Z3Y1SOGjkIwNYJ8Y307hvYUvIIWJ4ySXDwPS9w1EE44WnMyaddasspWY4XpRrPhyWVY8nXXrfCUXVSYLvhANtqXAoi2LQtQFX4o8b_hMrXnKs7Ti6aJalmmaVFm1WrTZIsWmLmXdsDzFXiidkBMk1h1myvsR10Ve5XymRY3ax3Mi5wafIf7IOKdjo1tH163Hg2d5qpUP_vUrQQWN6zfnn-nwM7-edaivvO0zV1hqnAQSG-n1hBhp0ur3WCWz0en1324KMXey8Li3PwIAAP__AQpSRA">