Index: tools/clang/plugins/FindBadConstructsConsumer.cpp |
diff --git a/tools/clang/plugins/FindBadConstructsConsumer.cpp b/tools/clang/plugins/FindBadConstructsConsumer.cpp |
index b7e1886776fcda0d8fa2bd3cb63de1853262a231..0f88e701985a8c5d996533ea647a90247b6fa5e8 100644 |
--- a/tools/clang/plugins/FindBadConstructsConsumer.cpp |
+++ b/tools/clang/plugins/FindBadConstructsConsumer.cpp |
@@ -103,6 +103,10 @@ bool IsPodOrTemplateType(const CXXRecordDecl& record) { |
FindBadConstructsConsumer::FindBadConstructsConsumer(CompilerInstance& instance, |
const Options& options) |
: ChromeClassTester(instance, options) { |
+ if (options.check_ipc) { |
+ ipc_visitor_.reset(new CheckIPCVisitor(instance)); |
+ } |
+ |
// Messages for virtual method specifiers. |
diag_method_requires_override_ = |
diagnostic().getCustomDiagID(getErrorLevel(), kMethodRequiresOverride); |
@@ -136,6 +140,24 @@ FindBadConstructsConsumer::FindBadConstructsConsumer(CompilerInstance& instance, |
DiagnosticsEngine::Note, kNoteProtectedNonVirtualDtor); |
} |
+void FindBadConstructsConsumer::Visit(ASTContext& context) { |
+ if (ipc_visitor_) ipc_visitor_->set_context(&context); |
+ RecursiveASTVisitor::TraverseDecl(context.getTranslationUnitDecl()); |
+ if (ipc_visitor_) ipc_visitor_->set_context(nullptr); |
+} |
+ |
+bool FindBadConstructsConsumer::shouldVisitTemplateInstantiations() const { |
+ return RecursiveASTVisitor::shouldVisitTemplateInstantiations() || |
+ (ipc_visitor_ && ipc_visitor_->shouldVisitTemplateInstantiations()); |
+} |
+ |
+bool FindBadConstructsConsumer::TraverseDecl(Decl* decl) { |
+ if (ipc_visitor_) ipc_visitor_->BeginDecl(decl); |
+ bool result = RecursiveASTVisitor::TraverseDecl(decl); |
+ if (ipc_visitor_) ipc_visitor_->EndDecl(); |
+ return result; |
+} |
+ |
bool FindBadConstructsConsumer::VisitDecl(clang::Decl* decl) { |
clang::TagDecl* tag_decl = dyn_cast<clang::TagDecl>(decl); |
if (tag_decl && tag_decl->isCompleteDefinition()) |
@@ -143,6 +165,17 @@ bool FindBadConstructsConsumer::VisitDecl(clang::Decl* decl) { |
return true; |
} |
+bool FindBadConstructsConsumer::VisitTemplateSpecializationType( |
+ TemplateSpecializationType* spec) { |
+ if (ipc_visitor_) ipc_visitor_->VisitTemplateSpecializationType(spec); |
+ return true; |
+} |
+ |
+bool FindBadConstructsConsumer::VisitCallExpr(CallExpr* call_expr) { |
+ if (ipc_visitor_) ipc_visitor_->VisitCallExpr(call_expr); |
+ return true; |
+} |
+ |
void FindBadConstructsConsumer::CheckChromeClass(SourceLocation record_location, |
CXXRecordDecl* record) { |
// By default, the clang checker doesn't check some types (templates, etc). |