akyrtzi updated this revision to Diff 502201. akyrtzi added a comment. Avoid passing a new `IgnoringDiagConsumer` for the test since it's unused.
Repository: rG LLVM Github Monorepo CHANGES SINCE LAST ACTION https://reviews.llvm.org/D145256/new/ https://reviews.llvm.org/D145256 Files: clang/include/clang/Basic/Diagnostic.h clang/lib/Basic/Diagnostic.cpp clang/unittests/Basic/DiagnosticTest.cpp Index: clang/unittests/Basic/DiagnosticTest.cpp =================================================================== --- clang/unittests/Basic/DiagnosticTest.cpp +++ clang/unittests/Basic/DiagnosticTest.cpp @@ -9,6 +9,7 @@ #include "clang/Basic/Diagnostic.h" #include "clang/Basic/DiagnosticError.h" #include "clang/Basic/DiagnosticIDs.h" +#include "clang/Basic/DiagnosticLex.h" #include "gtest/gtest.h" #include <optional> @@ -128,4 +129,26 @@ EXPECT_EQ(*Value, std::make_pair(20, 1)); EXPECT_EQ(Value->first, 20); } + +TEST(DiagnosticTest, storedDiagEmptyWarning) { + DiagnosticsEngine Diags(new DiagnosticIDs(), new DiagnosticOptions); + + class CaptureDiagnosticConsumer : public DiagnosticConsumer { + public: + SmallVector<StoredDiagnostic> StoredDiags; + + void HandleDiagnostic(DiagnosticsEngine::Level level, + const Diagnostic &Info) override { + StoredDiags.push_back(StoredDiagnostic(level, Info)); + } + }; + + CaptureDiagnosticConsumer CaptureConsumer; + Diags.setClient(&CaptureConsumer, /*ShouldOwnClient=*/false); + Diags.Report(diag::pp_hash_warning) << ""; + ASSERT_TRUE(CaptureConsumer.StoredDiags.size() == 1); + + // Make sure an empty warning can round-trip with \c StoredDiagnostic. + Diags.Report(CaptureConsumer.StoredDiags.front()); +} } Index: clang/lib/Basic/Diagnostic.cpp =================================================================== --- clang/lib/Basic/Diagnostic.cpp +++ clang/lib/Basic/Diagnostic.cpp @@ -793,8 +793,8 @@ /// array. void Diagnostic:: FormatDiagnostic(SmallVectorImpl<char> &OutStr) const { - if (!StoredDiagMessage.empty()) { - OutStr.append(StoredDiagMessage.begin(), StoredDiagMessage.end()); + if (StoredDiagMessage.has_value()) { + OutStr.append(StoredDiagMessage->begin(), StoredDiagMessage->end()); return; } Index: clang/include/clang/Basic/Diagnostic.h =================================================================== --- clang/include/clang/Basic/Diagnostic.h +++ clang/include/clang/Basic/Diagnostic.h @@ -1565,7 +1565,7 @@ /// currently in-flight diagnostic. class Diagnostic { const DiagnosticsEngine *DiagObj; - StringRef StoredDiagMessage; + std::optional<StringRef> StoredDiagMessage; public: explicit Diagnostic(const DiagnosticsEngine *DO) : DiagObj(DO) {}
Index: clang/unittests/Basic/DiagnosticTest.cpp =================================================================== --- clang/unittests/Basic/DiagnosticTest.cpp +++ clang/unittests/Basic/DiagnosticTest.cpp @@ -9,6 +9,7 @@ #include "clang/Basic/Diagnostic.h" #include "clang/Basic/DiagnosticError.h" #include "clang/Basic/DiagnosticIDs.h" +#include "clang/Basic/DiagnosticLex.h" #include "gtest/gtest.h" #include <optional> @@ -128,4 +129,26 @@ EXPECT_EQ(*Value, std::make_pair(20, 1)); EXPECT_EQ(Value->first, 20); } + +TEST(DiagnosticTest, storedDiagEmptyWarning) { + DiagnosticsEngine Diags(new DiagnosticIDs(), new DiagnosticOptions); + + class CaptureDiagnosticConsumer : public DiagnosticConsumer { + public: + SmallVector<StoredDiagnostic> StoredDiags; + + void HandleDiagnostic(DiagnosticsEngine::Level level, + const Diagnostic &Info) override { + StoredDiags.push_back(StoredDiagnostic(level, Info)); + } + }; + + CaptureDiagnosticConsumer CaptureConsumer; + Diags.setClient(&CaptureConsumer, /*ShouldOwnClient=*/false); + Diags.Report(diag::pp_hash_warning) << ""; + ASSERT_TRUE(CaptureConsumer.StoredDiags.size() == 1); + + // Make sure an empty warning can round-trip with \c StoredDiagnostic. + Diags.Report(CaptureConsumer.StoredDiags.front()); +} } Index: clang/lib/Basic/Diagnostic.cpp =================================================================== --- clang/lib/Basic/Diagnostic.cpp +++ clang/lib/Basic/Diagnostic.cpp @@ -793,8 +793,8 @@ /// array. void Diagnostic:: FormatDiagnostic(SmallVectorImpl<char> &OutStr) const { - if (!StoredDiagMessage.empty()) { - OutStr.append(StoredDiagMessage.begin(), StoredDiagMessage.end()); + if (StoredDiagMessage.has_value()) { + OutStr.append(StoredDiagMessage->begin(), StoredDiagMessage->end()); return; } Index: clang/include/clang/Basic/Diagnostic.h =================================================================== --- clang/include/clang/Basic/Diagnostic.h +++ clang/include/clang/Basic/Diagnostic.h @@ -1565,7 +1565,7 @@ /// currently in-flight diagnostic. class Diagnostic { const DiagnosticsEngine *DiagObj; - StringRef StoredDiagMessage; + std::optional<StringRef> StoredDiagMessage; public: explicit Diagnostic(const DiagnosticsEngine *DO) : DiagObj(DO) {}
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits