TEST_F(ClangdVFSTest, SearchLibDir) { // Checks that searches for GCC installation is done through vfs. MockFSProvider FS; ErrorCheckingDiagConsumer DiagConsumer; MockCompilationDatabase CDB; CDB.ExtraClangFlags.insert(CDB.ExtraClangFlags.end(), {"-xc++", "-target", "x86_64-linux-unknown", "-m64", "--gcc-toolchain=/randomusr", "-stdlib=libstdc++"}); ClangdServer Server(CDB, FS, DiagConsumer, ClangdServer::optsForTest()); // Just a random gcc version string SmallString<8> Version("4.9.3"); // A lib dir for gcc installation SmallString<64> LibDir("/randomusr/lib/gcc/x86_64-linux-gnu"); llvm::sys::path::append(LibDir, Version); // Put crtbegin.o into LibDir/64 to trick clang into thinking there's a gcc // installation there. SmallString<64> DummyLibFile; llvm::sys::path::append(DummyLibFile, LibDir, "64", "crtbegin.o"); FS.Files[DummyLibFile] = ""; SmallString<64> IncludeDir("/randomusr/include/c++"); llvm::sys::path::append(IncludeDir, Version); SmallString<64> StringPath; llvm::sys::path::append(StringPath, IncludeDir, "string"); FS.Files[StringPath] = "class mock_string {};"; auto FooCpp = testPath("foo.cpp"); const auto SourceContents = R"cpp( #include <string> mock_string x; )cpp"; FS.Files[FooCpp] = SourceContents; runAddDocument(Server, FooCpp, SourceContents); EXPECT_FALSE(DiagConsumer.hadErrorInLastDiags()); const auto SourceContentsWithError = R"cpp( #include <string> std::string x; )cpp";
//{ CppCheck int CppCheck::ExecuteCppCheck(cbProject* Project) { if ( !DoVersion(_T("cppcheck"), _T("cppcheck_app")) ) return -1; TCppCheckAttribs CppCheckAttribs; wxFile InputFile; CppCheckAttribs.InputFileName = _T("CppCheckInput.txt"); if ( !InputFile.Create(CppCheckAttribs.InputFileName, true) ) { cbMessageBox(_("Failed to create input file 'CppCheckInput.txt' for cppcheck.\nPlease check file/folder access rights."), _("Error"), wxICON_ERROR | wxOK, Manager::Get()->GetAppWindow()); return -1; } for (FilesList::iterator it = Project->GetFilesList().begin(); it != Project->GetFilesList().end(); ++it) { ProjectFile* pf = *it; // filter to avoid including non C/C++ files if ( pf->relativeFilename.EndsWith(FileFilters::C_DOT_EXT) || pf->relativeFilename.EndsWith(FileFilters::CPP_DOT_EXT) || pf->relativeFilename.EndsWith(FileFilters::CC_DOT_EXT) || pf->relativeFilename.EndsWith(FileFilters::CXX_DOT_EXT) || pf->relativeFilename.EndsWith(FileFilters::CPLPL_DOT_EXT) || (FileTypeOf(pf->relativeFilename) == ftHeader) || (FileTypeOf(pf->relativeFilename) == ftTemplateSource) ) { InputFile.Write(pf->relativeFilename + _T("\n")); } } InputFile.Close(); MacrosManager* MacrosMgr = Manager::Get()->GetMacrosManager(); ProjectBuildTarget* Target = Project->GetBuildTarget(Project->GetActiveBuildTarget()); // project include dirs const wxArrayString& IncludeDirs = Project->GetIncludeDirs(); for (unsigned int Dir = 0; Dir < IncludeDirs.GetCount(); ++Dir) { wxString IncludeDir(IncludeDirs[Dir]); if (Target) MacrosMgr->ReplaceMacros(IncludeDir, Target); else MacrosMgr->ReplaceMacros(IncludeDir); CppCheckAttribs.IncludeList += _T("-I\"") + IncludeDir + _T("\" "); } if (Target) { // target include dirs const wxArrayString& targetIncludeDirs = Target->GetIncludeDirs(); for (unsigned int Dir = 0; Dir < targetIncludeDirs.GetCount(); ++Dir) { wxString IncludeDir(targetIncludeDirs[Dir]); MacrosMgr->ReplaceMacros(IncludeDir, Target); CppCheckAttribs.IncludeList += _T("-I\"") + IncludeDir + _T("\" "); } } // project #defines const wxArrayString& Defines = Project->GetCompilerOptions(); for (unsigned int Opt = 0; Opt < Defines.GetCount(); ++Opt) { wxString Define(Defines[Opt]); if (Target) MacrosMgr->ReplaceMacros(Define, Target); else MacrosMgr->ReplaceMacros(Define); if ( Define.StartsWith(_T("-D")) ) CppCheckAttribs.DefineList += Define + _T(" "); } if (Target) { // target #defines const wxArrayString& targetDefines = Target->GetCompilerOptions(); for (unsigned int Opt = 0; Opt < targetDefines.GetCount(); ++Opt) { wxString Define(targetDefines[Opt]); MacrosMgr->ReplaceMacros(Define, Target); if ( Define.StartsWith(_T("-D")) ) CppCheckAttribs.DefineList += Define + _T(" "); } } return DoCppCheckExecute(CppCheckAttribs); }