Skip to content

Commit

Permalink
[FileCheck] Abort if -NOT is combined with another suffix.
Browse files Browse the repository at this point in the history
Combinations of suffixes that look useful actually are ignored;
complaining about them will avoid mistakes.

Differential Revision: http://reviews.llvm.org/D17587

llvm-svn: 262092
  • Loading branch information
Paul Robinson committed Feb 26, 2016
1 parent e0eb8bf commit abcfa39
Show file tree
Hide file tree
Showing 2 changed files with 46 additions and 1 deletion.
28 changes: 28 additions & 0 deletions llvm/test/FileCheck/no-multi-suffixes.txt
@@ -0,0 +1,28 @@
; RUN: not FileCheck -check-prefix=DAGNOT -input-file %s %s 2>&1 | FileCheck -check-prefix=ERROR -check-prefix=DAGNOT-ERROR %s
; RUN: not FileCheck -check-prefix=NOTDAG -input-file %s %s 2>&1 | FileCheck -check-prefix=ERROR -check-prefix=NOTDAG-ERROR %s
; RUN: not FileCheck -check-prefix=NEXTNOT -input-file %s %s 2>&1 | FileCheck -check-prefix=ERROR -check-prefix=NEXTNOT-ERROR %s
; RUN: not FileCheck -check-prefix=NOTNEXT -input-file %s %s 2>&1 | FileCheck -check-prefix=ERROR -check-prefix=NOTNEXT-ERROR %s
; RUN: not FileCheck -check-prefix=SAMENOT -input-file %s %s 2>&1 | FileCheck -check-prefix=ERROR -check-prefix=SAMENOT-ERROR %s
; RUN: not FileCheck -check-prefix=NOTSAME -input-file %s %s 2>&1 | FileCheck -check-prefix=ERROR -check-prefix=NOTSAME-ERROR %s

foo
; DAGNOT: foo
; DAGNOT-DAG-NOT: bar
; NOTDAG: foo
; NOTDAG-NOT-DAG: bar
; NEXTNOT: foo
; NEXTNOT-NEXT-NOT: bar
; NOTNEXT: foo
; NOTNEXT-NOT-NEXT: bar
; SAMENOT: foo
; SAMENOT-SAME-NOT: bar
; NOTSAME: foo
; NOTSAME-NOT-SAME: bar

; ERROR: error: unsupported -NOT combo on prefix
; DAGNOT-ERROR-SAME: 'DAGNOT'
; NOTDAG-ERROR-SAME: 'NOTDAG'
; NEXTNOT-ERROR-SAME: 'NEXTNOT'
; NOTNEXT-ERROR-SAME: 'NOTNEXT'
; SAMENOT-ERROR-SAME: 'SAMENOT'
; NOTSAME-ERROR-SAME: 'NOTSAME'
19 changes: 18 additions & 1 deletion llvm/utils/FileCheck/FileCheck.cpp
Expand Up @@ -86,7 +86,9 @@ namespace Check {

/// MatchEOF - When set, this pattern only matches the end of file. This is
/// used for trailing CHECK-NOTs.
CheckEOF
CheckEOF,
/// CheckBadNot - Found -NOT combined with another CHECK suffix.
CheckBadNot
};
}

Expand Down Expand Up @@ -693,6 +695,7 @@ static bool IsPartOfWord(char c) {
static size_t CheckTypeSize(Check::CheckType Ty) {
switch (Ty) {
case Check::CheckNone:
case Check::CheckBadNot:
return 0;

case Check::CheckPlain:
Expand Down Expand Up @@ -746,6 +749,12 @@ static Check::CheckType FindCheckType(StringRef Buffer, StringRef Prefix) {
if (Rest.startswith("LABEL:"))
return Check::CheckLabel;

// You can't combine -NOT with another suffix.
if (Rest.startswith("DAG-NOT:") || Rest.startswith("NOT-DAG:") ||
Rest.startswith("NEXT-NOT:") || Rest.startswith("NOT-NEXT:") ||
Rest.startswith("SAME-NOT:") || Rest.startswith("NOT-SAME:"))
return Check::CheckBadNot;

return Check::CheckNone;
}

Expand Down Expand Up @@ -914,6 +923,14 @@ static bool ReadCheckFile(SourceMgr &SM,
// PrefixLoc is to the start of the prefix. Skip to the end.
Buffer = Buffer.drop_front(UsedPrefix.size() + CheckTypeSize(CheckTy));

// Complain about useful-looking but unsupported suffixes.
if (CheckTy == Check::CheckBadNot) {
SM.PrintMessage(SMLoc::getFromPointer(Buffer.data()),
SourceMgr::DK_Error,
"unsupported -NOT combo on prefix '" + UsedPrefix + "'");
return true;
}

// Okay, we found the prefix, yay. Remember the rest of the line, but ignore
// leading and trailing whitespace.
Buffer = Buffer.substr(Buffer.find_first_not_of(" \t"));
Expand Down

0 comments on commit abcfa39

Please sign in to comment.