aboutsummaryrefslogtreecommitdiff
path: root/llvm/lib/FileCheck/FileCheck.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'llvm/lib/FileCheck/FileCheck.cpp')
-rw-r--r--llvm/lib/FileCheck/FileCheck.cpp24
1 files changed, 16 insertions, 8 deletions
diff --git a/llvm/lib/FileCheck/FileCheck.cpp b/llvm/lib/FileCheck/FileCheck.cpp
index a0371cf..8e234b2 100644
--- a/llvm/lib/FileCheck/FileCheck.cpp
+++ b/llvm/lib/FileCheck/FileCheck.cpp
@@ -22,6 +22,7 @@
#include "llvm/Support/FormatVariadic.h"
#include <cstdint>
#include <list>
+#include <set>
#include <tuple>
#include <utility>
@@ -1825,8 +1826,10 @@ bool FileCheck::readCheckFile(
// found.
unsigned LineNumber = 1;
- bool FoundUsedCheckPrefix = false;
- while (1) {
+ std::set<StringRef> PrefixesNotFound(Req.CheckPrefixes.begin(),
+ Req.CheckPrefixes.end());
+ const size_t DistinctPrefixes = PrefixesNotFound.size();
+ while (true) {
Check::FileCheckType CheckTy;
// See if a prefix occurs in the memory buffer.
@@ -1837,7 +1840,7 @@ bool FileCheck::readCheckFile(
if (UsedPrefix.empty())
break;
if (CheckTy != Check::CheckComment)
- FoundUsedCheckPrefix = true;
+ PrefixesNotFound.erase(UsedPrefix);
assert(UsedPrefix.data() == Buffer.data() &&
"Failed to move Buffer's start forward, or pointed prefix outside "
@@ -1930,14 +1933,19 @@ bool FileCheck::readCheckFile(
// When there are no used prefixes we report an error except in the case that
// no prefix is specified explicitly but -implicit-check-not is specified.
- if (!FoundUsedCheckPrefix &&
+ const bool NoPrefixesFound = PrefixesNotFound.size() == DistinctPrefixes;
+ const bool SomePrefixesUnexpectedlyNotUsed =
+ !Req.AllowUnusedPrefixes && !PrefixesNotFound.empty();
+ if ((NoPrefixesFound || SomePrefixesUnexpectedlyNotUsed) &&
(ImplicitNegativeChecks.empty() || !Req.IsDefaultCheckPrefix)) {
errs() << "error: no check strings found with prefix"
- << (Req.CheckPrefixes.size() > 1 ? "es " : " ");
- for (size_t I = 0, E = Req.CheckPrefixes.size(); I != E; ++I) {
- if (I != 0)
+ << (PrefixesNotFound.size() > 1 ? "es " : " ");
+ bool First = true;
+ for (StringRef MissingPrefix : PrefixesNotFound) {
+ if (!First)
errs() << ", ";
- errs() << "\'" << Req.CheckPrefixes[I] << ":'";
+ errs() << "\'" << MissingPrefix << ":'";
+ First = false;
}
errs() << '\n';
return true;