diff options
Diffstat (limited to 'clang/lib/Sema/SemaExpr.cpp')
-rw-r--r-- | clang/lib/Sema/SemaExpr.cpp | 96 |
1 files changed, 45 insertions, 51 deletions
diff --git a/clang/lib/Sema/SemaExpr.cpp b/clang/lib/Sema/SemaExpr.cpp index 6e27b76ba25..4d3eba73d78 100644 --- a/clang/lib/Sema/SemaExpr.cpp +++ b/clang/lib/Sema/SemaExpr.cpp @@ -4017,9 +4017,9 @@ Sema::ConvertArgumentsForCall(CallExpr *Call, Expr *Fn, // C99 6.5.2.2p7 - the arguments are implicitly converted, as if by // assignment, to the types of the corresponding parameter, ... - unsigned NumArgsInProto = Proto->getNumParams(); + unsigned NumParams = Proto->getNumParams(); bool Invalid = false; - unsigned MinArgs = FDecl ? FDecl->getMinRequiredArguments() : NumArgsInProto; + unsigned MinArgs = FDecl ? FDecl->getMinRequiredArguments() : NumParams; unsigned FnKind = Fn->getType()->isBlockPointerType() ? 1 /* block */ : (IsExecConfig ? 3 /* kernel function (exec config) */ @@ -4027,7 +4027,7 @@ Sema::ConvertArgumentsForCall(CallExpr *Call, Expr *Fn, // If too few arguments are available (and we don't have default // arguments for the remaining parameters), don't make the call. - if (Args.size() < NumArgsInProto) { + if (Args.size() < NumParams) { if (Args.size() < MinArgs) { MemberExpr *ME = dyn_cast<MemberExpr>(Fn); TypoCorrection TC; @@ -4037,25 +4037,24 @@ Sema::ConvertArgumentsForCall(CallExpr *Call, Expr *Fn, : Fn->getLocStart())), Args))) { unsigned diag_id = - MinArgs == NumArgsInProto && !Proto->isVariadic() + MinArgs == NumParams && !Proto->isVariadic() ? diag::err_typecheck_call_too_few_args_suggest : diag::err_typecheck_call_too_few_args_at_least_suggest; diagnoseTypo(TC, PDiag(diag_id) << FnKind << MinArgs << static_cast<unsigned>(Args.size()) << Fn->getSourceRange()); } else if (MinArgs == 1 && FDecl && FDecl->getParamDecl(0)->getDeclName()) - Diag(RParenLoc, MinArgs == NumArgsInProto && !Proto->isVariadic() - ? diag::err_typecheck_call_too_few_args_one - : diag::err_typecheck_call_too_few_args_at_least_one) - << FnKind - << FDecl->getParamDecl(0) << Fn->getSourceRange(); + Diag(RParenLoc, + MinArgs == NumParams && !Proto->isVariadic() + ? diag::err_typecheck_call_too_few_args_one + : diag::err_typecheck_call_too_few_args_at_least_one) + << FnKind << FDecl->getParamDecl(0) << Fn->getSourceRange(); else - Diag(RParenLoc, MinArgs == NumArgsInProto && !Proto->isVariadic() - ? diag::err_typecheck_call_too_few_args - : diag::err_typecheck_call_too_few_args_at_least) - << FnKind - << MinArgs << static_cast<unsigned>(Args.size()) - << Fn->getSourceRange(); + Diag(RParenLoc, MinArgs == NumParams && !Proto->isVariadic() + ? diag::err_typecheck_call_too_few_args + : diag::err_typecheck_call_too_few_args_at_least) + << FnKind << MinArgs << static_cast<unsigned>(Args.size()) + << Fn->getSourceRange(); // Emit the location of the prototype. if (!TC && FDecl && !FDecl->getBuiltinID() && !IsExecConfig) @@ -4064,12 +4063,12 @@ Sema::ConvertArgumentsForCall(CallExpr *Call, Expr *Fn, return true; } - Call->setNumArgs(Context, NumArgsInProto); + Call->setNumArgs(Context, NumParams); } // If too many are passed and not variadic, error on the extras and drop // them. - if (Args.size() > NumArgsInProto) { + if (Args.size() > NumParams) { if (!Proto->isVariadic()) { TypoCorrection TC; if (FDecl && (TC = TryTypoCorrectionForCall( @@ -4077,33 +4076,31 @@ Sema::ConvertArgumentsForCall(CallExpr *Call, Expr *Fn, Fn->getLocStart()), Args))) { unsigned diag_id = - MinArgs == NumArgsInProto && !Proto->isVariadic() + MinArgs == NumParams && !Proto->isVariadic() ? diag::err_typecheck_call_too_many_args_suggest : diag::err_typecheck_call_too_many_args_at_most_suggest; - diagnoseTypo(TC, PDiag(diag_id) << FnKind << NumArgsInProto + diagnoseTypo(TC, PDiag(diag_id) << FnKind << NumParams << static_cast<unsigned>(Args.size()) << Fn->getSourceRange()); - } else if (NumArgsInProto == 1 && FDecl && + } else if (NumParams == 1 && FDecl && FDecl->getParamDecl(0)->getDeclName()) - Diag(Args[NumArgsInProto]->getLocStart(), - MinArgs == NumArgsInProto - ? diag::err_typecheck_call_too_many_args_one - : diag::err_typecheck_call_too_many_args_at_most_one) - << FnKind - << FDecl->getParamDecl(0) << static_cast<unsigned>(Args.size()) - << Fn->getSourceRange() - << SourceRange(Args[NumArgsInProto]->getLocStart(), - Args.back()->getLocEnd()); + Diag(Args[NumParams]->getLocStart(), + MinArgs == NumParams + ? diag::err_typecheck_call_too_many_args_one + : diag::err_typecheck_call_too_many_args_at_most_one) + << FnKind << FDecl->getParamDecl(0) + << static_cast<unsigned>(Args.size()) << Fn->getSourceRange() + << SourceRange(Args[NumParams]->getLocStart(), + Args.back()->getLocEnd()); else - Diag(Args[NumArgsInProto]->getLocStart(), - MinArgs == NumArgsInProto - ? diag::err_typecheck_call_too_many_args - : diag::err_typecheck_call_too_many_args_at_most) - << FnKind - << NumArgsInProto << static_cast<unsigned>(Args.size()) - << Fn->getSourceRange() - << SourceRange(Args[NumArgsInProto]->getLocStart(), - Args.back()->getLocEnd()); + Diag(Args[NumParams]->getLocStart(), + MinArgs == NumParams + ? diag::err_typecheck_call_too_many_args + : diag::err_typecheck_call_too_many_args_at_most) + << FnKind << NumParams << static_cast<unsigned>(Args.size()) + << Fn->getSourceRange() + << SourceRange(Args[NumParams]->getLocStart(), + Args.back()->getLocEnd()); // Emit the location of the prototype. if (!TC && FDecl && !FDecl->getBuiltinID() && !IsExecConfig) @@ -4111,7 +4108,7 @@ Sema::ConvertArgumentsForCall(CallExpr *Call, Expr *Fn, << FDecl; // This deletes the extra arguments. - Call->setNumArgs(Context, NumArgsInProto); + Call->setNumArgs(Context, NumParams); return true; } } @@ -4129,24 +4126,21 @@ Sema::ConvertArgumentsForCall(CallExpr *Call, Expr *Fn, return false; } -bool Sema::GatherArgumentsForCall(SourceLocation CallLoc, - FunctionDecl *FDecl, +bool Sema::GatherArgumentsForCall(SourceLocation CallLoc, FunctionDecl *FDecl, const FunctionProtoType *Proto, - unsigned FirstProtoArg, - ArrayRef<Expr *> Args, + unsigned FirstParam, ArrayRef<Expr *> Args, SmallVectorImpl<Expr *> &AllArgs, - VariadicCallType CallType, - bool AllowExplicit, + VariadicCallType CallType, bool AllowExplicit, bool IsListInitialization) { - unsigned NumArgsInProto = Proto->getNumParams(); + unsigned NumParams = Proto->getNumParams(); unsigned NumArgsToCheck = Args.size(); bool Invalid = false; - if (Args.size() != NumArgsInProto) + if (Args.size() != NumParams) // Use default arguments for missing arguments - NumArgsToCheck = NumArgsInProto; + NumArgsToCheck = NumParams; unsigned ArgIx = 0; // Continue to check argument types (even if we have too few/many args). - for (unsigned i = FirstProtoArg; i != NumArgsToCheck; i++) { + for (unsigned i = FirstParam; i != NumArgsToCheck; i++) { QualType ProtoArgType = Proto->getParamType(i); Expr *Arg; @@ -10342,8 +10336,8 @@ void Sema::ActOnBlockArguments(SourceLocation CaretLoc, Declarator &ParamInfo, // Push block parameters from the declarator if we had them. SmallVector<ParmVarDecl*, 8> Params; if (ExplicitSignature) { - for (unsigned I = 0, E = ExplicitSignature.getNumArgs(); I != E; ++I) { - ParmVarDecl *Param = ExplicitSignature.getArg(I); + for (unsigned I = 0, E = ExplicitSignature.getNumParams(); I != E; ++I) { + ParmVarDecl *Param = ExplicitSignature.getParam(I); if (Param->getIdentifier() == 0 && !Param->isImplicit() && !Param->isInvalidDecl() && |