Author: Kadir Cetinkaya Date: 2023-02-23T16:10:11+01:00 New Revision: 981e3a35a14541afc6fa338abf3f31895b80eed9
URL: https://github.com/llvm/llvm-project/commit/981e3a35a14541afc6fa338abf3f31895b80eed9 DIFF: https://github.com/llvm/llvm-project/commit/981e3a35a14541afc6fa338abf3f31895b80eed9.diff LOG: [clangd] Set diag data before emitting Also fixes a benign use-after-free. Differential Revision: https://reviews.llvm.org/D144641 Added: Modified: clang-tools-extra/clangd/Diagnostics.cpp clang-tools-extra/clangd/unittests/DiagnosticsTests.cpp Removed: ################################################################################ diff --git a/clang-tools-extra/clangd/Diagnostics.cpp b/clang-tools-extra/clangd/Diagnostics.cpp index 26b0047951b51..12a865fcf9e50 100644 --- a/clang-tools-extra/clangd/Diagnostics.cpp +++ b/clang-tools-extra/clangd/Diagnostics.cpp @@ -526,6 +526,9 @@ void toLSPDiags( } } Main.tags = D.Tags; + // FIXME: Get rid of the copies here by taking in a mutable clangd::Diag. + for (auto &Entry : D.OpaqueData) + Main.data.insert({Entry.first, Entry.second}); OutFn(std::move(Main), D.Fixes); // If we didn't emit the notes as relatedLocations, emit separate diagnostics @@ -540,10 +543,6 @@ void toLSPDiags( Res.message = noteMessage(D, Note, Opts); OutFn(std::move(Res), llvm::ArrayRef<Fix>()); } - - // FIXME: Get rid of the copies here by taking in a mutable clangd::Diag. - for (auto &Entry : D.OpaqueData) - Main.data.insert({Entry.first, Entry.second}); } int getSeverity(DiagnosticsEngine::Level L) { diff --git a/clang-tools-extra/clangd/unittests/DiagnosticsTests.cpp b/clang-tools-extra/clangd/unittests/DiagnosticsTests.cpp index 610a290f834aa..a20be39722ec3 100644 --- a/clang-tools-extra/clangd/unittests/DiagnosticsTests.cpp +++ b/clang-tools-extra/clangd/unittests/DiagnosticsTests.cpp @@ -23,6 +23,7 @@ #include "clang/Basic/Diagnostic.h" #include "clang/Basic/DiagnosticSema.h" #include "llvm/ADT/StringRef.h" +#include "llvm/Support/JSON.h" #include "llvm/Support/ScopedPrinter.h" #include "llvm/Support/TargetSelect.h" #include "gmock/gmock.h" @@ -1012,6 +1013,7 @@ TEST(DiagnosticsTest, ToLSP) { D.Severity = DiagnosticsEngine::Error; D.File = "foo/bar/main.cpp"; D.AbsFile = std::string(MainFile.file()); + D.OpaqueData["test"] = "bar"; clangd::Note NoteInMain; NoteInMain.Message = "declared somewhere in the main file"; @@ -1050,6 +1052,7 @@ main.cpp:6:7: remark: declared somewhere in the main file ../foo/baz/header.h:10:11: note: declared somewhere in the header file)"; MainLSP.tags = {DiagnosticTag::Unnecessary}; + MainLSP.data = D.OpaqueData; clangd::Diagnostic NoteInMainLSP; NoteInMainLSP.range = NoteInMain.Range; _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits