<table border="1" cellspacing="0" cellpadding="8">
<tr>
<th>Issue</th>
<td>
<a href=https://github.com/llvm/llvm-project/issues/107625>107625</a>
</td>
</tr>
<tr>
<th>Summary</th>
<td>
[clang-tidy] misc-include-header Not directly included & not directly used issue
</td>
</tr>
<tr>
<th>Labels</th>
<td>
clang-tidy
</td>
</tr>
<tr>
<th>Assignees</th>
<td>
</td>
</tr>
<tr>
<th>Reporter</th>
<td>
mnorfolk03
</td>
</tr>
</table>
<pre>
The misc-include-header check for clang tidy is not properly identifying which header provides a particular function.
I believe this likely due to the function having an overload defined in different files.
Reproducibility:
```cpp
// clang_tidy_issue.cpp
#include "clang_tidy_issue.h"
#include <unistd.h>
int main() {
time("hello", [] { sleep(1); });
}
```
```cpp
// clang_tidy_issue.h
#pragma once
#include <chrono>
#include <functional>
#include <string>
inline size_t time(const std::string& prefix, std::function<void()> func) {
auto thread_local timer_start = std::chrono::high_resolution_clock::now();
func();
auto thread_local timer_stop = std::chrono::high_resolution_clock::now();
const size_t dur = std::chrono::duration_cast<std::chrono::nanoseconds>(timer_stop - timer_start).count();
printf("[%s] took %ld nanos", prefix.c_str(), dur);
return dur;
}
```
```
$ clang-tidy-18 --checks=misc-include-cleaner clang_tidy_issue.cpp
...
2 warnings generated.
/scratch/mnorfolk/Code/Clion/CppTesting/clang_tidy/clang_tidy_issue.cpp:5:1: warning: included header clang_tidy_issue.h is not used directly [misc-include-cleaner]
5 | #include "clang_tidy_issue.h"
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~
6 | #include <unistd.h>
/scratch/mnorfolk/Code/Clion/CppTesting/clang_tidy/clang_tidy_issue.cpp:9:5: warning: no header providing "time" is directly included [misc-include-cleaner]
6 | #include <unistd.h>
7 |
8 | int main() {
9 | time("hello", [] { sleep(1); });
| ^
```
---
In this example, I believe it is trying to find the `time_t time( time_t *arg );` function defined in `<time.h>`
https://en.cppreference.com/w/c/chrono/time
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJy0VkuP4jgQ_jXmUkoUHPLgwIGBQdrLHlZzR8auEG8bO7IdetjD_vaVnYTHQrdaq1nUDYldrq_qq4eLOSePGnFFim-k2M5Y71tjVydtbGPUW5bPDkZcVj9ahJN0PJGaq15g0iITaIG3yN-gMRa4YvoIXooLSAfaeOis6dCqC0iB2svmIvUR3lvJWxhPd9acpUAHDDpmveS9YhaaXnMvjU5JtiXZevj-DQ6oJJ4RfCsdKPmG6gKiR_AGfIvXU9CycwBiGswZrTJMgMBGahQgNQjZNGhRe2ikQveAMXz_gZ01oufyIJX0F5Kvn2VImQ1_vOvGFbojdDewsA8s7KVzPaZ3AvnIHRBKn-RaQumzYL7ptXRepC3Jv98bILWHE5Oa0JrQJZDq27AOAODlCeM6bVEpExTTDQzxDZLgFGJHaD0ndEnyb0Cq7fA0IlTbl77-NwLaq1edZccTA6M5vvKUt9Zoc_PzYXOKLlMfCDhvpT4-saSkRnDyL9z7iRdutPPgvAiRzdfjQVpCZ7GRPwNX180JluSbs5FiYJvk32O2PRHP-piLFpnYK8OZipB27zyzHki-vSmenA3PrTy2e4vOqD5g7bky_G3Y0uZ9wrzDGcCflj-GN92vQh_JGwgVvf1Yr-gtGxQy52OAXghppo1DbrRwIXS0vrM4uWeP0GXKTa_9C787K7VvhowPWU4LFzLdG_MGhBZKQIQZ62CIcsr3zttRGd0EV_6t1qLvrY47z5XxaU1M-bkYqiEJ1ZDMa0iS2C4dybcPvZQrZBrtJ80jTcdGReGdWS310cERNVrmUaTXAnTcMs9bQndT_yZ0tzECw48KeUx3m677gc7HnN_dEB9e7uDzdUHy9Zzk6wk5PI6Wi6mRP1f9dAn0DgUIaZF7dQlN6JXnpNjeeC-AVBv4cruE-IlHiu9_f_K5iZdPCK_67P9E53Kk9J5ObR5vxHB_EUqHhkUDlVcGr8x_hcovORoEq0Hw-l7H988umWWU-BXXzUMAPymvJEkeBgI9TAL4k506hQHzNiNIH0jzNo4c3kAjtYhTAimzYO_tNoDxldA1s4H1aFiZ3eaJu-EhWJRvwomBv8nA1vvOhY4W70DUIdQW45zBMeXmROjuPaRE-B_aH90FNTOxysUyX7IZruYVLcpFUVbVrF3RsqF1U2V13cxpTQueZ5jVC1zSuuYiYzO5ohldZMusnNfZfF6ldH6geVUtFgUuWCkqssjwxKRKlTqfUmOPs5iFq3lWlbSYKXZA5eLUN5ZXMuQtDVOgXYVTyaE_OrLIlHTe3fR46VWcF--OFduX4-Hvxr9KXVrG3nDdiU0imjfrrVo90nmUvu0PI4vBiPEn6az5E7kndBePOkJ3o3PnFf0nAAD__xP2Ug4">