Index: clang/include/clang/StaticAnalyzer/Core/PathSensitive/CallDescription.h =================================================================== --- clang/include/clang/StaticAnalyzer/Core/PathSensitive/CallDescription.h +++ clang/include/clang/StaticAnalyzer/Core/PathSensitive/CallDescription.h @@ -87,7 +87,9 @@ /// An immutable map from CallDescriptions to arbitrary data. Provides a unified /// way for checkers to react on function calls. -template class CallDescriptionMap { +template class CallDescriptionMap { + friend class CallDescriptionMap; + // Some call descriptions aren't easily hashable (eg., the ones with qualified // names in which some sections are omitted), so let's put them // in a simple vector and use linear lookup. @@ -118,6 +120,25 @@ } }; +template <> class CallDescriptionMap { + CallDescriptionMap Impl = {}; + +public: + CallDescriptionMap(std::initializer_list &&List) { + Impl.LinearMap.reserve(List.size()); + for (const CallDescription &CD : List) + Impl.LinearMap.push_back({CD, true}); + } + + ~CallDescriptionMap() = default; + CallDescriptionMap(const CallDescriptionMap &) = delete; + CallDescriptionMap &operator=(const CallDescription &) = delete; + + bool lookup(const CallEvent &Call) const { + return static_cast(Impl.lookup(Call)); + } +}; + } // namespace ento } // namespace clang