<html><head><meta http-equiv="Content-Type" content="text/html charset=us-ascii"></head><body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;">Okay. done. Thanks!<div><br></div><div>-bw</div><div><br><div style=""><div>On Aug 6, 2014, at 6:05 PM, Richard Smith <<a href="mailto:richard@metafoo.co.uk">richard@metafoo.co.uk</a>> wrote:</div><br class="Apple-interchange-newline"><blockquote type="cite"><div dir="ltr">Hi Bill,<div><br></div><div>This is a bit of a big change for the branch, but I'd still like you to consider it; if we release with a -W flag accepted for a remark, we may find we need to accept that in future for compatibility =( (Also our previous output is really dumb; when we issue a 'module-build' diagnostic, we include the string '[-Rmodule-build]' in the diagnostic, but that flag doesn't work.)</div>
</div><div class="gmail_extra"><br><br><div class="gmail_quote">On Wed, Aug 6, 2014 at 5:24 PM, Richard Smith <span dir="ltr"><<a href="mailto:richard-llvm@metafoo.co.uk" target="_blank">richard-llvm@metafoo.co.uk</a>></span> wrote:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Author: rsmith<br>
Date: Wed Aug  6 19:24:21 2014<br>
New Revision: 215046<br>
<br>
URL: <a href="http://llvm.org/viewvc/llvm-project?rev=215046&view=rev" target="_blank">http://llvm.org/viewvc/llvm-project?rev=215046&view=rev</a><br>
Log:<br>
Use -Rblah, not -Wblah, to control remark diagnostics. This was always the<br>
intent when we added remark support, but was never implemented in the general<br>
case, because the first -R flags didn't need it. (-Rpass= had special handling<br>
to accomodate its argument.)<br>
<br>
-Rno-foo, -Reverything, and -Rno-everything can be used to turn off a remark,<br>
or to turn on or off all remarks. Per discussion on cfe-commits, -Weverything<br>
does not affect remarks, and -Reverything does not affect warnings or errors.<br>
<br>
The only "real" -R flag we have right now is -Rmodule-build; that flag is<br>
effectively renamed from -Wmodule-build to -Rmodule-build by this change.<br>
<br>
-Wpass and -Wno-pass (and their friends) are also renamed to -Rpass and<br>
-Rno-pass by this change; it's not completely clear whether we intended to have<br>
a -Rpass (with no =pattern), but that is unchanged by this commit, other than<br>
the flag name. The default pattern is effectively one which matches no passes.<br>
In future, we may want to make the default pattern be .*, so that -Reverything<br>
works for -Rpass properly.<br>
<br>
Modified:<br>
    cfe/trunk/include/clang/Basic/Diagnostic.h<br>
    cfe/trunk/include/clang/Basic/DiagnosticFrontendKinds.td<br>
    cfe/trunk/include/clang/Basic/DiagnosticIDs.h<br>
    cfe/trunk/include/clang/Basic/DiagnosticOptions.h<br>
    cfe/trunk/include/clang/Driver/Options.td<br>
    cfe/trunk/lib/Basic/Diagnostic.cpp<br>
    cfe/trunk/lib/Basic/DiagnosticIDs.cpp<br>
    cfe/trunk/lib/Basic/Warnings.cpp<br>
    cfe/trunk/lib/Driver/Tools.cpp<br>
    cfe/trunk/lib/Frontend/CompilerInvocation.cpp<br>
    cfe/trunk/lib/Frontend/FrontendActions.cpp<br>
    cfe/trunk/lib/Lex/PPMacroExpansion.cpp<br>
    cfe/trunk/lib/Lex/Pragma.cpp<br>
    cfe/trunk/lib/Serialization/ASTReader.cpp<br>
    cfe/trunk/lib/Serialization/ASTWriter.cpp<br>
    cfe/trunk/test/Frontend/optimization-remark.c<br>
    cfe/trunk/test/Frontend/warning-options.cpp<br>
    cfe/trunk/test/Modules/Rmodule-build.m<br>
    cfe/trunk/test/Modules/module_file_info.m<br>
    cfe/trunk/test/Modules/no-stale-modtime.m<br>
<br>
Modified: cfe/trunk/include/clang/Basic/Diagnostic.h<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Basic/Diagnostic.h?rev=215046&r1=215045&r2=215046&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Basic/Diagnostic.h?rev=215046&r1=215045&r2=215046&view=diff</a><br>

==============================================================================<br>
--- cfe/trunk/include/clang/Basic/Diagnostic.h (original)<br>
+++ cfe/trunk/include/clang/Basic/Diagnostic.h Wed Aug  6 19:24:21 2014<br>
@@ -542,9 +542,13 @@ public:<br>
   /// \returns true (and ignores the request) if "Group" was unknown, false<br>
   /// otherwise.<br>
   ///<br>
+  /// \param Flavor The flavor of group to affect. -Rfoo does not affect the<br>
+  /// state of the -Wfoo group and vice versa.<br>
+  ///<br>
   /// \param Loc The source location that this change of diagnostic state should<br>
   /// take affect. It can be null if we are setting the state from command-line.<br>
