Index: tools/clang/blink_gc_plugin/BlinkGCPlugin.cpp |
diff --git a/tools/clang/blink_gc_plugin/BlinkGCPlugin.cpp b/tools/clang/blink_gc_plugin/BlinkGCPlugin.cpp |
index 4aa8e387ab6969815d8210ba09e08db6a909c53c..e726a842e0275fc00a07ba4da571326d758c79d0 100644 |
--- a/tools/clang/blink_gc_plugin/BlinkGCPlugin.cpp |
+++ b/tools/clang/blink_gc_plugin/BlinkGCPlugin.cpp |
@@ -27,12 +27,14 @@ const char kClassMustLeftMostlyDeriveGC[] = |
"[blink-gc] Class %0 must derive its GC base in the left-most position."; |
const char kClassRequiresTraceMethod[] = |
- "[blink-gc] Class %0 requires a trace method" |
- " because it contains fields that require tracing."; |
+ "[blink-gc] Class %0 requires a trace method."; |
const char kBaseRequiresTracing[] = |
"[blink-gc] Base class %0 of derived class %1 requires tracing."; |
+const char kBaseRequiresTracingNote[] = |
+ "[blink-gc] Untraced base class %0 declared here:"; |
+ |
const char kFieldsRequireTracing[] = |
"[blink-gc] Class %0 has untraced fields that require tracing."; |
@@ -578,6 +580,8 @@ class BlinkGCPluginConsumer : public ASTConsumer { |
getErrorLevel(), kClassDeclaresPureVirtualTrace); |
// Register note messages. |
+ diag_base_requires_tracing_note_ = diagnostic_.getCustomDiagID( |
+ DiagnosticsEngine::Note, kBaseRequiresTracingNote); |
diag_field_requires_tracing_note_ = diagnostic_.getCustomDiagID( |
DiagnosticsEngine::Note, kFieldRequiresTracingNote); |
diag_raw_ptr_to_gc_managed_class_note_ = diagnostic_.getCustomDiagID( |
@@ -1093,6 +1097,14 @@ class BlinkGCPluginConsumer : public ASTConsumer { |
FullSourceLoc full_loc(loc, manager); |
diagnostic_.Report(full_loc, diag_class_requires_trace_method_) |
<< info->record(); |
+ |
+ for (RecordInfo::Bases::iterator it = info->GetBases().begin(); |
+ it != info->GetBases().end(); |
+ ++it) { |
+ if (it->second.NeedsTracing().IsNeeded()) |
+ NoteBaseRequiresTracing(&it->second); |
+ } |
+ |
for (RecordInfo::Fields::iterator it = info->GetFields().begin(); |
it != info->GetFields().end(); |
++it) { |
@@ -1278,6 +1290,14 @@ class BlinkGCPluginConsumer : public ASTConsumer { |
diagnostic_.Report(full_loc, diag_manual_dispatch_method_note_) << dispatch; |
} |
+ void NoteBaseRequiresTracing(BasePoint* base) { |
+ SourceLocation loc = base->spec().getLocStart(); |
+ SourceManager& manager = instance_.getSourceManager(); |
+ FullSourceLoc full_loc(loc, manager); |
+ diagnostic_.Report(full_loc, diag_base_requires_tracing_note_) |
+ << base->info()->record(); |
+ } |
+ |
void NoteFieldRequiresTracing(RecordInfo* holder, FieldDecl* field) { |
NoteField(field, diag_field_requires_tracing_note_); |
} |
@@ -1354,6 +1374,7 @@ class BlinkGCPluginConsumer : public ASTConsumer { |
unsigned diag_class_overrides_new_; |
unsigned diag_class_declares_pure_virtual_trace_; |
+ unsigned diag_base_requires_tracing_note_; |
unsigned diag_field_requires_tracing_note_; |
unsigned diag_raw_ptr_to_gc_managed_class_note_; |
unsigned diag_ref_ptr_to_gc_managed_class_note_; |