From 0436233a662589d5e8c95fe395a0cfa8addd6cbf Mon Sep 17 00:00:00 2001 From: Diego Novillo Date: Tue, 22 Apr 2014 19:56:49 +0000 Subject: [PATCH] Use a manipulator to add a value to the current diagnostic flag. Summary: This addresses the feedback to http://lists.cs.uiuc.edu/pipermail/cfe-commits/Week-of-Mon-20140421/103598.html Reviewers: rsmith Subscribers: cfe-commits Differential Revision: http://reviews.llvm.org/D3453 git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@206920 91177308-0d34-0410-b5e6-96231b3b80d8 --- include/clang/Basic/Diagnostic.h | 40 ++++++++++++++++++++------------ lib/CodeGen/CodeGenAction.cpp | 5 ++-- 2 files changed, 27 insertions(+), 18 deletions(-) diff --git a/include/clang/Basic/Diagnostic.h b/include/clang/Basic/Diagnostic.h index f9764d18ef..f7f84440a5 100644 --- a/include/clang/Basic/Diagnostic.h +++ b/include/clang/Basic/Diagnostic.h @@ -654,11 +654,6 @@ public: /// \param DiagID A member of the @c diag::kind enum. /// \param Loc Represents the source location associated with the diagnostic, /// which can be an invalid location if no position information is available. - /// \param Val A string that represents the value that triggered - /// this diagnostic. If given, this value will be emitted as "=value" - /// after the flag name. - inline DiagnosticBuilder Report(SourceLocation Loc, unsigned DiagID, - StringRef Val); inline DiagnosticBuilder Report(SourceLocation Loc, unsigned DiagID); inline DiagnosticBuilder Report(unsigned DiagID); @@ -694,9 +689,12 @@ public: /// \brief Clear out the current diagnostic. void Clear() { CurDiagID = ~0U; } - /// \brief Return the overridden name for this diagnostic flag. + /// \brief Return the value associated to this diagnostic flag. StringRef getFlagNameValue() const { return StringRef(FlagNameValue); } + /// \brief Set the value associated to this diagnostic flag. + void setFlagNameValue(StringRef V) { FlagNameValue = V; } + private: /// \brief Report the delayed diagnostic. void ReportDelayed(); @@ -1010,8 +1008,25 @@ public: bool hasMaxFixItHints() const { return NumFixits == DiagnosticsEngine::MaxFixItHints; } + + void addFlagValue(StringRef V) const { DiagObj->setFlagNameValue(V); } +}; + +struct AddFlagValue { + explicit AddFlagValue(StringRef V) : Val(V) {} + StringRef Val; }; +/// \brief Register a value for the flag in the current diagnostic. This +/// value will be shown as the suffix "=value" after the flag name. It is +/// useful in cases where the diagnostic flag accepts values (e.g., +/// -Rpass or -Wframe-larger-than). +inline const DiagnosticBuilder &operator<<(const DiagnosticBuilder &DB, + const AddFlagValue V) { + DB.addFlagValue(V.Val); + return DB; +} + inline const DiagnosticBuilder &operator<<(const DiagnosticBuilder &DB, StringRef S) { DB.AddString(S); @@ -1100,22 +1115,17 @@ inline const DiagnosticBuilder &operator<<(const DiagnosticBuilder &DB, return DB; } -inline DiagnosticBuilder -DiagnosticsEngine::Report(SourceLocation Loc, unsigned DiagID, StringRef Val) { +inline DiagnosticBuilder DiagnosticsEngine::Report(SourceLocation Loc, + unsigned DiagID) { assert(CurDiagID == ~0U && "Multiple diagnostics in flight at once!"); CurDiagLoc = Loc; CurDiagID = DiagID; - FlagNameValue = Val.str(); + FlagNameValue.clear(); return DiagnosticBuilder(this); } -inline DiagnosticBuilder DiagnosticsEngine::Report(SourceLocation Loc, - unsigned DiagID) { - return Report(Loc, DiagID, ""); -} - inline DiagnosticBuilder DiagnosticsEngine::Report(unsigned DiagID) { - return Report(SourceLocation(), DiagID, ""); + return Report(SourceLocation(), DiagID); } //===----------------------------------------------------------------------===// diff --git a/lib/CodeGen/CodeGenAction.cpp b/lib/CodeGen/CodeGenAction.cpp index 5952e671b5..e1e102fc23 100644 --- a/lib/CodeGen/CodeGenAction.cpp +++ b/lib/CodeGen/CodeGenAction.cpp @@ -404,9 +404,8 @@ void BackendConsumer::OptimizationRemarkHandler( Loc = SourceMgr.translateFileLineCol(FileMgr.getFile(Filename), Line, Column); } - Diags.Report(Loc, diag::remark_fe_backend_optimization_remark, - D.getPassName()) - << D.getMsg().str(); + Diags.Report(Loc, diag::remark_fe_backend_optimization_remark) + << AddFlagValue(D.getPassName()) << D.getMsg().str(); if (Line == 0) // If we could not extract a source location for the diagnostic, -- 2.40.0