Browse Source

Clean up re-usage and ownership of diagnostic clients in the parser.

pull/1126/head
Joao Matos 7 years ago committed by João Matos
parent
commit
a73635a497
  1. 28
      src/CppParser/Parser.cpp

28
src/CppParser/Parser.cpp

@ -2921,10 +2921,15 @@ void Parser::CompleteIfSpecializationType(const clang::QualType& QualType)
CTS->isCompleteDefinition()) CTS->isCompleteDefinition())
return; return;
auto Diagnostics = c->getSema().getDiagnostics().getClient(); auto existingClient = c->getSema().getDiagnostics().getClient();
auto SemaDiagnostics = static_cast<::DiagnosticConsumer*>(Diagnostics); std::unique_ptr<::DiagnosticConsumer> SemaDiagnostics(new ::DiagnosticConsumer());
SemaDiagnostics-> Decl = CTS;
c->getSema().getDiagnostics().setClient(SemaDiagnostics.get(), false);
c->getSema().InstantiateClassTemplateSpecialization(CTS->getBeginLoc(), c->getSema().InstantiateClassTemplateSpecialization(CTS->getBeginLoc(),
CTS, TSK_ImplicitInstantiation, false); CTS, TSK_ImplicitInstantiation, false);
c->getSema().getDiagnostics().setClient(existingClient, false);
} }
Parameter* Parser::WalkParameter(const clang::ParmVarDecl* PVD, Parameter* Parser::WalkParameter(const clang::ParmVarDecl* PVD,
@ -3053,9 +3058,11 @@ void Parser::MarkValidity(Function* F)
c->getSourceManager().isInSystemHeader(FD->getBeginLoc())) c->getSourceManager().isInSystemHeader(FD->getBeginLoc()))
return; return;
auto Diagnostics = c->getSema().getDiagnostics().getClient(); auto existingClient = c->getSema().getDiagnostics().getClient();
auto SemaDiagnostics = static_cast<::DiagnosticConsumer*>(Diagnostics); std::unique_ptr<::DiagnosticConsumer> SemaDiagnostics(new ::DiagnosticConsumer());
SemaDiagnostics->Decl = FD; SemaDiagnostics->Decl = FD;
c->getSema().getDiagnostics().setClient(SemaDiagnostics.get(), false);
auto TUScope = c->getSema().TUScope; auto TUScope = c->getSema().TUScope;
std::stack<Scope> Scopes = GetScopesFor(FD); std::stack<Scope> Scopes = GetScopesFor(FD);
c->getSema().TUScope = &Scopes.top(); c->getSema().TUScope = &Scopes.top();
@ -3068,6 +3075,8 @@ void Parser::MarkValidity(Function* F)
std::unordered_set<Stmt*> Bodies{ 0 }; std::unordered_set<Stmt*> Bodies{ 0 };
F->isInvalid = IsInvalid(FD->getBody(), Bodies); F->isInvalid = IsInvalid(FD->getBody(), Bodies);
} }
c->getSema().getDiagnostics().setClient(existingClient, false);
} }
void Parser::WalkFunction(const clang::FunctionDecl* FD, Function* F, void Parser::WalkFunction(const clang::FunctionDecl* FD, Function* F,
@ -4154,19 +4163,18 @@ ParserResult* Parser::ParseHeader(const std::vector<std::string>& SourceFiles)
c->createSema(clang::TU_Complete, 0); c->createSema(clang::TU_Complete, 0);
auto DiagClient = new DiagnosticConsumer(); std::unique_ptr<::DiagnosticConsumer> DiagClient(new ::DiagnosticConsumer());
c->getDiagnostics().setClient(DiagClient); c->getDiagnostics().setClient(DiagClient.get(), false);
clang::DiagnosticConsumer* client = c->getDiagnostics().getClient(); DiagClient->BeginSourceFile(c->getLangOpts(), &c->getPreprocessor());
client->BeginSourceFile(c->getLangOpts(), &c->getPreprocessor());
ParseAST(c->getSema()); ParseAST(c->getSema());
client->EndSourceFile(); DiagClient->EndSourceFile();
HandleDiagnostics(res); HandleDiagnostics(res);
if(client->getNumErrors() != 0) if(DiagClient->getNumErrors() != 0)
{ {
res->kind = ParserResultKind::Error; res->kind = ParserResultKind::Error;
return res; return res;

Loading…
Cancel
Save