diff --git a/llvm/lib/Support/CommandLine.cpp b/llvm/lib/Support/CommandLine.cpp --- a/llvm/lib/Support/CommandLine.cpp +++ b/llvm/lib/Support/CommandLine.cpp @@ -1300,8 +1300,9 @@ llvm::sys::fs::file_type::regular_file, llvm::sys::fs::perms::all_all) : FS->status(FName); + std::error_code EC; if (!Res || !Res->exists()) { - std::error_code EC = Res.getError(); + EC = Res.getError(); if (!InConfigFile) { // If the specified file does not exist, leave '@file' unexpanded, as // libiberty does. @@ -1317,6 +1318,12 @@ } const llvm::vfs::Status &FileStatus = Res.get(); + if (FileStatus.isDirectory()) { + EC = std::make_error_code(std::errc::is_a_directory); + return createStringError(EC, Twine("cannot not open file '") + FName + + "': " + EC.message()); + } + auto IsEquivalent = [FileStatus, this](const ResponseFileRecord &RFile) -> ErrorOr { ErrorOr RHS = FS->status(RFile.File); diff --git a/llvm/unittests/Support/CommandLineTest.cpp b/llvm/unittests/Support/CommandLineTest.cpp --- a/llvm/unittests/Support/CommandLineTest.cpp +++ b/llvm/unittests/Support/CommandLineTest.cpp @@ -1060,7 +1060,6 @@ ASSERT_STREQ(Argv[0], "clang"); ASSERT_STREQ(Argv[1], AFileExp.c_str()); -#if !defined(_AIX) && !defined(__MVS__) std::string ADirExp = std::string("@") + std::string(ADir.path()); Argv = {"clang", ADirExp.c_str()}; Res = cl::ExpandResponseFiles(Saver, cl::TokenizeGNUCommandLine, Argv); @@ -1068,7 +1067,6 @@ ASSERT_EQ(2U, Argv.size()); ASSERT_STREQ(Argv[0], "clang"); ASSERT_STREQ(Argv[1], ADirExp.c_str()); -#endif } TEST(CommandLineTest, SetDefaultValue) {