From bff7d23b94b20fbb1289907b08a65b1ece229828 Mon Sep 17 00:00:00 2001 From: MagentaTreehouse <99200384+MagentaTreehouse@users.noreply.github.com> Date: Wed, 17 Jul 2024 08:09:35 -0400 Subject: [PATCH] [clang][Sema] Improve `Sema::CheckCXXDefaultArguments` (#97338) In the second loop in `Sema::CheckCXXDefaultArguments`, we don't need to re-examine the first parameter with a default argument. Dropped the first iteration of that loop. In addition, use the preferred early `continue` for the if-statement in the loop. --- clang/lib/Sema/SemaDeclCXX.cpp | 30 ++++++++++++++---------------- 1 file changed, 14 insertions(+), 16 deletions(-) diff --git a/clang/lib/Sema/SemaDeclCXX.cpp b/clang/lib/Sema/SemaDeclCXX.cpp index f24912cde275a96..2bfb103e8953d65 100644 --- a/clang/lib/Sema/SemaDeclCXX.cpp +++ b/clang/lib/Sema/SemaDeclCXX.cpp @@ -1630,9 +1630,6 @@ void Sema::MergeVarDeclExceptionSpecs(VarDecl *New, VarDecl *Old) { /// function declaration are well-formed according to C++ /// [dcl.fct.default]. void Sema::CheckCXXDefaultArguments(FunctionDecl *FD) { - unsigned NumParams = FD->getNumParams(); - unsigned ParamIdx = 0; - // This checking doesn't make sense for explicit specializations; their // default arguments are determined by the declaration we're specializing, // not by FD. @@ -1642,6 +1639,9 @@ void Sema::CheckCXXDefaultArguments(FunctionDecl *FD) { if (FTD->isMemberSpecialization()) return; + unsigned NumParams = FD->getNumParams(); + unsigned ParamIdx = 0; + // Find first parameter with a default argument for (; ParamIdx < NumParams; ++ParamIdx) { ParmVarDecl *Param = FD->getParamDecl(ParamIdx); @@ -1654,21 +1654,19 @@ void Sema::CheckCXXDefaultArguments(FunctionDecl *FD) { // with a default argument shall have a default argument supplied in this or // a previous declaration, unless the parameter was expanded from a // parameter pack, or shall be a function parameter pack. - for (; ParamIdx < NumParams; ++ParamIdx) { + for (++ParamIdx; ParamIdx < NumParams; ++ParamIdx) { ParmVarDecl *Param = FD->getParamDecl(ParamIdx); - if (!Param->hasDefaultArg() && !Param->isParameterPack() && - !(CurrentInstantiationScope && - CurrentInstantiationScope->isLocalPackExpansion(Param))) { - if (Param->isInvalidDecl()) - /* We already complained about this parameter. */; - else if (Param->getIdentifier()) - Diag(Param->getLocation(), - diag::err_param_default_argument_missing_name) + if (Param->hasDefaultArg() || Param->isParameterPack() || + (CurrentInstantiationScope && + CurrentInstantiationScope->isLocalPackExpansion(Param))) + continue; + if (Param->isInvalidDecl()) + /* We already complained about this parameter. */; + else if (Param->getIdentifier()) + Diag(Param->getLocation(), diag::err_param_default_argument_missing_name) << Param->getIdentifier(); - else - Diag(Param->getLocation(), - diag::err_param_default_argument_missing); - } + else + Diag(Param->getLocation(), diag::err_param_default_argument_missing); } }