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 &`. One would think this gives `CompilerInvocation` exclusive ownership of the object, but that's not the case: ```c++ void shareOwnership(CompilerInvocation &CI) { llvm::IntrusiveRefCntPtr<DiagnosticOptions> CoOwner = &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 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits