<div dir="ltr"><br><div class="gmail_extra"><br><div class="gmail_quote">On Sat, Jun 13, 2015 at 12:11 AM, Eric Fiselier <span dir="ltr"><<a href="mailto:eric@efcs.ca" target="_blank">eric@efcs.ca</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Author: ericwf<br>
Date: Sat Jun 13 02:11:40 2015<br>
New Revision: 239665<br>
<br>
URL: <a href="https://urldefense.proofpoint.com/v2/url?u=http-3A__llvm.org_viewvc_llvm-2Dproject-3Frev-3D239665-26view-3Drev&d=AwMFaQ&c=8hUWFZcy2Z-Za5rBPlktOQ&r=BSqEv9KvKMW_Ob8SyngJ70KdZISM_ASROnREeq0cCxk&m=k83L_khkj86BpOvYcXZkvvUi4N7GN-yeG7hpUt2UTQQ&s=H2HVi9sixnAkBgn-AVugfduu1mXH-PbRlyDyXrptMHA&e=" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project?rev=239665&view=rev</a><br>
Log:<br>
Add `-verify-ignore-unexpected` option to ignore unexpected diagnostics in VerifyDiagnosticsConsumer<br>
<br>
Summary:<br>
The goal of this patch is to make `-verify` easier to use when testing libc++. The `notes` attached to compile error diagnostics are numerous and relatively unstable when they reference libc++ header internals. This patch allows libc++ to write stable compilation failure tests by allowing unexpected diagnostic messages to be ignored where they are not relevant.<br></blockquote><div><br>Would it be better to have a flag that only ignores notes (or do we have a flag that disables notes? That might be generically useful?).<br><br>I'd be concerned that ignoring unexpected diagnostics could hide warnings/errors in libc++?<br> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
<br>
This patch adds a new CC1 flag called `-verify-ignore-unexpected`. `-verify-ignore-unexpected` tells `VerifyDiagnosticsConsumer` to ignore *all* unexpected diagnostic messages. `-verify-ignore-unexpected=<LevelList>` can be used to only ignore certain diagnostic levels. `<LevelList>` is a comma separated list of diagnostic levels to ignore. The supported levels are `note`, `remark`, `warning` and `error`.<br>
<br>
<br>
<br>
Reviewers: bogner, grosser, EricWF<br>
<br>
Reviewed By: EricWF<br>
<br>
Subscribers: cfe-commits<br>
<br>
Differential Revision: <a href="https://urldefense.proofpoint.com/v2/url?u=http-3A__reviews.llvm.org_D10138&d=AwMFaQ&c=8hUWFZcy2Z-Za5rBPlktOQ&r=BSqEv9KvKMW_Ob8SyngJ70KdZISM_ASROnREeq0cCxk&m=k83L_khkj86BpOvYcXZkvvUi4N7GN-yeG7hpUt2UTQQ&s=V9DUmhyW4oshxtLOxtrFlP-6A6KjrOUsa7WF_OFOdMk&e=" rel="noreferrer" target="_blank">http://reviews.llvm.org/D10138</a><br>
<br>
Added:<br>
    cfe/trunk/lib/Basic/DiagnosticOptions.cpp<br>
    cfe/trunk/test/Frontend/verify-ignore-unexpected.c<br>
Modified:<br>
    cfe/trunk/include/clang/Basic/DiagnosticOptions.def<br>
    cfe/trunk/include/clang/Basic/DiagnosticOptions.h<br>
    cfe/trunk/include/clang/Driver/CC1Options.td<br>
    cfe/trunk/lib/Basic/CMakeLists.txt<br>
    cfe/trunk/lib/Frontend/CompilerInvocation.cpp<br>
    cfe/trunk/lib/Frontend/VerifyDiagnosticConsumer.cpp<br>
