зеркало из https://github.com/microsoft/clang-1.git
More cleanup of argument call collection.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@89789 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Родитель
f7a1a744eb
Коммит
4cd1c706c2
|
@ -1523,14 +1523,6 @@ public:
|
|||
Expr **Args, unsigned NumArgs,
|
||||
SourceLocation RParenLoc);
|
||||
|
||||
bool GatherArgumentsForCall(SourceLocation CallLoc,
|
||||
FunctionDecl *FDecl,
|
||||
const FunctionProtoType *Proto,
|
||||
unsigned FirstProtoArg,
|
||||
Expr **Args, unsigned NumArgs,
|
||||
llvm::SmallVector<Expr *, 8> &AllArgs,
|
||||
Expr *Fn = 0);
|
||||
|
||||
void DeconstructCallFunction(Expr *FnExpr,
|
||||
llvm::SmallVectorImpl<NamedDecl*>& Fns,
|
||||
DeclarationName &Name,
|
||||
|
@ -3320,9 +3312,21 @@ public:
|
|||
VariadicFunction,
|
||||
VariadicBlock,
|
||||
VariadicMethod,
|
||||
VariadicConstructor
|
||||
VariadicConstructor,
|
||||
VariadicDoesNotApply
|
||||
};
|
||||
|
||||
/// GatherArgumentsForCall - Collector argument expressions for various
|
||||
/// form of call prototypes.
|
||||
bool GatherArgumentsForCall(SourceLocation CallLoc,
|
||||
FunctionDecl *FDecl,
|
||||
const FunctionProtoType *Proto,
|
||||
unsigned FirstProtoArg,
|
||||
Expr **Args, unsigned NumArgs,
|
||||
llvm::SmallVector<Expr *, 8> &AllArgs,
|
||||
Expr *Fn = 0,
|
||||
VariadicCallType CallType = VariadicDoesNotApply);
|
||||
|
||||
// DefaultVariadicArgumentPromotion - Like DefaultArgumentPromotion, but
|
||||
// will warn if the resulting type is not a POD type.
|
||||
bool DefaultVariadicArgumentPromotion(Expr *&Expr, VariadicCallType CT);
|
||||
|
|
|
@ -2620,8 +2620,14 @@ Sema::ConvertArgumentsForCall(CallExpr *Call, Expr *Fn,
|
|||
}
|
||||
}
|
||||
llvm::SmallVector<Expr *, 8> AllArgs;
|
||||
VariadicCallType CallType =
|
||||
Proto->isVariadic() ? VariadicFunction : VariadicDoesNotApply;
|
||||
if (Fn->getType()->isBlockPointerType())
|
||||
CallType = VariadicBlock; // Block
|
||||
else if (isa<MemberExpr>(Fn))
|
||||
CallType = VariadicMethod;
|
||||
Invalid = GatherArgumentsForCall(Call->getSourceRange().getBegin(), FDecl,
|
||||
Proto, 0, Args, NumArgs, AllArgs, Fn);
|
||||
Proto, 0, Args, NumArgs, AllArgs, Fn, CallType);
|
||||
if (Invalid)
|
||||
return true;
|
||||
unsigned TotalNumArgs = AllArgs.size();
|
||||
|
@ -2637,7 +2643,8 @@ bool Sema::GatherArgumentsForCall(SourceLocation CallLoc,
|
|||
unsigned FirstProtoArg,
|
||||
Expr **Args, unsigned NumArgs,
|
||||
llvm::SmallVector<Expr *, 8> &AllArgs,
|
||||
Expr *Fn) {
|
||||
Expr *Fn,
|
||||
VariadicCallType CallType) {
|
||||
unsigned NumArgsInProto = Proto->getNumArgs();
|
||||
unsigned NumArgsToCheck = NumArgs;
|
||||
bool Invalid = false;
|
||||
|
@ -2679,14 +2686,7 @@ bool Sema::GatherArgumentsForCall(SourceLocation CallLoc,
|
|||
}
|
||||
|
||||
// If this is a variadic call, handle args passed through "...".
|
||||
if (Proto->isVariadic()) {
|
||||
VariadicCallType CallType = VariadicFunction;
|
||||
if (Fn) {
|
||||
if (Fn->getType()->isBlockPointerType())
|
||||
CallType = VariadicBlock; // Block
|
||||
else if (isa<MemberExpr>(Fn))
|
||||
CallType = VariadicMethod;
|
||||
}
|
||||
if (CallType != VariadicDoesNotApply) {
|
||||
// Promote the arguments (C99 6.5.2.2p7).
|
||||
for (unsigned i = ArgIx; i < NumArgs; i++) {
|
||||
Expr *Arg = Args[i];
|
||||
|
|
|
@ -407,9 +407,11 @@ Sema::BuildCXXNew(SourceLocation StartLoc, bool UseGlobal,
|
|||
// Add default arguments, if any.
|
||||
const FunctionProtoType *Proto =
|
||||
OperatorNew->getType()->getAs<FunctionProtoType>();
|
||||
VariadicCallType CallType =
|
||||
Proto->isVariadic() ? VariadicFunction : VariadicDoesNotApply;
|
||||
bool Invalid = GatherArgumentsForCall(PlacementLParen, OperatorNew,
|
||||
Proto, 1, PlaceArgs, NumPlaceArgs,
|
||||
AllPlaceArgs);
|
||||
AllPlaceArgs, 0, CallType);
|
||||
if (Invalid)
|
||||
return ExprError();
|
||||
|
||||
|
|
Загрузка…
Ссылка в новой задаче