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:
Fariborz Jahanian 2009-11-24 19:27:49 +00:00
Родитель f7a1a744eb
Коммит 4cd1c706c2
3 изменённых файлов: 26 добавлений и 20 удалений

Просмотреть файл

@ -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();