<br>
Modified: cfe/trunk/include/clang/Basic/DiagnosticOptions.def<br>
URL: <a href="https://urldefense.proofpoint.com/v2/url?u=http-3A__llvm.org_viewvc_llvm-2Dproject_cfe_trunk_include_clang_Basic_DiagnosticOptions.def-3Frev-3D239665-26r1-3D239664-26r2-3D239665-26view-3Ddiff&d=AwMFaQ&c=8hUWFZcy2Z-Za5rBPlktOQ&r=BSqEv9KvKMW_Ob8SyngJ70KdZISM_ASROnREeq0cCxk&m=k83L_khkj86BpOvYcXZkvvUi4N7GN-yeG7hpUt2UTQQ&s=X1wSy-TnFJAti8uWdBbZ3bF9GQwbclmbip50Shw2NnU&e=" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Basic/DiagnosticOptions.def?rev=239665&r1=239664&r2=239665&view=diff</a><br>
==============================================================================<br>
--- cfe/trunk/include/clang/Basic/DiagnosticOptions.def (original)<br>
+++ cfe/trunk/include/clang/Basic/DiagnosticOptions.def Sat Jun 13 02:11:40 2015<br>
@@ -69,7 +69,10 @@ ENUM_DIAGOPT(ShowOverloads, OverloadsSho<br>
 DIAGOPT(VerifyDiagnostics, 1, 0) /// Check that diagnostics match the expected<br>
                                  /// diagnostics, indicated by markers in the<br>
                                  /// input source file.<br>
-<br>
+ENUM_DIAGOPT(VerifyIgnoreUnexpected, DiagnosticLevelMask, 4,<br>
+             DiagnosticLevelMask::None) /// Ignore unexpected diagnostics of<br>
+                                        /// the specified levels when using<br>
+                                        /// -verify.<br>
 DIAGOPT(ElideType, 1, 0)         /// Elide identical types in template diffing<br>
 DIAGOPT(ShowTemplateTree, 1, 0)  /// Print a template tree when diffing<br>
 DIAGOPT(CLFallbackMode, 1, 0)    /// Format for clang-cl fallback mode<br>
<br>
Modified: cfe/trunk/include/clang/Basic/DiagnosticOptions.h<br>
URL: <a href="https://urldefense.proofpoint.com/v2/url?u=http-3A__llvm.org_viewvc_llvm-2Dproject_cfe_trunk_include_clang_Basic_DiagnosticOptions.h-3Frev-3D239665-26r1-3D239664-26r2-3D239665-26view-3Ddiff&d=AwMFaQ&c=8hUWFZcy2Z-Za5rBPlktOQ&r=BSqEv9KvKMW_Ob8SyngJ70KdZISM_ASROnREeq0cCxk&m=k83L_khkj86BpOvYcXZkvvUi4N7GN-yeG7hpUt2UTQQ&s=s8D_Blt5P9oe6KkRDbDtsGYmkf-YPHGa9dAZRR-euKA&e=" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Basic/DiagnosticOptions.h?rev=239665&r1=239664&r2=239665&view=diff</a><br>
==============================================================================<br>
--- cfe/trunk/include/clang/Basic/DiagnosticOptions.h (original)<br>
+++ cfe/trunk/include/clang/Basic/DiagnosticOptions.h Sat Jun 13 02:11:40 2015<br>
@@ -13,6 +13,7 @@<br>
 #include "clang/Basic/LLVM.h"<br>
 #include "llvm/ADT/IntrusiveRefCntPtr.h"<br>
 #include <string><br>
+#include <type_traits><br>
 #include <vector><br>
<br>
 namespace clang {<br>
@@ -24,6 +25,38 @@ enum OverloadsShown : unsigned {<br>
   Ovl_Best  ///< Show just the "best" overload candidates.<br>
 };<br>
<br>
+/// \brief A bitmask representing the diagnostic levels used by<br>
+/// VerifyDiagnosticConsumer.<br>
+enum class DiagnosticLevelMask : unsigned {<br>
+  None    = 0,<br>
+  Note    = 1 << 0,<br>
+  Remark  = 1 << 1,<br>
+  Warning = 1 << 2,<br>
+  Error   = 1 << 3,<br>
+  All     = Note | Remark | Warning | Error<br>
+};<br>
+<br>
+inline DiagnosticLevelMask operator~(DiagnosticLevelMask M) {<br>
+  using UT = std::underlying_type<DiagnosticLevelMask>::type;<br>
+  return static_cast<DiagnosticLevelMask>(~static_cast<UT>(M));<br>
+}<br>
+<br>
+inline DiagnosticLevelMask operator|(DiagnosticLevelMask LHS,<br>
+                                     DiagnosticLevelMask RHS) {<br>
+  using UT = std::underlying_type<DiagnosticLevelMask>::type;<br>
+  return static_cast<DiagnosticLevelMask>(<br>
+    static_cast<UT>(LHS) | static_cast<UT>(RHS));<br>
+}<br>
+<br>
+inline DiagnosticLevelMask operator&(DiagnosticLevelMask LHS,<br>
+                                     DiagnosticLevelMask RHS) {<br>
+  using UT = std::underlying_type<DiagnosticLevelMask>::type;<br>
+  return static_cast<DiagnosticLevelMask>(<br>
+    static_cast<UT>(LHS) & static_cast<UT>(RHS));<br>
+}<br>
+<br>
+raw_ostream& operator<<(raw_ostream& Out, DiagnosticLevelMask M);<br>
+<br>
 /// \brief Options for controlling the compiler diagnostics engine.<br>
 class DiagnosticOptions : public RefCountedBase<DiagnosticOptions>{<br>
 public:<br>
<br>
Modified: cfe/trunk/include/clang/Driver/CC1Options.td<br>
URL: <a href="https://urldefense.proofpoint.com/v2/url?u=http-3A__llvm.org_viewvc_llvm-2Dproject_cfe_trunk_include_clang_Driver_CC1Options.td-3Frev-3D239665-26r1-3D239664-26r2-3D239665-26view-3Ddiff&d=AwMFaQ&c=8hUWFZcy2Z-Za5rBPlktOQ&r=BSqEv9KvKMW_Ob8SyngJ70KdZISM_ASROnREeq0cCxk&m=k83L_khkj86BpOvYcXZkvvUi4N7GN-yeG7hpUt2UTQQ&s=N03iPztzUC7Kk0tRFtufeOfdxKoj_TYJr8yKNafZ3GY&e=" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Driver/CC1Options.td?rev=239665&r1=239664&r2=239665&view=diff</a><br>
==============================================================================<br>
--- cfe/trunk/include/clang/Driver/CC1Options.td (original)<br>
+++ cfe/trunk/include/clang/Driver/CC1Options.td Sat Jun 13 02:11:40 2015<br>
@@ -301,6 +301,10 @@ def fmessage_length : Separate<["-"], "f<br>
   HelpText<"Format message diagnostics so that they fit within N columns or fewer, when possible.">;<br>
 def verify : Flag<["-"], "verify">,<br>
   HelpText<"Verify diagnostic output using comment directives">;<br>
+def verify_ignore_unexpected : Flag<["-"], "verify-ignore-unexpected">,<br>
+  HelpText<"Ignore unexpected diagnostic messages">;<br>
+def verify_ignore_unexpected_EQ : CommaJoined<["-"], "verify-ignore-unexpected=">,<br>
+  HelpText<"Ignore unexpected diagnostic messages">;<br>
 def Wno_rewrite_macros : Flag<["-"], "Wno-rewrite-macros">,<br>
   HelpText<"Silence ObjC rewriting warnings">;<br>
<br>
<br>
Modified: cfe/trunk/lib/Basic/CMakeLists.txt<br>
URL: <a href="https://urldefense.proofpoint.com/v2/url?u=http-3A__llvm.org_viewvc_llvm-2Dproject_cfe_trunk_lib_Basic_CMakeLists.txt-3Frev-3D239665-26r1-3D239664-26r2-3D239665-26view-3Ddiff&d=AwMFaQ&c=8hUWFZcy2Z-Za5rBPlktOQ&r=BSqEv9KvKMW_Ob8SyngJ70KdZISM_ASROnREeq0cCxk&m=k83L_khkj86BpOvYcXZkvvUi4N7GN-yeG7hpUt2UTQQ&s=eBsCuyjyBXf5DsyywuPaQRSDPfRcsE_lCcGB9-1JGgQ&e=" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Basic/CMakeLists.txt?rev=239665&r1=239664&r2=239665&view=diff</a><br>
==============================================================================<br>
--- cfe/trunk/lib/Basic/CMakeLists.txt (original)<br>
+++ cfe/trunk/lib/Basic/CMakeLists.txt Sat Jun 13 02:11:40 2015<br>
@@ -61,6 +61,7 @@ add_clang_library(clangBasic<br>
   CharInfo.cpp<br>
   Diagnostic.cpp<br>
   DiagnosticIDs.cpp<br>
+  DiagnosticOptions.cpp<br>
   FileManager.cpp<br>
   FileSystemStatCache.cpp<br>
   IdentifierTable.cpp<br>
<br>
Added: cfe/trunk/lib/Basic/DiagnosticOptions.cpp<br>
URL: <a href="https://urldefense.proofpoint.com/v2/url?u=http-3A__llvm.org_viewvc_llvm-2Dproject_cfe_trunk_lib_Basic_DiagnosticOptions.cpp-3Frev-3D239665-26view-3Dauto&d=AwMFaQ&c=8hUWFZcy2Z-Za5rBPlktOQ&r=BSqEv9KvKMW_Ob8SyngJ70KdZISM_ASROnREeq0cCxk&m=k83L_khkj86BpOvYcXZkvvUi4N7GN-yeG7hpUt2UTQQ&s=BmxnuyTG__nwM1kElRYXLnntmNpzjDoPS3ZGV_pRQ24&e=" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Basic/DiagnosticOptions.cpp?rev=239665&view=auto</a><br>
==============================================================================<br>
--- cfe/trunk/lib/Basic/DiagnosticOptions.cpp (added)<br>
+++ cfe/trunk/lib/Basic/DiagnosticOptions.cpp Sat Jun 13 02:11:40 2015<br>
@@ -0,0 +1,24 @@<br>
+//===--- DiagnosticOptions.cpp - C Language Family Diagnostic Handling ----===//<br>
+//<br>
+//                     The LLVM Compiler Infrastructure<br>
+//<br>
+// This file is distributed under the University of Illinois Open Source<br>
+// License. See LICENSE.TXT for details.<br>
+//<br>
+//===----------------------------------------------------------------------===//<br>
+//<br>
+//  This file implements the DiagnosticOptions related interfaces.<br>
+//<br>
+//===----------------------------------------------------------------------===//<br>
+<br>
+#include "clang/Basic/DiagnosticOptions.h"<br>
+#include "llvm/Support/raw_ostream.h"<br>
+<br>
+namespace clang {<br>
+<br>
+raw_ostream& operator<<(raw_ostream& Out, DiagnosticLevelMask M) {<br>
+  using UT = std::underlying_type<DiagnosticLevelMask>::type;<br>
+  return Out << static_cast<UT>(M);<br>
+}<br>
+<br>
+} // end namespace clang<br>
<br>
Modified: cfe/trunk/lib/Frontend/CompilerInvocation.cpp<br>
URL: <a href="https://urldefense.proofpoint.com/v2/url?u=http-3A__llvm.org_viewvc_llvm-2Dproject_cfe_trunk_lib_Frontend_CompilerInvocation.cpp-3Frev-3D239665-26r1-3D239664-26r2-3D239665-26view-3Ddiff&d=AwMFaQ&c=8hUWFZcy2Z-Za5rBPlktOQ&r=BSqEv9KvKMW_Ob8SyngJ70KdZISM_ASROnREeq0cCxk&m=k83L_khkj86BpOvYcXZkvvUi4N7GN-yeG7hpUt2UTQQ&s=W-c5hNpV1D6MoGl_Y6PsnEKCph2IzGe3PqUddp8Fr9M&e=" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Frontend/CompilerInvocation.cpp?rev=239665&r1=239664&r2=239665&view=diff</a><br>
==============================================================================<br>
--- cfe/trunk/lib/Frontend/CompilerInvocation.cpp (original)<br>
+++ cfe/trunk/lib/Frontend/CompilerInvocation.cpp Sat Jun 13 02:11:40 2015<br>
@@ -321,6 +321,29 @@ GenerateOptimizationRemarkRegex(Diagnost<br>
   return Pattern;<br>
 }<br>
<br>
+static bool parseDiagnosticLevelMask(StringRef FlagName,<br>
+                                     const std::vector<std::string> &Levels,<br>
+                                     DiagnosticsEngine *Diags,<br>
+                                     DiagnosticLevelMask &M) {<br>
+  bool Success = true;<br>
+  for (const auto &Level : Levels) {<br>
+    DiagnosticLevelMask const PM =<br>
+      llvm::StringSwitch<DiagnosticLevelMask>(Level)<br>
+        .Case("note",    DiagnosticLevelMask::Note)<br>
+        .Case("remark",  DiagnosticLevelMask::Remark)<br>
+        .Case("warning", DiagnosticLevelMask::Warning)<br>
+        .Case("error",   DiagnosticLevelMask::Error)<br>
+        .Default(DiagnosticLevelMask::None);<br>
+    if (PM == DiagnosticLevelMask::None) {<br>
+      Success = false;<br>
+      if (Diags)<br>
+        Diags->Report(diag::err_drv_invalid_value) << FlagName << Level;<br>
+    }<br>
+    M = M | PM;<br>
+  }<br>
+  return Success;<br>
+}<br>
+<br>
 static void parseSanitizerKinds(StringRef FlagName,<br>
                                 const std::vector<std::string> &Sanitizers,<br>
                                 DiagnosticsEngine &Diags, SanitizerSet &S) {<br>
@@ -748,11 +771,18 @@ bool clang::ParseDiagnosticArgs(Diagnost<br>
       << Args.getLastArg(OPT_fdiagnostics_format)->getAsString(Args)<br>
       << Format;<br>
   }<br>
-<br>
+<br>
   Opts.ShowSourceRanges = Args.hasArg(OPT_fdiagnostics_print_source_range_info);<br>
   Opts.ShowParseableFixits = Args.hasArg(OPT_fdiagnostics_parseable_fixits);<br>
   Opts.ShowPresumedLoc = !Args.hasArg(OPT_fno_diagnostics_use_presumed_location);<br>
   Opts.VerifyDiagnostics = Args.hasArg(OPT_verify);<br>
+  DiagnosticLevelMask DiagMask = DiagnosticLevelMask::None;<br>
+  Success &= parseDiagnosticLevelMask("-verify-ignore-unexpected=",<br>
+    Args.getAllArgValues(OPT_verify_ignore_unexpected_EQ),<br>
+    Diags, DiagMask);<br>
+  if (Args.hasArg(OPT_verify_ignore_unexpected))<br>
+    DiagMask = DiagnosticLevelMask::All;<br>
+  Opts.setVerifyIgnoreUnexpected(DiagMask);<br>
   Opts.ElideType = !Args.hasArg(OPT_fno_elide_type);<br>
   Opts.ShowTemplateTree = Args.hasArg(OPT_fdiagnostics_show_template_tree);<br>
   Opts.ErrorLimit = getLastArgIntValue(Args, OPT_ferror_limit, 0, Diags);<br>
<br>
Modified: cfe/trunk/lib/Frontend/VerifyDiagnosticConsumer.cpp<br>
URL: <a href="https://urldefense.proofpoint.com/v2/url?u=http-3A__llvm.org_viewvc_llvm-2Dproject_cfe_trunk_lib_Frontend_VerifyDiagnosticConsumer.cpp-3Frev-3D239665-26r1-3D239664-26r2-3D239665-26view-3Ddiff&d=AwMFaQ&c=8hUWFZcy2Z-Za5rBPlktOQ&r=BSqEv9KvKMW_Ob8SyngJ70KdZISM_ASROnREeq0cCxk&m=k83L_khkj86BpOvYcXZkvvUi4N7GN-yeG7hpUt2UTQQ&s=0FLTnQiDlDvXSsXazOYOT7fVeUN89G2NdoopltEB5I8&e=" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Frontend/VerifyDiagnosticConsumer.cpp?rev=239665&r1=239664&r2=239665&view=diff</a><br>
==============================================================================<br>
--- cfe/trunk/lib/Frontend/VerifyDiagnosticConsumer.cpp (original)<br>
+++ cfe/trunk/lib/Frontend/VerifyDiagnosticConsumer.cpp Sat Jun 13 02:11:40 2015<br>
@@ -691,7 +691,8 @@ static unsigned CheckLists(DiagnosticsEn<br>
                            const char *Label,<br>
                            DirectiveList &Left,<br>
                            const_diag_iterator d2_begin,<br>
-                           const_diag_iterator d2_end) {<br>
+                           const_diag_iterator d2_end,<br>
+                           bool IgnoreUnexpected) {<br>
   std::vector<Directive *> LeftOnly;<br>
   DiagList Right(d2_begin, d2_end);<br>
<br>
@@ -727,7 +728,8 @@ static unsigned CheckLists(DiagnosticsEn<br>
   }<br>
   // Now all that's left in Right are those that were not matched.<br>
   unsigned num = PrintExpected(Diags, SourceMgr, LeftOnly, Label);<br>
-  num += PrintUnexpected(Diags, &SourceMgr, Right.begin(), Right.end(), Label);<br>
+  if (!IgnoreUnexpected)<br>
+    num += PrintUnexpected(Diags, &SourceMgr, Right.begin(), Right.end(), Label);<br>
   return num;<br>
 }<br>
<br>
@@ -745,21 +747,28 @@ static unsigned CheckResults(Diagnostics<br>
   //   Seen \ Expected - set seen but not expected<br>
   unsigned NumProblems = 0;<br>
<br>
+  const DiagnosticLevelMask DiagMask =<br>
+    Diags.getDiagnosticOptions().getVerifyIgnoreUnexpected();<br>
+<br>
   // See if there are error mismatches.<br>
   NumProblems += CheckLists(Diags, SourceMgr, "error", ED.Errors,<br>
-                            Buffer.err_begin(), Buffer.err_end());<br>
+                            Buffer.err_begin(), Buffer.err_end(),<br>
+                            bool(DiagnosticLevelMask::Error & DiagMask));<br>
<br>
   // See if there are warning mismatches.<br>
   NumProblems += CheckLists(Diags, SourceMgr, "warning", ED.Warnings,<br>
-                            Buffer.warn_begin(), Buffer.warn_end());<br>
+                            Buffer.warn_begin(), Buffer.warn_end(),<br>
+                            bool(DiagnosticLevelMask::Warning & DiagMask));<br>
<br>
   // See if there are remark mismatches.<br>
   NumProblems += CheckLists(Diags, SourceMgr, "remark", ED.Remarks,<br>
-                            Buffer.remark_begin(), Buffer.remark_end());<br>
+                            Buffer.remark_begin(), Buffer.remark_end(),<br>
+                            bool(DiagnosticLevelMask::Remark & DiagMask));<br>
<br>
   // See if there are note mismatches.<br>
   NumProblems += CheckLists(Diags, SourceMgr, "note", ED.Notes,<br>
-                            Buffer.note_begin(), Buffer.note_end());<br>
+                            Buffer.note_begin(), Buffer.note_end(),<br>
+                            bool(DiagnosticLevelMask::Note & DiagMask));<br>
<br>
   return NumProblems;<br>
 }<br>
@@ -854,12 +863,20 @@ void VerifyDiagnosticConsumer::CheckDiag<br>
     // Check that the expected diagnostics occurred.<br>
     NumErrors += CheckResults(Diags, *SrcManager, *Buffer, ED);<br>
   } else {<br>
-    NumErrors += (PrintUnexpected(Diags, nullptr, Buffer->err_begin(),<br>
-                                  Buffer->err_end(), "error") +<br>
-                  PrintUnexpected(Diags, nullptr, Buffer->warn_begin(),<br>
-                                  Buffer->warn_end(), "warn") +<br>
-                  PrintUnexpected(Diags, nullptr, Buffer->note_begin(),<br>
-                                  Buffer->note_end(), "note"));<br>
+    const DiagnosticLevelMask DiagMask =<br>
+        ~Diags.getDiagnosticOptions().getVerifyIgnoreUnexpected();<br>
+    if (bool(DiagnosticLevelMask::Error & DiagMask))<br>
+      NumErrors += PrintUnexpected(Diags, nullptr, Buffer->err_begin(),<br>
+                                   Buffer->err_end(), "error");<br>
+    if (bool(DiagnosticLevelMask::Warning & DiagMask))<br>
+      NumErrors += PrintUnexpected(Diags, nullptr, Buffer->warn_begin(),<br>
+                                   Buffer->warn_end(), "warn");<br>
+    if (bool(DiagnosticLevelMask::Remark & DiagMask))<br>
+      NumErrors += PrintUnexpected(Diags, nullptr, Buffer->remark_begin(),<br>
+                                   Buffer->remark_end(), "remark");<br>
+    if (bool(DiagnosticLevelMask::Note & DiagMask))<br>
+      NumErrors += PrintUnexpected(Diags, nullptr, Buffer->note_begin(),<br>
+                                   Buffer->note_end(), "note");<br>
   }<br>
