diff --git a/lib/Support/CommandLine.cpp b/lib/Support/CommandLine.cpp
index 0050002..98d06f6 100644
--- a/lib/Support/CommandLine.cpp
+++ b/lib/Support/CommandLine.cpp
@@ -1040,7 +1040,7 @@
 bool cl::ExpandResponseFiles(StringSaver &Saver, TokenizerCallback Tokenizer,
                              SmallVectorImpl<const char *> &Argv,
                              bool MarkEOLs, bool RelativeNames) {
-  unsigned ExpandedRspFiles = 0;
+  unsigned RspFiles = 0;
   bool AllExpanded = true;
 
   // Don't cache Argv.size() because it can change.
@@ -1058,16 +1058,14 @@
 
     // If we have too many response files, leave some unexpanded.  This avoids
     // crashing on self-referential response files.
-    if (ExpandedRspFiles > 20)
+    if (RspFiles++ > 20)
       return false;
 
     // Replace this response file argument with the tokenization of its
     // contents.  Nested response files are expanded in subsequent iterations.
     SmallVector<const char *, 0> ExpandedArgv;
-    if (ExpandResponseFile(Arg + 1, Saver, Tokenizer, ExpandedArgv, MarkEOLs,
-                           RelativeNames)) {
-      ++ExpandedRspFiles;
-    } else {
+    if (!ExpandResponseFile(Arg + 1, Saver, Tokenizer, ExpandedArgv,
+                            MarkEOLs, RelativeNames)) {
       // We couldn't read this file, so we leave it in the argument stream and
       // move on.
       AllExpanded = false;
diff --git a/unittests/Support/CommandLineTest.cpp b/unittests/Support/CommandLineTest.cpp
index 99db7e2..782a816 100644
--- a/unittests/Support/CommandLineTest.cpp
+++ b/unittests/Support/CommandLineTest.cpp
@@ -813,43 +813,6 @@
     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;
-  llvm::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());
-
-  llvm::BumpPtrAllocator A;
-  llvm::StringSaver Saver(A);
-  bool Res = llvm::cl::ExpandResponseFiles(
-      Saver, llvm::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();
 
