<div dir="ltr"><br><div class="gmail_extra"><br><div class="gmail_quote">On Sat, Jun 13, 2015 at 9:32 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"><span class="">On Sat, Jun 13, 2015 at 12:16 PM, David Blaikie <<a href="mailto:dblaikie@gmail.com">dblaikie@gmail.com</a>> wrote:<br>
><br>
><br>
> On Sat, Jun 13, 2015 at 12:11 AM, Eric Fiselier <<a href="mailto:eric@efcs.ca">eric@efcs.ca</a>> wrote:<br>
>><br>
>> 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=36WdRqpk57GHVRcI1f7ihYjOa3YBtwV2lIhF6Pr2PHw&s=qZ3mLrQ1vp1DoQbQC4wxvAeTEBqKDJTC_laDJJhBjcY&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<br>
>> VerifyDiagnosticsConsumer<br>
>><br>
>> Summary:<br>
>> The goal of this patch is to make `-verify` easier to use when testing<br>
>> libc++. The `notes` attached to compile error diagnostics are numerous and<br>
>> relatively unstable when they reference libc++ header internals. This patch<br>
>> allows libc++ to write stable compilation failure tests by allowing<br>
>> unexpected diagnostic messages to be ignored where they are not relevant.<br>
><br>
><br>
> Would it be better to have a flag that only ignores notes (or do we have a<br>
> flag that disables notes? That might be generically useful?).<br>
<br>
</span>-verify-ignore-unexpected=note will only ignore notes.<br>
<span class=""><br>
> I'd be concerned that ignoring unexpected diagnostics could hide<br>
> warnings/errors in libc++?<br>
<br>
</span>I agree with your concerns. Within libc++ I was only planning on<br>
ignoring notes, and possibly<br>
warnings in some contexts (C++11 extensions warnings for example).<br>
<br>
However I felt that providing '-verify-ignore-unexpected' and<br>
'-verify-ignore-unexpected=<Levels>'<br>
was a better, more generic, solution than just providing something<br>
like '-verify-ignore-unexpected-notes'.<br></blockquote><div><br>Oh, fair enough - seems I could've read a bit more carefully/completely. Sorry for the noise & thanks for the explanation!<br><br>- Dave<br> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
<span class="HOEnZb"><font color="#888888"><br>
/Eric<br>
</font></span><div class="HOEnZb"><div class="h5"><br>
<br>
><br>
>><br>
>><br>
>> This patch adds a new CC1 flag called `-verify-ignore-unexpected`.<br>
>> `-verify-ignore-unexpected` tells `VerifyDiagnosticsConsumer` to ignore<br>
>> *all* unexpected diagnostic messages.<br>
>> `-verify-ignore-unexpected=<LevelList>` can be used to only ignore certain<br>
>> diagnostic levels. `<LevelList>` is a comma separated list of diagnostic<br>
>> levels to ignore. The supported levels are `note`, `remark`, `warning` and<br>
>> `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=36WdRqpk57GHVRcI1f7ihYjOa3YBtwV2lIhF6Pr2PHw&s=B6YuWrVJvQSpyM3-BY0hp1Di-8SSOWyeVBp7_4jSqC4&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:<br>
>> <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=36WdRqpk57GHVRcI1f7ihYjOa3YBtwV2lIhF6Pr2PHw&s=qvzHmgdMGvDuCRTtvO7mFvLndq95jvihyaMaxt5mGlk&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>
>> ==============================================================================<br>
>> --- cfe/trunk/include/clang/Basic/DiagnosticOptions.def (original)<br>
>> +++ cfe/trunk/include/clang/Basic/DiagnosticOptions.def Sat Jun 13<br>
>> 02:11:40 2015<br>
>> @@ -69,7 +69,10 @@ ENUM_DIAGOPT(ShowOverloads, OverloadsSho<br>
>>  DIAGOPT(VerifyDiagnostics, 1, 0) /// Check that diagnostics match the<br>
>> expected<br>
>>                                   /// diagnostics, indicated by markers in<br>
>> the<br>
>>                                   /// input source file.<br>
>> -<br>
>> +ENUM_DIAGOPT(VerifyIgnoreUnexpected, DiagnosticLevelMask, 4,<br>
>> +             DiagnosticLevelMask::None) /// Ignore unexpected diagnostics<br>
>> of<br>
>> +                                        /// the specified levels when<br>
>> using<br>
>> +                                        /// -verify.<br>
>>  DIAGOPT(ElideType, 1, 0)         /// Elide identical types in template<br>
>> 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:<br>
>> <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=36WdRqpk57GHVRcI1f7ihYjOa3YBtwV2lIhF6Pr2PHw&s=lg6KccYpGD06IvzuXv0OkgiiiXM9TqXGKNd6FnxvIs4&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>
>> ==============================================================================<br>
>> --- cfe/trunk/include/clang/Basic/DiagnosticOptions.h (original)<br>
>> +++ cfe/trunk/include/clang/Basic/DiagnosticOptions.h Sat Jun 13 02:11:40<br>
>> 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:<br>
>> <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=36WdRqpk57GHVRcI1f7ihYjOa3YBtwV2lIhF6Pr2PHw&s=2Hc3mf1WMK5GnUuVI3RP3FimhJJ2raSxFSBe6waElxE&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>
>> ==============================================================================<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<br>
>> 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<["-"],<br>
>> "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:<br>
>> <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=36WdRqpk57GHVRcI1f7ihYjOa3YBtwV2lIhF6Pr2PHw&s=fVzOsUAZfX-tlJKgzyahUYmhXAMJ92OsTzxKBeBZYwU&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>
>> ==============================================================================<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:<br>
>> <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=36WdRqpk57GHVRcI1f7ihYjOa3YBtwV2lIhF6Pr2PHw&s=QF1Uhc-Phf3hYCfP8b51W4zNri7WeODbBsLc5_7Az6E&e=" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Basic/DiagnosticOptions.cpp?rev=239665&view=auto</a><br>
>><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>
>> +//<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>
>> +//<br>
>> +//  This file implements the DiagnosticOptions related interfaces.<br>
>> +//<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:<br>
>> <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=36WdRqpk57GHVRcI1f7ihYjOa3YBtwV2lIhF6Pr2PHw&s=fqNXcQXDJwsMn3RCuL_V2Gy_nPlbIiauqO40ji5TJkA&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>
>> ==============================================================================<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><br>
>> &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><br>
>> &Sanitizers,<br>
>>                                  DiagnosticsEngine &Diags, SanitizerSet<br>
>> &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 =<br>
>> Args.hasArg(OPT_fdiagnostics_print_source_range_info);<br>
>>    Opts.ShowParseableFixits =<br>
>> Args.hasArg(OPT_fdiagnostics_parseable_fixits);<br>
>>    Opts.ShowPresumedLoc =<br>
>> !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 =<br>
>> 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:<br>
>> <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=36WdRqpk57GHVRcI1f7ihYjOa3YBtwV2lIhF6Pr2PHw&s=w3joKMKoh-gUtR_tB8j3v2uruW-UIA6qZyoc1L68B-8&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>
>> ==============================================================================<br>
>> --- cfe/trunk/lib/Frontend/VerifyDiagnosticConsumer.cpp (original)<br>
>> +++ cfe/trunk/lib/Frontend/VerifyDiagnosticConsumer.cpp Sat Jun 13<br>
>> 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(),<br>
>> Label);<br>
>> +  if (!IgnoreUnexpected)<br>
>> +    num += PrintUnexpected(Diags, &SourceMgr, Right.begin(), Right.end(),<br>
>> 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 &<br>
>> 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 &<br>
>> 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,<br>
>> 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:<br>
>> <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=36WdRqpk57GHVRcI1f7ihYjOa3YBtwV2lIhF6Pr2PHw&s=cKSPtSrWzlyv0cxFFpD9zdC-S6sPMy4Qdf4wSw1GIGI&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>
>> ==============================================================================<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<br>
>> 2015<br>
>> @@ -0,0 +1,81 @@<br>
>> +// RUN: not %clang_cc1 -DTEST_SWITCH<br>
>> -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<br>
>> '-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>
>> \<br>
>> +// RUN:     | FileCheck -check-prefix=CHECK-UNEXP %s<br>
>> +// RUN: not %clang_cc1 -DTEST2 -verify -verify-ignore-unexpected=note %s<br>
>> 2>&1 \<br>
>> +// RUN:     | FileCheck -check-prefix=CHECK-NOTE %s<br>
>> +// RUN: not %clang_cc1 -DTEST2 -verify -verify-ignore-unexpected=warning<br>
>> %s 2>&1 \<br>
>> +// RUN:     | FileCheck -check-prefix=CHECK-WARN %s<br>
>> +// RUN: not %clang_cc1 -DTEST2 -verify -verify-ignore-unexpected=error %s<br>
>> 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>
>> \<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>
>> \<br>
>> +// RUN:     | FileCheck -check-prefix=CHECK-NOEXP %s<br>
>> +// RUN: not %clang_cc1 -DTEST4 -verify<br>
>> -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>
><br>
><br>
</div></div></blockquote></div><br></div></div>