[clang] [llvm] [clang] Use a formatted_raw_ostream in TextDiagnostic (PR #164935)
Timm Baeder via llvm-commits
llvm-commits at lists.llvm.org
Fri Oct 24 08:43:35 PDT 2025
Timm =?utf-8?q?Bäder?= <tbaeder at redhat.com>,
Timm =?utf-8?q?Bäder?= <tbaeder at redhat.com>
Message-ID:
In-Reply-To: <llvm.org/llvm/llvm-project/pull/164935 at github.com>
https://github.com/tbaederr updated https://github.com/llvm/llvm-project/pull/164935
>From dbb4a43124d1f9080f657eb294740f663f152713 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Timm=20B=C3=A4der?= <tbaeder at redhat.com>
Date: Fri, 24 Oct 2025 08:32:28 +0200
Subject: [PATCH 1/3] [clang] Use a formatted_raw_ostream in TextDiagnostic
---
clang/include/clang/Frontend/TextDiagnostic.h | 8 +++---
clang/lib/Frontend/TextDiagnostic.cpp | 27 ++++++++++++-------
llvm/include/llvm/Support/FormattedStream.h | 3 ++-
3 files changed, 25 insertions(+), 13 deletions(-)
diff --git a/clang/include/clang/Frontend/TextDiagnostic.h b/clang/include/clang/Frontend/TextDiagnostic.h
index e2e88d4d648a2..10028186d27f3 100644
--- a/clang/include/clang/Frontend/TextDiagnostic.h
+++ b/clang/include/clang/Frontend/TextDiagnostic.h
@@ -16,10 +16,12 @@
#define LLVM_CLANG_FRONTEND_TEXTDIAGNOSTIC_H
#include "clang/Frontend/DiagnosticRenderer.h"
-#include "llvm/Support/raw_ostream.h"
+#include "llvm/Support/FormattedStream.h"
namespace clang {
+using llvm::formatted_raw_ostream;
+
/// Class to encapsulate the logic for formatting and printing a textual
/// diagnostic message.
///
@@ -33,7 +35,7 @@ namespace clang {
/// DiagnosticClient is implemented through this class as is diagnostic
/// printing coming out of libclang.
class TextDiagnostic : public DiagnosticRenderer {
- raw_ostream &OS;
+ formatted_raw_ostream OS;
const Preprocessor *PP;
public:
@@ -47,7 +49,7 @@ class TextDiagnostic : public DiagnosticRenderer {
unsigned End;
enum llvm::raw_ostream::Colors Color;
StyleRange(unsigned S, unsigned E, enum llvm::raw_ostream::Colors C)
- : Start(S), End(E), Color(C){};
+ : Start(S), End(E), Color(C) {};
};
/// Print the diagonstic level to a raw_ostream.
diff --git a/clang/lib/Frontend/TextDiagnostic.cpp b/clang/lib/Frontend/TextDiagnostic.cpp
index 58885712fbdcc..e44219c4d657a 100644
--- a/clang/lib/Frontend/TextDiagnostic.cpp
+++ b/clang/lib/Frontend/TextDiagnostic.cpp
@@ -17,7 +17,6 @@
#include "llvm/Support/ConvertUTF.h"
#include "llvm/Support/ErrorHandling.h"
#include "llvm/Support/Locale.h"
-#include "llvm/Support/raw_ostream.h"
#include <algorithm>
#include <optional>
@@ -662,7 +661,7 @@ void TextDiagnostic::emitDiagnosticMessage(
FullSourceLoc Loc, PresumedLoc PLoc, DiagnosticsEngine::Level Level,
StringRef Message, ArrayRef<clang::CharSourceRange> Ranges,
DiagOrStoredDiag D) {
- uint64_t StartOfLocationInfo = OS.tell();
+ uint64_t StartOfLocationInfo = OS.getColumn();
// Emit the location of this particular diagnostic.
if (Loc.isValid())
@@ -675,7 +674,7 @@ void TextDiagnostic::emitDiagnosticMessage(
printDiagnosticLevel(OS, Level, DiagOpts.ShowColors);
printDiagnosticMessage(OS,
/*IsSupplemental*/ Level == DiagnosticsEngine::Note,
- Message, OS.tell() - StartOfLocationInfo,
+ Message, OS.getColumn() - StartOfLocationInfo,
DiagOpts.MessageLength, DiagOpts.ShowColors);
}
@@ -688,11 +687,21 @@ TextDiagnostic::printDiagnosticLevel(raw_ostream &OS,
switch (Level) {
case DiagnosticsEngine::Ignored:
llvm_unreachable("Invalid diagnostic type");
- case DiagnosticsEngine::Note: OS.changeColor(noteColor, true); break;
- case DiagnosticsEngine::Remark: OS.changeColor(remarkColor, true); break;
- case DiagnosticsEngine::Warning: OS.changeColor(warningColor, true); break;
- case DiagnosticsEngine::Error: OS.changeColor(errorColor, true); break;
- case DiagnosticsEngine::Fatal: OS.changeColor(fatalColor, true); break;
+ case DiagnosticsEngine::Note:
+ OS.changeColor(noteColor, true);
+ break;
+ case DiagnosticsEngine::Remark:
+ OS.changeColor(remarkColor, true);
+ break;
+ case DiagnosticsEngine::Warning:
+ OS.changeColor(warningColor, true);
+ break;
+ case DiagnosticsEngine::Error:
+ OS.changeColor(errorColor, true);
+ break;
+ case DiagnosticsEngine::Fatal:
+ OS.changeColor(fatalColor, true);
+ break;
}
}
@@ -1485,7 +1494,7 @@ void TextDiagnostic::emitSnippet(StringRef SourceLine,
if (CharStyle != Styles.end()) {
if (!CurrentColor ||
(CurrentColor && *CurrentColor != CharStyle->Color)) {
- OS.changeColor(CharStyle->Color, false);
+ OS.changeColor(CharStyle->Color);
CurrentColor = CharStyle->Color;
}
} else if (CurrentColor) {
diff --git a/llvm/include/llvm/Support/FormattedStream.h b/llvm/include/llvm/Support/FormattedStream.h
index 011a6aea238e3..402cd3e3235dc 100644
--- a/llvm/include/llvm/Support/FormattedStream.h
+++ b/llvm/include/llvm/Support/FormattedStream.h
@@ -180,7 +180,8 @@ class LLVM_ABI formatted_raw_ostream : public raw_ostream {
return *this;
}
- raw_ostream &changeColor(enum Colors Color, bool Bold, bool BG) override {
+ raw_ostream &changeColor(enum Colors Color, bool Bold = false,
+ bool BG = false) override {
if (colors_enabled()) {
DisableScanScope S(this);
raw_ostream::changeColor(Color, Bold, BG);
>From 85d94459cd853054635bd6d514ff5f72f9a449f3 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Timm=20B=C3=A4der?= <tbaeder at redhat.com>
Date: Fri, 24 Oct 2025 14:33:43 +0200
Subject: [PATCH 2/3] Flush!
---
clang/lib/Frontend/TextDiagnostic.cpp | 1 +
1 file changed, 1 insertion(+)
diff --git a/clang/lib/Frontend/TextDiagnostic.cpp b/clang/lib/Frontend/TextDiagnostic.cpp
index e44219c4d657a..5e21e1f8c5d76 100644
--- a/clang/lib/Frontend/TextDiagnostic.cpp
+++ b/clang/lib/Frontend/TextDiagnostic.cpp
@@ -744,6 +744,7 @@ void TextDiagnostic::printDiagnosticMessage(raw_ostream &OS,
if (ShowColors)
OS.resetColor();
OS << '\n';
+ OS.flush();
}
void TextDiagnostic::emitFilename(StringRef Filename, const SourceManager &SM) {
>From afd23e6f151e42d6c8cb4ebd1557daa5be49873b Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Timm=20B=C3=A4der?= <tbaeder at redhat.com>
Date: Fri, 24 Oct 2025 17:43:11 +0200
Subject: [PATCH 3/3] Flush in emitDiagnosticMessage
---
clang/lib/Frontend/TextDiagnostic.cpp | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/clang/lib/Frontend/TextDiagnostic.cpp b/clang/lib/Frontend/TextDiagnostic.cpp
index 5e21e1f8c5d76..b8fb159d9ebb9 100644
--- a/clang/lib/Frontend/TextDiagnostic.cpp
+++ b/clang/lib/Frontend/TextDiagnostic.cpp
@@ -676,6 +676,8 @@ void TextDiagnostic::emitDiagnosticMessage(
/*IsSupplemental*/ Level == DiagnosticsEngine::Note,
Message, OS.getColumn() - StartOfLocationInfo,
DiagOpts.MessageLength, DiagOpts.ShowColors);
+
+ OS.flush();
}
/*static*/ void
@@ -744,7 +746,6 @@ void TextDiagnostic::printDiagnosticMessage(raw_ostream &OS,
if (ShowColors)
OS.resetColor();
OS << '\n';
- OS.flush();
}
void TextDiagnostic::emitFilename(StringRef Filename, const SourceManager &SM) {
More information about the llvm-commits
mailing list