Remove SMLoc paired with CHECK-NOT patterns. Not functionality change.
authorMichael Liao <michael.liao@intel.com>
Thu, 25 Apr 2013 21:31:34 +0000 (21:31 +0000)
committerMichael Liao <michael.liao@intel.com>
Thu, 25 Apr 2013 21:31:34 +0000 (21:31 +0000)
Pattern has source location by itself. After adding a trivial method to
retrieve it, it's unnecessary to pair a source location for CHECK-NOT patterns.
One thing revised after this is the diagnostic info is more accurate by
pointing to the start of the CHECK-NOT pattern instead of the end of the
CHECK-NOT pattern. E.g. diagnostic message previously looks like

    <stdin>:1:1: error: CHECK-NOT: string occurred!
    test
    ^
    test.txt:1:16: note: CHECK-NOT: pattern specified here
    CHECK-NOT: test
                   ^

is changed to

    <stdin>:1:1: error: CHECK-NOT: string occurred!
    test
    ^
    test.txt:1:12: note: CHECK-NOT: pattern specified here
    CHECK-NOT: test
               ^

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@180578 91177308-0d34-0410-b5e6-96231b3b80d8

test/FileCheck/check-not-diaginfo.txt [new file with mode: 0644]
utils/FileCheck/FileCheck.cpp

diff --git a/test/FileCheck/check-not-diaginfo.txt b/test/FileCheck/check-not-diaginfo.txt
new file mode 100644 (file)
index 0000000..a4c3ca8
--- /dev/null
@@ -0,0 +1,7 @@
+; RUN: FileCheck -input-file %s %s 2>&1 | FileCheck -check-prefix DIAG %s
+
+CHECK-NOT: test
+
+DIAG:         CHECK-NOT: pattern specified here
+DIAG-NEXT:    CHECK-NOT: test
+DIAG-NEXT: {{^           \^}}
index a25df5c57a517846d8f8dca2443a3865b28165a3..cd7bb5a44fb991601ebb8d76f781d302500404f3 100644 (file)
@@ -85,6 +85,9 @@ public:
 
   Pattern(bool matchEOF = false) : MatchEOF(matchEOF) { }
 
+  /// getLoc - Return the location in source code.
+  SMLoc getLoc() const { return PatternLoc; }
+
   /// ParsePattern - Parse the given string into the Pattern.  SM provides the
   /// SourceMgr used for error reports, and LineNumber is the line number in
   /// the input file from which the pattern string was read.
@@ -581,7 +584,7 @@ struct CheckString {
   /// NotStrings - These are all of the strings that are disallowed from
   /// occurring between this match string and the previous one (or start of
   /// file).
-  std::vector<std::pair<SMLoc, Pattern> > NotStrings;
+  std::vector<Pattern> NotStrings;
 
   CheckString(const Pattern &P, SMLoc L, bool isCheckNext)
     : Pat(P), Loc(L), IsCheckNext(isCheckNext) {}
@@ -649,7 +652,7 @@ static bool ReadCheckFile(SourceMgr &SM,
 
   // Find all instances of CheckPrefix followed by : in the file.
   StringRef Buffer = F->getBuffer();
-  std::vector<std::pair<SMLoc, Pattern> > NotMatches;
+  std::vector<Pattern> NotMatches;
 
   // LineNumber keeps track of the line on which CheckPrefix instances are
   // found.
@@ -716,8 +719,7 @@ static bool ReadCheckFile(SourceMgr &SM,
 
     // Handle CHECK-NOT.
     if (IsCheckNot) {
-      NotMatches.push_back(std::make_pair(SMLoc::getFromPointer(Buffer.data()),
-                                          P));
+      NotMatches.push_back(P);
       continue;
     }
 
@@ -877,14 +879,13 @@ int main(int argc, char **argv) {
     for (unsigned ChunkNo = 0, e = CheckStr.NotStrings.size();
          ChunkNo != e; ++ChunkNo) {
       size_t MatchLen = 0;
-      size_t Pos = CheckStr.NotStrings[ChunkNo].second.Match(SkippedRegion,
-                                                             MatchLen,
-                                                             VariableTable);
+      size_t Pos = CheckStr.NotStrings[ChunkNo].Match(SkippedRegion, MatchLen,
+                                                      VariableTable);
       if (Pos == StringRef::npos) continue;
 
       SM.PrintMessage(SMLoc::getFromPointer(LastMatch+Pos), SourceMgr::DK_Error,
                       CheckPrefix+"-NOT: string occurred!");
-      SM.PrintMessage(CheckStr.NotStrings[ChunkNo].first, SourceMgr::DK_Note,
+      SM.PrintMessage(CheckStr.NotStrings[ChunkNo].getLoc(), SourceMgr::DK_Note,
                       CheckPrefix+"-NOT: pattern specified here");
       return 1;
     }