<br>
   Diags.setClient(CurClient, Owner.release() != nullptr);<br>
<br>
Added: cfe/trunk/test/Frontend/verify-ignore-unexpected.c<br>
URL: <a href="https://urldefense.proofpoint.com/v2/url?u=http-3A__llvm.org_viewvc_llvm-2Dproject_cfe_trunk_test_Frontend_verify-2Dignore-2Dunexpected.c-3Frev-3D239665-26view-3Dauto&d=AwMFaQ&c=8hUWFZcy2Z-Za5rBPlktOQ&r=BSqEv9KvKMW_Ob8SyngJ70KdZISM_ASROnREeq0cCxk&m=k83L_khkj86BpOvYcXZkvvUi4N7GN-yeG7hpUt2UTQQ&s=BoG5TS-GkCKKg1ySLRPggLVZwExxjjiIQWaM6fYcoK0&e=" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Frontend/verify-ignore-unexpected.c?rev=239665&view=auto</a><br>
==============================================================================<br>
--- cfe/trunk/test/Frontend/verify-ignore-unexpected.c (added)<br>
+++ cfe/trunk/test/Frontend/verify-ignore-unexpected.c Sat Jun 13 02:11:40 2015<br>
@@ -0,0 +1,81 @@<br>
+// RUN: not %clang_cc1 -DTEST_SWITCH -verify-ignore-unexpected=remark,aoeu,note -verify %s 2>&1 \<br>
+// RUN:     | FileCheck -check-prefix=CHECK-BAD-SWITCH %s<br>
+#ifdef TEST_SWITCH<br>
+// expected-no-diagnostics<br>
+#endif<br>
+// CHECK-BAD-SWITCH: error: 'error' diagnostics seen but not expected:<br>
+// CHECK-BAD-SWITCH-NEXT: (frontend): invalid value 'aoeu' in '-verify-ignore-unexpected='<br>
+<br>
+// RUN: %clang_cc1 -DTEST1 -verify %s<br>
+// RUN: %clang_cc1 -DTEST1 -verify -verify-ignore-unexpected %s<br>
+#ifdef TEST1<br>
+#warning MyWarning1<br>
+    // expected-warning@-1 {{MyWarning1}}<br>
+int x; // expected-note {{previous definition is here}}<br>
+float x; // expected-error {{redefinition of 'x'}}<br>
+#endif<br>
+<br>
+// RUN: not %clang_cc1 -DTEST2 -verify %s 2>&1 \<br>
+// RUN:     | FileCheck -check-prefix=CHECK-UNEXP %s<br>
+// RUN: not %clang_cc1 -DTEST2 -verify -verify-ignore-unexpected= %s 2>&1 \<br>
+// RUN:     | FileCheck -check-prefix=CHECK-UNEXP %s<br>
+// RUN: not %clang_cc1 -DTEST2 -verify -verify-ignore-unexpected=note %s 2>&1 \<br>
+// RUN:     | FileCheck -check-prefix=CHECK-NOTE %s<br>
+// RUN: not %clang_cc1 -DTEST2 -verify -verify-ignore-unexpected=warning %s 2>&1 \<br>
+// RUN:     | FileCheck -check-prefix=CHECK-WARN %s<br>
+// RUN: not %clang_cc1 -DTEST2 -verify -verify-ignore-unexpected=error %s 2>&1 \<br>
+// RUN:     | FileCheck -check-prefix=CHECK-ERR %s<br>
+#ifdef TEST2<br>
+#warning MyWarning2<br>
+int x;<br>
+float x;<br>
+#endif<br>
+// CHECK-UNEXP: no expected directives found<br>
+// CHECK-UNEXP-NEXT: 'error' diagnostics seen but not expected<br>
+// CHECK-UNEXP-NEXT: Line {{[0-9]+}}: redefinition of 'x'<br>
+// CHECK-UNEXP-NEXT: 'warning' diagnostics seen but not expected<br>
+// CHECK-UNEXP-NEXT: Line {{[0-9]+}}: MyWarning2<br>
+// CHECK-UNEXP-NEXT: 'note' diagnostics seen but not expected<br>
+// CHECK-UNEXP-NEXT: Line {{[0-9]+}}: previous definition is here<br>
+// CHECK-UNEXP-NEXT: 4 errors generated.<br>
+<br>
+// CHECK-NOTE: no expected directives found<br>
+// CHECK-NOTE-NEXT: 'error' diagnostics seen but not expected<br>
+// CHECK-NOTE-NEXT: Line {{[0-9]+}}: redefinition of 'x'<br>
+// CHECK-NOTE-NEXT: 'warning' diagnostics seen but not expected<br>
+// CHECK-NOTE-NEXT: Line {{[0-9]+}}: MyWarning2<br>
+// CHECK-NOTE-NEXT: 3 errors generated.<br>
+<br>
+// CHECK-WARN: no expected directives found<br>
+// CHECK-WARN-NEXT: 'error' diagnostics seen but not expected<br>
+// CHECK-WARN-NEXT: Line {{[0-9]+}}: redefinition of 'x'<br>
+// CHECK-WARN-NEXT: 'note' diagnostics seen but not expected<br>
+// CHECK-WARN-NEXT: Line {{[0-9]+}}: previous definition is here<br>
+// CHECK-WARN-NEXT: 3 errors generated.<br>
+<br>
+// CHECK-ERR: no expected directives found<br>
+// CHECK-ERR-NEXT: 'warning' diagnostics seen but not expected<br>
+// CHECK-ERR-NEXT: Line {{[0-9]+}}: MyWarning2<br>
+// CHECK-ERR-NEXT: 'note' diagnostics seen but not expected<br>
+// CHECK-ERR-NEXT: Line {{[0-9]+}}: previous definition is here<br>
+// CHECK-ERR-NEXT: 3 errors generated.<br>
+<br>
+// RUN: not %clang_cc1 -DTEST3 -verify -verify-ignore-unexpected %s 2>&1 \<br>
+// RUN:     | FileCheck -check-prefix=CHECK-EXP %s<br>
+#ifdef TEST3<br>
+// expected-error {{test3}}<br>
+#endif<br>
+// CHECK-EXP: 'error' diagnostics expected but not seen<br>
+// CHECK-EXP-NEXT: Line {{[0-9]+}}: test3<br>
+<br>
+// RUN: not %clang_cc1 -DTEST4 -verify -verify-ignore-unexpected %s 2>&1 \<br>
+// RUN:     | FileCheck -check-prefix=CHECK-NOEXP %s<br>
+// RUN: not %clang_cc1 -DTEST4 -verify -verify-ignore-unexpected=warning,error,note %s 2>&1 \<br>
+// RUN:     | FileCheck -check-prefix=CHECK-NOEXP %s<br>
+#ifdef TEST4<br>
+#warning MyWarning4<br>
+int x;<br>
+float x;<br>
+#endif<br>
+// CHECK-NOEXP: error: no expected directives found<br>
+// CHECK-NOEXP-NEXT: 1 error generated<br>
<br>
<br>
_______________________________________________<br>
cfe-commits mailing list<br>
<a href="mailto:cfe-commits@cs.uiuc.edu">cfe-commits@cs.uiuc.edu</a><br>
<a href="http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits" rel="noreferrer" target="_blank">http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits</a><br>
</blockquote></div><br></div></div>