<div dir="ltr">Nice!<div><br></div><div>-- Sean Silva</div></div><div class="gmail_extra"><br><div class="gmail_quote">On Fri, Feb 26, 2016 at 3:34 PM, Paul Robinson via llvm-commits <span dir="ltr"><<a href="mailto:llvm-commits@lists.llvm.org" target="_blank">llvm-commits@lists.llvm.org</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Author: probinson<br>
Date: Fri Feb 26 17:34:02 2016<br>
New Revision: 262092<br>
<br>
URL: <a href="http://llvm.org/viewvc/llvm-project?rev=262092&view=rev" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project?rev=262092&view=rev</a><br>
Log:<br>
[FileCheck] Abort if -NOT is combined with another suffix.<br>
Combinations of suffixes that look useful actually are ignored;<br>
complaining about them will avoid mistakes.<br>
<br>
Differential Revision: <a href="http://reviews.llvm.org/D17587" rel="noreferrer" target="_blank">http://reviews.llvm.org/D17587</a><br>
<br>
Added:<br>
    llvm/trunk/test/FileCheck/no-multi-suffixes.txt<br>
Modified:<br>
    llvm/trunk/utils/FileCheck/FileCheck.cpp<br>
<br>
Added: llvm/trunk/test/FileCheck/no-multi-suffixes.txt<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/test/FileCheck/no-multi-suffixes.txt?rev=262092&view=auto" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/test/FileCheck/no-multi-suffixes.txt?rev=262092&view=auto</a><br>
==============================================================================<br>
--- llvm/trunk/test/FileCheck/no-multi-suffixes.txt (added)<br>
+++ llvm/trunk/test/FileCheck/no-multi-suffixes.txt Fri Feb 26 17:34:02 2016<br>
@@ -0,0 +1,28 @@<br>
+; RUN: not FileCheck -check-prefix=DAGNOT -input-file %s %s 2>&1 | FileCheck -check-prefix=ERROR -check-prefix=DAGNOT-ERROR %s<br>
+; RUN: not FileCheck -check-prefix=NOTDAG -input-file %s %s 2>&1 | FileCheck -check-prefix=ERROR -check-prefix=NOTDAG-ERROR %s<br>
+; RUN: not FileCheck -check-prefix=NEXTNOT -input-file %s %s 2>&1 | FileCheck -check-prefix=ERROR -check-prefix=NEXTNOT-ERROR %s<br>
+; RUN: not FileCheck -check-prefix=NOTNEXT -input-file %s %s 2>&1 | FileCheck -check-prefix=ERROR -check-prefix=NOTNEXT-ERROR %s<br>
+; RUN: not FileCheck -check-prefix=SAMENOT -input-file %s %s 2>&1 | FileCheck -check-prefix=ERROR -check-prefix=SAMENOT-ERROR %s<br>
+; RUN: not FileCheck -check-prefix=NOTSAME -input-file %s %s 2>&1 | FileCheck -check-prefix=ERROR -check-prefix=NOTSAME-ERROR %s<br>
+<br>
+foo<br>
+; DAGNOT: foo<br>
+; DAGNOT-DAG-NOT: bar<br>
+; NOTDAG: foo<br>
+; NOTDAG-NOT-DAG: bar<br>
+; NEXTNOT: foo<br>
+; NEXTNOT-NEXT-NOT: bar<br>
+; NOTNEXT: foo<br>
+; NOTNEXT-NOT-NEXT: bar<br>
+; SAMENOT: foo<br>
+; SAMENOT-SAME-NOT: bar<br>
+; NOTSAME: foo<br>
+; NOTSAME-NOT-SAME: bar<br>
+<br>
+; ERROR: error: unsupported -NOT combo on prefix<br>
+; DAGNOT-ERROR-SAME:  'DAGNOT'<br>
+; NOTDAG-ERROR-SAME:  'NOTDAG'<br>
+; NEXTNOT-ERROR-SAME: 'NEXTNOT'<br>
+; NOTNEXT-ERROR-SAME: 'NOTNEXT'<br>
+; SAMENOT-ERROR-SAME: 'SAMENOT'<br>
+; NOTSAME-ERROR-SAME: 'NOTSAME'<br>
<br>
Modified: llvm/trunk/utils/FileCheck/FileCheck.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/utils/FileCheck/FileCheck.cpp?rev=262092&r1=262091&r2=262092&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/utils/FileCheck/FileCheck.cpp?rev=262092&r1=262091&r2=262092&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/utils/FileCheck/FileCheck.cpp (original)<br>
+++ llvm/trunk/utils/FileCheck/FileCheck.cpp Fri Feb 26 17:34:02 2016<br>
@@ -86,7 +86,9 @@ namespace Check {<br>
<br>
     /// MatchEOF - When set, this pattern only matches the end of file. This is<br>
     /// used for trailing CHECK-NOTs.<br>
-    CheckEOF<br>
+    CheckEOF,<br>
+    /// CheckBadNot - Found -NOT combined with another CHECK suffix.<br>
+    CheckBadNot<br>
   };<br>
 }<br>
<br>
@@ -693,6 +695,7 @@ static bool IsPartOfWord(char c) {<br>
 static size_t CheckTypeSize(Check::CheckType Ty) {<br>
   switch (Ty) {<br>
   case Check::CheckNone:<br>
+  case Check::CheckBadNot:<br>
     return 0;<br>
<br>
   case Check::CheckPlain:<br>
@@ -746,6 +749,12 @@ static Check::CheckType FindCheckType(St<br>
   if (Rest.startswith("LABEL:"))<br>
     return Check::CheckLabel;<br>
<br>
+  // You can't combine -NOT with another suffix.<br>
+  if (Rest.startswith("DAG-NOT:") || Rest.startswith("NOT-DAG:") ||<br>
+      Rest.startswith("NEXT-NOT:") || Rest.startswith("NOT-NEXT:") ||<br>
+      Rest.startswith("SAME-NOT:") || Rest.startswith("NOT-SAME:"))<br>
+    return Check::CheckBadNot;<br>
+<br>
   return Check::CheckNone;<br>
 }<br>
<br>
@@ -914,6 +923,14 @@ static bool ReadCheckFile(SourceMgr &SM,<br>
     // PrefixLoc is to the start of the prefix. Skip to the end.<br>
     Buffer = Buffer.drop_front(UsedPrefix.size() + CheckTypeSize(CheckTy));<br>
<br>
+    // Complain about useful-looking but unsupported suffixes.<br>
+    if (CheckTy == Check::CheckBadNot) {<br>
+      SM.PrintMessage(SMLoc::getFromPointer(Buffer.data()),<br>
+                      SourceMgr::DK_Error,<br>
+                      "unsupported -NOT combo on prefix '" + UsedPrefix + "'");<br>
+      return true;<br>
+    }<br>
+<br>
     // Okay, we found the prefix, yay. Remember the rest of the line, but ignore<br>
     // leading and trailing whitespace.<br>
     Buffer = Buffer.substr(Buffer.find_first_not_of(" \t"));<br>
<br>
<br>
_______________________________________________<br>
llvm-commits mailing list<br>
<a href="mailto:llvm-commits@lists.llvm.org">llvm-commits@lists.llvm.org</a><br>
<a href="http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits" rel="noreferrer" target="_blank">http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits</a><br>
</blockquote></div><br></div>