From: Alexey Samsonov Date: Wed, 13 Nov 2013 14:12:52 +0000 (+0000) Subject: FileCheck: fix matching of one check-prefix is a prefix of another X-Git-Url: http://demsky.eecs.uci.edu/git/?a=commitdiff_plain;h=0ab53c711295f0469c86db088dc895238da801aa;p=oota-llvm.git FileCheck: fix matching of one check-prefix is a prefix of another Summary: Fix a case when "FileCheck --check-prefix=CHECK --check-prefix=CHECKER" would silently ignore check-lines of the form: CHECKER: foo Reviewers: dsanders Reviewed By: dsanders CC: llvm-commits Differential Revision: http://llvm-reviews.chandlerc.com/D2168 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@194577 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/test/FileCheck/check-multiple-prefixes-substr.txt b/test/FileCheck/check-multiple-prefixes-substr.txt new file mode 100644 index 00000000000..76a2ca8e75c --- /dev/null +++ b/test/FileCheck/check-multiple-prefixes-substr.txt @@ -0,0 +1,5 @@ +// RUN: FileCheck -check-prefix=CHECKER -check-prefix=CHECK -input-file %s %s +// RUN: FileCheck -check-prefix=CHECK -check-prefix=CHECKER -input-file %s %s + +foo +; CHECKER: fo{{o}} diff --git a/utils/FileCheck/FileCheck.cpp b/utils/FileCheck/FileCheck.cpp index d5f760246d6..f2510d7dfd7 100644 --- a/utils/FileCheck/FileCheck.cpp +++ b/utils/FileCheck/FileCheck.cpp @@ -785,6 +785,10 @@ static StringRef FindFirstCandidateMatch(StringRef &Buffer, // We only want to find the first match to avoid skipping some. if (PrefixLoc > FirstLoc) continue; + // If one matching check-prefix is a prefix of another, choose the + // longer one. + if (PrefixLoc == FirstLoc && Prefix.size() < FirstPrefix.size()) + continue; StringRef Rest = Buffer.drop_front(PrefixLoc); // Make sure we have actually found the prefix, and not a word containing @@ -793,22 +797,19 @@ static StringRef FindFirstCandidateMatch(StringRef &Buffer, if (PrefixLoc != 0 && IsPartOfWord(Buffer[PrefixLoc - 1])) continue; - Check::CheckType Ty = FindCheckType(Rest, Prefix); - FirstLoc = PrefixLoc; - FirstTy = Ty; - // We've found the first matching check prefix. If it is invalid, we should - // continue the search after it. - FirstPrefix = (Ty == Check::CheckNone) ? "" : Prefix; + FirstTy = FindCheckType(Rest, Prefix); + FirstPrefix = Prefix; } - if (FirstPrefix.empty()) { + // If the first prefix is invalid, we should continue the search after it. + if (FirstTy == Check::CheckNone) { CheckLoc = SearchLoc; - } else { - CheckTy = FirstTy; - CheckLoc = FirstLoc; + return ""; } + CheckTy = FirstTy; + CheckLoc = FirstLoc; return FirstPrefix; }