diff options
author | Fariborz Jahanian <fjahanian@apple.com> | 2009-11-24 19:27:49 +0000 |
---|---|---|
committer | Fariborz Jahanian <fjahanian@apple.com> | 2009-11-24 19:27:49 +0000 |
commit | 6f2d25e441dd4d0d6057cdffb029e5559c4bf6ee (patch) | |
tree | 6b7052524918eb27283cd2338fc0a2361afb976c /clang | |
parent | c8654eb64e92368cc40979381e411bea886bab32 (diff) | |
download | bcm5719-llvm-6f2d25e441dd4d0d6057cdffb029e5559c4bf6ee.tar.gz bcm5719-llvm-6f2d25e441dd4d0d6057cdffb029e5559c4bf6ee.zip |
More cleanup of argument call collection.
llvm-svn: 89789
Diffstat (limited to 'clang')
-rw-r--r-- | clang/lib/Sema/Sema.h | 22 | ||||
-rw-r--r-- | clang/lib/Sema/SemaExpr.cpp | 20 | ||||
-rw-r--r-- | clang/lib/Sema/SemaExprCXX.cpp | 4 |
3 files changed, 26 insertions, 20 deletions
diff --git a/clang/lib/Sema/Sema.h b/clang/lib/Sema/Sema.h index beaccdac2f3..259bf25bed0 100644 --- a/clang/lib/Sema/Sema.h +++ b/clang/lib/Sema/Sema.h @@ -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); diff --git a/clang/lib/Sema/SemaExpr.cpp b/clang/lib/Sema/SemaExpr.cpp index 50fd5ec9b1f..2a7758a677b 100644 --- a/clang/lib/Sema/SemaExpr.cpp +++ b/clang/lib/Sema/SemaExpr.cpp @@ -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]; diff --git a/clang/lib/Sema/SemaExprCXX.cpp b/clang/lib/Sema/SemaExprCXX.cpp index 4800a1df4a3..4ad62f73119 100644 --- a/clang/lib/Sema/SemaExprCXX.cpp +++ b/clang/lib/Sema/SemaExprCXX.cpp @@ -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(); |