<html xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:w="urn:schemas-microsoft-com:office:word" xmlns:m="http://schemas.microsoft.com/office/2004/12/omml" xmlns="http://www.w3.org/TR/REC-html40">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<meta name="Generator" content="Microsoft Word 15 (filtered medium)">
<style><!--
/* Font Definitions */
@font-face
        {font-family:"Cambria Math";
        panose-1:2 4 5 3 5 4 6 3 2 4;}
@font-face
        {font-family:Calibri;
        panose-1:2 15 5 2 2 2 4 3 2 4;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
        {margin:0in;
        margin-bottom:.0001pt;
        font-size:11.0pt;
        font-family:"Calibri",sans-serif;}
a:link, span.MsoHyperlink
        {mso-style-priority:99;
        color:blue;
        text-decoration:underline;}
a:visited, span.MsoHyperlinkFollowed
        {mso-style-priority:99;
        color:purple;
        text-decoration:underline;}
p.msonormal0, li.msonormal0, div.msonormal0
        {mso-style-name:msonormal;
        mso-margin-top-alt:auto;
        margin-right:0in;
        mso-margin-bottom-alt:auto;
        margin-left:0in;
        font-size:11.0pt;
        font-family:"Calibri",sans-serif;}
span.EmailStyle18
        {mso-style-type:personal-reply;
        font-family:"Calibri",sans-serif;
        color:windowtext;}
.MsoChpDefault
        {mso-style-type:export-only;
        font-size:10.0pt;}
@page WordSection1
        {size:8.5in 11.0in;
        margin:1.0in 1.0in 1.0in 1.0in;}
div.WordSection1
        {page:WordSection1;}
--></style>
</head>
<body lang="EN-US" link="blue" vlink="purple">
<div class="WordSection1">
<p class="MsoNormal">This is awesome! Thank you!<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<div style="border:none;border-top:solid #B5C4DF 1.0pt;padding:3.0pt 0in 0in 0in">
<p class="MsoNormal" style="margin-left:.5in"><b><span style="font-size:12.0pt;color:black">From:
</span></b><span style="font-size:12.0pt;color:black">llvm-commits <llvm-commits-bounces@lists.llvm.org> on behalf of James Henderson via llvm-commits <llvm-commits@lists.llvm.org><br>
<b>Reply-To: </b>James Henderson <jh7370@my.bristol.ac.uk><br>
<b>Date: </b>Tuesday, June 26, 2018 at 8:20 AM<br>
<b>To: </b>"llvm-commits@lists.llvm.org" <llvm-commits@lists.llvm.org><br>
<b>Subject: </b>[llvm] r335613 - [FileCheck] Add CHECK-EMPTY directive for checking for blank lines<o:p></o:p></span></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in"><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">Author: jhenderson<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">Date: Tue Jun 26 08:15:45 2018<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">New Revision: 335613<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in"><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">URL: <a href="https://urldefense.proofpoint.com/v2/url?u=http-3A__llvm.org_viewvc_llvm-2Dproject-3Frev-3D335613-26view-3Drev&d=DwIGaQ&c=5VD0RTtNlTh3ycd41b3MUw&r=o3kDXzdBUE3ljQXKeTWOMw&m=2-S1z7T7v1sFBeG2mPwydbqJ4Cb8Vgsa2GpqO298kPs&s=CKT1Ah3lAKRH7F53c0cEQoNtx4UfyOUcueHeaImC-Qw&e=">
https://urldefense.proofpoint.com/v2/url?u=http-3A__llvm.org_viewvc_llvm-2Dproject-3Frev-3D335613-26view-3Drev&d=DwIGaQ&c=5VD0RTtNlTh3ycd41b3MUw&r=o3kDXzdBUE3ljQXKeTWOMw&m=2-S1z7T7v1sFBeG2mPwydbqJ4Cb8Vgsa2GpqO298kPs&s=CKT1Ah3lAKRH7F53c0cEQoNtx4UfyOUcueHeaImC-Qw&e=</a><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">Log:<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">[FileCheck] Add CHECK-EMPTY directive for checking for blank lines<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in"><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">Prior to this change, there was no clean way of getting FileCheck to<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">check that a line is completely empty. The expected way of using<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">"CHECK: {{^$}}" does not work because the '^' matches the end of the<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">previous match (this behaviour may be desirable in certain instances).<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">For the same reason, "CHECK-NEXT: {{^$}}" will fail when the previous<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">match was at the end of the line, as the pattern will match there.<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">Using the recommended [[:space:]] to match an explicit new line could<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">also match a space, and thus is not always desired. Literal '\n'<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">matches also do not work. A workaround was suggested in the review, but<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">it is a little clunky.<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in"><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">This change adds a new directive that behaves the same as CHECK-NEXT,<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">except that it only matches against empty lines (nothing, not even<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">whitespace, is allowed). As with CHECK-NEXT, it will fail if more than<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">one newline occurs before the next blank line. Example usage:<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">; test.txt<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">foo<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in"><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">bar<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">; CHECK: foo<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">; CHECK-EMPTY:<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">; CHECK-NEXT: bar<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in"><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">Differential Revision: <a href="https://urldefense.proofpoint.com/v2/url?u=https-3A__reviews.llvm.org_D28896&d=DwIGaQ&c=5VD0RTtNlTh3ycd41b3MUw&r=o3kDXzdBUE3ljQXKeTWOMw&m=2-S1z7T7v1sFBeG2mPwydbqJ4Cb8Vgsa2GpqO298kPs&s=WP3wImOJhGEcqdWRp0SKjw9vuymH1v0T3f41EStXYlg&e=">
https://urldefense.proofpoint.com/v2/url?u=https-3A__reviews.llvm.org_D28896&d=DwIGaQ&c=5VD0RTtNlTh3ycd41b3MUw&r=o3kDXzdBUE3ljQXKeTWOMw&m=2-S1z7T7v1sFBeG2mPwydbqJ4Cb8Vgsa2GpqO298kPs&s=WP3wImOJhGEcqdWRp0SKjw9vuymH1v0T3f41EStXYlg&e=</a><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in"><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">Reviewed by: probinson<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in"><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">Added:<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">    llvm/trunk/test/FileCheck/check-empty-tag.txt<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">Modified:<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">    llvm/trunk/docs/CommandGuide/FileCheck.rst<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">    llvm/trunk/utils/FileCheck/FileCheck.cpp<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in"><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">Modified: llvm/trunk/docs/CommandGuide/FileCheck.rst<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">URL: <a href="https://urldefense.proofpoint.com/v2/url?u=http-3A__llvm.org_viewvc_llvm-2Dproject_llvm_trunk_docs_CommandGuide_FileCheck.rst-3Frev-3D335613-26r1-3D335612-26r2-3D335613-26view-3Ddiff&d=DwIGaQ&c=5VD0RTtNlTh3ycd41b3MUw&r=o3kDXzdBUE3ljQXKeTWOMw&m=2-S1z7T7v1sFBeG2mPwydbqJ4Cb8Vgsa2GpqO298kPs&s=UPW5L28j9gREwlBXjgvZ2IHJaWyDhu2QWkQwXKiB1bg&e=">
https://urldefense.proofpoint.com/v2/url?u=http-3A__llvm.org_viewvc_llvm-2Dproject_llvm_trunk_docs_CommandGuide_FileCheck.rst-3Frev-3D335613-26r1-3D335612-26r2-3D335613-26view-3Ddiff&d=DwIGaQ&c=5VD0RTtNlTh3ycd41b3MUw&r=o3kDXzdBUE3ljQXKeTWOMw&m=2-S1z7T7v1sFBeG2mPwydbqJ4Cb8Vgsa2GpqO298kPs&s=UPW5L28j9gREwlBXjgvZ2IHJaWyDhu2QWkQwXKiB1bg&e=</a><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">==============================================================================<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">--- llvm/trunk/docs/CommandGuide/FileCheck.rst (original)<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">+++ llvm/trunk/docs/CommandGuide/FileCheck.rst Tue Jun 26 08:15:45 2018<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">@@ -241,6 +241,25 @@ For example, the following works like yo<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">it and the previous directive.  A "``CHECK-SAME:``" cannot be the first<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">directive in a file.<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">+The "CHECK-EMPTY:" directive<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">+~~~~~~~~~~~~~~~~~~~~~~~~~~~<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">+<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">+If you need to check that the next line has nothing on it, not even whitespace,<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">+you can use the "``CHECK-EMPTY:``" directive.<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">+<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">+.. code-block:: llvm<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">+<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">+   foo<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">+<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">+   bar<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">+   ; CHECK: foo<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">+   ; CHECK-EMPTY:<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">+   ; CHECK-NEXT: bar<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">+<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">+Just like "``CHECK-NEXT:``" the directive will fail if there is more than one<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">+newline before it finds the next blank line, and it cannot be the first<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">+directive in a file.<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">+<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">The "CHECK-NOT:" directive<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">~~~~~~~~~~~~~~~~~~~~~~~~~~<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in"><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">Added: llvm/trunk/test/FileCheck/check-empty-tag.txt<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">URL: <a href="https://urldefense.proofpoint.com/v2/url?u=http-3A__llvm.org_viewvc_llvm-2Dproject_llvm_trunk_test_FileCheck_check-2Dempty-2Dtag.txt-3Frev-3D335613-26view-3Dauto&d=DwIGaQ&c=5VD0RTtNlTh3ycd41b3MUw&r=o3kDXzdBUE3ljQXKeTWOMw&m=2-S1z7T7v1sFBeG2mPwydbqJ4Cb8Vgsa2GpqO298kPs&s=UTeu5dOpMVCwRzzEtYbkHZEsftBkJ6EudUeofaRc9r0&e=">
https://urldefense.proofpoint.com/v2/url?u=http-3A__llvm.org_viewvc_llvm-2Dproject_llvm_trunk_test_FileCheck_check-2Dempty-2Dtag.txt-3Frev-3D335613-26view-3Dauto&d=DwIGaQ&c=5VD0RTtNlTh3ycd41b3MUw&r=o3kDXzdBUE3ljQXKeTWOMw&m=2-S1z7T7v1sFBeG2mPwydbqJ4Cb8Vgsa2GpqO298kPs&s=UTeu5dOpMVCwRzzEtYbkHZEsftBkJ6EudUeofaRc9r0&e=</a><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">==============================================================================<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">--- llvm/trunk/test/FileCheck/check-empty-tag.txt (added)<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">+++ llvm/trunk/test/FileCheck/check-empty-tag.txt Tue Jun 26 08:15:45 2018<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">@@ -0,0 +1,45 @@<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">+; basic functionality<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">+; RUN: FileCheck %s --input-file %s --check-prefix=CHECK1<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">+foo<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">+<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">+bar<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">+CHECK1: foo<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">+CHECK1-EMPTY:<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">+CHECK1-NEXT: bar<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">+<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">+; next line must be blank<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">+; RUN: not FileCheck %s --input-file %s --check-prefix=CHECK2A 2>&1 | FileCheck %s --check-prefix=CHECK2B<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">+badger<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">+CHECK2A: badger<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">+CHECK2A-EMPTY:<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">+CHECK2B: CHECK2A-EMPTY: is not on the line after the previous match<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">+<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">+; CHECK-EMPTY must have empty pattern<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">+; RUN: not FileCheck %s --input-file %s --check-prefix=CHECK3A 2>&1 | FileCheck %s --check-prefix=CHECK3B<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">+CHECK3A: foo<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">+CHECK3A-EMPTY: this is not empty<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">+CHECK3B: found non-empty check string for empty check with prefix 'CHECK3A:'<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">+<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">+; CHECK-EMPTY cannot be the first check<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">+; RUN: not FileCheck %s --input-file %s --check-prefix=CHECK4A 2>&1 | FileCheck %s --check-prefix=CHECK4B<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">+CHECK4A-EMPTY:<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">+CHECK4B: found 'CHECK4A-EMPTY' without previous 'CHECK4A: line<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">+<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">+; CHECK-EMPTY-NOT and CHECK-NOT-EMPTY rejected<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">+; RUN: not FileCheck %s --input-file %s --check-prefixes=CHECK5A 2>&1 | FileCheck %s --check-prefix=CHECK5C<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">+; RUN: not FileCheck %s --input-file %s --check-prefixes=CHECK5B 2>&1 | FileCheck %s --check-prefix=CHECK5C<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">+CHECK5A-EMPTY-NOT:<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">+CHECK5B-NOT-EMPTY:<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">+CHECK5C: unsupported -NOT combo on prefix 'CHECK5{{A|B}}'<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">+<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">+; whitespace does not count as empty<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">+; RUN: not FileCheck %s --input-file %s --check-prefix=CHECK6A --match-full-lines 2>&1 | FileCheck %s --check-prefix=CHECK6B<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">+CHECK6A: the next line has spaces<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">+CHECK6A-EMPTY:<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">+CHECK6B: expected string not found in input<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">+<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">+; ***don't add any further blank lines after this point***<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">+; CHECK-EMPTY, like CHECK-NEXT, will report an error if the first matching<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">+; line is not the line immediately following the previous check.<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">+the next line has spaces<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">+  <o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">\ No newline at end of file<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in"><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">Modified: llvm/trunk/utils/FileCheck/FileCheck.cpp<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">URL: <a href="https://urldefense.proofpoint.com/v2/url?u=http-3A__llvm.org_viewvc_llvm-2Dproject_llvm_trunk_utils_FileCheck_FileCheck.cpp-3Frev-3D335613-26r1-3D335612-26r2-3D335613-26view-3Ddiff&d=DwIGaQ&c=5VD0RTtNlTh3ycd41b3MUw&r=o3kDXzdBUE3ljQXKeTWOMw&m=2-S1z7T7v1sFBeG2mPwydbqJ4Cb8Vgsa2GpqO298kPs&s=5yEJeYneYrV2bG1gUuVyYDdlN_m32jG7fk_sZJ5Ou7A&e=">
https://urldefense.proofpoint.com/v2/url?u=http-3A__llvm.org_viewvc_llvm-2Dproject_llvm_trunk_utils_FileCheck_FileCheck.cpp-3Frev-3D335613-26r1-3D335612-26r2-3D335613-26view-3Ddiff&d=DwIGaQ&c=5VD0RTtNlTh3ycd41b3MUw&r=o3kDXzdBUE3ljQXKeTWOMw&m=2-S1z7T7v1sFBeG2mPwydbqJ4Cb8Vgsa2GpqO298kPs&s=5yEJeYneYrV2bG1gUuVyYDdlN_m32jG7fk_sZJ5Ou7A&e=</a><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">==============================================================================<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">--- llvm/trunk/utils/FileCheck/FileCheck.cpp (original)<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">+++ llvm/trunk/utils/FileCheck/FileCheck.cpp Tue Jun 26 08:15:45 2018<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">@@ -97,6 +97,7 @@ enum CheckType {<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">   CheckNot,<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">   CheckDAG,<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">   CheckLabel,<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">+  CheckEmpty,<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">   /// Indicates the pattern only matches the end of file. This is used for<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">   /// trailing CHECK-NOTs.<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">@@ -184,12 +185,25 @@ bool Pattern::ParsePattern(StringRef Pat<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">       PatternStr = PatternStr.substr(0, PatternStr.size() - 1);<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">   // Check that there is something on the line.<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">-  if (PatternStr.empty()) {<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">+  if (PatternStr.empty() && CheckTy != Check::CheckEmpty) {<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">     SM.PrintMessage(PatternLoc, SourceMgr::DK_Error,<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">                     "found empty check string with prefix '" + Prefix + ":'");<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">     return true;<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">   }<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">+  if (!PatternStr.empty() && CheckTy == Check::CheckEmpty) {<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">+    SM.PrintMessage(<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">+        PatternLoc, SourceMgr::DK_Error,<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">+        "found non-empty check string for empty check with prefix '" + Prefix +<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">+            ":'");<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">+    return true;<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">+  }<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">+<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">+  if (CheckTy == Check::CheckEmpty) {<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">+    RegExStr = "(\n$)";<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">+    return false;<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">+  }<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">+<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">   // Check to see if this is a fixed string, or if it has regex pieces.<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">   if (!MatchFullLinesHere &&<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">       (PatternStr.size() < 2 || (PatternStr.find("{{") == StringRef::npos &&<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">@@ -709,6 +723,9 @@ static size_t CheckTypeSize(Check::Check<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">   case Check::CheckLabel:<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">     return sizeof("-LABEL:") - 1;<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">+  case Check::CheckEmpty:<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">+    return sizeof("-EMPTY:") - 1;<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">+<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">   case Check::CheckEOF:<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">     llvm_unreachable("Should not be using EOF size");<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">   }<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">@@ -745,10 +762,14 @@ static Check::CheckType FindCheckType(St<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">   if (Rest.startswith("LABEL:"))<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">     return Check::CheckLabel;<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">+  if (Rest.startswith("EMPTY:"))<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">+    return Check::CheckEmpty;<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">+<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">   // You can't combine -NOT with another suffix.<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">   if (Rest.startswith("DAG-NOT:") || Rest.startswith("NOT-DAG:") ||<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">       Rest.startswith("NEXT-NOT:") || Rest.startswith("NOT-NEXT:") ||<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">-      Rest.startswith("SAME-NOT:") || Rest.startswith("NOT-SAME:"))<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">+      Rest.startswith("SAME-NOT:") || Rest.startswith("NOT-SAME:") ||<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">+      Rest.startswith("EMPTY-NOT:") || Rest.startswith("NOT-EMPTY:"))<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">     return Check::CheckBadNot;<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">   return Check::CheckNone;<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">@@ -908,10 +929,13 @@ static bool ReadCheckFile(SourceMgr &SM,<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">     Buffer = Buffer.substr(EOL);<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">-    // Verify that CHECK-NEXT lines have at least one CHECK line before them.<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">-    if ((CheckTy == Check::CheckNext || CheckTy == Check::CheckSame) &&<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">+    // Verify that CHECK-NEXT/SAME/EMPTY lines have at least one CHECK line before them.<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">+    if ((CheckTy == Check::CheckNext || CheckTy == Check::CheckSame ||<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">+         CheckTy == Check::CheckEmpty) &&<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">         CheckStrings.empty()) {<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">-      StringRef Type = CheckTy == Check::CheckNext ? "NEXT" : "SAME";<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">+      StringRef Type = CheckTy == Check::CheckNext<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">+                           ? "NEXT"<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">+                           : CheckTy == Check::CheckEmpty ? "EMPTY" : "SAME";<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">       SM.PrintMessage(SMLoc::getFromPointer(UsedPrefixStart),<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">                       SourceMgr::DK_Error,<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">                       "found '" + UsedPrefix + "-" + Type +<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">@@ -1057,22 +1081,32 @@ size_t CheckString::Check(const SourceMg<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">/// Verify there is a single line in the given buffer.<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">bool CheckString::CheckNext(const SourceMgr &SM, StringRef Buffer) const {<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">-  if (Pat.getCheckTy() != Check::CheckNext)<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">+  if (Pat.getCheckTy() != Check::CheckNext &&<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">+      Pat.getCheckTy() != Check::CheckEmpty)<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">     return false;<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">+  Twine CheckName =<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">+      Prefix +<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">+      Twine(Pat.getCheckTy() == Check::CheckEmpty ? "-EMPTY" : "-NEXT");<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">+<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">   // Count the number of newlines between the previous match and this one.<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">   assert(Buffer.data() !=<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">              SM.getMemoryBuffer(SM.FindBufferContainingLoc(<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">                                     SMLoc::getFromPointer(Buffer.data())))<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">                  ->getBufferStart() &&<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">-         "CHECK-NEXT can't be the first check in a file");<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">+         "CHECK-NEXT and CHECK-EMPTY can't be the first check in a file");<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">   const char *FirstNewLine = nullptr;<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">   unsigned NumNewLines = CountNumNewlinesBetween(Buffer, FirstNewLine);<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">+  // For CHECK-EMPTY, the preceding new line is consumed by the pattern, so<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">+  // this needs to be re-added.<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">+  if (Pat.getCheckTy() == Check::CheckEmpty)<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">+    ++NumNewLines;<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">+<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">   if (NumNewLines == 0) {<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">     SM.PrintMessage(Loc, SourceMgr::DK_Error,<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">-                    Prefix + "-NEXT: is on the same line as previous match");<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">+                    CheckName + ": is on the same line as previous match");<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">     SM.PrintMessage(SMLoc::getFromPointer(Buffer.end()), SourceMgr::DK_Note,<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">                     "'next' match was here");<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">     SM.PrintMessage(SMLoc::getFromPointer(Buffer.data()), SourceMgr::DK_Note,<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">@@ -1082,8 +1116,8 @@ bool CheckString::CheckNext(const Source<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">   if (NumNewLines != 1) {<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">     SM.PrintMessage(Loc, SourceMgr::DK_Error,<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">-                    Prefix +<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">-                        "-NEXT: is not on the line after the previous match");<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">+                    CheckName +<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">+                        ": is not on the line after the previous match");<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">     SM.PrintMessage(SMLoc::getFromPointer(Buffer.end()), SourceMgr::DK_Note,<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">                     "'next' match was here");<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">     SM.PrintMessage(SMLoc::getFromPointer(Buffer.data()), SourceMgr::DK_Note,<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in"><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in"><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">_______________________________________________<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in">llvm-commits mailing list<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in"><a href="mailto:llvm-commits@lists.llvm.org">llvm-commits@lists.llvm.org</a><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in"><a href="https://urldefense.proofpoint.com/v2/url?u=http-3A__lists.llvm.org_cgi-2Dbin_mailman_listinfo_llvm-2Dcommits&d=DwIGaQ&c=5VD0RTtNlTh3ycd41b3MUw&r=o3kDXzdBUE3ljQXKeTWOMw&m=2-S1z7T7v1sFBeG2mPwydbqJ4Cb8Vgsa2GpqO298kPs&s=IixYw__8z0du405p7rsYExTUCmou9nk0ma2g1c9pa8M&e=">https://urldefense.proofpoint.com/v2/url?u=http-3A__lists.llvm.org_cgi-2Dbin_mailman_listinfo_llvm-2Dcommits&d=DwIGaQ&c=5VD0RTtNlTh3ycd41b3MUw&r=o3kDXzdBUE3ljQXKeTWOMw&m=2-S1z7T7v1sFBeG2mPwydbqJ4Cb8Vgsa2GpqO298kPs&s=IixYw__8z0du405p7rsYExTUCmou9nk0ma2g1c9pa8M&e=</a><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:.5in"><o:p> </o:p></p>
</div>
</div>
</body>
</html>