Simplify FunctionDecl::getMinRequiredArguments().

llvm-svn: 205351
This commit is contained in:
Richard Smith 2014-04-01 19:18:16 +00:00
parent 068fc01234
commit 911517848d
1 changed files with 5 additions and 25 deletions

View File

@ -2534,35 +2534,15 @@ void FunctionDecl::setDeclsInPrototypeScope(ArrayRef<NamedDecl *> NewDecls) {
/// getMinRequiredArguments - Returns the minimum number of arguments
/// needed to call this function. This may be fewer than the number of
/// function parameters, if some of the parameters have default
/// arguments (in C++) or the last parameter is a parameter pack.
/// arguments (in C++) or are parameter packs (C++11).
unsigned FunctionDecl::getMinRequiredArguments() const {
if (!getASTContext().getLangOpts().CPlusPlus)
return getNumParams();
unsigned NumRequiredArgs = getNumParams();
// If the last parameter is a parameter pack, we don't need an argument for
// it.
if (NumRequiredArgs > 0 &&
getParamDecl(NumRequiredArgs - 1)->isParameterPack())
--NumRequiredArgs;
// If this parameter has a default argument, we don't need an argument for
// it.
while (NumRequiredArgs > 0 &&
getParamDecl(NumRequiredArgs-1)->hasDefaultArg())
--NumRequiredArgs;
// We might have parameter packs before the end. These can't be deduced,
// but they can still handle multiple arguments.
unsigned ArgIdx = NumRequiredArgs;
while (ArgIdx > 0) {
if (getParamDecl(ArgIdx - 1)->isParameterPack())
NumRequiredArgs = ArgIdx;
--ArgIdx;
}
unsigned NumRequiredArgs = 0;
for (auto *Param : params())
if (!Param->isParameterPack() && !Param->hasDefaultArg())
++NumRequiredArgs;
return NumRequiredArgs;
}