r215046 - Use -Rblah, not -Wblah, to control remark diagnostics. This was always the
Richard Smith
richard at metafoo.co.uk
Wed Aug 6 18:05:23 PDT 2014
Hi Bill,
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.)
On Wed, Aug 6, 2014 at 5:24 PM, Richard Smith <richard-llvm at metafoo.co.uk>
wrote:
> Author: rsmith
> Date: Wed Aug 6 19:24:21 2014
> New Revision: 215046
>
> URL: http://llvm.org/viewvc/llvm-project?rev=215046&view=rev
> Log:
> Use -Rblah, not -Wblah, to control remark diagnostics. This was always the
> intent when we added remark support, but was never implemented in the
> general
> case, because the first -R flags didn't need it. (-Rpass= had special
> handling
> to accomodate its argument.)
>
> -Rno-foo, -Reverything, and -Rno-everything can be used to turn off a
> remark,
> or to turn on or off all remarks. Per discussion on cfe-commits,
> -Weverything
> does not affect remarks, and -Reverything does not affect warnings or
> errors.
>
> The only "real" -R flag we have right now is -Rmodule-build; that flag is
> effectively renamed from -Wmodule-build to -Rmodule-build by this change.
>
> -Wpass and -Wno-pass (and their friends) are also renamed to -Rpass and
> -Rno-pass by this change; it's not completely clear whether we intended to
> have
> a -Rpass (with no =pattern), but that is unchanged by this commit, other
> than
> the flag name. The default pattern is effectively one which matches no
> passes.
> In future, we may want to make the default pattern be .*, so that
> -Reverything
> works for -Rpass properly.
>
> Modified:
> cfe/trunk/include/clang/Basic/Diagnostic.h
> cfe/trunk/include/clang/Basic/DiagnosticFrontendKinds.td
> cfe/trunk/include/clang/Basic/DiagnosticIDs.h
> cfe/trunk/include/clang/Basic/DiagnosticOptions.h
> cfe/trunk/include/clang/Driver/Options.td
> cfe/trunk/lib/Basic/Diagnostic.cpp
> cfe/trunk/lib/Basic/DiagnosticIDs.cpp
> cfe/trunk/lib/Basic/Warnings.cpp
> cfe/trunk/lib/Driver/Tools.cpp
> cfe/trunk/lib/Frontend/CompilerInvocation.cpp
> cfe/trunk/lib/Frontend/FrontendActions.cpp
> cfe/trunk/lib/Lex/PPMacroExpansion.cpp
> cfe/trunk/lib/Lex/Pragma.cpp
> cfe/trunk/lib/Serialization/ASTReader.cpp
> cfe/trunk/lib/Serialization/ASTWriter.cpp
> cfe/trunk/test/Frontend/optimization-remark.c
> cfe/trunk/test/Frontend/warning-options.cpp
> cfe/trunk/test/Modules/Rmodule-build.m
> cfe/trunk/test/Modules/module_file_info.m
> cfe/trunk/test/Modules/no-stale-modtime.m
>
> Modified: cfe/trunk/include/clang/Basic/Diagnostic.h
> URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Basic/Diagnostic.h?rev=215046&r1=215045&r2=215046&view=diff
>
> ==============================================================================
> --- cfe/trunk/include/clang/Basic/Diagnostic.h (original)
> +++ cfe/trunk/include/clang/Basic/Diagnostic.h Wed Aug 6 19:24:21 2014
> @@ -542,9 +542,13 @@ public:
> /// \returns true (and ignores the request) if "Group" was unknown,
> false
> /// otherwise.
> ///
> + /// \param Flavor The flavor of group to affect. -Rfoo does not affect
> the
> + /// state of the -Wfoo group and vice versa.
> + ///
> /// \param Loc The source location that this change of diagnostic state
> should
> /// take affect. It can be null if we are setting the state from
> command-line.
> - bool setSeverityForGroup(StringRef Group, diag::Severity Map,
> + bool setSeverityForGroup(diag::Flavor Flavor, StringRef Group,
> + diag::Severity Map,
> SourceLocation Loc = SourceLocation());
>
> /// \brief Set the warning-as-error flag for the given diagnostic group.
> @@ -561,11 +565,12 @@ public:
> /// \returns True if the given group is unknown, false otherwise.
> bool setDiagnosticGroupErrorAsFatal(StringRef Group, bool Enabled);
>
> - /// \brief Add the specified mapping to all diagnostics.
> + /// \brief Add the specified mapping to all diagnostics of the specified
> + /// flavor.
> ///
> /// Mainly to be used by -Wno-everything to disable all warnings but
> allow
> /// subsequent -W options to enable specific warnings.
> - void setSeverityForAll(diag::Severity Map,
> + void setSeverityForAll(diag::Flavor Flavor, diag::Severity Map,
> SourceLocation Loc = SourceLocation());
>
> bool hasErrorOccurred() const { return ErrorOccurred; }
>
> Modified: cfe/trunk/include/clang/Basic/DiagnosticFrontendKinds.td
> URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Basic/DiagnosticFrontendKinds.td?rev=215046&r1=215045&r2=215046&view=diff
>
> ==============================================================================
> --- cfe/trunk/include/clang/Basic/DiagnosticFrontendKinds.td (original)
> +++ cfe/trunk/include/clang/Basic/DiagnosticFrontendKinds.td Wed Aug 6
> 19:24:21 2014
> @@ -36,11 +36,11 @@ def remark_fe_backend_plugin: Remark<"%0
> def note_fe_backend_plugin: Note<"%0">, BackendInfo;
>
> def remark_fe_backend_optimization_remark : Remark<"%0">, BackendInfo,
> - InGroup<BackendOptimizationRemark>, DefaultRemark;
> + InGroup<BackendOptimizationRemark>;
> def remark_fe_backend_optimization_remark_missed : Remark<"%0">,
> BackendInfo,
> - InGroup<BackendOptimizationRemarkMissed>, DefaultRemark;
> + InGroup<BackendOptimizationRemarkMissed>;
> def remark_fe_backend_optimization_remark_analysis : Remark<"%0">,
> BackendInfo,
> - InGroup<BackendOptimizationRemarkAnalysis>, DefaultRemark;
> + InGroup<BackendOptimizationRemarkAnalysis>;
> def warn_fe_backend_optimization_failure : Warning<"%0">, BackendInfo,
> InGroup<BackendOptimizationFailure>, DefaultWarn;
> def note_fe_backend_optimization_remark_invalid_loc : Note<"could "
> @@ -126,17 +126,8 @@ def err_relocatable_without_isysroot : E
> "must specify system root with -isysroot when building a relocatable "
> "PCH file">;
>
> -def warn_unknown_warning_option : Warning<
> - "unknown warning option '%0'">,
> - InGroup<UnknownWarningOption>;
> -def warn_unknown_negative_warning_option : Warning<
> - "unknown warning option '%0'">,
> - InGroup<UnknownWarningOption>;
> -def warn_unknown_warning_option_suggest : Warning<
> - "unknown warning option '%0'; did you mean '%1'?">,
> - InGroup<UnknownWarningOption>;
> -def warn_unknown_negative_warning_option_suggest : Warning<
> - "unknown warning option '%0'; did you mean '%1'?">,
> +def warn_unknown_diag_option : Warning<
> + "unknown %select{warning|remark}0 option '%1'%select{|; did you mean
> '%3'?}2">,
> InGroup<UnknownWarningOption>;
> def warn_unknown_warning_specifier : Warning<
> "unknown %0 warning specifier: '%1'">,
> @@ -176,7 +167,7 @@ def warn_module_config_macro_undef : War
> def note_module_def_undef_here : Note<
> "macro was %select{defined|#undef'd}0 here">;
> def remark_module_build : Remark<"building module '%0' as '%1'">,
> - InGroup<DiagGroup<"module-build">>, DefaultIgnore;
> + InGroup<DiagGroup<"module-build">>;
>
> def err_conflicting_module_names : Error<
> "conflicting module names specified: '-fmodule-name=%0' and "
>
> Modified: cfe/trunk/include/clang/Basic/DiagnosticIDs.h
> URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Basic/DiagnosticIDs.h?rev=215046&r1=215045&r2=215046&view=diff
>
> ==============================================================================
> --- cfe/trunk/include/clang/Basic/DiagnosticIDs.h (original)
> +++ cfe/trunk/include/clang/Basic/DiagnosticIDs.h Wed Aug 6 19:24:21 2014
> @@ -67,6 +67,15 @@ namespace clang {
> Error = 4, ///< Present this diagnostic as an error.
> Fatal = 5 ///< Present this diagnostic as a fatal error.
> };
> +
> + /// Flavors of diagnostics we can emit. Used to filter for a
> particular
> + /// kind of diagnostic (for instance, for -W/-R flags).
> + enum class Flavor {
> + WarningOrError, ///< A diagnostic that indicates a problem or
> potential
> + ///< problem. Can be made fatal by -Werror.
> + Remark ///< A diagnostic that indicates normal progress
> through
> + ///< compilation.
> + };
> }
>
> class DiagnosticMapping {
> @@ -228,15 +237,16 @@ public:
> ///
> /// \param[out] Diags - On return, the diagnostics in the group.
> /// \returns \c true if the given group is unknown, \c false otherwise.
> - bool getDiagnosticsInGroup(StringRef Group,
> + bool getDiagnosticsInGroup(diag::Flavor Flavor, StringRef Group,
> SmallVectorImpl<diag::kind> &Diags) const;
>
> /// \brief Get the set of all diagnostic IDs.
> - void getAllDiagnostics(SmallVectorImpl<diag::kind> &Diags) const;
> + void getAllDiagnostics(diag::Flavor Flavor,
> + SmallVectorImpl<diag::kind> &Diags) const;
>
> - /// \brief Get the warning option with the closest edit distance to the
> given
> - /// group name.
> - static StringRef getNearestWarningOption(StringRef Group);
> + /// \brief Get the diagnostic option with the closest edit distance to
> the
> + /// given group name.
> + static StringRef getNearestOption(diag::Flavor Flavor, StringRef Group);
>
> private:
> /// \brief Classify the specified diagnostic ID into a Level,
> consumable by
>
> Modified: cfe/trunk/include/clang/Basic/DiagnosticOptions.h
> URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Basic/DiagnosticOptions.h?rev=215046&r1=215045&r2=215046&view=diff
>
> ==============================================================================
> --- cfe/trunk/include/clang/Basic/DiagnosticOptions.h (original)
> +++ cfe/trunk/include/clang/Basic/DiagnosticOptions.h Wed Aug 6 19:24:21
> 2014
> @@ -58,6 +58,10 @@ public:
> /// prefixes removed.
> std::vector<std::string> Warnings;
>
> + /// The list of -R... options used to alter the diagnostic mappings,
> with the
> + /// prefixes removed.
> + std::vector<std::string> Remarks;
> +
> public:
> // Define accessors/mutators for diagnostic options of enumeration type.
> #define DIAGOPT(Name, Bits, Default)
>
> Modified: cfe/trunk/include/clang/Driver/Options.td
> URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Driver/Options.td?rev=215046&r1=215045&r2=215046&view=diff
>
> ==============================================================================
> --- cfe/trunk/include/clang/Driver/Options.td (original)
> +++ cfe/trunk/include/clang/Driver/Options.td Wed Aug 6 19:24:21 2014
> @@ -64,7 +64,9 @@ def M_Group : OptionGroup<
> def T_Group : OptionGroup<"<T group>">;
> def O_Group : OptionGroup<"<O group>">,
> Group<CompileOnly_Group>;
> def R_Group : OptionGroup<"<R group>">,
> Group<CompileOnly_Group>;
> +def R_value_Group : OptionGroup<"<R (with value) group>">,
> Group<R_Group>;
> def W_Group : OptionGroup<"<W group>">,
> Group<CompileOnly_Group>;
> +def W_value_Group : OptionGroup<"<W (with value) group>">,
> Group<W_Group>;
> def d_Group : OptionGroup<"<d group>">;
> def f_Group : OptionGroup<"<f group>">,
> Group<CompileOnly_Group>;
> def f_clang_Group : OptionGroup<"<f (clang-only) group>">,
> Group<CompileOnly_Group>;
> @@ -261,17 +263,19 @@ def Qn : Flag<["-"], "Qn">;
> def Qunused_arguments : Flag<["-"], "Qunused-arguments">,
> Flags<[DriverOption, CoreOption]>,
> HelpText<"Don't emit warning for unused driver arguments">;
> def Q : Flag<["-"], "Q">;
> -def Rpass_EQ : Joined<["-"], "Rpass=">, Group<R_Group>,
> Flags<[CC1Option]>,
> +def Rpass_EQ : Joined<["-"], "Rpass=">, Group<R_value_Group>,
> Flags<[CC1Option]>,
> HelpText<"Report transformations performed by optimization passes whose
> "
> "name matches the given POSIX regular expression">;
> -def Rpass_missed_EQ : Joined<["-"], "Rpass-missed=">, Group<R_Group>,
> +def Rpass_missed_EQ : Joined<["-"], "Rpass-missed=">,
> Group<R_value_Group>,
> Flags<[CC1Option]>,
> HelpText<"Report missed transformations by optimization passes whose "
> "name matches the given POSIX regular expression">;
> -def Rpass_analysis_EQ : Joined<["-"], "Rpass-analysis=">, Group<R_Group>,
> +def Rpass_analysis_EQ : Joined<["-"], "Rpass-analysis=">,
> Group<R_value_Group>,
> Flags<[CC1Option]>,
> HelpText<"Report transformation analysis from optimization passes whose
> "
> "name matches the given POSIX regular expression">;
> +def R_Joined : Joined<["-"], "R">, Group<R_Group>, Flags<[CC1Option,
> CoreOption]>,
> + MetaVarName<"<remark>">, HelpText<"Enable the specified remark">;
> def S : Flag<["-"], "S">, Flags<[DriverOption,CC1Option]>,
> Group<Action_Group>,
> HelpText<"Only run preprocess and compilation steps">;
> def Tbss : JoinedOrSeparate<["-"], "Tbss">, Group<T_Group>;
> @@ -290,6 +294,7 @@ def Wextra : Flag<["-"], "Wextra">, Grou
> def Wl_COMMA : CommaJoined<["-"], "Wl,">, Flags<[LinkerInput,
> RenderAsInput]>,
> HelpText<"Pass the comma separated arguments in <arg> to the linker">,
> MetaVarName<"<arg>">;
> +// FIXME: This is broken; these should not be Joined arguments.
> def Wno_nonportable_cfstrings : Joined<["-"],
> "Wno-nonportable-cfstrings">, Group<W_Group>,
> Flags<[CC1Option]>;
> def Wnonportable_cfstrings : Joined<["-"], "Wnonportable-cfstrings">,
> Group<W_Group>,
>
> Modified: cfe/trunk/lib/Basic/Diagnostic.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Basic/Diagnostic.cpp?rev=215046&r1=215045&r2=215046&view=diff
>
> ==============================================================================
> --- cfe/trunk/lib/Basic/Diagnostic.cpp (original)
> +++ cfe/trunk/lib/Basic/Diagnostic.cpp Wed Aug 6 19:24:21 2014
> @@ -228,11 +228,12 @@ void DiagnosticsEngine::setSeverity(diag
> FullSourceLoc(Loc,
> *SourceMgr)));
> }
>
> -bool DiagnosticsEngine::setSeverityForGroup(StringRef Group,
> diag::Severity Map,
> +bool DiagnosticsEngine::setSeverityForGroup(diag::Flavor Flavor,
> + StringRef Group,
> diag::Severity Map,
> SourceLocation Loc) {
> // Get the diagnostics in this group.
> SmallVector<diag::kind, 8> GroupDiags;
> - if (Diags->getDiagnosticsInGroup(Group, GroupDiags))
> + if (Diags->getDiagnosticsInGroup(Flavor, Group, GroupDiags))
> return true;
>
> // Set the mapping.
> @@ -247,14 +248,16 @@ bool DiagnosticsEngine::setDiagnosticGro
> // If we are enabling this feature, just set the diagnostic mappings to
> map to
> // errors.
> if (Enabled)
> - return setSeverityForGroup(Group, diag::Severity::Error);
> + return setSeverityForGroup(diag::Flavor::WarningOrError, Group,
> + diag::Severity::Error);
>
> // Otherwise, we want to set the diagnostic mapping's "no Werror" bit,
> and
> // potentially downgrade anything already mapped to be a warning.
>
> // Get the diagnostics in this group.
> SmallVector<diag::kind, 8> GroupDiags;
> - if (Diags->getDiagnosticsInGroup(Group, GroupDiags))
> + if (Diags->getDiagnosticsInGroup(diag::Flavor::WarningOrError, Group,
> + GroupDiags))
> return true;
>
> // Perform the mapping change.
> @@ -276,14 +279,16 @@ bool DiagnosticsEngine::setDiagnosticGro
> // If we are enabling this feature, just set the diagnostic mappings to
> map to
> // fatal errors.
> if (Enabled)
> - return setSeverityForGroup(Group, diag::Severity::Fatal);
> + return setSeverityForGroup(diag::Flavor::WarningOrError, Group,
> + diag::Severity::Fatal);
>
> // Otherwise, we want to set the diagnostic mapping's "no Werror" bit,
> and
> // potentially downgrade anything already mapped to be an error.
>
> // Get the diagnostics in this group.
> SmallVector<diag::kind, 8> GroupDiags;
> - if (Diags->getDiagnosticsInGroup(Group, GroupDiags))
> + if (Diags->getDiagnosticsInGroup(diag::Flavor::WarningOrError, Group,
> + GroupDiags))
> return true;
>
> // Perform the mapping change.
> @@ -299,11 +304,12 @@ bool DiagnosticsEngine::setDiagnosticGro
> return false;
> }
>
> -void DiagnosticsEngine::setSeverityForAll(diag::Severity Map,
> +void DiagnosticsEngine::setSeverityForAll(diag::Flavor Flavor,
> + diag::Severity Map,
> SourceLocation Loc) {
> // Get all the diagnostics.
> SmallVector<diag::kind, 64> AllDiags;
> - Diags->getAllDiagnostics(AllDiags);
> + Diags->getAllDiagnostics(Flavor, AllDiags);
>
> // Set the mapping.
> for (unsigned i = 0, e = AllDiags.size(); i != e; ++i)
>
> Modified: cfe/trunk/lib/Basic/DiagnosticIDs.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Basic/DiagnosticIDs.cpp?rev=215046&r1=215045&r2=215046&view=diff
>
> ==============================================================================
> --- cfe/trunk/lib/Basic/DiagnosticIDs.cpp (original)
> +++ cfe/trunk/lib/Basic/DiagnosticIDs.cpp Wed Aug 6 19:24:21 2014
> @@ -58,6 +58,11 @@ struct StaticDiagInfoRec {
> return StringRef(DescriptionStr, DescriptionLen);
> }
>
> + diag::Flavor getFlavor() const {
> + return Class == CLASS_REMARK ? diag::Flavor::Remark
> + : diag::Flavor::WarningOrError;
> + }
> +
> bool operator<(const StaticDiagInfoRec &RHS) const {
> return DiagID < RHS.DiagID;
> }
> @@ -522,40 +527,57 @@ StringRef DiagnosticIDs::getWarningOptio
> return StringRef();
> }
>
> -static void getDiagnosticsInGroup(const WarningOption *Group,
> +/// Return \c true if any diagnostics were found in this group, even if
> they
> +/// were filtered out due to having the wrong flavor.
> +static bool getDiagnosticsInGroup(diag::Flavor Flavor,
> + const WarningOption *Group,
> SmallVectorImpl<diag::kind> &Diags) {
> + // An empty group is considered to be a warning group: we have empty
> groups
> + // for GCC compatibility, and GCC does not have remarks.
> + if (!Group->Members && !Group->SubGroups)
> + return Flavor == diag::Flavor::Remark ? true : false;
> +
> + bool NotFound = true;
> +
> // Add the members of the option diagnostic set.
> const int16_t *Member = DiagArrays + Group->Members;
> - for (; *Member != -1; ++Member)
> - Diags.push_back(*Member);
> + for (; *Member != -1; ++Member) {
> + if (GetDiagInfo(*Member)->getFlavor() == Flavor) {
> + NotFound = false;
> + Diags.push_back(*Member);
> + }
> + }
>
> // Add the members of the subgroups.
> const int16_t *SubGroups = DiagSubGroups + Group->SubGroups;
> for (; *SubGroups != (int16_t)-1; ++SubGroups)
> - getDiagnosticsInGroup(&OptionTable[(short)*SubGroups], Diags);
> + NotFound &= getDiagnosticsInGroup(Flavor,
> &OptionTable[(short)*SubGroups],
> + Diags);
> +
> + return NotFound;
> }
>
> -bool DiagnosticIDs::getDiagnosticsInGroup(
> - StringRef Group,
> - SmallVectorImpl<diag::kind> &Diags) const {
> - const WarningOption *Found =
> - std::lower_bound(OptionTable, OptionTable + OptionTableSize, Group,
> - WarningOptionCompare);
> +bool
> +DiagnosticIDs::getDiagnosticsInGroup(diag::Flavor Flavor, StringRef Group,
> + SmallVectorImpl<diag::kind> &Diags)
> const {
> + const WarningOption *Found = std::lower_bound(
> + OptionTable, OptionTable + OptionTableSize, Group,
> WarningOptionCompare);
> if (Found == OptionTable + OptionTableSize ||
> Found->getName() != Group)
> return true; // Option not found.
>
> - ::getDiagnosticsInGroup(Found, Diags);
> - return false;
> + return ::getDiagnosticsInGroup(Flavor, Found, Diags);
> }
>
> -void DiagnosticIDs::getAllDiagnostics(
> - SmallVectorImpl<diag::kind> &Diags) const {
> +void DiagnosticIDs::getAllDiagnostics(diag::Flavor Flavor,
> + SmallVectorImpl<diag::kind> &Diags)
> const {
> for (unsigned i = 0; i != StaticDiagInfoSize; ++i)
> - Diags.push_back(StaticDiagInfo[i].DiagID);
> + if (StaticDiagInfo[i].getFlavor() == Flavor)
> + Diags.push_back(StaticDiagInfo[i].DiagID);
> }
>
> -StringRef DiagnosticIDs::getNearestWarningOption(StringRef Group) {
> +StringRef DiagnosticIDs::getNearestOption(diag::Flavor Flavor,
> + StringRef Group) {
> StringRef Best;
> unsigned BestDistance = Group.size() + 1; // Sanity threshold.
> for (const WarningOption *i = OptionTable, *e = OptionTable +
> OptionTableSize;
> @@ -565,6 +587,14 @@ StringRef DiagnosticIDs::getNearestWarni
> continue;
>
> unsigned Distance = i->getName().edit_distance(Group, true,
> BestDistance);
> + if (Distance > BestDistance)
> + continue;
> +
> + // Don't suggest groups that are not of this kind.
> + llvm::SmallVector<diag::kind, 8> Diags;
> + if (::getDiagnosticsInGroup(Flavor, i, Diags) || Diags.empty())
> + continue;
> +
> if (Distance == BestDistance) {
> // Two matches with the same distance, don't prefer one over the
> other.
> Best = "";
>
> Modified: cfe/trunk/lib/Basic/Warnings.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Basic/Warnings.cpp?rev=215046&r1=215045&r2=215046&view=diff
>
> ==============================================================================
> --- cfe/trunk/lib/Basic/Warnings.cpp (original)
> +++ cfe/trunk/lib/Basic/Warnings.cpp Wed Aug 6 19:24:21 2014
> @@ -20,6 +20,8 @@
> // Given a warning option 'foo', the following are valid:
> // -Wfoo, -Wno-foo, -Werror=foo, -Wfatal-errors=foo
> //
> +// Remark options are also handled here, analogously, except that they
> are much
> +// simpler because a remark can't be promoted to an error.
> #include "clang/Basic/AllDiagnostics.h"
> #include "clang/Basic/Diagnostic.h"
> #include "clang/Basic/DiagnosticOptions.h"
> @@ -31,17 +33,12 @@ using namespace clang;
> // EmitUnknownDiagWarning - Emit a warning and typo hint for unknown
> warning
> // opts
> static void EmitUnknownDiagWarning(DiagnosticsEngine &Diags,
> - StringRef Prefix, StringRef Opt,
> - bool isPositive) {
> - StringRef Suggestion = DiagnosticIDs::getNearestWarningOption(Opt);
> - if (!Suggestion.empty())
> - Diags.Report(isPositive? diag::warn_unknown_warning_option_suggest :
> -
> diag::warn_unknown_negative_warning_option_suggest)
> - << (Prefix.str() += Opt) << (Prefix.str() += Suggestion);
> - else
> - Diags.Report(isPositive? diag::warn_unknown_warning_option :
> - diag::warn_unknown_negative_warning_option)
> - << (Prefix.str() += Opt);
> + diag::Flavor Flavor, StringRef Prefix,
> + StringRef Opt) {
> + StringRef Suggestion = DiagnosticIDs::getNearestOption(Flavor, Opt);
> + Diags.Report(diag::warn_unknown_diag_option)
> + << (Flavor == diag::Flavor::WarningOrError ? 0 : 1) << (Prefix.str()
> += Opt)
> + << !Suggestion.empty() << (Prefix.str() += Suggestion);
> }
>
> void clang::ProcessWarningOptions(DiagnosticsEngine &Diags,
> @@ -89,6 +86,7 @@ void clang::ProcessWarningOptions(Diagno
> break;
>
> for (unsigned i = 0, e = Opts.Warnings.size(); i != e; ++i) {
> + const auto Flavor = diag::Flavor::WarningOrError;
> StringRef Opt = Opts.Warnings[i];
> StringRef OrigOpt = Opts.Warnings[i];
>
> @@ -125,7 +123,7 @@ void clang::ProcessWarningOptions(Diagno
> Diags.setEnableAllWarnings(true);
> } else {
> Diags.setEnableAllWarnings(false);
> - Diags.setSeverityForAll(diag::Severity::Ignored);
> + Diags.setSeverityForAll(Flavor, diag::Severity::Ignored);
> }
> }
> continue;
> @@ -154,8 +152,8 @@ void clang::ProcessWarningOptions(Diagno
> if (SetDiagnostic) {
> // Set the warning as error flag for this specifier.
> Diags.setDiagnosticGroupWarningAsError(Specifier, isPositive);
> - } else if (DiagIDs->getDiagnosticsInGroup(Specifier, _Diags)) {
> - EmitUnknownDiagWarning(Diags, "-Werror=", Specifier,
> isPositive);
> + } else if (DiagIDs->getDiagnosticsInGroup(Flavor, Specifier,
> _Diags)) {
> + EmitUnknownDiagWarning(Diags, Flavor, "-Werror=", Specifier);
> }
> continue;
> }
> @@ -182,19 +180,50 @@ void clang::ProcessWarningOptions(Diagno
> if (SetDiagnostic) {
> // Set the error as fatal flag for this specifier.
> Diags.setDiagnosticGroupErrorAsFatal(Specifier, isPositive);
> - } else if (DiagIDs->getDiagnosticsInGroup(Specifier, _Diags)) {
> - EmitUnknownDiagWarning(Diags, "-Wfatal-errors=", Specifier,
> - isPositive);
> + } else if (DiagIDs->getDiagnosticsInGroup(Flavor, Specifier,
> _Diags)) {
> + EmitUnknownDiagWarning(Diags, Flavor, "-Wfatal-errors=",
> Specifier);
> }
> continue;
> }
>
> if (Report) {
> - if (DiagIDs->getDiagnosticsInGroup(Opt, _Diags))
> - EmitUnknownDiagWarning(Diags, isPositive ? "-W" : "-Wno-", Opt,
> - isPositive);
> + if (DiagIDs->getDiagnosticsInGroup(Flavor, Opt, _Diags))
> + EmitUnknownDiagWarning(Diags, Flavor, isPositive ? "-W" :
> "-Wno-",
> + Opt);
> + } else {
> + Diags.setSeverityForGroup(Flavor, Opt, Mapping);
> + }
> + }
> +
> + for (unsigned i = 0, e = Opts.Remarks.size(); i != e; ++i) {
> + StringRef Opt = Opts.Remarks[i];
> + const auto Flavor = diag::Flavor::Remark;
> +
> + // Check to see if this warning starts with "no-", if so, this is a
> + // negative form of the option.
> + bool IsPositive = !Opt.startswith("no-");
> + if (!IsPositive) Opt = Opt.substr(3);
> +
> + auto Severity = IsPositive ? diag::Severity::Remark
> + : diag::Severity::Ignored;
> +
> + // -Reverything sets the state of all remarks. Note that all
> remarks are
> + // in remark groups, so we don't need a separate 'all remarks
> enabled'
> + // flag.
> + if (Opt == "everything") {
> + if (SetDiagnostic)
> + Diags.setSeverityForAll(Flavor, Severity);
> + continue;
> + }
> +
> + if (Report) {
> + if (DiagIDs->getDiagnosticsInGroup(Flavor, Opt, _Diags))
> + EmitUnknownDiagWarning(Diags, Flavor, IsPositive ? "-R" :
> "-Rno-",
> + Opt);
> } else {
> - Diags.setSeverityForGroup(Opt, Mapping);
> + Diags.setSeverityForGroup(Flavor, Opt,
> + IsPositive ? diag::Severity::Remark
> + : diag::Severity::Ignored);
> }
> }
> }
>
> Modified: cfe/trunk/lib/Driver/Tools.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Driver/Tools.cpp?rev=215046&r1=215045&r2=215046&view=diff
>
> ==============================================================================
> --- cfe/trunk/lib/Driver/Tools.cpp (original)
> +++ cfe/trunk/lib/Driver/Tools.cpp Wed Aug 6 19:24:21 2014
> @@ -3374,6 +3374,7 @@ void Clang::ConstructJob(Compilation &C,
> // precompiling.
> Args.ClaimAllArgs(options::OPT_flto);
>
> + Args.AddAllArgs(CmdArgs, options::OPT_R_Group);
> Args.AddAllArgs(CmdArgs, options::OPT_W_Group);
> if (Args.hasFlag(options::OPT_pedantic, options::OPT_no_pedantic,
> false))
> CmdArgs.push_back("-pedantic");
> @@ -3735,15 +3736,6 @@ void Clang::ConstructJob(Compilation &C,
> A->render(Args, CmdArgs);
> }
>
> - if (Arg *A = Args.getLastArg(options::OPT_Rpass_EQ))
> - A->render(Args, CmdArgs);
> -
> - if (Arg *A = Args.getLastArg(options::OPT_Rpass_missed_EQ))
> - A->render(Args, CmdArgs);
> -
> - if (Arg *A = Args.getLastArg(options::OPT_Rpass_analysis_EQ))
> - A->render(Args, CmdArgs);
> -
> if (Args.hasArg(options::OPT_mkernel)) {
> if (!Args.hasArg(options::OPT_fapple_kext) && types::isCXX(InputType))
> CmdArgs.push_back("-fapple-kext");
>
> Modified: cfe/trunk/lib/Frontend/CompilerInvocation.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Frontend/CompilerInvocation.cpp?rev=215046&r1=215045&r2=215046&view=diff
>
> ==============================================================================
> --- cfe/trunk/lib/Frontend/CompilerInvocation.cpp (original)
> +++ cfe/trunk/lib/Frontend/CompilerInvocation.cpp Wed Aug 6 19:24:21 2014
> @@ -111,25 +111,21 @@ static unsigned getOptimizationLevelSize
> return 0;
> }
>
> -static void addWarningArgs(ArgList &Args, std::vector<std::string>
> &Warnings) {
> - for (arg_iterator I = Args.filtered_begin(OPT_W_Group),
> - E = Args.filtered_end(); I != E; ++I) {
> - Arg *A = *I;
> - // If the argument is a pure flag, add its name (minus the "W" at the
> beginning)
> - // to the warning list. Else, add its value (for the OPT_W case).
> +static void addDiagnosticArgs(ArgList &Args, OptSpecifier Group,
> + OptSpecifier GroupWithValue,
> + std::vector<std::string> &Diagnostics) {
> + for (Arg *A : Args.filtered(Group)) {
> if (A->getOption().getKind() == Option::FlagClass) {
> - Warnings.push_back(A->getOption().getName().substr(1));
> + // The argument is a pure flag (such as OPT_Wall or
> OPT_Wdeprecated). Add
> + // its name (minus the "W" or "R" at the beginning) to the warning
> list.
> + Diagnostics.push_back(A->getOption().getName().drop_front(1));
> + } else if (A->getOption().matches(GroupWithValue)) {
> + // This is -Wfoo= or -Rfoo=, where foo is the name of the
> diagnostic group.
> +
> Diagnostics.push_back(A->getOption().getName().drop_front(1).rtrim("=-"));
> } else {
> - for (unsigned Idx = 0, End = A->getNumValues();
> - Idx < End; ++Idx) {
> - StringRef V = A->getValue(Idx);
> - // "-Wl," and such are not warning options.
> - // FIXME: Should be handled by putting these in separate flags.
> - if (V.startswith("l,") || V.startswith("a,") ||
> V.startswith("p,"))
> - continue;
> -
> - Warnings.push_back(V);
> - }
> + // Otherwise, add its value (for OPT_W_Joined and similar).
> + for (const char *Arg : A->getValues())
> + Diagnostics.push_back(Arg);
> }
> }
> }
> @@ -700,7 +696,8 @@ bool clang::ParseDiagnosticArgs(Diagnost
> << Opts.TabStop << DiagnosticOptions::DefaultTabStop;
> }
> Opts.MessageLength = getLastArgIntValue(Args, OPT_fmessage_length, 0,
> Diags);
> - addWarningArgs(Args, Opts.Warnings);
> + addDiagnosticArgs(Args, OPT_W_Group, OPT_W_value_Group, Opts.Warnings);
> + addDiagnosticArgs(Args, OPT_R_Group, OPT_R_value_Group, Opts.Remarks);
>
> return Success;
> }
>
> Modified: cfe/trunk/lib/Frontend/FrontendActions.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Frontend/FrontendActions.cpp?rev=215046&r1=215045&r2=215046&view=diff
>
> ==============================================================================
> --- cfe/trunk/lib/Frontend/FrontendActions.cpp (original)
> +++ cfe/trunk/lib/Frontend/FrontendActions.cpp Wed Aug 6 19:24:21 2014
> @@ -470,10 +470,11 @@ namespace {
> Out.indent(4) << #Name << ": " << DiagOpts->Name << "\n";
> #include "clang/Basic/DiagnosticOptions.def"
>
> - Out.indent(4) << "Warning options:\n";
> - for (const std::string &Warning : DiagOpts->Warnings) {
> + Out.indent(4) << "Diagnostic flags:\n";
> + for (const std::string &Warning : DiagOpts->Warnings)
> Out.indent(6) << "-W" << Warning << "\n";
> - }
> + for (const std::string &Remark : DiagOpts->Remarks)
> + Out.indent(6) << "-R" << Remark << "\n";
>
> return false;
> }
>
> Modified: cfe/trunk/lib/Lex/PPMacroExpansion.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Lex/PPMacroExpansion.cpp?rev=215046&r1=215045&r2=215046&view=diff
>
> ==============================================================================
> --- cfe/trunk/lib/Lex/PPMacroExpansion.cpp (original)
> +++ cfe/trunk/lib/Lex/PPMacroExpansion.cpp Wed Aug 6 19:24:21 2014
> @@ -1446,6 +1446,8 @@ void Preprocessor::ExpandBuiltinMacro(To
> break;
> }
>
> + // FIXME: Should we accept "-R..." flags here, or should that be
> handled
> + // by a separate __has_remark?
> if (WarningName.size() < 3 || WarningName[0] != '-' ||
> WarningName[1] != 'W') {
> Diag(StrStartLoc, diag::warn_has_warning_invalid_option);
> @@ -1458,7 +1460,8 @@ void Preprocessor::ExpandBuiltinMacro(To
> // worth special casing.
> SmallVector<diag::kind, 10> Diags;
> Value = !getDiagnostics().getDiagnosticIDs()->
> - getDiagnosticsInGroup(WarningName.substr(2), Diags);
> + getDiagnosticsInGroup(diag::Flavor::WarningOrError,
> + WarningName.substr(2), Diags);
> } while (false);
>
> OS << (int)Value;
>
> Modified: cfe/trunk/lib/Lex/Pragma.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Lex/Pragma.cpp?rev=215046&r1=215045&r2=215046&view=diff
>
> ==============================================================================
> --- cfe/trunk/lib/Lex/Pragma.cpp (original)
> +++ cfe/trunk/lib/Lex/Pragma.cpp Wed Aug 6 19:24:21 2014
> @@ -993,13 +993,15 @@ public:
> }
>
> if (WarningName.size() < 3 || WarningName[0] != '-' ||
> - WarningName[1] != 'W') {
> + (WarningName[1] != 'W' && WarningName[1] != 'R')) {
> PP.Diag(StringLoc, diag::warn_pragma_diagnostic_invalid_option);
> return;
> }
>
> - if (PP.getDiagnostics().setSeverityForGroup(WarningName.substr(2), SV,
> - DiagLoc))
> + if (PP.getDiagnostics().setSeverityForGroup(
> + WarningName[1] == 'W' ? diag::Flavor::WarningOrError
> + : diag::Flavor::Remark,
> + WarningName.substr(2), SV, DiagLoc))
> PP.Diag(StringLoc, diag::warn_pragma_diagnostic_unknown_warning)
> << WarningName;
> else if (Callbacks)
>
> Modified: cfe/trunk/lib/Serialization/ASTReader.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Serialization/ASTReader.cpp?rev=215046&r1=215045&r2=215046&view=diff
>
> ==============================================================================
> --- cfe/trunk/lib/Serialization/ASTReader.cpp (original)
> +++ cfe/trunk/lib/Serialization/ASTReader.cpp Wed Aug 6 19:24:21 2014
> @@ -4639,9 +4639,10 @@ bool ASTReader::ParseDiagnosticOptions(c
> DiagOpts->set##Name(static_cast<Type>(Record[Idx++]));
> #include "clang/Basic/DiagnosticOptions.def"
>
> - for (unsigned N = Record[Idx++]; N; --N) {
> + for (unsigned N = Record[Idx++]; N; --N)
> DiagOpts->Warnings.push_back(ReadString(Record, Idx));
> - }
> + for (unsigned N = Record[Idx++]; N; --N)
> + DiagOpts->Remarks.push_back(ReadString(Record, Idx));
>
> return Listener.ReadDiagnosticOptions(DiagOpts, Complain);
> }
>
> Modified: cfe/trunk/lib/Serialization/ASTWriter.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Serialization/ASTWriter.cpp?rev=215046&r1=215045&r2=215046&view=diff
>
> ==============================================================================
> --- cfe/trunk/lib/Serialization/ASTWriter.cpp (original)
> +++ cfe/trunk/lib/Serialization/ASTWriter.cpp Wed Aug 6 19:24:21 2014
> @@ -1226,6 +1226,9 @@ void ASTWriter::WriteControlBlock(Prepro
> Record.push_back(DiagOpts.Warnings.size());
> for (unsigned I = 0, N = DiagOpts.Warnings.size(); I != N; ++I)
> AddString(DiagOpts.Warnings[I], Record);
> + Record.push_back(DiagOpts.Remarks.size());
> + for (unsigned I = 0, N = DiagOpts.Remarks.size(); I != N; ++I)
> + AddString(DiagOpts.Remarks[I], Record);
> // Note: we don't serialize the log or serialization file names,
> because they
> // are generally transient files and will almost always be overridden.
> Stream.EmitRecord(DIAGNOSTIC_OPTIONS, Record);
>
> Modified: cfe/trunk/test/Frontend/optimization-remark.c
> URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Frontend/optimization-remark.c?rev=215046&r1=215045&r2=215046&view=diff
>
> ==============================================================================
> --- cfe/trunk/test/Frontend/optimization-remark.c (original)
> +++ cfe/trunk/test/Frontend/optimization-remark.c Wed Aug 6 19:24:21 2014
> @@ -6,6 +6,21 @@
> // RUN: %clang_cc1 %s -Rpass=inline -Rpass-analysis=inline
> -Rpass-missed=inline -O0 -emit-llvm-only -verify
> // RUN: %clang_cc1 %s -Rpass=inline -Rpass-analysis=inline
> -Rpass-missed=inline -O0 -emit-llvm-only -gline-tables-only -verify
> // RUN: %clang_cc1 %s -Rpass=inline -emit-llvm -o - 2>/dev/null |
> FileCheck %s
> +//
> +// Check that we can override -Rpass= with -Rno-pass.
> +// RUN: %clang_cc1 %s -Rpass=inline -emit-llvm -o - 2>&1 | FileCheck %s
> --check-prefix=CHECK-REMARKS
> +// RUN: %clang_cc1 %s -Rpass=inline -Rno-pass -emit-llvm -o - 2>&1 |
> FileCheck %s --check-prefix=CHECK-NO-REMARKS
> +// RUN: %clang_cc1 %s -Rpass=inline -Rno-everything -emit-llvm -o - 2>&1
> | FileCheck %s --check-prefix=CHECK-NO-REMARKS
> +// RUN: %clang_cc1 %s -Rpass=inline -Rno-everything -Reverything
> -emit-llvm -o - 2>&1 | FileCheck %s --check-prefix=CHECK-REMARKS
> +//
> +// FIXME: -Reverything should imply -Rpass=.*.
> +// RUN: %clang_cc1 %s -Reverything -emit-llvm -o - 2>/dev/null |
> FileCheck %s --check-prefix=CHECK-NO-REMARKS
> +//
> +// FIXME: -Rpass should either imply -Rpass=.* or should be rejected.
> +// RUN: %clang_cc1 %s -Rpass -emit-llvm -o - 2>/dev/null | FileCheck %s
> --check-prefix=CHECK-NO-REMARKS
> +
> +// CHECK-REMARKS: remark:
> +// CHECK-NO-REMARKS-NOT: remark:
>
> // -Rpass should produce source location annotations, exclusively (just
> // like -gmlt).
>
> Modified: cfe/trunk/test/Frontend/warning-options.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Frontend/warning-options.cpp?rev=215046&r1=215045&r2=215046&view=diff
>
> ==============================================================================
> --- cfe/trunk/test/Frontend/warning-options.cpp (original)
> +++ cfe/trunk/test/Frontend/warning-options.cpp Wed Aug 6 19:24:21 2014
> @@ -1,5 +1,7 @@
> // RUN: %clang_cc1 -Wmonkey -Wno-monkey
> -Wno-unused-command-line-arguments \
> -// RUN: -Wno-unused-command-line-argument %s 2>&1 | FileCheck %s
> +// RUN: -Wno-unused-command-line-argument -Wmodule-build
> -Rmodule-built %s 2>&1 | FileCheck %s
> // CHECK: unknown warning option '-Wmonkey'
> // CHECK: unknown warning option '-Wno-monkey'
> // CHECK: unknown warning option '-Wno-unused-command-line-arguments';
> did you mean '-Wno-unused-command-line-argument'?
> +// CHECK: unknown warning option '-Wmodule-build'; did you mean
> '-Wmodule-conflict'?
> +// CHECK: unknown remark option '-Rmodule-built'; did you mean
> '-Rmodule-build'?
>
> Modified: cfe/trunk/test/Modules/Rmodule-build.m
> URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Modules/Rmodule-build.m?rev=215046&r1=215045&r2=215046&view=diff
>
> ==============================================================================
> --- cfe/trunk/test/Modules/Rmodule-build.m (original)
> +++ cfe/trunk/test/Modules/Rmodule-build.m Wed Aug 6 19:24:21 2014
> @@ -7,7 +7,7 @@
> // RUN: echo 'module B { header "B.h" }' >> %t/module.modulemap
>
> // RUN: %clang_cc1 -fmodules -fmodules-cache-path=%t -fsyntax-only %s
> -verify \
> -// RUN: -I %t -Wmodule-build
> +// RUN: -I %t -Rmodule-build
>
> @import A; // expected-remark{{building module 'A' as}}
> @import B; // expected-remark{{building module 'B' as}}
> @@ -16,7 +16,19 @@
>
> // RUN: echo ' ' >> %t/B.h
> // RUN: %clang_cc1 -fmodules -fmodules-cache-path=%t -fsyntax-only %s -I
> %t \
> -// RUN: -Wmodule-build 2>&1 | FileCheck %s
> +// RUN: -Rmodule-build 2>&1 | FileCheck %s
> +
> +// RUN: echo ' ' >> %t/B.h
> +// RUN: %clang_cc1 -fmodules -fmodules-cache-path=%t -fsyntax-only %s -I
> %t \
> +// RUN: -Reverything 2>&1 | FileCheck %s
> +
> +// RUN: echo ' ' >> %t/B.h
> +// RUN: %clang_cc1 -fmodules -fmodules-cache-path=%t -fsyntax-only %s -I
> %t \
> +// RUN: 2>&1 | count 0
> +
> +// RUN: echo ' ' >> %t/B.h
> +// RUN: %clang_cc1 -fmodules -fmodules-cache-path=%t -fsyntax-only %s -I
> %t \
> +// RUN: -Rmodule-build -Rno-everything 2>&1 | count 0
>
> // CHECK-NOT: building module 'A'
> // CHECK: building module 'B'
>
> Modified: cfe/trunk/test/Modules/module_file_info.m
> URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Modules/module_file_info.m?rev=215046&r1=215045&r2=215046&view=diff
>
> ==============================================================================
> --- cfe/trunk/test/Modules/module_file_info.m (original)
> +++ cfe/trunk/test/Modules/module_file_info.m Wed Aug 6 19:24:21 2014
> @@ -22,7 +22,7 @@
>
> // CHECK: Diagnostic options:
> // CHECK: IgnoreWarnings: Yes
> -// CHECK: Warning options:
> +// CHECK: Diagnostic flags:
> // CHECK: -Wunused
>
> // CHECK: Header search options:
>
> Modified: cfe/trunk/test/Modules/no-stale-modtime.m
> URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Modules/no-stale-modtime.m?rev=215046&r1=215045&r2=215046&view=diff
>
> ==============================================================================
> --- cfe/trunk/test/Modules/no-stale-modtime.m (original)
> +++ cfe/trunk/test/Modules/no-stale-modtime.m Wed Aug 6 19:24:21 2014
> @@ -13,18 +13,18 @@
> // RUN: echo 'module r { header "r.h" } module t { header "t.h" }' >>
> %t/module.map
>
> // RUN: %clang_cc1 -fmodules -fmodules-cache-path=%t
> -fdisable-module-hash \
> -// RUN: -I %t -fsyntax-only %s -Wmodule-build 2>&1 \
> +// RUN: -I %t -fsyntax-only %s -Rmodule-build 2>&1 \
> // RUN: | FileCheck -check-prefix=REBUILD-ALL %s
> // RUN: %clang_cc1 -fmodules -fmodules-cache-path=%t
> -fdisable-module-hash \
> -// RUN: -I %t -fsyntax-only %s -Wmodule-build -verify
> +// RUN: -I %t -fsyntax-only %s -Rmodule-build -verify
>
> // Add an identifier to ensure everything depending on t is out of date
> // RUN: echo 'extern int a;' >> %t/t.h
> // RUN: %clang_cc1 -fmodules -fmodules-cache-path=%t
> -fdisable-module-hash \
> -// RUN: -I %t -fsyntax-only %s -Wmodule-build 2>&1 \
> +// RUN: -I %t -fsyntax-only %s -Rmodule-build 2>&1 \
> // RUN: | FileCheck -check-prefix=REBUILD-ALL %s
> // RUN: %clang_cc1 -fmodules -fmodules-cache-path=%t
> -fdisable-module-hash \
> -// RUN: -I %t -fsyntax-only %s -Wmodule-build -verify
> +// RUN: -I %t -fsyntax-only %s -Rmodule-build -verify
>
> // REBUILD-ALL: building module 'b'
> // REBUILD-ALL: building module 'l'
>
>
> _______________________________________________
> cfe-commits mailing list
> cfe-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20140806/1339b197/attachment.html>
More information about the cfe-commits
mailing list