================ @@ -293,6 +293,34 @@ bool Builtin::Context::isScanfLike(unsigned ID, unsigned &FormatIdx, return isLike(ID, FormatIdx, HasVAListArg, "sS"); } +bool Builtin::Context::IsNonNull(unsigned ID, + llvm::SmallVectorImpl<int> &Indxs) const { + + const char *CalleePos = ::strchr(getAttributesString(ID), 'N'); + if (!CalleePos) + return false; + + ++CalleePos; + assert(*CalleePos == '<' && + "Callback callee specifier must be followed by a '<'"); + ++CalleePos; + + char *EndPos; + int CalleeIdx = ::strtol(CalleePos, &EndPos, 10); + assert(CalleeIdx >= 0 && "Callee index is supposed to be positive!"); + Indxs.push_back(CalleeIdx); + + while (*EndPos == ',') { + const char *PayloadPos = EndPos + 1; + + int PayloadIdx = ::strtol(PayloadPos, &EndPos, 10); + Indxs.push_back(PayloadIdx); + } + + assert(*EndPos == '>' && "Callback callee specifier must end with a '>'"); + return true; ---------------- Sirraide wrote:
This is copy-pasted from `performsCallback()`, which is 1. not great, we should factor out some parts of it (specifically, there should be a separate function that parses a comma-separated list of integers enclosed in `<>` and writes them to the `SmallVector` and which is called by both this and `performsCallback()`), and 2. the naming of some of these local variables doesn’t make sense for this function (e.g. a formatting function has no ‘callee’, so `CalleePos` isn’t really a good name for this). https://github.com/llvm/llvm-project/pull/158626 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits