Skip to content

Commit 79d809a

Browse files
committed
Fixup ASTUnit lifetimes
1 parent 5fa1d9b commit 79d809a

File tree

6 files changed

+19
-12
lines changed

6 files changed

+19
-12
lines changed

clang/include/clang/Frontend/ASTUnit.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -107,6 +107,7 @@ class ASTUnit {
107107

108108
private:
109109
std::unique_ptr<LangOptions> LangOpts;
110+
std::shared_ptr<DiagnosticOptions> DiagOpts;
110111
IntrusiveRefCntPtr<DiagnosticsEngine> Diagnostics;
111112
IntrusiveRefCntPtr<FileManager> FileMgr;
112113
IntrusiveRefCntPtr<SourceManager> SourceMgr;
@@ -837,6 +838,7 @@ class ASTUnit {
837838
static std::unique_ptr<ASTUnit> LoadFromCommandLine(
838839
const char **ArgBegin, const char **ArgEnd,
839840
std::shared_ptr<PCHContainerOperations> PCHContainerOps,
841+
std::shared_ptr<DiagnosticOptions> DiagOpts,
840842
IntrusiveRefCntPtr<DiagnosticsEngine> Diags, StringRef ResourceFilesPath,
841843
bool StorePreamblesInMemory = false,
842844
StringRef PreambleStoragePath = StringRef(), bool OnlyLocalDecls = false,

clang/lib/CrossTU/CrossTranslationUnit.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -604,14 +604,15 @@ CrossTranslationUnitContext::ASTLoader::loadFromSource(
604604
[](auto &&CmdPart) { return CmdPart.c_str(); });
605605

606606
auto *DiagClient = new ForwardingDiagnosticConsumer{CI.getDiagnosticClient()};
607+
auto DiagOpts = std::make_shared<DiagnosticOptions>(CI.getDiagnosticOpts());
607608
IntrusiveRefCntPtr<DiagnosticIDs> DiagID{
608609
CI.getDiagnostics().getDiagnosticIDs()};
609610
IntrusiveRefCntPtr<DiagnosticsEngine> Diags(
610611
new DiagnosticsEngine{DiagID, CI.getDiagnosticOpts(), DiagClient});
611612

612613
return ASTUnit::LoadFromCommandLine(CommandLineArgs.begin(),
613614
(CommandLineArgs.end()),
614-
CI.getPCHContainerOperations(), Diags,
615+
CI.getPCHContainerOperations(),DiagOpts, Diags,
615616
CI.getHeaderSearchOpts().ResourceDir);
616617
}
617618

clang/lib/Frontend/ASTUnit.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1766,6 +1766,7 @@ std::unique_ptr<ASTUnit> ASTUnit::LoadFromCompilerInvocation(
17661766
std::unique_ptr<ASTUnit> ASTUnit::LoadFromCommandLine(
17671767
const char **ArgBegin, const char **ArgEnd,
17681768
std::shared_ptr<PCHContainerOperations> PCHContainerOps,
1769+
std::shared_ptr<DiagnosticOptions> DiagOpts,
17691770
IntrusiveRefCntPtr<DiagnosticsEngine> Diags, StringRef ResourceFilesPath,
17701771
bool StorePreamblesInMemory, StringRef PreambleStoragePath,
17711772
bool OnlyLocalDecls, CaptureDiagsKind CaptureDiagnostics,
@@ -1828,6 +1829,7 @@ std::unique_ptr<ASTUnit> ASTUnit::LoadFromCommandLine(
18281829
AST->NumStoredDiagnosticsFromDriver = StoredDiagnostics.size();
18291830
AST->StoredDiagnostics.swap(StoredDiagnostics);
18301831
ConfigureDiags(Diags, *AST, CaptureDiagnostics);
1832+
AST->DiagOpts = DiagOpts;
18311833
AST->Diagnostics = Diags;
18321834
AST->FileSystemOpts = CI->getFileSystemOpts();
18331835
VFS = createVFSFromCompilerInvocation(*CI, *Diags, VFS);

clang/tools/libclang/CIndex.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4300,7 +4300,7 @@ clang_parseTranslationUnit_Impl(CXIndex CIdx, const char *source_filename,
43004300
}
43014301

43024302
// Configure the diagnostics.
4303-
std::unique_ptr<DiagnosticOptions> DiagOpts = CreateAndPopulateDiagOpts(
4303+
std::shared_ptr<DiagnosticOptions> DiagOpts = CreateAndPopulateDiagOpts(
43044304
llvm::ArrayRef(command_line_args, num_command_line_args));
43054305
IntrusiveRefCntPtr<DiagnosticsEngine> Diags(
43064306
CompilerInstance::createDiagnostics(*llvm::vfs::getRealFileSystem(),
@@ -4388,7 +4388,7 @@ clang_parseTranslationUnit_Impl(CXIndex CIdx, const char *source_filename,
43884388
options, llvm::ArrayRef(*Args), /*InvocationArgs=*/{}, unsaved_files);
43894389
std::unique_ptr<ASTUnit> Unit = ASTUnit::LoadFromCommandLine(
43904390
Args->data(), Args->data() + Args->size(),
4391-
CXXIdx->getPCHContainerOperations(), Diags,
4391+
CXXIdx->getPCHContainerOperations(), DiagOpts, Diags,
43924392
CXXIdx->getClangResourcesPath(), CXXIdx->getStorePreamblesInMemory(),
43934393
CXXIdx->getPreambleStoragePath(), CXXIdx->getOnlyLocalDecls(),
43944394
CaptureDiagnostics, *RemappedFiles.get(),

clang/unittests/Frontend/ASTUnitTest.cpp

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,8 @@ class ASTUnitTest : public ::testing::Test {
3030
int FD;
3131
llvm::SmallString<256> InputFileName;
3232
std::unique_ptr<ToolOutputFile> input_file;
33-
DiagnosticOptions DiagOpts;
33+
std::shared_ptr<DiagnosticOptions> DiagOpts =
34+
std::make_shared<DiagnosticOptions>();
3435
IntrusiveRefCntPtr<DiagnosticsEngine> Diags;
3536
std::shared_ptr<CompilerInvocation> CInvok;
3637
std::shared_ptr<PCHContainerOperations> PCHContainerOps;
@@ -44,7 +45,7 @@ class ASTUnitTest : public ::testing::Test {
4445
const char *Args[] = {"clang", "-xc++", InputFileName.c_str()};
4546

4647
auto VFS = llvm::vfs::getRealFileSystem();
47-
Diags = CompilerInstance::createDiagnostics(*VFS, DiagOpts);
48+
Diags = CompilerInstance::createDiagnostics(*VFS, *DiagOpts);
4849

4950
CreateInvocationOptions CIOpts;
5051
CIOpts.Diags = Diags;
@@ -138,7 +139,7 @@ TEST_F(ASTUnitTest, ModuleTextualHeader) {
138139
const char *Args[] = {"clang", "test.cpp", "-fmodule-map-file=m.modulemap",
139140
"-fmodule-name=M"};
140141
Diags =
141-
CompilerInstance::createDiagnostics(*InMemoryFs, DiagOpts);
142+
CompilerInstance::createDiagnostics(*InMemoryFs, *DiagOpts);
142143
CreateInvocationOptions CIOpts;
143144
CIOpts.Diags = Diags;
144145
CInvok = createInvocation(Args, std::move(CIOpts));
@@ -167,12 +168,12 @@ TEST_F(ASTUnitTest, LoadFromCommandLineEarlyError) {
167168
const char *Args[] = {"clang", "-target", "foobar", InputFileName.c_str()};
168169

169170
auto Diags = CompilerInstance::createDiagnostics(
170-
*llvm::vfs::getRealFileSystem(), DiagOpts);
171+
*llvm::vfs::getRealFileSystem(), *DiagOpts);
171172
auto PCHContainerOps = std::make_shared<PCHContainerOperations>();
172173
std::unique_ptr<clang::ASTUnit> ErrUnit;
173174

174175
std::unique_ptr<ASTUnit> AST = ASTUnit::LoadFromCommandLine(
175-
&Args[0], &Args[4], PCHContainerOps, Diags, "", false, "", false,
176+
&Args[0], &Args[4], PCHContainerOps, DiagOpts, Diags, "", false, "", false,
176177
CaptureDiagsKind::All, {}, true, 0, TU_Complete, false, false, false,
177178
SkipFunctionBodiesScope::None, false, true, false, false, std::nullopt,
178179
&ErrUnit, nullptr);
@@ -195,12 +196,12 @@ TEST_F(ASTUnitTest, LoadFromCommandLineWorkingDirectory) {
195196
InputFileName.c_str()};
196197

197198
auto Diags = CompilerInstance::createDiagnostics(
198-
*llvm::vfs::getRealFileSystem(), DiagOpts);
199+
*llvm::vfs::getRealFileSystem(), *DiagOpts);
199200
auto PCHContainerOps = std::make_shared<PCHContainerOperations>();
200201
std::unique_ptr<clang::ASTUnit> ErrUnit;
201202

202203
std::unique_ptr<ASTUnit> AST = ASTUnit::LoadFromCommandLine(
203-
&Args[0], &Args[4], PCHContainerOps, Diags, "", false, "", false,
204+
&Args[0], &Args[4], PCHContainerOps, DiagOpts, Diags, "", false, "", false,
204205
CaptureDiagsKind::All, {}, true, 0, TU_Complete, false, false, false,
205206
SkipFunctionBodiesScope::None, false, true, false, false, std::nullopt,
206207
&ErrUnit, nullptr);

clang/unittests/Frontend/PCHPreambleTest.cpp

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,8 @@ class PCHPreambleTest : public ::testing::Test {
5353
IntrusiveRefCntPtr<ReadCountingInMemoryFileSystem> VFS;
5454
StringMap<std::string> RemappedFiles;
5555
std::shared_ptr<PCHContainerOperations> PCHContainerOpts;
56+
std::shared_ptr<DiagnosticOptions> DiagOpts =
57+
std::make_shared<DiagnosticOptions>();
5658
FileSystemOptions FSOpts;
5759

5860
public:
@@ -94,9 +96,8 @@ class PCHPreambleTest : public ::testing::Test {
9496
PreprocessorOptions &PPOpts = CI->getPreprocessorOpts();
9597
PPOpts.RemappedFilesKeepOriginalName = true;
9698

97-
DiagnosticOptions DiagOpts;
9899
IntrusiveRefCntPtr<DiagnosticsEngine> Diags(
99-
CompilerInstance::createDiagnostics(*VFS, DiagOpts,
100+
CompilerInstance::createDiagnostics(*VFS, *DiagOpts,
100101
new DiagnosticConsumer));
101102

102103
FileManager *FileMgr = new FileManager(FSOpts, VFS);

0 commit comments

Comments
 (0)