diff options
Diffstat (limited to 'llvm/unittests/Support/CommandLineTest.cpp')
-rw-r--r-- | llvm/unittests/Support/CommandLineTest.cpp | 37 |
1 files changed, 37 insertions, 0 deletions
diff --git a/llvm/unittests/Support/CommandLineTest.cpp b/llvm/unittests/Support/CommandLineTest.cpp index 263d0e3..b648600 100644 --- a/llvm/unittests/Support/CommandLineTest.cpp +++ b/llvm/unittests/Support/CommandLineTest.cpp @@ -816,6 +816,43 @@ TEST(CommandLineTest, RecursiveResponseFiles) { EXPECT_STREQ(Argv[i], ResponseFileRef.c_str()); } +TEST(CommandLineTest, ResponseFilesAtArguments) { + SmallString<128> TestDir; + std::error_code EC = sys::fs::createUniqueDirectory("unittest", TestDir); + EXPECT_TRUE(!EC); + + SmallString<128> ResponseFilePath; + sys::path::append(ResponseFilePath, TestDir, "test.rsp"); + + std::ofstream ResponseFile(ResponseFilePath.c_str()); + EXPECT_TRUE(ResponseFile.is_open()); + ResponseFile << "-foo" << "\n"; + ResponseFile << "-bar" << "\n"; + ResponseFile.close(); + + // Ensure we expand rsp files after lots of non-rsp arguments starting with @. + constexpr size_t NON_RSP_AT_ARGS = 64; + SmallVector<const char *, 4> Argv = {"test/test"}; + Argv.append(NON_RSP_AT_ARGS, "@non_rsp_at_arg"); + std::string ResponseFileRef = std::string("@") + ResponseFilePath.c_str(); + Argv.push_back(ResponseFileRef.c_str()); + + BumpPtrAllocator A; + StringSaver Saver(A); + bool Res = cl::ExpandResponseFiles(Saver, cl::TokenizeGNUCommandLine, Argv, + false, false); + EXPECT_FALSE(Res); + + // ASSERT instead of EXPECT to prevent potential out-of-bounds access. + ASSERT_EQ(Argv.size(), 1 + NON_RSP_AT_ARGS + 2); + size_t i = 0; + EXPECT_STREQ(Argv[i++], "test/test"); + for (; i < 1 + NON_RSP_AT_ARGS; ++i) + EXPECT_STREQ(Argv[i], "@non_rsp_at_arg"); + EXPECT_STREQ(Argv[i++], "-foo"); + EXPECT_STREQ(Argv[i++], "-bar"); +} + TEST(CommandLineTest, SetDefautValue) { cl::ResetCommandLineParser(); |