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 @@ -45,7 +45,7 @@ // e.g. "{a, b}" represent the qualified names, like "a::b". std::vector QualifiedName; Optional RequiredArgs; - Optional RequiredParams; + Optional RequiredParams; int Flags; public: @@ -61,12 +61,12 @@ /// name regardless the number of arguments. CallDescription(int Flags, ArrayRef QualifiedName, Optional RequiredArgs = None, - Optional RequiredParams = None); + Optional RequiredParams = None); /// Construct a CallDescription with default flags. CallDescription(ArrayRef QualifiedName, Optional RequiredArgs = None, - Optional RequiredParams = None); + Optional RequiredParams = None); CallDescription(std::nullptr_t) = delete; Index: clang/lib/StaticAnalyzer/Core/CallDescription.cpp =================================================================== --- clang/lib/StaticAnalyzer/Core/CallDescription.cpp +++ clang/lib/StaticAnalyzer/Core/CallDescription.cpp @@ -23,19 +23,20 @@ using namespace clang; // A constructor helper. -static Optional readRequiredParams(Optional RequiredArgs, - Optional RequiredParams) { +static Optional +readRequiredParams(Optional RequiredArgs, + Optional RequiredParams) { if (RequiredParams) return RequiredParams; if (RequiredArgs) - return static_cast(*RequiredArgs); + return RequiredArgs; return None; } ento::CallDescription::CallDescription( int Flags, ArrayRef QualifiedName, Optional RequiredArgs /*= None*/, - Optional RequiredParams /*= None*/) + Optional RequiredParams /*= None*/) : RequiredArgs(RequiredArgs), RequiredParams(readRequiredParams(RequiredArgs, RequiredParams)), Flags(Flags) { @@ -48,7 +49,7 @@ ento::CallDescription::CallDescription( ArrayRef QualifiedName, Optional RequiredArgs /*= None*/, - Optional RequiredParams /*= None*/) + Optional RequiredParams /*= None*/) : CallDescription(0, QualifiedName, RequiredArgs, RequiredParams) {} bool ento::CallDescription::matches(const CallEvent &Call) const { @@ -62,8 +63,8 @@ if (Flags & CDF_MaybeBuiltin) { return CheckerContext::isCLibraryFunction(FD, getFunctionName()) && - (!RequiredArgs || RequiredArgs <= Call.getNumArgs()) && - (!RequiredParams || RequiredParams <= Call.parameters().size()); + (!RequiredArgs || *RequiredArgs <= Call.getNumArgs()) && + (!RequiredParams || *RequiredParams <= Call.parameters().size()); } if (!II.hasValue()) { @@ -87,9 +88,9 @@ const auto ExactMatchArgAndParamCounts = [](const CallEvent &Call, const CallDescription &CD) -> bool { const bool ArgsMatch = - !CD.RequiredArgs || CD.RequiredArgs == Call.getNumArgs(); + !CD.RequiredArgs || *CD.RequiredArgs == Call.getNumArgs(); const bool ParamsMatch = - !CD.RequiredParams || CD.RequiredParams == Call.parameters().size(); + !CD.RequiredParams || *CD.RequiredParams == Call.parameters().size(); return ArgsMatch && ParamsMatch; };