llvmbot wrote:

<!--LLVM PR SUMMARY COMMENT-->

@llvm/pr-subscribers-hlsl

Author: Jan Svoboda (jansvoboda11)

<details>
<summary>Changes</summary>

The `DiagnosticOptions` class is currently intrusively reference-counted, which 
makes reasoning about its lifetime very difficult in some cases. For example, 
`CompilerInvocation` owns the `DiagnosticOptions` instance (wrapped in 
`llvm::IntrusiveRefCntPtr`) and only exposes an accessor returning 
`DiagnosticOptions &amp;`. One would think this gives `CompilerInvocation` 
exclusive ownership of the object, but that's not the case:

```c++
void shareOwnership(CompilerInvocation &amp;CI) {
  llvm::IntrusiveRefCntPtr&lt;DiagnosticOptions&gt; CoOwner = 
&amp;CI.getDiagnosticOptions();
 // ...
}
```

This is a perfectly valid pattern that is being actually used in the codebase.

I would like to ensure the ownership of `DiagnosticOptions` by 
`CompilerInvocation` is guaranteed to be exclusive. This can be leveraged for a 
copy-on-write optimization later on. This PR changes usages of 
`DiagnosticOptions` across `clang`, `clang-tools-extra` and `lldb` to not be 
intrusively reference-counted.

---

Patch is 189.21 KiB, truncated to 20.00 KiB below, full version: 
https://github.com/llvm/llvm-project/pull/139584.diff


134 Files Affected:

- (modified) 
clang-tools-extra/clang-apply-replacements/tool/ClangApplyReplacementsMain.cpp 
(+2-2) 
- (modified) 
clang-tools-extra/clang-change-namespace/tool/ClangChangeNamespace.cpp (+3-3) 
- (modified) clang-tools-extra/clang-include-fixer/tool/ClangIncludeFixer.cpp 
(+3-3) 
- (modified) clang-tools-extra/clang-move/tool/ClangMove.cpp (+3-3) 
- (modified) clang-tools-extra/clang-query/Query.cpp (+1-1) 
- (modified) clang-tools-extra/clang-reorder-fields/tool/ClangReorderFields.cpp 
(+3-3) 
- (modified) clang-tools-extra/clang-tidy/ClangTidy.cpp (+12-12) 
- (modified) clang-tools-extra/clang-tidy/ClangTidyDiagnosticConsumer.cpp 
(+2-2) 
- (modified) clang-tools-extra/clang-tidy/ClangTidyDiagnosticConsumer.h (+4-1) 
- (modified) clang-tools-extra/clang-tidy/ExpandModularHeadersPPCallbacks.cpp 
(+1-1) 
- (modified) clang-tools-extra/clang-tidy/ExpandModularHeadersPPCallbacks.h 
(+1) 
- (modified) clang-tools-extra/clangd/Compiler.cpp (+3-2) 
- (modified) clang-tools-extra/clangd/ModulesBuilder.cpp (+2-2) 
- (modified) clang-tools-extra/clangd/ParsedAST.cpp (+2-1) 
- (modified) clang-tools-extra/clangd/Preamble.cpp (+1-1) 
- (modified) clang-tools-extra/clangd/SystemIncludeExtractor.cpp (+2-1) 
- (modified) clang-tools-extra/clangd/unittests/ConfigCompileTests.cpp (+2-1) 
- (modified) clang-tools-extra/clangd/unittests/tweaks/TweakTests.cpp (+2-1) 
- (modified) clang-tools-extra/include-cleaner/unittests/RecordTest.cpp (+2-2) 
- (modified) clang-tools-extra/include-cleaner/unittests/WalkASTTest.cpp (+3-3) 
- (modified) clang-tools-extra/modularize/ModularizeUtilities.cpp (+2-4) 
- (modified) clang-tools-extra/modularize/ModularizeUtilities.h (+1-1) 
- (modified) 
clang-tools-extra/unittests/clang-apply-replacements/ApplyReplacementsTest.cpp 
(+2-2) 
- (modified) clang-tools-extra/unittests/clang-tidy/ClangTidyOptionsTest.cpp 
(+9-9) 
- (modified) clang-tools-extra/unittests/clang-tidy/ClangTidyTest.h (+3-3) 
- (modified) clang/include/clang/Basic/Diagnostic.h (+3-3) 
- (modified) clang/include/clang/Basic/DiagnosticOptions.h (+1-3) 
- (modified) clang/include/clang/Basic/SourceManager.h (+1) 
- (modified) clang/include/clang/Frontend/ASTUnit.h (+2) 
- (modified) clang/include/clang/Frontend/CompilerInstance.h (+1-1) 
- (modified) clang/include/clang/Frontend/CompilerInvocation.h (+1-1) 
- (modified) clang/include/clang/Frontend/DiagnosticRenderer.h (+3-4) 
- (modified) clang/include/clang/Frontend/LogDiagnosticPrinter.h (+2-2) 
- (modified) clang/include/clang/Frontend/SARIFDiagnostic.h (+1-1) 
- (modified) clang/include/clang/Frontend/SARIFDiagnosticPrinter.h (+2-2) 
- (modified) clang/include/clang/Frontend/SerializedDiagnosticPrinter.h (+1-1) 
- (modified) clang/include/clang/Frontend/TextDiagnostic.h (+1-1) 
- (modified) clang/include/clang/Frontend/TextDiagnosticPrinter.h (+2-2) 
- (modified) clang/include/clang/Serialization/ASTReader.h (+4-5) 
- (modified) clang/lib/Basic/Diagnostic.cpp (+5-5) 
- (modified) clang/lib/Basic/SourceManager.cpp (+2-2) 
- (modified) clang/lib/CrossTU/CrossTranslationUnit.cpp (+9-9) 
- (modified) clang/lib/Frontend/ASTMerge.cpp (+4-5) 
- (modified) clang/lib/Frontend/ASTUnit.cpp (+2) 
- (modified) clang/lib/Frontend/ChainedIncludesSource.cpp (+2-2) 
- (modified) clang/lib/Frontend/CompilerInstance.cpp (+13-14) 
- (modified) clang/lib/Frontend/CompilerInvocation.cpp (+7-20) 
- (modified) clang/lib/Frontend/CreateInvocationFromCommandLine.cpp (+9-5) 
- (modified) clang/lib/Frontend/DiagnosticRenderer.cpp (+8-9) 
- (modified) clang/lib/Frontend/FrontendAction.cpp (+2-3) 
- (modified) clang/lib/Frontend/FrontendActions.cpp (+8-8) 
- (modified) clang/lib/Frontend/LogDiagnosticPrinter.cpp (+2-2) 
- (modified) clang/lib/Frontend/SARIFDiagnostic.cpp (+2-2) 
- (modified) clang/lib/Frontend/SARIFDiagnosticPrinter.cpp (+3-4) 
- (modified) clang/lib/Frontend/SerializedDiagnosticPrinter.cpp (+15-14) 
- (modified) clang/lib/Frontend/TextDiagnostic.cpp (+39-40) 
- (modified) clang/lib/Frontend/TextDiagnosticPrinter.cpp (+6-9) 
- (modified) clang/lib/Interpreter/Interpreter.cpp (+4-4) 
- (modified) clang/lib/Rewrite/HTMLRewrite.cpp (+2-2) 
- (modified) clang/lib/Serialization/ASTReader.cpp (+12-13) 
- (modified) clang/lib/Testing/TestAST.cpp (+1-1) 
- (modified) clang/lib/Tooling/CompilationDatabase.cpp (+4-4) 
- (modified) clang/lib/Tooling/Core/Replacement.cpp (+2-2) 
- (modified) clang/lib/Tooling/DependencyScanning/DependencyScanningWorker.cpp 
(+3-3) 
- (modified) clang/lib/Tooling/Refactoring.cpp (+4-4) 
- (modified) clang/lib/Tooling/Tooling.cpp (+4-4) 
- (modified) clang/tools/c-index-test/core_main.cpp (+4-2) 
- (modified) clang/tools/clang-extdef-mapping/ClangExtDefMapGen.cpp (+7-5) 
- (modified) clang/tools/clang-format/ClangFormat.cpp (+4-4) 
- (modified) clang/tools/clang-import-test/clang-import-test.cpp (+2-2) 
- (modified) clang/tools/clang-installapi/ClangInstallAPI.cpp (+4-4) 
- (modified) clang/tools/clang-scan-deps/ClangScanDeps.cpp (+5-4) 
- (modified) clang/tools/diagtool/ShowEnabledWarnings.cpp (+3-3) 
- (modified) clang/tools/diagtool/TreeView.cpp (+2-2) 
- (modified) clang/tools/driver/cc1_main.cpp (+2-2) 
- (modified) clang/tools/driver/cc1as_main.cpp (+4-4) 
- (modified) clang/tools/driver/cc1gen_reproducer_main.cpp (+3-3) 
- (modified) clang/tools/driver/driver.cpp (+5-6) 
- (modified) clang/tools/libclang/CIndex.cpp (+5-4) 
- (modified) clang/tools/libclang/CIndexCodeCompletion.cpp (+5-5) 
- (modified) clang/tools/libclang/CIndexDiagnostic.cpp (+8-9) 
- (modified) clang/tools/libclang/Indexing.cpp (+2-1) 
- (modified) clang/unittests/AST/ASTVectorTest.cpp (+2-1) 
- (modified) clang/unittests/AST/CommentLexer.cpp (+4-6) 
- (modified) clang/unittests/AST/CommentParser.cpp (+4-6) 
- (modified) clang/unittests/AST/CommentTextTest.cpp (+2-1) 
- (modified) clang/unittests/AST/ExternalASTSourceTest.cpp (+2-2) 
- (modified) 
clang/unittests/Analysis/FlowSensitive/UncheckedOptionalAccessModelTest.cpp 
(+2-3) 
- (modified) clang/unittests/Analysis/MacroExpansionContextTest.cpp (+3-3) 
- (modified) clang/unittests/Analysis/UnsafeBufferUsageTest.cpp (+2-1) 
- (modified) clang/unittests/Basic/DiagnosticTest.cpp (+14-9) 
- (modified) clang/unittests/Basic/SarifTest.cpp (+3-3) 
- (modified) clang/unittests/Basic/SourceManagerTest.cpp (+4-5) 
- (modified) clang/unittests/Driver/DXCModeTest.cpp (+6-6) 
- (modified) clang/unittests/Driver/SanitizerArgsTest.cpp (+3-4) 
- (modified) clang/unittests/Driver/SimpleDiagnosticConsumer.h (+2-3) 
- (modified) clang/unittests/Driver/ToolChainTest.cpp (+36-35) 
- (modified) clang/unittests/Frontend/ASTUnitTest.cpp (+14-13) 
- (modified) clang/unittests/Frontend/CompilerInstanceTest.cpp (+6-5) 
- (modified) clang/unittests/Frontend/CompilerInvocationTest.cpp (+2-1) 
- (modified) clang/unittests/Frontend/OutputStreamTest.cpp (+6-6) 
- (modified) clang/unittests/Frontend/PCHPreambleTest.cpp (+3-1) 
- (modified) clang/unittests/Frontend/ReparseWorkingDirTest.cpp (+2-1) 
- (modified) clang/unittests/Frontend/SearchPathTest.cpp (+2-2) 
- (modified) clang/unittests/Frontend/TextDiagnosticTest.cpp (+4-4) 
- (modified) clang/unittests/Frontend/UtilsTest.cpp (+5-4) 
- (modified) clang/unittests/Interpreter/InterpreterTest.cpp (+9-6) 
- (modified) clang/unittests/Lex/HeaderSearchTest.cpp (+2-1) 
- (modified) clang/unittests/Lex/LexerTest.cpp (+4-6) 
- (modified) clang/unittests/Lex/ModuleDeclStateTest.cpp (+2-1) 
- (modified) clang/unittests/Lex/PPCallbacksTest.cpp (+4-4) 
- (modified) clang/unittests/Lex/PPConditionalDirectiveRecordTest.cpp (+4-6) 
- (modified) clang/unittests/Lex/PPDependencyDirectivesTest.cpp (+2-1) 
- (modified) clang/unittests/Lex/PPMemoryAllocationsTest.cpp (+2-1) 
- (modified) clang/unittests/Parse/ParseHLSLRootSignatureTest.cpp (+2-2) 
- (modified) clang/unittests/Sema/SemaNoloadLookupTest.cpp (+2-2) 
- (modified) clang/unittests/Serialization/ForceCheckFileInputTest.cpp (+4-4) 
- (modified) clang/unittests/Serialization/LoadSpecLazilyTest.cpp (+2-1) 
- (modified) clang/unittests/Serialization/ModuleCacheTest.cpp (+4-2) 
- (modified) clang/unittests/Serialization/NoCommentsTest.cpp (+2-1) 
- (modified) clang/unittests/Serialization/PreambleInNamedModulesTest.cpp 
(+2-1) 
- (modified) clang/unittests/Serialization/VarDeclConstantInitTest.cpp (+2-1) 
- (modified) clang/unittests/Support/TimeProfilerTest.cpp (+2-2) 
- (modified) clang/unittests/Tooling/RewriterTestContext.h (+4-5) 
- (modified) clang/unittests/Tooling/Syntax/TokensTest.cpp (+2-1) 
- (modified) clang/unittests/Tooling/Syntax/TreeTestBase.cpp (+1-1) 
- (modified) clang/unittests/Tooling/Syntax/TreeTestBase.h (+2-2) 
- (modified) clang/unittests/Tooling/ToolingTest.cpp (+4-4) 
- (modified) 
lldb/source/Plugins/ExpressionParser/Clang/ClangExpressionParser.cpp (+5-5) 
- (modified) 
lldb/source/Plugins/ExpressionParser/Clang/ClangExpressionSourceCode.cpp (+1-2) 
- (modified) 
lldb/source/Plugins/ExpressionParser/Clang/ClangModulesDeclVendor.cpp (+13-8) 
- (modified) lldb/source/Plugins/Language/ClangCommon/ClangHighlighter.cpp 
(+1-2) 
- (modified) lldb/source/Plugins/TypeSystem/Clang/TypeSystemClang.cpp (+2-1) 
- (modified) lldb/source/Plugins/TypeSystem/Clang/TypeSystemClang.h (+1) 


``````````diff
diff --git 
a/clang-tools-extra/clang-apply-replacements/tool/ClangApplyReplacementsMain.cpp
 
b/clang-tools-extra/clang-apply-replacements/tool/ClangApplyReplacementsMain.cpp
index 68b5743c6540f..062e236d3e51f 100644
--- 
a/clang-tools-extra/clang-apply-replacements/tool/ClangApplyReplacementsMain.cpp
+++ 
b/clang-tools-extra/clang-apply-replacements/tool/ClangApplyReplacementsMain.cpp
@@ -96,9 +96,9 @@ int main(int argc, char **argv) {
   cl::SetVersionPrinter(printVersion);
   cl::ParseCommandLineOptions(argc, argv);
 
-  IntrusiveRefCntPtr<DiagnosticOptions> DiagOpts(new DiagnosticOptions());
+  DiagnosticOptions DiagOpts;
   DiagnosticsEngine Diagnostics(
-      IntrusiveRefCntPtr<DiagnosticIDs>(new DiagnosticIDs()), DiagOpts.get());
+      IntrusiveRefCntPtr<DiagnosticIDs>(new DiagnosticIDs()), DiagOpts);
 
   // Determine a formatting style from options.
   auto FormatStyleOrError = format::getStyle(FormatStyleOpt, FormatStyleConfig,
diff --git 
a/clang-tools-extra/clang-change-namespace/tool/ClangChangeNamespace.cpp 
b/clang-tools-extra/clang-change-namespace/tool/ClangChangeNamespace.cpp
index 22d26db0c11bc..2a8fe2d06d185 100644
--- a/clang-tools-extra/clang-change-namespace/tool/ClangChangeNamespace.cpp
+++ b/clang-tools-extra/clang-change-namespace/tool/ClangChangeNamespace.cpp
@@ -126,10 +126,10 @@ int main(int argc, const char **argv) {
   if (int Result = Tool.run(Factory.get()))
     return Result;
   LangOptions DefaultLangOptions;
-  IntrusiveRefCntPtr<DiagnosticOptions> DiagOpts = new DiagnosticOptions();
-  clang::TextDiagnosticPrinter DiagnosticPrinter(errs(), &*DiagOpts);
+  DiagnosticOptions DiagOpts;
+  clang::TextDiagnosticPrinter DiagnosticPrinter(errs(), DiagOpts);
   DiagnosticsEngine Diagnostics(
-      IntrusiveRefCntPtr<DiagnosticIDs>(new DiagnosticIDs()), &*DiagOpts,
+      IntrusiveRefCntPtr<DiagnosticIDs>(new DiagnosticIDs()), DiagOpts,
       &DiagnosticPrinter, false);
   auto &FileMgr = Tool.getFiles();
   SourceManager Sources(Diagnostics, FileMgr);
diff --git a/clang-tools-extra/clang-include-fixer/tool/ClangIncludeFixer.cpp 
b/clang-tools-extra/clang-include-fixer/tool/ClangIncludeFixer.cpp
index 6e51f25a66407..746ba7bcea015 100644
--- a/clang-tools-extra/clang-include-fixer/tool/ClangIncludeFixer.cpp
+++ b/clang-tools-extra/clang-include-fixer/tool/ClangIncludeFixer.cpp
@@ -455,9 +455,9 @@ int includeFixerMain(int argc, const char **argv) {
   }
 
   // Set up a new source manager for applying the resulting replacements.
-  IntrusiveRefCntPtr<DiagnosticOptions> DiagOpts(new DiagnosticOptions);
-  DiagnosticsEngine Diagnostics(new DiagnosticIDs, &*DiagOpts);
-  TextDiagnosticPrinter DiagnosticPrinter(outs(), &*DiagOpts);
+  DiagnosticOptions DiagOpts;
+  DiagnosticsEngine Diagnostics(new DiagnosticIDs, DiagOpts);
+  TextDiagnosticPrinter DiagnosticPrinter(outs(), DiagOpts);
   SourceManager SM(Diagnostics, tool.getFiles());
   Diagnostics.setClient(&DiagnosticPrinter, false);
 
diff --git a/clang-tools-extra/clang-move/tool/ClangMove.cpp 
b/clang-tools-extra/clang-move/tool/ClangMove.cpp
index 655ea81ee37d4..750eb952714f7 100644
--- a/clang-tools-extra/clang-move/tool/ClangMove.cpp
+++ b/clang-tools-extra/clang-move/tool/ClangMove.cpp
@@ -176,10 +176,10 @@ int main(int argc, const char **argv) {
     }
   }
 
-  IntrusiveRefCntPtr<DiagnosticOptions> DiagOpts(new DiagnosticOptions());
-  clang::TextDiagnosticPrinter DiagnosticPrinter(errs(), &*DiagOpts);
+  DiagnosticOptions DiagOpts;
+  clang::TextDiagnosticPrinter DiagnosticPrinter(errs(), DiagOpts);
   DiagnosticsEngine Diagnostics(
-      IntrusiveRefCntPtr<DiagnosticIDs>(new DiagnosticIDs()), &*DiagOpts,
+      IntrusiveRefCntPtr<DiagnosticIDs>(new DiagnosticIDs()), DiagOpts,
       &DiagnosticPrinter, false);
   auto &FileMgr = Tool.getFiles();
   SourceManager SM(Diagnostics, FileMgr);
diff --git a/clang-tools-extra/clang-query/Query.cpp 
b/clang-tools-extra/clang-query/Query.cpp
index 382aa5d6fe25e..574b64ee0f759 100644
--- a/clang-tools-extra/clang-query/Query.cpp
+++ b/clang-tools-extra/clang-query/Query.cpp
@@ -172,7 +172,7 @@ bool MatchQuery::run(llvm::raw_ostream &OS, QuerySession 
&QS) const {
           clang::SourceRange R = BI->second.getSourceRange();
           if (R.isValid()) {
             TextDiagnostic TD(OS, AST->getASTContext().getLangOpts(),
-                              &AST->getDiagnostics().getDiagnosticOptions());
+                              AST->getDiagnostics().getDiagnosticOptions());
             TD.emitDiagnostic(
                 FullSourceLoc(R.getBegin(), AST->getSourceManager()),
                 DiagnosticsEngine::Note, "\"" + BI->first + "\" binds here",
diff --git a/clang-tools-extra/clang-reorder-fields/tool/ClangReorderFields.cpp 
b/clang-tools-extra/clang-reorder-fields/tool/ClangReorderFields.cpp
index 5b77ee7b5738c..03502525417b2 100644
--- a/clang-tools-extra/clang-reorder-fields/tool/ClangReorderFields.cpp
+++ b/clang-tools-extra/clang-reorder-fields/tool/ClangReorderFields.cpp
@@ -72,10 +72,10 @@ int main(int argc, const char **argv) {
 
   int ExitCode = Tool.run(Factory.get());
   LangOptions DefaultLangOptions;
-  IntrusiveRefCntPtr<DiagnosticOptions> DiagOpts(new DiagnosticOptions());
-  TextDiagnosticPrinter DiagnosticPrinter(errs(), &*DiagOpts);
+  DiagnosticOptions DiagOpts;
+  TextDiagnosticPrinter DiagnosticPrinter(errs(), DiagOpts);
   DiagnosticsEngine Diagnostics(
-      IntrusiveRefCntPtr<DiagnosticIDs>(new DiagnosticIDs()), &*DiagOpts,
+      IntrusiveRefCntPtr<DiagnosticIDs>(new DiagnosticIDs()), DiagOpts,
       &DiagnosticPrinter, false);
 
   auto &FileMgr = Tool.getFiles();
diff --git a/clang-tools-extra/clang-tidy/ClangTidy.cpp 
b/clang-tools-extra/clang-tidy/ClangTidy.cpp
index 733a53a0f5dcc..26f9afbc0880e 100644
--- a/clang-tools-extra/clang-tidy/ClangTidy.cpp
+++ b/clang-tools-extra/clang-tidy/ClangTidy.cpp
@@ -97,15 +97,14 @@ class ErrorReporter {
   ErrorReporter(ClangTidyContext &Context, FixBehaviour ApplyFixes,
                 llvm::IntrusiveRefCntPtr<llvm::vfs::FileSystem> BaseFS)
       : Files(FileSystemOptions(), std::move(BaseFS)),
-        DiagOpts(new DiagnosticOptions()),
-        DiagPrinter(new TextDiagnosticPrinter(llvm::outs(), &*DiagOpts)),
-        Diags(IntrusiveRefCntPtr<DiagnosticIDs>(new DiagnosticIDs), &*DiagOpts,
+        DiagPrinter(new TextDiagnosticPrinter(llvm::outs(), DiagOpts)),
+        Diags(IntrusiveRefCntPtr<DiagnosticIDs>(new DiagnosticIDs), DiagOpts,
               DiagPrinter),
         SourceMgr(Diags, Files), Context(Context), ApplyFixes(ApplyFixes) {
-    DiagOpts->ShowColors = Context.getOptions().UseColor.value_or(
+    DiagOpts.ShowColors = Context.getOptions().UseColor.value_or(
         llvm::sys::Process::StandardOutHasColors());
     DiagPrinter->BeginSourceFile(LangOpts);
-    if (DiagOpts->ShowColors && !llvm::sys::Process::StandardOutIsDisplayed()) 
{
+    if (DiagOpts.ShowColors && !llvm::sys::Process::StandardOutIsDisplayed()) {
       llvm::sys::Process::UseANSIEscapeCodes(true);
     }
   }
@@ -308,7 +307,7 @@ class ErrorReporter {
 
   FileManager Files;
   LangOptions LangOpts; // FIXME: use langopts from each original file
-  IntrusiveRefCntPtr<DiagnosticOptions> DiagOpts;
+  DiagnosticOptions DiagOpts;
   DiagnosticConsumer *DiagPrinter;
   DiagnosticsEngine Diags;
   SourceManager SourceMgr;
@@ -516,10 +515,10 @@ getCheckOptions(const ClangTidyOptions &Options,
                                                 Options),
       AllowEnablingAnalyzerAlphaCheckers);
   ClangTidyDiagnosticConsumer DiagConsumer(Context);
-  DiagnosticsEngine DE(llvm::makeIntrusiveRefCnt<DiagnosticIDs>(),
-                       llvm::makeIntrusiveRefCnt<DiagnosticOptions>(),
+  auto DiagOpts = std::make_unique<DiagnosticOptions>();
+  DiagnosticsEngine DE(llvm::makeIntrusiveRefCnt<DiagnosticIDs>(), *DiagOpts,
                        &DiagConsumer, /*ShouldOwnClient=*/false);
-  Context.setDiagnosticsEngine(&DE);
+  Context.setDiagnosticsEngine(std::move(DiagOpts), &DE);
   ClangTidyASTConsumerFactory Factory(Context);
   return Factory.getCheckOptions();
 }
@@ -558,9 +557,10 @@ runClangTidy(clang::tidy::ClangTidyContext &Context,
   Context.setProfileStoragePrefix(StoreCheckProfile);
 
   ClangTidyDiagnosticConsumer DiagConsumer(Context, nullptr, true, 
ApplyAnyFix);
-  DiagnosticsEngine DE(new DiagnosticIDs(), new DiagnosticOptions(),
-                       &DiagConsumer, /*ShouldOwnClient=*/false);
-  Context.setDiagnosticsEngine(&DE);
+  auto DiagOpts = std::make_unique<DiagnosticOptions>();
+  DiagnosticsEngine DE(new DiagnosticIDs(), *DiagOpts, &DiagConsumer,
+                       /*ShouldOwnClient=*/false);
+  Context.setDiagnosticsEngine(std::move(DiagOpts), &DE);
   Tool.setDiagnosticConsumer(&DiagConsumer);
 
   class ActionFactory : public FrontendActionFactory {
diff --git a/clang-tools-extra/clang-tidy/ClangTidyDiagnosticConsumer.cpp 
b/clang-tools-extra/clang-tidy/ClangTidyDiagnosticConsumer.cpp
index b216970bfbd8c..a0253a5fd1a48 100644
--- a/clang-tools-extra/clang-tidy/ClangTidyDiagnosticConsumer.cpp
+++ b/clang-tools-extra/clang-tidy/ClangTidyDiagnosticConsumer.cpp
@@ -49,7 +49,7 @@ namespace {
 class ClangTidyDiagnosticRenderer : public DiagnosticRenderer {
 public:
   ClangTidyDiagnosticRenderer(const LangOptions &LangOpts,
-                              DiagnosticOptions *DiagOpts,
+                              DiagnosticOptions &DiagOpts,
                               ClangTidyError &Error)
       : DiagnosticRenderer(LangOpts, DiagOpts), Error(Error) {}
 
@@ -429,7 +429,7 @@ void ClangTidyDiagnosticConsumer::HandleDiagnostic(
     forwardDiagnostic(Info);
   } else {
     ClangTidyDiagnosticRenderer Converter(
-        Context.getLangOpts(), &Context.DiagEngine->getDiagnosticOptions(),
+        Context.getLangOpts(), Context.DiagEngine->getDiagnosticOptions(),
         Errors.back());
     SmallString<100> Message;
     Info.FormatDiagnostic(Message);
diff --git a/clang-tools-extra/clang-tidy/ClangTidyDiagnosticConsumer.h 
b/clang-tools-extra/clang-tidy/ClangTidyDiagnosticConsumer.h
index d6cf6a2b2731e..bd7a1bf2c11c7 100644
--- a/clang-tools-extra/clang-tidy/ClangTidyDiagnosticConsumer.h
+++ b/clang-tools-extra/clang-tidy/ClangTidyDiagnosticConsumer.h
@@ -75,7 +75,9 @@ class ClangTidyContext {
   /// Sets the DiagnosticsEngine that diag() will emit diagnostics to.
   // FIXME: this is required initialization, and should be a constructor param.
   // Fix the context -> diag engine -> consumer -> context initialization 
cycle.
-  void setDiagnosticsEngine(DiagnosticsEngine *DiagEngine) {
+  void setDiagnosticsEngine(std::unique_ptr<DiagnosticOptions> DiagOpts,
+                            DiagnosticsEngine *DiagEngine) {
+    this->DiagOpts = std::move(DiagOpts);
     this->DiagEngine = DiagEngine;
   }
 
@@ -231,6 +233,7 @@ class ClangTidyContext {
   // Writes to Stats.
   friend class ClangTidyDiagnosticConsumer;
 
+  std::unique_ptr<DiagnosticOptions> DiagOpts = nullptr;
   DiagnosticsEngine *DiagEngine = nullptr;
   std::unique_ptr<ClangTidyOptionsProvider> OptionsProvider;
 
diff --git a/clang-tools-extra/clang-tidy/ExpandModularHeadersPPCallbacks.cpp 
b/clang-tools-extra/clang-tidy/ExpandModularHeadersPPCallbacks.cpp
index 03a3e8404e069..6a84704434c33 100644
--- a/clang-tools-extra/clang-tidy/ExpandModularHeadersPPCallbacks.cpp
+++ b/clang-tools-extra/clang-tidy/ExpandModularHeadersPPCallbacks.cpp
@@ -71,7 +71,7 @@ 
ExpandModularHeadersPPCallbacks::ExpandModularHeadersPPCallbacks(
       InMemoryFs(new llvm::vfs::InMemoryFileSystem),
       Sources(Compiler.getSourceManager()),
       // Forward the new diagnostics to the original DiagnosticConsumer.
-      Diags(new DiagnosticIDs, new DiagnosticOptions,
+      Diags(new DiagnosticIDs, DiagOpts,
             new ForwardingDiagnosticConsumer(Compiler.getDiagnosticClient())),
       LangOpts(Compiler.getLangOpts()), HSOpts(Compiler.getHeaderSearchOpts()) 
{
   // Add a FileSystem containing the extra files needed in place of modular
diff --git a/clang-tools-extra/clang-tidy/ExpandModularHeadersPPCallbacks.h 
b/clang-tools-extra/clang-tidy/ExpandModularHeadersPPCallbacks.h
index a263681b3c633..c3478917ef498 100644
--- a/clang-tools-extra/clang-tidy/ExpandModularHeadersPPCallbacks.h
+++ b/clang-tools-extra/clang-tidy/ExpandModularHeadersPPCallbacks.h
@@ -128,6 +128,7 @@ class ExpandModularHeadersPPCallbacks : public PPCallbacks {
   llvm::IntrusiveRefCntPtr<llvm::vfs::InMemoryFileSystem> InMemoryFs;
 
   SourceManager &Sources;
+  DiagnosticOptions DiagOpts;
   DiagnosticsEngine Diags;
   LangOptions LangOpts;
   HeaderSearchOptions HSOpts;
diff --git a/clang-tools-extra/clangd/Compiler.cpp 
b/clang-tools-extra/clangd/Compiler.cpp
index 9be0152afd2f7..8b3865c8a8e5c 100644
--- a/clang-tools-extra/clangd/Compiler.cpp
+++ b/clang-tools-extra/clangd/Compiler.cpp
@@ -110,8 +110,9 @@ buildCompilerInvocation(const ParseInputs &Inputs, 
clang::DiagnosticConsumer &D,
   CIOpts.VFS = Inputs.TFS->view(Inputs.CompileCommand.Directory);
   CIOpts.CC1Args = CC1Args;
   CIOpts.RecoverOnError = true;
-  CIOpts.Diags = CompilerInstance::createDiagnostics(
-      *CIOpts.VFS, new DiagnosticOptions, &D, false);
+  DiagnosticOptions DiagOpts;
+  CIOpts.Diags =
+      CompilerInstance::createDiagnostics(*CIOpts.VFS, DiagOpts, &D, false);
   CIOpts.ProbePrecompiled = false;
   std::unique_ptr<CompilerInvocation> CI = createInvocation(ArgStrs, CIOpts);
   if (!CI)
diff --git a/clang-tools-extra/clangd/ModulesBuilder.cpp 
b/clang-tools-extra/clangd/ModulesBuilder.cpp
index c1878f91b5e16..bf77f43bd28bb 100644
--- a/clang-tools-extra/clangd/ModulesBuilder.cpp
+++ b/clang-tools-extra/clangd/ModulesBuilder.cpp
@@ -187,9 +187,9 @@ bool IsModuleFileUpToDate(PathRef ModuleFilePath,
   HSOpts.ValidateASTInputFilesContent = true;
 
   clang::clangd::IgnoreDiagnostics IgnoreDiags;
+  DiagnosticOptions DiagOpts;
   IntrusiveRefCntPtr<DiagnosticsEngine> Diags =
-      CompilerInstance::createDiagnostics(*VFS, new DiagnosticOptions,
-                                          &IgnoreDiags,
+      CompilerInstance::createDiagnostics(*VFS, DiagOpts, &IgnoreDiags,
                                           /*ShouldOwnClient=*/false);
 
   LangOptions LangOpts;
diff --git a/clang-tools-extra/clangd/ParsedAST.cpp 
b/clang-tools-extra/clangd/ParsedAST.cpp
index 3f63daaf400db..9e1f6bb977226 100644
--- a/clang-tools-extra/clangd/ParsedAST.cpp
+++ b/clang-tools-extra/clangd/ParsedAST.cpp
@@ -556,7 +556,8 @@ ParsedAST::build(llvm::StringRef Filename, const 
ParseInputs &Inputs,
         *AllCTFactories, Cfg.Diagnostics.ClangTidy.FastCheckFilter);
     CTContext.emplace(std::make_unique<tidy::DefaultOptionsProvider>(
         tidy::ClangTidyGlobalOptions(), ClangTidyOpts));
-    CTContext->setDiagnosticsEngine(&Clang->getDiagnostics());
+    // The lifetime of DiagnosticOptions is managed by \c Clang.
+    CTContext->setDiagnosticsEngine(nullptr, &Clang->getDiagnostics());
     CTContext->setASTContext(&Clang->getASTContext());
     CTContext->setCurrentFile(Filename);
     CTContext->setSelfContainedDiags(true);
diff --git a/clang-tools-extra/clangd/Preamble.cpp 
b/clang-tools-extra/clangd/Preamble.cpp
index ba9a53db8a0dc..7b4d63ff197e7 100644
--- a/clang-tools-extra/clangd/Preamble.cpp
+++ b/clang-tools-extra/clangd/Preamble.cpp
@@ -615,7 +615,7 @@ buildPreamble(PathRef FileName, CompilerInvocation CI,
       });
   auto VFS = Inputs.TFS->view(Inputs.CompileCommand.Directory);
   llvm::IntrusiveRefCntPtr<DiagnosticsEngine> PreambleDiagsEngine =
-      CompilerInstance::createDiagnostics(*VFS, &CI.getDiagnosticOpts(),
+      CompilerInstance::createDiagnostics(*VFS, CI.getDiagnosticOpts(),
                                           &PreambleDiagnostics,
                                           /*ShouldOwnClient=*/false);
   const Config &Cfg = Config::current();
diff --git a/clang-tools-extra/clangd/SystemIncludeExtractor.cpp 
b/clang-tools-extra/clangd/SystemIncludeExtractor.cpp
index 6417bf8765622..0b067e8b0b2b2 100644
--- a/clang-tools-extra/clangd/SystemIncludeExtractor.cpp
+++ b/clang-tools-extra/clangd/SystemIncludeExtractor.cpp
@@ -253,7 +253,8 @@ namespace {
 bool isValidTarget(llvm::StringRef Triple) {
   std::shared_ptr<TargetOptions> TargetOpts(new TargetOptions);
   TargetOpts->Triple = Triple.str();
-  DiagnosticsEngine Diags(new DiagnosticIDs, new DiagnosticOptions,
+  DiagnosticOptions DiagOpts;
+  DiagnosticsEngine Diags(new DiagnosticIDs, DiagOpts,
                           new IgnoringDiagConsumer);
   llvm::IntrusiveRefCntPtr<TargetInfo> Target =
       TargetInfo::CreateTargetInfo(Diags, *TargetOpts);
diff --git a/clang-tools-extra/clangd/unittests/ConfigCompileTests.cpp 
b/clang-tools-extra/clangd/unittests/ConfigCompileTests.cpp
index c3e484a1a79c4..75d0ff244038d 100644
--- a/clang-tools-extra/clangd/unittests/ConfigCompileTests.cpp
+++ b/clang-tools-extra/clangd/unittests/ConfigCompileTests.cpp
@@ -298,7 +298,8 @@ TEST_F(ConfigCompileTests, DiagnosticSuppression) {
                                    "unreachable-code", "unused-variable",
                                    "typecheck_bool_condition",
                                    "unexpected_friend", "warn_alloca"));
-  clang::DiagnosticsEngine DiagEngine(new DiagnosticIDs, nullptr,
+  clang::DiagnosticOptions DiagOpts;
+  clang::DiagnosticsEngine DiagEngine(new DiagnosticIDs, DiagOpts,
                                       new clang::IgnoringDiagConsumer);
 
   using Diag = clang::Diagnostic;
diff --git a/clang-tools-extra/clangd/unittests/tweaks/TweakTests.cpp 
b/clang-tools-extra/clangd/unittests/tweaks/TweakTests.cpp
index 8bd40c1429012..e39b70224d97c 100644
--- a/clang-tools-extra/clangd/unittests/tweaks/TweakTests.cpp
+++ b/clang-tools-extra/clangd/unittests/tweaks/TweakTests.cpp
@@ -44,7 +44,8 @@ TEST(FileEdits, AbsolutePath) {
   for (const auto *Path : RelPaths)
     MemFS->addFile(Path, 0, llvm::MemoryBuffer::getMemBuffer("", Path));
   FileManager FM(FileSystemOptions(), MemFS);
-  DiagnosticsEngine DE(new DiagnosticIDs, new DiagnosticOptions);
+  DiagnosticOptions DiagOpts;
+  DiagnosticsEngine DE(new DiagnosticIDs, DiagOpts);
   SourceManager SM(DE, FM);
 
   for (const auto *Path : RelPaths) {
diff --git a/clang-tools-extra/include-cleaner/unittests/RecordTest.cpp 
b/clang-tools-extra/include-cleaner/unittests/RecordTest.cpp
index a10c0d5a54a95..91d2697712b6e 100644
--- a/clang-tools-extra/include-cleaner/unittests/RecordTest.cpp
+++ b/clang-tools-extra/include-cleaner/unittests/RecordTest.cpp
@@ -618,8 +618,8 @@ TEST_F(PragmaIncludeTest, ExportInUnnamedBuffer) {
                  llvm::MemoryBuffer::getMemBufferCopy(Extra.getValue(),
                                                       /*BufferName=*/""));
 
-  auto DiagOpts = llvm::makeIntrusiveRefCnt<DiagnosticOptions>();
-  auto Diags = CompilerInstance::createDiagnostics(*VFS, DiagOpts.get());
+  DiagnosticOptions DiagOpts;
+  auto Diags = CompilerInstance::createDiagnostics(*VFS, DiagOpts);
   auto Invocation = std::make_unique<CompilerInvocation>();
   ASSERT_TRUE(CompilerInvocation::CreateFromArgs(*Invocation, 
{Filename.data()},
                                                  *Diags, "clang"));
diff --git a/clang-tools-extra/include-cleaner/unittests/WalkASTTest.cpp 
b/clang-tools-extra/include-cleaner/unittests/WalkASTTest.cpp
index e45ea36f7938e..5223eb563e4cb 100644
--- a/clang-tools-extra/include-cleaner/unittests/WalkASTTest.cpp
+++ b/clang-tools-extra/include-cleaner/unittests/WalkASTTest.cpp
@@ -85,9 +85,9 @@ std::vector<Decl::Kind> testWalk(llvm::StringRef TargetCode,
   // For each difference, show the target point in context, like a diagnostic.
   std::string DiagBuf;
   llvm::raw_string_ostream DiagOS(DiagBuf);
-  auto *DiagOpts = new DiagnosticOptions();
-  DiagOpts->ShowLevel = 0;
-  DiagOpts->ShowNoteIncludeStack = 0;
+  DiagnosticOptions DiagOpts;
+  DiagOpts.ShowLevel = 0;
+  DiagOpts.ShowNoteIncludeStack = 0;
   TextDiagnostic Diag(DiagOS, AST.context().getLangOpts(), DiagOpts);
   auto DiagnosePoint = [&](llvm::StringRef Message, unsigned Offset) {
     Diag.emitDiagnostic(
diff --git a/clang-tools-extra/modularize/ModularizeUtilities.cpp 
b/clang-tools-extra/modularize/ModularizeUtilities.cpp
index 576e863c8a9d2..b04eb80a67717 100644
--- a/clang-tools-extra/modularize/ModularizeUtilities.cpp
+++ b/clang-tools-extra/modularize/ModularizeUtilities.cpp
@@ -48,10 +48,8 @@ ModularizeUtilities::ModularizeUtilities(...
[truncated]

``````````

</details>


https://github.com/llvm/llvm-project/pull/139584
_______________________________________________
lldb-commits mailing list
lldb-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits

Reply via email to