const std::vector<const Pattern *> &NotStrings,
const FileCheckRequest &Req,
std::vector<FileCheckDiag> *Diags) const {
+ bool DirectiveFail = false;
for (const Pattern *Pat : NotStrings) {
assert((Pat->getCheckTy() == Check::CheckNot) && "Expect CHECK-NOT!");
PrintMatch(false, SM, Prefix, Pat->getLoc(), *Pat, 1, Buffer, Pos, MatchLen,
Req, Diags);
-
- return true;
+ DirectiveFail = true;
+ continue;
}
- return false;
+ return DirectiveFail;
}
size_t FileCheckString::CheckDag(const SourceMgr &SM, StringRef Buffer,
--- /dev/null
+; Check that all errors in a CHECK-NOT blocks are reported, but that FileCheck
+; does not check past the block.
+RUN: %ProtectFileCheckOutput \
+RUN: not FileCheck --dump-input=never --input-file %s %s 2>&1 | \
+RUN: FileCheck --strict-whitespace --check-prefix CHECK-ERRORS %s
+
+foo
+bar
+
+barrier
+
+baz
+
+CHECK-NOT: bar
+CHECK-NOT: foo
+CHECK: barrier
+CHECK-NOT: baz
+
+CHECK-ERRORS: multiple-check-not-failures.txt:[[#@LINE-5]]:12: error: {{C}}HECK-NOT: excluded string found in input
+CHECK-ERRORS-NEXT: {{C}}HECK-NOT: bar
+CHECK-ERRORS-NEXT: {{^}} ^{{$}}
+CHECK-ERRORS-NEXT: multiple-check-not-failures.txt:[[#@LINE-14]]:1: note: found here
+CHECK-ERRORS-NEXT: bar
+CHECK-ERRORS-NEXT: {{^}}^~~{{$}}
+CHECK-ERRORS-NEXT: multiple-check-not-failures.txt:[[#@LINE-10]]:12: error: {{C}}HECK-NOT: excluded string found in input
+CHECK-ERRORS-NEXT: {{C}}HECK-NOT: foo
+CHECK-ERRORS-NEXT: {{^}} ^{{$}}
+CHECK-ERRORS-NEXT: multiple-check-not-failures.txt:[[#@LINE-21]]:1: note: found here
+CHECK-ERRORS-NEXT: foo
+CHECK-ERRORS-NEXT: {{^}}^~~{{$}}
+CHECK-ERRORS-NOT: error:
+CHECK-ERRORS-NOT: {{C}}HECK-NOT: baz