Index: cfe/trunk/lib/Driver/Driver.cpp =================================================================== --- cfe/trunk/lib/Driver/Driver.cpp +++ cfe/trunk/lib/Driver/Driver.cpp @@ -21,6 +21,7 @@ #include "clang/Driver/ToolChain.h" #include "llvm/ADT/ArrayRef.h" #include "llvm/ADT/STLExtras.h" +#include "llvm/ADT/StringExtras.h" #include "llvm/ADT/StringSet.h" #include "llvm/ADT/StringSwitch.h" #include "llvm/Option/Arg.h" @@ -33,6 +34,7 @@ #include "llvm/Support/FileSystem.h" #include "llvm/Support/Path.h" #include "llvm/Support/PrettyStackTrace.h" +#include "llvm/Support/Process.h" #include "llvm/Support/Program.h" #include "llvm/Support/raw_ostream.h" #include @@ -927,6 +929,35 @@ } } +/// \brief Check whether the file referenced by Value exists in the LIB +/// environment variable. +static bool ExistsInLibDir(StringRef Value) { + llvm::Optional OptPath = llvm::sys::Process::GetEnv("LIB"); + if (!OptPath.hasValue()) + return false; + +#ifdef LLVM_ON_WIN32 + const StringRef PathSeparators = ";"; +#else + const StringRef PathSeparators = ":"; +#endif + + SmallVector LibDirs; + llvm::SplitString(OptPath.getValue(), LibDirs, PathSeparators); + + for (const auto &LibDir : LibDirs) { + if (LibDir.empty()) + continue; + + SmallString<128> FilePath(LibDir); + llvm::sys::path::append(FilePath, Value); + if (llvm::sys::fs::exists(Twine(FilePath))) + return true; + } + + return false; +} + /// \brief Check that the file referenced by Value exists. If it doesn't, /// issue a diagnostic and return false. static bool DiagnoseInputExistence(const Driver &D, const DerivedArgList &Args, @@ -950,6 +981,9 @@ if (llvm::sys::fs::exists(Twine(Path))) return true; + if (D.IsCLMode() && ExistsInLibDir(Value)) + return true; + D.Diag(clang::diag::err_drv_no_such_file) << Path.str(); return false; } Index: cfe/trunk/test/Driver/cl-inputs.c =================================================================== --- cfe/trunk/test/Driver/cl-inputs.c +++ cfe/trunk/test/Driver/cl-inputs.c @@ -40,4 +40,13 @@ // RUN: %clang_cl -### /Tc - 2>&1 | FileCheck -check-prefix=STDINTc %s // STDINTc: "-x" "c" +// RUN: env LIB=%S/Inputs/cl-libs %clang_cl -### -- %s cl-test.lib 2>&1 | FileCheck -check-prefix=LIBINPUT %s +// LIBINPUT: "link.exe" +// LIBINPUT: "cl-test.lib" + +// RUN: env LIB=%S/Inputs/cl-libs %clang_cl -### -- %s cl-test2.lib 2>&1 | FileCheck -check-prefix=LIBINPUT2 %s +// LIBINPUT2: error: no such file or directory: 'cl-test2.lib' +// LIBINPUT2: "link.exe" +// LIBINPUT2-NOT: "cl-test2.lib" + void f();