Skip to content

Commit a73635a

Browse files
committed
Clean up re-usage and ownership of diagnostic clients in the parser.
1 parent ef0b054 commit a73635a

File tree

1 file changed

+18
-10
lines changed

1 file changed

+18
-10
lines changed

src/CppParser/Parser.cpp

Lines changed: 18 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -2921,10 +2921,15 @@ void Parser::CompleteIfSpecializationType(const clang::QualType& QualType)
29212921
CTS->isCompleteDefinition())
29222922
return;
29232923

2924-
auto Diagnostics = c->getSema().getDiagnostics().getClient();
2925-
auto SemaDiagnostics = static_cast<::DiagnosticConsumer*>(Diagnostics);
2924+
auto existingClient = c->getSema().getDiagnostics().getClient();
2925+
std::unique_ptr<::DiagnosticConsumer> SemaDiagnostics(new ::DiagnosticConsumer());
2926+
SemaDiagnostics-> Decl = CTS;
2927+
c->getSema().getDiagnostics().setClient(SemaDiagnostics.get(), false);
2928+
29262929
c->getSema().InstantiateClassTemplateSpecialization(CTS->getBeginLoc(),
29272930
CTS, TSK_ImplicitInstantiation, false);
2931+
2932+
c->getSema().getDiagnostics().setClient(existingClient, false);
29282933
}
29292934

29302935
Parameter* Parser::WalkParameter(const clang::ParmVarDecl* PVD,
@@ -3053,9 +3058,11 @@ void Parser::MarkValidity(Function* F)
30533058
c->getSourceManager().isInSystemHeader(FD->getBeginLoc()))
30543059
return;
30553060

3056-
auto Diagnostics = c->getSema().getDiagnostics().getClient();
3057-
auto SemaDiagnostics = static_cast<::DiagnosticConsumer*>(Diagnostics);
3061+
auto existingClient = c->getSema().getDiagnostics().getClient();
3062+
std::unique_ptr<::DiagnosticConsumer> SemaDiagnostics(new ::DiagnosticConsumer());
30583063
SemaDiagnostics->Decl = FD;
3064+
c->getSema().getDiagnostics().setClient(SemaDiagnostics.get(), false);
3065+
30593066
auto TUScope = c->getSema().TUScope;
30603067
std::stack<Scope> Scopes = GetScopesFor(FD);
30613068
c->getSema().TUScope = &Scopes.top();
@@ -3068,6 +3075,8 @@ void Parser::MarkValidity(Function* F)
30683075
std::unordered_set<Stmt*> Bodies{ 0 };
30693076
F->isInvalid = IsInvalid(FD->getBody(), Bodies);
30703077
}
3078+
3079+
c->getSema().getDiagnostics().setClient(existingClient, false);
30713080
}
30723081

30733082
void Parser::WalkFunction(const clang::FunctionDecl* FD, Function* F,
@@ -4154,19 +4163,18 @@ ParserResult* Parser::ParseHeader(const std::vector<std::string>& SourceFiles)
41544163

41554164
c->createSema(clang::TU_Complete, 0);
41564165

4157-
auto DiagClient = new DiagnosticConsumer();
4158-
c->getDiagnostics().setClient(DiagClient);
4166+
std::unique_ptr<::DiagnosticConsumer> DiagClient(new ::DiagnosticConsumer());
4167+
c->getDiagnostics().setClient(DiagClient.get(), false);
41594168

4160-
clang::DiagnosticConsumer* client = c->getDiagnostics().getClient();
4161-
client->BeginSourceFile(c->getLangOpts(), &c->getPreprocessor());
4169+
DiagClient->BeginSourceFile(c->getLangOpts(), &c->getPreprocessor());
41624170

41634171
ParseAST(c->getSema());
41644172

4165-
client->EndSourceFile();
4173+
DiagClient->EndSourceFile();
41664174

41674175
HandleDiagnostics(res);
41684176

4169-
if(client->getNumErrors() != 0)
4177+
if(DiagClient->getNumErrors() != 0)
41704178
{
41714179
res->kind = ParserResultKind::Error;
41724180
return res;

0 commit comments

Comments
 (0)