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

    <tr>
        <th>Summary</th>
        <td>
            libclang leak file descriptor for c++ feature __has_include
        </td>
    </tr>

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

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

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

<pre>
    Platform: MacOS
Background:
1. Use ccsyspath to include compiler path.
2. Use simplest libclang call:
index = Index.create()
index.parse(header, args)
args has only ccsyspath include, like
['-isystem', '/usr/local/include', '-isystem', '/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/usr/include/c++/v1', '-isystem', '/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/clang/14.0.0/include', '-isystem', '/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/usr/include', '-isystem', '/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include', '-isystem', '/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/System/Library/Frameworks', '-x', 'c++']
3. after parse, I found libclang leak fd for:
/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/usr/include/pthread.h

4. I find it's because this content:
usr/include/c++/v1/__config: (defined(__MINGW32__) && __has_include(<pthread.h>))
and the backtrace is the following:

`
"0x10bd3e87b libclang.dylib!llvm::sys::fs::openFile(llvm::Twine const&, int&, llvm::sys::fs::CreationDisposition, llvm::sys::fs::FileAccess, llvm::sys::fs::OpenFlags, unsigned int)"
"0x10bd3cbfe libclang.dylib!llvm::sys::fs::openFileForRead(llvm::Twine const&, int&, llvm::sys::fs::OpenFlags, llvm::SmallVectorImpl<char>*)"
"0x10bd3e92b libclang.dylib!llvm::sys::fs::openNativeFileForRead(llvm::Twine const&, llvm::sys::fs::OpenFlags, llvm::SmallVectorImpl<char>*)"
"0x10bd0ef62 libclang.dylib!(anonymous namespace)::RealFileSystem::openFileForRead(llvm::Twine const&)"
"0x109c6f9fb libclang.dylib!clang::FileSystemStatCache::get(llvm::StringRef, llvm::vfs::Status&, bool, std::__1::unique_ptr<llvm::vfs::File, std::__1::default_delete<llvm::vfs::File> >*, clang::FileSystemStatCache*, llvm::vfs::FileSystem&)"
"0x109c6c0fb libclang.dylib!clang::FileManager::getStatValue(llvm::StringRef, llvm::vfs::Status&, bool, std::__1::unique_ptr<llvm::vfs::File, std::__1::default_delete<llvm::vfs::File> >*)"
"0x109c6c4d9 libclang.dylib!clang::FileManager::getFileRef(llvm::StringRef, bool, bool)"
"0x109fa7e10 libclang.dylib!clang::HeaderSearch::getFileAndSuggestModule(llvm::StringRef, clang::SourceLocation, clang::DirectoryEntry const*, bool, clang::Module*, clang::ModuleMap::KnownHeader*)"
"0x109fa866e libclang.dylib!clang::DirectoryLookup::LookupFile(llvm::StringRef&, clang::HeaderSearch&, clang::SourceLocation, llvm::SmallVectorImpl<char>*, llvm::SmallVectorImpl<char>*, clang::Module*, clang::ModuleMap::KnownHeader*, bool&, bool&, bool&, llvm::SmallVectorImpl<char>&) const"
"0x109faa13d libclang.dylib!clang::HeaderSearch::LookupFile(llvm::StringRef, clang::SourceLocation, bool, clang::detail::SearchDirIteratorImpl<true>, clang::detail::SearchDirIteratorImpl<true>*, llvm::ArrayRef<std::__1::pair<clang::FileEntry const*, clang::DirectoryEntry const*> >, llvm::SmallVectorImpl<char>*, llvm::SmallVectorImpl<char>*, clang::Module*, clang::ModuleMap::KnownHeader*, bool*, bool*, bool, bool)"
"0x109fede4f libclang.dylib!clang::Preprocessor::LookupFile(clang::SourceLocation, llvm::StringRef, bool, clang::detail::SearchDirIteratorImpl<true>, clang::FileEntry const*, clang::detail::SearchDirIteratorImpl<true>*, llvm::SmallVectorImpl<char>*, llvm::SmallVectorImpl<char>*, clang::ModuleMap::KnownHeader*, bool*, bool*, bool)"
"0x10a00d3f3 libclang.dylib!EvaluateHasIncludeCommon(clang::Token&, clang::IdentifierInfo*, clang::Preprocessor&, clang::detail::SearchDirIteratorImpl<true>, clang::FileEntry const*)"
"0x10a00a1f5 libclang.dylib!clang::Preprocessor::ExpandBuiltinMacro(clang::Token&)"
"0x10a0089c6 libclang.dylib!clang::Preprocessor::HandleMacroExpandedIdentifier(clang::Token&, clang::MacroDefinition const&)"
"0x10a026a85 libclang.dylib!clang::Preprocessor::HandleIdentifier(clang::Token&)"
"0x109fc3e94 libclang.dylib!clang::Lexer::LexTokenInternal(clang::Token&, bool)"
`

5. EvaluateHasIncludeCommon function may have problem as it open's File but return File.has_value() but not close it.
[source code](https://github.com/llvm/llvm-project/blob/main/clang/lib/Lex/PPMacroExpansion.cpp#L1265)

And I suggest a fix like this:
`
  // Get the result value.  A result of true means the file exists.
  bool ret = File.has_value();
  if (ret) {
    File.closeFile();
  }
  return ret;
`


</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJzVWNuS2jgQ_Rp4UcXlC9cHHhgYEioz2VTIZvNGyXIbtCMsryRP4O-3JWMDg-dCMrtJqly2LLWk06dbLaljmexGHwU1qVSbVjQmt5T9sWj505Y_vqLsbqVkkSXYUFYFHvlTA2FM73ROzZoYSXjGRJFgpdzkXIAitsEr5cNSXvNNLkAbInjMBM1WhFEh6lF5lsCWtKIpmduSxxRQA61w0AqHRxJeTpW21WugCahWOCFUrXQtZH_ImmoiM7E7wrgHaOUFv4NSuNW9aoX9NxyFDGywaJvdZ1ZoHHsmJGLEb927kmjsM85zwRk1XGYIaPaVyQQ8mudYnsjMQGZs9RTuQcjcYp9VpNt6R_pXL6_scCq5mL4_EtLJXY2xxjZjrfDKPbP74NWhfpZSsDXlB_kppLQQxtsyU7UdiOOxBWTNjN-g4_me_7vw-FOJ-zUZWuwhzG54rKjaYWmm6Aa-SXWnj7BuD-XaGfut7rRcbpFHaGpccHBreELmJLWh5RASBNA7kiZYrerI8PM9YpabNYajxFvvEbl3x7P4MSoRblBNTWJgtMBIZ9ZcYyR0uGotnl6ss-USO6R8ZcMvRrcEcGBIsLRc3s4_vP0rCpdLDHLY1sOHLJcY45b1aINWNDlgjK5tOKwjIgI0ayAxRnKjKAOC6GxFKoWQ33i2OjBdvnt-RXzobwM_TiIY9OPaSF6yc8s7EOLebhf4oIuWhXT_RW6zGW4ECO0g9Rkns1tEpo1TY4JRuSo9MdbE7gRo-SnXudTcFp_pYWceMwZaPyP4h4Up6MrJFZnmKyS9RIUEhg9pYHEK30XDTKpPaJvXYOME8kFuscHN9AtgRFFz3GfRHzCuKOcK42ZlYBhebtMPaIl7eLlK_4MiPqS98FwRBEYzme02stAkw1iF5wAGdgQ3DWIXVo19ZLvYWmdAhqyXDtMGRstNsPbLcsKFoWZC2RrKhhWYk9kWRuG6_ATpKTf3FXe2e6H3HMe4idivNknZulwGZaHI-D8FLHOD_E0ahilXaFPPpNyilgkIwFPY472ja1LZZkKeUbUUemSkaot5hFvmv4DbW5rRFaiaUzv1FyoK-P3JbeSkkwwv5sTWOd0fY6TSuPyez5vSPgT-k_O-c2fzBVDF1icTj7NkUaxWeAu4lUkhnrDL0WgLWSgGN7Lc_x80TrlysWJ3nRm1qxbo-FiRI-lq1ofeWtbf0rz8fZ_Jb9m7_QWjkfyUDnq9hr2gCdmNlHfFfuSyfLYzHqneewDthMuz1nNuXhpJL5H8cQYra_QeL74Ijo0OlZHPTEKDKLnQL5-3xzN0NzhZAoZyse_g5kJXmOO5lx4UMqoAp9D393xgw7FSdGcRR5PziJNTbqPUg9BwvmResLCqmPSre1pz8YmwBgl00ifd56OCXEl7rJSqwX1euiybgu2ruM-zNv0R__oPbfydtjyzIfX9JEqjcxte3-MhgBp4R_W8vDJN5GZjDXNstM_yDrLzEDtP8BrHUw5qnqXyXIcTrzjr_brWbFKZBmn3Qre93uZ4K7wquDA8w4uvko8x0TThAI8eF074DqezdsaZyrkhOdD6Iiu4vlN7K3YXwKdO4tQPe3RwKSclxOdRNUQOhnepzpPT3cC2OoJh0Q02z9AJMptdfEz7My-v7-Xu3fXIY35N0iJjjqYN3ZE1vQeC2sYCNoRqwg2xNx2XsrBORuLCEAWmUJn792xq4X5_bLb7rW3PpEFzSA3Y3auzp9rFOWLTMTbLEw7WxuTuBBvO8Flxsy5ij0mbc3EBovy8QTR_Y4DA31hImynclDmwKmFYpg-RKpvJ-XjwG406eczmfaKbIOx16yRH-cbjJZkTXZ4wCSUp37psr8vIWFSnPBJSwiRvwbiMiAKN53LidPcIGVcVMiV2jZINIIQyd2J5gy3XRnvVYNZelkeXxG4ishVdVbI8tVkeZa99Q9Lq1_Wk7OiY3m8rpx1b_WlV3JvMDlK1P3CRNoyCXq8fDPtBFLaTUZQMoyFtG24EjB7k3KxCCWimeI6RySbgyD5FRVLAC5GC06RTu1BidLG5udYF2HRbd9D3g_Z6NOwGfp91gn4SQ9jth5DEPo2ClIWQ9v2w0xY0BqFHLlUfZvCNuCHsouhO23wU-mEY-FHg94JBN_QY9bswoAPWG_jhIO22Oj6gbwnP4vCkWrXVyEGKi5XGRuEsWDdS7VJA4KbD8Wlh1lKNtpzKXaGiTr_tZh859P8Cw1LYRA">