Index: include/clang/StaticAnalyzer/Core/Checker.h =================================================================== --- include/clang/StaticAnalyzer/Core/Checker.h +++ include/clang/StaticAnalyzer/Core/Checker.h @@ -558,6 +558,8 @@ // dereference might happen later (for example pointer passed to a parameter // that is marked with nonnull attribute.) bool IsDirectDereference; + + static int Tag; }; /// A helper class which wraps a boolean value set to false by default. Index: include/clang/StaticAnalyzer/Core/CheckerManager.h =================================================================== --- include/clang/StaticAnalyzer/Core/CheckerManager.h +++ include/clang/StaticAnalyzer/Core/CheckerManager.h @@ -532,19 +532,19 @@ template void _registerListenerForEvent(CheckEventFunc checkfn) { - EventInfo &info = Events[getTag()]; + EventInfo &info = Events[&EVENT::Tag]; info.Checkers.push_back(checkfn); } template void _registerDispatcherForEvent() { - EventInfo &info = Events[getTag()]; + EventInfo &info = Events[&EVENT::Tag]; info.HasDispatcher = true; } template void _dispatchEvent(const EVENT &event) const { - EventsTy::const_iterator I = Events.find(getTag()); + EventsTy::const_iterator I = Events.find(&EVENT::Tag); if (I == Events.end()) return; const EventInfo &info = I->second; Index: lib/StaticAnalyzer/Core/Checker.cpp =================================================================== --- lib/StaticAnalyzer/Core/Checker.cpp +++ lib/StaticAnalyzer/Core/Checker.cpp @@ -17,6 +17,8 @@ using namespace clang; using namespace ento; +int ImplicitNullDerefEvent::Tag; + StringRef CheckerBase::getTagDescription() const { return getCheckName().getName(); }