-  bool setSeverityForGroup(StringRef Group, diag::Severity Map,<br>
+  bool setSeverityForGroup(diag::Flavor Flavor, StringRef Group,<br>
+                           diag::Severity Map,<br>
                            SourceLocation Loc = SourceLocation());<br>
<br>
   /// \brief Set the warning-as-error flag for the given diagnostic group.<br>
@@ -561,11 +565,12 @@ public:<br>
   /// \returns True if the given group is unknown, false otherwise.<br>
   bool setDiagnosticGroupErrorAsFatal(StringRef Group, bool Enabled);<br>
<br>
-  /// \brief Add the specified mapping to all diagnostics.<br>
+  /// \brief Add the specified mapping to all diagnostics of the specified<br>
+  /// flavor.<br>
   ///<br>
   /// Mainly to be used by -Wno-everything to disable all warnings but allow<br>
   /// subsequent -W options to enable specific warnings.<br>
-  void setSeverityForAll(diag::Severity Map,<br>
+  void setSeverityForAll(diag::Flavor Flavor, diag::Severity Map,<br>
                          SourceLocation Loc = SourceLocation());<br>
<br>
   bool hasErrorOccurred() const { return ErrorOccurred; }<br>
<br>
Modified: cfe/trunk/include/clang/Basic/DiagnosticFrontendKinds.td<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Basic/DiagnosticFrontendKinds.td?rev=215046&r1=215045&r2=215046&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Basic/DiagnosticFrontendKinds.td?rev=215046&r1=215045&r2=215046&view=diff</a><br>

==============================================================================<br>
--- cfe/trunk/include/clang/Basic/DiagnosticFrontendKinds.td (original)<br>
+++ cfe/trunk/include/clang/Basic/DiagnosticFrontendKinds.td Wed Aug  6 19:24:21 2014<br>
@@ -36,11 +36,11 @@ def remark_fe_backend_plugin: Remark<"%0<br>
 def note_fe_backend_plugin: Note<"%0">, BackendInfo;<br>
<br>
 def remark_fe_backend_optimization_remark : Remark<"%0">, BackendInfo,<br>
-    InGroup<BackendOptimizationRemark>, DefaultRemark;<br>
+    InGroup<BackendOptimizationRemark>;<br>
 def remark_fe_backend_optimization_remark_missed : Remark<"%0">, BackendInfo,<br>
-    InGroup<BackendOptimizationRemarkMissed>, DefaultRemark;<br>
+    InGroup<BackendOptimizationRemarkMissed>;<br>
 def remark_fe_backend_optimization_remark_analysis : Remark<"%0">, BackendInfo,<br>
-    InGroup<BackendOptimizationRemarkAnalysis>, DefaultRemark;<br>
+    InGroup<BackendOptimizationRemarkAnalysis>;<br>
 def warn_fe_backend_optimization_failure : Warning<"%0">, BackendInfo,<br>
     InGroup<BackendOptimizationFailure>, DefaultWarn;<br>
 def note_fe_backend_optimization_remark_invalid_loc : Note<"could "<br>
@@ -126,17 +126,8 @@ def err_relocatable_without_isysroot : E<br>
     "must specify system root with -isysroot when building a relocatable "<br>
     "PCH file">;<br>
<br>
-def warn_unknown_warning_option : Warning<<br>
-    "unknown warning option '%0'">,<br>
-    InGroup<UnknownWarningOption>;<br>
-def warn_unknown_negative_warning_option : Warning<<br>
-    "unknown warning option '%0'">,<br>
-    InGroup<UnknownWarningOption>;<br>
-def warn_unknown_warning_option_suggest : Warning<<br>
-    "unknown warning option '%0'; did you mean '%1'?">,<br>
-    InGroup<UnknownWarningOption>;<br>
-def warn_unknown_negative_warning_option_suggest : Warning<<br>
-    "unknown warning option '%0'; did you mean '%1'?">,<br>
+def warn_unknown_diag_option : Warning<<br>
+    "unknown %select{warning|remark}0 option '%1'%select{|; did you mean '%3'?}2">,<br>
     InGroup<UnknownWarningOption>;<br>
 def warn_unknown_warning_specifier : Warning<<br>
     "unknown %0 warning specifier: '%1'">,<br>
@@ -176,7 +167,7 @@ def warn_module_config_macro_undef : War<br>
 def note_module_def_undef_here : Note<<br>
   "macro was %select{defined|#undef'd}0 here">;<br>
 def remark_module_build : Remark<"building module '%0' as '%1'">,<br>
-  InGroup<DiagGroup<"module-build">>, DefaultIgnore;<br>
+  InGroup<DiagGroup<"module-build">>;<br>
<br>
 def err_conflicting_module_names : Error<<br>
   "conflicting module names specified: '-fmodule-name=%0' and "<br>
<br>
Modified: cfe/trunk/include/clang/Basic/DiagnosticIDs.h<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Basic/DiagnosticIDs.h?rev=215046&r1=215045&r2=215046&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Basic/DiagnosticIDs.h?rev=215046&r1=215045&r2=215046&view=diff</a><br>

==============================================================================<br>
--- cfe/trunk/include/clang/Basic/DiagnosticIDs.h (original)<br>
+++ cfe/trunk/include/clang/Basic/DiagnosticIDs.h Wed Aug  6 19:24:21 2014<br>
@@ -67,6 +67,15 @@ namespace clang {<br>
       Error = 4,   ///< Present this diagnostic as an error.<br>
       Fatal = 5    ///< Present this diagnostic as a fatal error.<br>
     };<br>
+<br>
+    /// Flavors of diagnostics we can emit. Used to filter for a particular<br>
+    /// kind of diagnostic (for instance, for -W/-R flags).<br>
+    enum class Flavor {<br>
+      WarningOrError, ///< A diagnostic that indicates a problem or potential<br>
+                      ///< problem. Can be made fatal by -Werror.<br>
+      Remark          ///< A diagnostic that indicates normal progress through<br>
+                      ///< compilation.<br>
+    };<br>
   }<br>
<br>
 class DiagnosticMapping {<br>
@@ -228,15 +237,16 @@ public:<br>
   ///<br>
   /// \param[out] Diags - On return, the diagnostics in the group.<br>
   /// \returns \c true if the given group is unknown, \c false otherwise.<br>
-  bool getDiagnosticsInGroup(StringRef Group,<br>
+  bool getDiagnosticsInGroup(diag::Flavor Flavor, StringRef Group,<br>
                              SmallVectorImpl<diag::kind> &Diags) const;<br>
<br>
   /// \brief Get the set of all diagnostic IDs.<br>
-  void getAllDiagnostics(SmallVectorImpl<diag::kind> &Diags) const;<br>
+  void getAllDiagnostics(diag::Flavor Flavor,<br>
+                         SmallVectorImpl<diag::kind> &Diags) const;<br>
<br>
-  /// \brief Get the warning option with the closest edit distance to the given<br>
-  /// group name.<br>
-  static StringRef getNearestWarningOption(StringRef Group);<br>
+  /// \brief Get the diagnostic option with the closest edit distance to the<br>
+  /// given group name.<br>
+  static StringRef getNearestOption(diag::Flavor Flavor, StringRef Group);<br>
<br>
 private:<br>
   /// \brief Classify the specified diagnostic ID into a Level, consumable by<br>
<br>
Modified: cfe/trunk/include/clang/Basic/DiagnosticOptions.h<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Basic/DiagnosticOptions.h?rev=215046&r1=215045&r2=215046&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Basic/DiagnosticOptions.h?rev=215046&r1=215045&r2=215046&view=diff</a><br>

==============================================================================<br>
--- cfe/trunk/include/clang/Basic/DiagnosticOptions.h (original)<br>
+++ cfe/trunk/include/clang/Basic/DiagnosticOptions.h Wed Aug  6 19:24:21 2014<br>
@@ -58,6 +58,10 @@ public:<br>
   /// prefixes removed.<br>
   std::vector<std::string> Warnings;<br>
<br>
+  /// The list of -R... options used to alter the diagnostic mappings, with the<br>
+  /// prefixes removed.<br>
+  std::vector<std::string> Remarks;<br>
+<br>
 public:<br>
   // Define accessors/mutators for diagnostic options of enumeration type.<br>
 #define DIAGOPT(Name, Bits, Default)<br>
<br>
Modified: cfe/trunk/include/clang/Driver/Options.td<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Driver/Options.td?rev=215046&r1=215045&r2=215046&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Driver/Options.td?rev=215046&r1=215045&r2=215046&view=diff</a><br>

==============================================================================<br>
--- cfe/trunk/include/clang/Driver/Options.td (original)<br>
+++ cfe/trunk/include/clang/Driver/Options.td Wed Aug  6 19:24:21 2014<br>
@@ -64,7 +64,9 @@ def M_Group               : OptionGroup<<br>
 def T_Group               : OptionGroup<"<T group>">;<br>
 def O_Group               : OptionGroup<"<O group>">, Group<CompileOnly_Group>;<br>
 def R_Group               : OptionGroup<"<R group>">, Group<CompileOnly_Group>;<br>
+def R_value_Group         : OptionGroup<"<R (with value) group>">, Group<R_Group>;<br>
 def W_Group               : OptionGroup<"<W group>">, Group<CompileOnly_Group>;<br>
+def W_value_Group         : OptionGroup<"<W (with value) group>">, Group<W_Group>;<br>
 def d_Group               : OptionGroup<"<d group>">;<br>
 def f_Group               : OptionGroup<"<f group>">, Group<CompileOnly_Group>;<br>
 def f_clang_Group         : OptionGroup<"<f (clang-only) group>">, Group<CompileOnly_Group>;<br>
@@ -261,17 +263,19 @@ def Qn : Flag<["-"], "Qn">;<br>
 def Qunused_arguments : Flag<["-"], "Qunused-arguments">, Flags<[DriverOption, CoreOption]>,<br>
   HelpText<"Don't emit warning for unused driver arguments">;<br>
 def Q : Flag<["-"], "Q">;<br>
-def Rpass_EQ : Joined<["-"], "Rpass=">, Group<R_Group>, Flags<[CC1Option]>,<br>
+def Rpass_EQ : Joined<["-"], "Rpass=">, Group<R_value_Group>, Flags<[CC1Option]>,<br>
   HelpText<"Report transformations performed by optimization passes whose "<br>
            "name matches the given POSIX regular expression">;<br>
-def Rpass_missed_EQ : Joined<["-"], "Rpass-missed=">, Group<R_Group>,<br>
+def Rpass_missed_EQ : Joined<["-"], "Rpass-missed=">, Group<R_value_Group>,<br>
   Flags<[CC1Option]>,<br>
   HelpText<"Report missed transformations by optimization passes whose "<br>
            "name matches the given POSIX regular expression">;<br>
-def Rpass_analysis_EQ : Joined<["-"], "Rpass-analysis=">, Group<R_Group>,<br>
+def Rpass_analysis_EQ : Joined<["-"], "Rpass-analysis=">, Group<R_value_Group>,<br>
   Flags<[CC1Option]>,<br>
   HelpText<"Report transformation analysis from optimization passes whose "<br>
            "name matches the given POSIX regular expression">;<br>
+def R_Joined : Joined<["-"], "R">, Group<R_Group>, Flags<[CC1Option, CoreOption]>,<br>
+  MetaVarName<"<remark>">, HelpText<"Enable the specified remark">;<br>
 def S : Flag<["-"], "S">, Flags<[DriverOption,CC1Option]>, Group<Action_Group>,<br>
   HelpText<"Only run preprocess and compilation steps">;<br>
 def Tbss : JoinedOrSeparate<["-"], "Tbss">, Group<T_Group>;<br>
@@ -290,6 +294,7 @@ def Wextra : Flag<["-"], "Wextra">, Grou<br>
 def Wl_COMMA : CommaJoined<["-"], "Wl,">, Flags<[LinkerInput, RenderAsInput]>,<br>
   HelpText<"Pass the comma separated arguments in <arg> to the linker">,<br>
   MetaVarName<"<arg>">;<br>
+// FIXME: This is broken; these should not be Joined arguments.<br>
 def Wno_nonportable_cfstrings : Joined<["-"], "Wno-nonportable-cfstrings">, Group<W_Group>,<br>
   Flags<[CC1Option]>;<br>
 def Wnonportable_cfstrings : Joined<["-"], "Wnonportable-cfstrings">, Group<W_Group>,<br>
<br>
Modified: cfe/trunk/lib/Basic/Diagnostic.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Basic/Diagnostic.cpp?rev=215046&r1=215045&r2=215046&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Basic/Diagnostic.cpp?rev=215046&r1=215045&r2=215046&view=diff</a><br>

==============================================================================<br>
--- cfe/trunk/lib/Basic/Diagnostic.cpp (original)<br>
+++ cfe/trunk/lib/Basic/Diagnostic.cpp Wed Aug  6 19:24:21 2014<br>
@@ -228,11 +228,12 @@ void DiagnosticsEngine::setSeverity(diag<br>
                                                FullSourceLoc(Loc, *SourceMgr)));<br>
 }<br>
<br>
-bool DiagnosticsEngine::setSeverityForGroup(StringRef Group, diag::Severity Map,<br>
+bool DiagnosticsEngine::setSeverityForGroup(diag::Flavor Flavor,<br>
+                                            StringRef Group, diag::Severity Map,<br>
                                             SourceLocation Loc) {<br>
   // Get the diagnostics in this group.<br>
   SmallVector<diag::kind, 8> GroupDiags;<br>
-  if (Diags->getDiagnosticsInGroup(Group, GroupDiags))<br>
+  if (Diags->getDiagnosticsInGroup(Flavor, Group, GroupDiags))<br>
     return true;<br>
<br>
   // Set the mapping.<br>
@@ -247,14 +248,16 @@ bool DiagnosticsEngine::setDiagnosticGro<br>
   // If we are enabling this feature, just set the diagnostic mappings to map to<br>
   // errors.<br>
   if (Enabled)<br>
-    return setSeverityForGroup(Group, diag::Severity::Error);<br>
+    return setSeverityForGroup(diag::Flavor::WarningOrError, Group,<br>
+                               diag::Severity::Error);<br>
<br>
   // Otherwise, we want to set the diagnostic mapping's "no Werror" bit, and<br>
   // potentially downgrade anything already mapped to be a warning.<br>
<br>
   // Get the diagnostics in this group.<br>
   SmallVector<diag::kind, 8> GroupDiags;<br>
-  if (Diags->getDiagnosticsInGroup(Group, GroupDiags))<br>
+  if (Diags->getDiagnosticsInGroup(diag::Flavor::WarningOrError, Group,<br>
+                                   GroupDiags))<br>
     return true;<br>
<br>
   // Perform the mapping change.<br>
@@ -276,14 +279,16 @@ bool DiagnosticsEngine::setDiagnosticGro<br>
   // If we are enabling this feature, just set the diagnostic mappings to map to<br>
   // fatal errors.<br>
   if (Enabled)<br>
-    return setSeverityForGroup(Group, diag::Severity::Fatal);<br>
+    return setSeverityForGroup(diag::Flavor::WarningOrError, Group,<br>
+                               diag::Severity::Fatal);<br>
<br>
   // Otherwise, we want to set the diagnostic mapping's "no Werror" bit, and<br>
   // potentially downgrade anything already mapped to be an error.<br>
<br>
   // Get the diagnostics in this group.<br>
   SmallVector<diag::kind, 8> GroupDiags;<br>
-  if (Diags->getDiagnosticsInGroup(Group, GroupDiags))<br>
+  if (Diags->getDiagnosticsInGroup(diag::Flavor::WarningOrError, Group,<br>
+                                   GroupDiags))<br>
     return true;<br>
<br>
   // Perform the mapping change.<br>
@@ -299,11 +304,12 @@ bool DiagnosticsEngine::setDiagnosticGro<br>
   return false;<br>
 }<br>
<br>
-void DiagnosticsEngine::setSeverityForAll(diag::Severity Map,<br>
+void DiagnosticsEngine::setSeverityForAll(diag::Flavor Flavor,<br>
+                                          diag::Severity Map,<br>
                                           SourceLocation Loc) {<br>
   // Get all the diagnostics.<br>
   SmallVector<diag::kind, 64> AllDiags;<br>
-  Diags->getAllDiagnostics(AllDiags);<br>
+  Diags->getAllDiagnostics(Flavor, AllDiags);<br>
<br>
   // Set the mapping.<br>
   for (unsigned i = 0, e = AllDiags.size(); i != e; ++i)<br>
<br>
Modified: cfe/trunk/lib/Basic/DiagnosticIDs.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Basic/DiagnosticIDs.cpp?rev=215046&r1=215045&r2=215046&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Basic/DiagnosticIDs.cpp?rev=215046&r1=215045&r2=215046&view=diff</a><br>

==============================================================================<br>
--- cfe/trunk/lib/Basic/DiagnosticIDs.cpp (original)<br>
+++ cfe/trunk/lib/Basic/DiagnosticIDs.cpp Wed Aug  6 19:24:21 2014<br>
@@ -58,6 +58,11 @@ struct StaticDiagInfoRec {<br>
     return StringRef(DescriptionStr, DescriptionLen);<br>
   }<br>
<br>
+  diag::Flavor getFlavor() const {<br>
+    return Class == CLASS_REMARK ? diag::Flavor::Remark<br>
+                                 : diag::Flavor::WarningOrError;<br>
+  }<br>
+<br>
   bool operator<(const StaticDiagInfoRec &RHS) const {<br>
     return DiagID < RHS.DiagID;<br>
   }<br>
@@ -522,40 +527,57 @@ StringRef DiagnosticIDs::getWarningOptio<br>
   return StringRef();<br>
 }<br>
<br>
-static void getDiagnosticsInGroup(const WarningOption *Group,<br>
+/// Return \c true if any diagnostics were found in this group, even if they<br>
+/// were filtered out due to having the wrong flavor.<br>
+static bool getDiagnosticsInGroup(diag::Flavor Flavor,<br>
+                                  const WarningOption *Group,<br>
                                   SmallVectorImpl<diag::kind> &Diags) {<br>
+  // An empty group is considered to be a warning group: we have empty groups<br>
+  // for GCC compatibility, and GCC does not have remarks.<br>
+  if (!Group->Members && !Group->SubGroups)<br>
+    return Flavor == diag::Flavor::Remark ? true : false;<br>
+<br>
+  bool NotFound = true;<br>
+<br>
   // Add the members of the option diagnostic set.<br>
   const int16_t *Member = DiagArrays + Group->Members;<br>
-  for (; *Member != -1; ++Member)<br>
-    Diags.push_back(*Member);<br>
+  for (; *Member != -1; ++Member) {<br>
+    if (GetDiagInfo(*Member)->getFlavor() == Flavor) {<br>
+      NotFound = false;<br>
+      Diags.push_back(*Member);<br>
+    }<br>
+  }<br>
<br>
   // Add the members of the subgroups.<br>
   const int16_t *SubGroups = DiagSubGroups + Group->SubGroups;<br>
   for (; *SubGroups != (int16_t)-1; ++SubGroups)<br>
-    getDiagnosticsInGroup(&OptionTable[(short)*SubGroups], Diags);<br>
+    NotFound &= getDiagnosticsInGroup(Flavor, &OptionTable[(short)*SubGroups],<br>
+                                      Diags);<br>
+<br>
+  return NotFound;<br>
 }<br>
<br>
-bool DiagnosticIDs::getDiagnosticsInGroup(<br>
-    StringRef Group,<br>
-    SmallVectorImpl<diag::kind> &Diags) const {<br>
-  const WarningOption *Found =<br>
-  std::lower_bound(OptionTable, OptionTable + OptionTableSize, Group,<br>
-                   WarningOptionCompare);<br>
+bool<br>
+DiagnosticIDs::getDiagnosticsInGroup(diag::Flavor Flavor, StringRef Group,<br>
+                                     SmallVectorImpl<diag::kind> &Diags) const {<br>
+  const WarningOption *Found = std::lower_bound(<br>
+      OptionTable, OptionTable + OptionTableSize, Group, WarningOptionCompare);<br>
   if (Found == OptionTable + OptionTableSize ||<br>
       Found->getName() != Group)<br>
     return true; // Option not found.<br>
<br>
-  ::getDiagnosticsInGroup(Found, Diags);<br>
-  return false;<br>
+  return ::getDiagnosticsInGroup(Flavor, Found, Diags);<br>
 }<br>
<br>
-void DiagnosticIDs::getAllDiagnostics(<br>
-                               SmallVectorImpl<diag::kind> &Diags) const {<br>
+void DiagnosticIDs::getAllDiagnostics(diag::Flavor Flavor,<br>
+                                     SmallVectorImpl<diag::kind> &Diags) const {<br>
   for (unsigned i = 0; i != StaticDiagInfoSize; ++i)<br>
-    Diags.push_back(StaticDiagInfo[i].DiagID);<br>
+    if (StaticDiagInfo[i].getFlavor() == Flavor)<br>
+      Diags.push_back(StaticDiagInfo[i].DiagID);<br>
 }<br>
<br>
-StringRef DiagnosticIDs::getNearestWarningOption(StringRef Group) {<br>
+StringRef DiagnosticIDs::getNearestOption(diag::Flavor Flavor,<br>
+                                          StringRef Group) {<br>
   StringRef Best;<br>
   unsigned BestDistance = Group.size() + 1; // Sanity threshold.<br>
   for (const WarningOption *i = OptionTable, *e = OptionTable + OptionTableSize;<br>
@@ -565,6 +587,14 @@ StringRef DiagnosticIDs::getNearestWarni<br>
       continue;<br>
<br>
     unsigned Distance = i->getName().edit_distance(Group, true, BestDistance);<br>
+    if (Distance > BestDistance)<br>
+      continue;<br>
+<br>
+    // Don't suggest groups that are not of this kind.<br>
+    llvm::SmallVector<diag::kind, 8> Diags;<br>
+    if (::getDiagnosticsInGroup(Flavor, i, Diags) || Diags.empty())<br>
+      continue;<br>
+<br>
     if (Distance == BestDistance) {<br>
       // Two matches with the same distance, don't prefer one over the other.<br>
       Best = "";<br>
<br>
Modified: cfe/trunk/lib/Basic/Warnings.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Basic/Warnings.cpp?rev=215046&r1=215045&r2=215046&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Basic/Warnings.cpp?rev=215046&r1=215045&r2=215046&view=diff</a><br>

==============================================================================<br>
--- cfe/trunk/lib/Basic/Warnings.cpp (original)<br>
+++ cfe/trunk/lib/Basic/Warnings.cpp Wed Aug  6 19:24:21 2014<br>
@@ -20,6 +20,8 @@<br>
 // Given a warning option 'foo', the following are valid:<br>
 //    -Wfoo, -Wno-foo, -Werror=foo, -Wfatal-errors=foo<br>
 //<br>
+// Remark options are also handled here, analogously, except that they are much<br>
+// simpler because a remark can't be promoted to an error.<br>
 #include "clang/Basic/AllDiagnostics.h"<br>
 #include "clang/Basic/Diagnostic.h"<br>
 #include "clang/Basic/DiagnosticOptions.h"<br>
@@ -31,17 +33,12 @@ using namespace clang;<br>
 // EmitUnknownDiagWarning - Emit a warning and typo hint for unknown warning<br>
 // opts<br>
 static void EmitUnknownDiagWarning(DiagnosticsEngine &Diags,<br>
-                                  StringRef Prefix, StringRef Opt,<br>
-                                  bool isPositive) {<br>
-  StringRef Suggestion = DiagnosticIDs::getNearestWarningOption(Opt);<br>
-  if (!Suggestion.empty())<br>
-    Diags.Report(isPositive? diag::warn_unknown_warning_option_suggest :<br>
-                             diag::warn_unknown_negative_warning_option_suggest)<br>
-      << (Prefix.str() += Opt) << (Prefix.str() += Suggestion);<br>
-  else<br>
-    Diags.Report(isPositive? diag::warn_unknown_warning_option :<br>
-                             diag::warn_unknown_negative_warning_option)<br>
-      << (Prefix.str() += Opt);<br>
+                                   diag::Flavor Flavor, StringRef Prefix,<br>
+                                   StringRef Opt) {<br>
+  StringRef Suggestion = DiagnosticIDs::getNearestOption(Flavor, Opt);<br>
+  Diags.Report(diag::warn_unknown_diag_option)<br>
+    << (Flavor == diag::Flavor::WarningOrError ? 0 : 1) << (Prefix.str() += Opt)<br>
+    << !Suggestion.empty() << (Prefix.str() += Suggestion);<br>
 }<br>
<br>
 void clang::ProcessWarningOptions(DiagnosticsEngine &Diags,<br>
@@ -89,6 +86,7 @@ void clang::ProcessWarningOptions(Diagno<br>
       break;<br>
<br>
     for (unsigned i = 0, e = Opts.Warnings.size(); i != e; ++i) {<br>
+      const auto Flavor = diag::Flavor::WarningOrError;<br>
       StringRef Opt = Opts.Warnings[i];<br>
       StringRef OrigOpt = Opts.Warnings[i];<br>
<br>
@@ -125,7 +123,7 @@ void clang::ProcessWarningOptions(Diagno<br>
             Diags.setEnableAllWarnings(true);<br>
           } else {<br>
             Diags.setEnableAllWarnings(false);<br>
-            Diags.setSeverityForAll(diag::Severity::Ignored);<br>
+            Diags.setSeverityForAll(Flavor, diag::Severity::Ignored);<br>
           }<br>
         }<br>
         continue;<br>
@@ -154,8 +152,8 @@ void clang::ProcessWarningOptions(Diagno<br>
         if (SetDiagnostic) {<br>
           // Set the warning as error flag for this specifier.<br>
           Diags.setDiagnosticGroupWarningAsError(Specifier, isPositive);<br>
-        } else if (DiagIDs->getDiagnosticsInGroup(Specifier, _Diags)) {<br>
-          EmitUnknownDiagWarning(Diags, "-Werror=", Specifier, isPositive);<br>
+        } else if (DiagIDs->getDiagnosticsInGroup(Flavor, Specifier, _Diags)) {<br>
+          EmitUnknownDiagWarning(Diags, Flavor, "-Werror=", Specifier);<br>
         }<br>
         continue;<br>
       }<br>
@@ -182,19 +180,50 @@ void clang::ProcessWarningOptions(Diagno<br>
         if (SetDiagnostic) {<br>
           // Set the error as fatal flag for this specifier.<br>
           Diags.setDiagnosticGroupErrorAsFatal(Specifier, isPositive);<br>
-        } else if (DiagIDs->getDiagnosticsInGroup(Specifier, _Diags)) {<br>
-          EmitUnknownDiagWarning(Diags, "-Wfatal-errors=", Specifier,<br>
-                                 isPositive);<br>
+        } else if (DiagIDs->getDiagnosticsInGroup(Flavor, Specifier, _Diags)) {<br>
+          EmitUnknownDiagWarning(Diags, Flavor, "-Wfatal-errors=", Specifier);<br>
         }<br>
         continue;<br>
       }<br>
<br>
       if (Report) {<br>
-        if (DiagIDs->getDiagnosticsInGroup(Opt, _Diags))<br>
-          EmitUnknownDiagWarning(Diags, isPositive ? "-W" : "-Wno-", Opt,<br>
-                                 isPositive);<br>
+        if (DiagIDs->getDiagnosticsInGroup(Flavor, Opt, _Diags))<br>
+          EmitUnknownDiagWarning(Diags, Flavor, isPositive ? "-W" : "-Wno-",<br>
+                                 Opt);<br>
+      } else {<br>
+        Diags.setSeverityForGroup(Flavor, Opt, Mapping);<br>
+      }<br>
+    }<br>
+<br>
+    for (unsigned i = 0, e = Opts.Remarks.size(); i != e; ++i) {<br>
+      StringRef Opt = Opts.Remarks[i];<br>
+      const auto Flavor = diag::Flavor::Remark;<br>
+<br>
+      // Check to see if this warning starts with "no-", if so, this is a<br>
+      // negative form of the option.<br>
+      bool IsPositive = !Opt.startswith("no-");<br>
+      if (!IsPositive) Opt = Opt.substr(3);<br>
+<br>
+      auto Severity = IsPositive ? diag::Severity::Remark<br>
+                                 : diag::Severity::Ignored;<br>
+<br>
+      // -Reverything sets the state of all remarks. Note that all remarks are<br>
+      // in remark groups, so we don't need a separate 'all remarks enabled'<br>
+      // flag.<br>
+      if (Opt == "everything") {<br>
+        if (SetDiagnostic)<br>
+          Diags.setSeverityForAll(Flavor, Severity);<br>
+        continue;<br>
+      }<br>
+<br>
+      if (Report) {<br>
+        if (DiagIDs->getDiagnosticsInGroup(Flavor, Opt, _Diags))<br>
+          EmitUnknownDiagWarning(Diags, Flavor, IsPositive ? "-R" : "-Rno-",<br>
+                                 Opt);<br>
       } else {<br>
-        Diags.setSeverityForGroup(Opt, Mapping);<br>
+        Diags.setSeverityForGroup(Flavor, Opt,<br>
+                                  IsPositive ? diag::Severity::Remark<br>
+                                             : diag::Severity::Ignored);<br>
       }<br>
     }<br>
   }<br>
<br>
Modified: cfe/trunk/lib/Driver/Tools.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Driver/Tools.cpp?rev=215046&r1=215045&r2=215046&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Driver/Tools.cpp?rev=215046&r1=215045&r2=215046&view=diff</a><br>

==============================================================================<br>
--- cfe/trunk/lib/Driver/Tools.cpp (original)<br>
+++ cfe/trunk/lib/Driver/Tools.cpp Wed Aug  6 19:24:21 2014<br>
@@ -3374,6 +3374,7 @@ void Clang::ConstructJob(Compilation &C,<br>
   // precompiling.<br>
   Args.ClaimAllArgs(options::OPT_flto);<br>
<br>
+  Args.AddAllArgs(CmdArgs, options::OPT_R_Group);<br>
   Args.AddAllArgs(CmdArgs, options::OPT_W_Group);<br>
   if (Args.hasFlag(options::OPT_pedantic, options::OPT_no_pedantic, false))<br>
     CmdArgs.push_back("-pedantic");<br>
@@ -3735,15 +3736,6 @@ void Clang::ConstructJob(Compilation &C,<br>
       A->render(Args, CmdArgs);<br>
   }<br>
<br>
-  if (Arg *A = Args.getLastArg(options::OPT_Rpass_EQ))<br>
-    A->render(Args, CmdArgs);<br>
-<br>
-  if (Arg *A = Args.getLastArg(options::OPT_Rpass_missed_EQ))<br>
-    A->render(Args, CmdArgs);<br>
-<br>
-  if (Arg *A = Args.getLastArg(options::OPT_Rpass_analysis_EQ))<br>
-    A->render(Args, CmdArgs);<br>
-<br>
   if (Args.hasArg(options::OPT_mkernel)) {<br>
     if (!Args.hasArg(options::OPT_fapple_kext) && types::isCXX(InputType))<br>
       CmdArgs.push_back("-fapple-kext");<br>
<br>
Modified: cfe/trunk/lib/Frontend/CompilerInvocation.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Frontend/CompilerInvocation.cpp?rev=215046&r1=215045&r2=215046&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Frontend/CompilerInvocation.cpp?rev=215046&r1=215045&r2=215046&view=diff</a><br>

==============================================================================<br>
--- cfe/trunk/lib/Frontend/CompilerInvocation.cpp (original)<br>
+++ cfe/trunk/lib/Frontend/CompilerInvocation.cpp Wed Aug  6 19:24:21 2014<br>
@@ -111,25 +111,21 @@ static unsigned getOptimizationLevelSize<br>
   return 0;<br>
 }<br>
<br>
-static void addWarningArgs(ArgList &Args, std::vector<std::string> &Warnings) {<br>
-  for (arg_iterator I = Args.filtered_begin(OPT_W_Group),<br>
-         E = Args.filtered_end(); I != E; ++I) {<br>
-    Arg *A = *I;<br>
-    // If the argument is a pure flag, add its name (minus the "W" at the beginning)<br>
-    // to the warning list. Else, add its value (for the OPT_W case).<br>
+static void addDiagnosticArgs(ArgList &Args, OptSpecifier Group,<br>
+                              OptSpecifier GroupWithValue,<br>
+                              std::vector<std::string> &Diagnostics) {<br>
+  for (Arg *A : Args.filtered(Group)) {<br>
     if (A->getOption().getKind() == Option::FlagClass) {<br>
-      Warnings.push_back(A->getOption().getName().substr(1));<br>
+      // The argument is a pure flag (such as OPT_Wall or OPT_Wdeprecated). Add<br>
+      // its name (minus the "W" or "R" at the beginning) to the warning list.<br>
+      Diagnostics.push_back(A->getOption().getName().drop_front(1));<br>
+    } else if (A->getOption().matches(GroupWithValue)) {<br>
+      // This is -Wfoo= or -Rfoo=, where foo is the name of the diagnostic group.<br>
+      Diagnostics.push_back(A->getOption().getName().drop_front(1).rtrim("=-"));<br>
     } else {<br>
-      for (unsigned Idx = 0, End = A->getNumValues();<br>
-           Idx < End; ++Idx) {<br>
-        StringRef V = A->getValue(Idx);<br>
-        // "-Wl," and such are not warning options.<br>
-        // FIXME: Should be handled by putting these in separate flags.<br>
-        if (V.startswith("l,") || V.startswith("a,") || V.startswith("p,"))<br>
-          continue;<br>
-<br>
-        Warnings.push_back(V);<br>
-      }<br>
+      // Otherwise, add its value (for OPT_W_Joined and similar).<br>
+      for (const char *Arg : A->getValues())<br>
+        Diagnostics.push_back(Arg);<br>
     }<br>
   }<br>
 }<br>
@@ -700,7 +696,8 @@ bool clang::ParseDiagnosticArgs(Diagnost<br>
       << Opts.TabStop << DiagnosticOptions::DefaultTabStop;<br>
   }<br>
   Opts.MessageLength = getLastArgIntValue(Args, OPT_fmessage_length, 0, Diags);<br>
-  addWarningArgs(Args, Opts.Warnings);<br>
+  addDiagnosticArgs(Args, OPT_W_Group, OPT_W_value_Group, Opts.Warnings);<br>
+  addDiagnosticArgs(Args, OPT_R_Group, OPT_R_value_Group, Opts.Remarks);<br>
<br>
   return Success;<br>
 }<br>
<br>
Modified: cfe/trunk/lib/Frontend/FrontendActions.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Frontend/FrontendActions.cpp?rev=215046&r1=215045&r2=215046&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Frontend/FrontendActions.cpp?rev=215046&r1=215045&r2=215046&view=diff</a><br>

==============================================================================<br>
--- cfe/trunk/lib/Frontend/FrontendActions.cpp (original)<br>
+++ cfe/trunk/lib/Frontend/FrontendActions.cpp Wed Aug  6 19:24:21 2014<br>
@@ -470,10 +470,11 @@ namespace {<br>
       Out.indent(4) << #Name << ": " << DiagOpts->Name << "\n";<br>
 #include "clang/Basic/DiagnosticOptions.def"<br>
<br>
-      Out.indent(4) << "Warning options:\n";<br>
-      for (const std::string &Warning : DiagOpts->Warnings) {<br>
+      Out.indent(4) << "Diagnostic flags:\n";<br>
+      for (const std::string &Warning : DiagOpts->Warnings)<br>
         Out.indent(6) << "-W" << Warning << "\n";<br>
-      }<br>
+      for (const std::string &Remark : DiagOpts->Remarks)<br>
+        Out.indent(6) << "-R" << Remark << "\n";<br>
<br>
       return false;<br>
     }<br>
<br>
Modified: cfe/trunk/lib/Lex/PPMacroExpansion.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Lex/PPMacroExpansion.cpp?rev=215046&r1=215045&r2=215046&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Lex/PPMacroExpansion.cpp?rev=215046&r1=215045&r2=215046&view=diff</a><br>

==============================================================================<br>
--- cfe/trunk/lib/Lex/PPMacroExpansion.cpp (original)<br>
+++ cfe/trunk/lib/Lex/PPMacroExpansion.cpp Wed Aug  6 19:24:21 2014<br>
@@ -1446,6 +1446,8 @@ void Preprocessor::ExpandBuiltinMacro(To<br>
         break;<br>
       }<br>
<br>
+      // FIXME: Should we accept "-R..." flags here, or should that be handled<br>
+      // by a separate __has_remark?<br>
       if (WarningName.size() < 3 || WarningName[0] != '-' ||<br>
           WarningName[1] != 'W') {<br>
         Diag(StrStartLoc, diag::warn_has_warning_invalid_option);<br>
@@ -1458,7 +1460,8 @@ void Preprocessor::ExpandBuiltinMacro(To<br>
       // worth special casing.<br>
       SmallVector<diag::kind, 10> Diags;<br>
       Value = !getDiagnostics().getDiagnosticIDs()-><br>
-        getDiagnosticsInGroup(WarningName.substr(2), Diags);<br>
+        getDiagnosticsInGroup(diag::Flavor::WarningOrError,<br>
+                              WarningName.substr(2), Diags);<br>
     } while (false);<br>
<br>
     OS << (int)Value;<br>
<br>
Modified: cfe/trunk/lib/Lex/Pragma.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Lex/Pragma.cpp?rev=215046&r1=215045&r2=215046&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Lex/Pragma.cpp?rev=215046&r1=215045&r2=215046&view=diff</a><br>

==============================================================================<br>
--- cfe/trunk/lib/Lex/Pragma.cpp (original)<br>
+++ cfe/trunk/lib/Lex/Pragma.cpp Wed Aug  6 19:24:21 2014<br>
@@ -993,13 +993,15 @@ public:<br>
     }<br>
<br>
     if (WarningName.size() < 3 || WarningName[0] != '-' ||<br>
-        WarningName[1] != 'W') {<br>
+        (WarningName[1] != 'W' && WarningName[1] != 'R')) {<br>
       PP.Diag(StringLoc, diag::warn_pragma_diagnostic_invalid_option);<br>
       return;<br>
     }<br>
<br>
-    if (PP.getDiagnostics().setSeverityForGroup(WarningName.substr(2), SV,<br>
-                                                DiagLoc))<br>
+    if (PP.getDiagnostics().setSeverityForGroup(<br>
+            WarningName[1] == 'W' ? diag::Flavor::WarningOrError<br>
+                                  : diag::Flavor::Remark,<br>
+            WarningName.substr(2), SV, DiagLoc))<br>
       PP.Diag(StringLoc, diag::warn_pragma_diagnostic_unknown_warning)<br>
         << WarningName;<br>
     else if (Callbacks)<br>
<br>
Modified: cfe/trunk/lib/Serialization/ASTReader.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Serialization/ASTReader.cpp?rev=215046&r1=215045&r2=215046&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Serialization/ASTReader.cpp?rev=215046&r1=215045&r2=215046&view=diff</a><br>

==============================================================================<br>
--- cfe/trunk/lib/Serialization/ASTReader.cpp (original)<br>
+++ cfe/trunk/lib/Serialization/ASTReader.cpp Wed Aug  6 19:24:21 2014<br>
@@ -4639,9 +4639,10 @@ bool ASTReader::ParseDiagnosticOptions(c<br>
   DiagOpts->set##Name(static_cast<Type>(Record[Idx++]));<br>
 #include "clang/Basic/DiagnosticOptions.def"<br>
<br>
-  for (unsigned N = Record[Idx++]; N; --N) {<br>
+  for (unsigned N = Record[Idx++]; N; --N)<br>
     DiagOpts->Warnings.push_back(ReadString(Record, Idx));<br>
-  }<br>
+  for (unsigned N = Record[Idx++]; N; --N)<br>
+    DiagOpts->Remarks.push_back(ReadString(Record, Idx));<br>
<br>
   return Listener.ReadDiagnosticOptions(DiagOpts, Complain);<br>
 }<br>
<br>
Modified: cfe/trunk/lib/Serialization/ASTWriter.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Serialization/ASTWriter.cpp?rev=215046&r1=215045&r2=215046&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Serialization/ASTWriter.cpp?rev=215046&r1=215045&r2=215046&view=diff</a><br>

==============================================================================<br>
--- cfe/trunk/lib/Serialization/ASTWriter.cpp (original)<br>
+++ cfe/trunk/lib/Serialization/ASTWriter.cpp Wed Aug  6 19:24:21 2014<br>
@@ -1226,6 +1226,9 @@ void ASTWriter::WriteControlBlock(Prepro<br>
   Record.push_back(DiagOpts.Warnings.size());<br>
   for (unsigned I = 0, N = DiagOpts.Warnings.size(); I != N; ++I)<br>
     AddString(DiagOpts.Warnings[I], Record);<br>
+  Record.push_back(DiagOpts.Remarks.size());<br>
+  for (unsigned I = 0, N = DiagOpts.Remarks.size(); I != N; ++I)<br>
+    AddString(DiagOpts.Remarks[I], Record);<br>
   // Note: we don't serialize the log or serialization file names, because they<br>
   // are generally transient files and will almost always be overridden.<br>
   Stream.EmitRecord(DIAGNOSTIC_OPTIONS, Record);<br>
<br>
Modified: cfe/trunk/test/Frontend/optimization-remark.c<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Frontend/optimization-remark.c?rev=215046&r1=215045&r2=215046&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Frontend/optimization-remark.c?rev=215046&r1=215045&r2=215046&view=diff</a><br>

==============================================================================<br>
--- cfe/trunk/test/Frontend/optimization-remark.c (original)<br>
+++ cfe/trunk/test/Frontend/optimization-remark.c Wed Aug  6 19:24:21 2014<br>
@@ -6,6 +6,21 @@<br>
 // RUN: %clang_cc1 %s -Rpass=inline -Rpass-analysis=inline -Rpass-missed=inline -O0 -emit-llvm-only -verify<br>
 // RUN: %clang_cc1 %s -Rpass=inline -Rpass-analysis=inline -Rpass-missed=inline -O0 -emit-llvm-only -gline-tables-only -verify<br>
 // RUN: %clang_cc1 %s -Rpass=inline -emit-llvm -o - 2>/dev/null | FileCheck %s<br>
+//<br>
+// Check that we can override -Rpass= with -Rno-pass.<br>
+// RUN: %clang_cc1 %s -Rpass=inline -emit-llvm -o - 2>&1 | FileCheck %s --check-prefix=CHECK-REMARKS<br>
+// RUN: %clang_cc1 %s -Rpass=inline -Rno-pass -emit-llvm -o - 2>&1 | FileCheck %s --check-prefix=CHECK-NO-REMARKS<br>
+// RUN: %clang_cc1 %s -Rpass=inline -Rno-everything -emit-llvm -o - 2>&1 | FileCheck %s --check-prefix=CHECK-NO-REMARKS<br>
+// RUN: %clang_cc1 %s -Rpass=inline -Rno-everything -Reverything -emit-llvm -o - 2>&1 | FileCheck %s --check-prefix=CHECK-REMARKS<br>
+//<br>
+// FIXME: -Reverything should imply -Rpass=.*.<br>
+// RUN: %clang_cc1 %s -Reverything -emit-llvm -o - 2>/dev/null | FileCheck %s --check-prefix=CHECK-NO-REMARKS<br>
+//<br>
+// FIXME: -Rpass should either imply -Rpass=.* or should be rejected.<br>
+// RUN: %clang_cc1 %s -Rpass -emit-llvm -o - 2>/dev/null | FileCheck %s --check-prefix=CHECK-NO-REMARKS<br>
+<br>
+// CHECK-REMARKS: remark:<br>
+// CHECK-NO-REMARKS-NOT: remark:<br>
<br>
 // -Rpass should produce source location annotations, exclusively (just<br>
 // like -gmlt).<br>
<br>
Modified: cfe/trunk/test/Frontend/warning-options.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Frontend/warning-options.cpp?rev=215046&r1=215045&r2=215046&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Frontend/warning-options.cpp?rev=215046&r1=215045&r2=215046&view=diff</a><br>

==============================================================================<br>
--- cfe/trunk/test/Frontend/warning-options.cpp (original)<br>
+++ cfe/trunk/test/Frontend/warning-options.cpp Wed Aug  6 19:24:21 2014<br>
@@ -1,5 +1,7 @@<br>
 // RUN: %clang_cc1 -Wmonkey -Wno-monkey -Wno-unused-command-line-arguments \<br>
-// RUN:        -Wno-unused-command-line-argument %s 2>&1 | FileCheck %s<br>
+// RUN:        -Wno-unused-command-line-argument -Wmodule-build -Rmodule-built %s 2>&1 | FileCheck %s<br>
 // CHECK: unknown warning option '-Wmonkey'<br>
 // CHECK: unknown warning option '-Wno-monkey'<br>
 // CHECK: unknown warning option '-Wno-unused-command-line-arguments'; did you mean '-Wno-unused-command-line-argument'?<br>
+// CHECK: unknown warning option '-Wmodule-build'; did you mean '-Wmodule-conflict'?<br>
+// CHECK: unknown remark option '-Rmodule-built'; did you mean '-Rmodule-build'?<br>
<br>
Modified: cfe/trunk/test/Modules/Rmodule-build.m<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Modules/Rmodule-build.m?rev=215046&r1=215045&r2=215046&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Modules/Rmodule-build.m?rev=215046&r1=215045&r2=215046&view=diff</a><br>

==============================================================================<br>
--- cfe/trunk/test/Modules/Rmodule-build.m (original)<br>
+++ cfe/trunk/test/Modules/Rmodule-build.m Wed Aug  6 19:24:21 2014<br>
@@ -7,7 +7,7 @@<br>
 // RUN: echo 'module B { header "B.h" }' >> %t/module.modulemap<br>
<br>
 // RUN: %clang_cc1 -fmodules -fmodules-cache-path=%t -fsyntax-only %s -verify \<br>
-// RUN:            -I %t -Wmodule-build<br>
+// RUN:            -I %t -Rmodule-build<br>
<br>
 @import A; // expected-remark{{building module 'A' as}}<br>
 @import B; // expected-remark{{building module 'B' as}}<br>
@@ -16,7 +16,19 @@<br>
<br>
 // RUN: echo ' ' >> %t/B.h<br>
 // RUN: %clang_cc1 -fmodules -fmodules-cache-path=%t -fsyntax-only %s -I %t \<br>
-// RUN:            -Wmodule-build 2>&1 | FileCheck %s<br>
+// RUN:            -Rmodule-build 2>&1 | FileCheck %s<br>
+<br>
+// RUN: echo ' ' >> %t/B.h<br>
+// RUN: %clang_cc1 -fmodules -fmodules-cache-path=%t -fsyntax-only %s -I %t \<br>
+// RUN:            -Reverything 2>&1 | FileCheck %s<br>
+<br>
+// RUN: echo ' ' >> %t/B.h<br>
+// RUN: %clang_cc1 -fmodules -fmodules-cache-path=%t -fsyntax-only %s -I %t \<br>
+// RUN:            2>&1 | count 0<br>
+<br>
+// RUN: echo ' ' >> %t/B.h<br>
+// RUN: %clang_cc1 -fmodules -fmodules-cache-path=%t -fsyntax-only %s -I %t \<br>
+// RUN:            -Rmodule-build -Rno-everything 2>&1 | count 0<br>
<br>
 // CHECK-NOT: building module 'A'<br>
 // CHECK: building module 'B'<br>
<br>
Modified: cfe/trunk/test/Modules/module_file_info.m<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Modules/module_file_info.m?rev=215046&r1=215045&r2=215046&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Modules/module_file_info.m?rev=215046&r1=215045&r2=215046&view=diff</a><br>

==============================================================================<br>
--- cfe/trunk/test/Modules/module_file_info.m (original)<br>
+++ cfe/trunk/test/Modules/module_file_info.m Wed Aug  6 19:24:21 2014<br>
@@ -22,7 +22,7 @@<br>
<br>
 // CHECK: Diagnostic options:<br>
 // CHECK:   IgnoreWarnings: Yes<br>
-// CHECK:   Warning options:<br>
+// CHECK:   Diagnostic flags:<br>
 // CHECK:     -Wunused<br>
<br>
 // CHECK: Header search options:<br>
<br>
Modified: cfe/trunk/test/Modules/no-stale-modtime.m<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Modules/no-stale-modtime.m?rev=215046&r1=215045&r2=215046&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Modules/no-stale-modtime.m?rev=215046&r1=215045&r2=215046&view=diff</a><br>

==============================================================================<br>
--- cfe/trunk/test/Modules/no-stale-modtime.m (original)<br>
+++ cfe/trunk/test/Modules/no-stale-modtime.m Wed Aug  6 19:24:21 2014<br>
@@ -13,18 +13,18 @@<br>
 // RUN: echo 'module r { header "r.h" } module t { header "t.h" }' >> %t/module.map<br>
<br>
 // RUN: %clang_cc1 -fmodules -fmodules-cache-path=%t -fdisable-module-hash \<br>
-// RUN:     -I %t -fsyntax-only %s -Wmodule-build 2>&1 \<br>
+// RUN:     -I %t -fsyntax-only %s -Rmodule-build 2>&1 \<br>
 // RUN: | FileCheck -check-prefix=REBUILD-ALL %s<br>
 // RUN: %clang_cc1 -fmodules -fmodules-cache-path=%t -fdisable-module-hash \<br>
-// RUN:     -I %t -fsyntax-only %s -Wmodule-build -verify<br>
+// RUN:     -I %t -fsyntax-only %s -Rmodule-build -verify<br>
<br>
 // Add an identifier to ensure everything depending on t is out of date<br>
 // RUN: echo 'extern int a;' >> %t/t.h<br>
 // RUN: %clang_cc1 -fmodules -fmodules-cache-path=%t -fdisable-module-hash \<br>
-// RUN:     -I %t -fsyntax-only %s -Wmodule-build 2>&1 \<br>
+// RUN:     -I %t -fsyntax-only %s -Rmodule-build 2>&1 \<br>
 // RUN: | FileCheck -check-prefix=REBUILD-ALL %s<br>
 // RUN: %clang_cc1 -fmodules -fmodules-cache-path=%t -fdisable-module-hash \<br>
-// RUN:     -I %t -fsyntax-only %s -Wmodule-build -verify<br>
+// RUN:     -I %t -fsyntax-only %s -Rmodule-build -verify<br>
<br>
 // REBUILD-ALL: building module 'b'<br>
 // REBUILD-ALL: building module 'l'<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" target="_blank">http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits</a><br>
</blockquote></div><br></div>
</blockquote></div><br></div></body></html>