diff options
Diffstat (limited to 'clang/lib/CodeGen/CGClass.cpp')
-rw-r--r-- | clang/lib/CodeGen/CGClass.cpp | 25 |
1 files changed, 5 insertions, 20 deletions
diff --git a/clang/lib/CodeGen/CGClass.cpp b/clang/lib/CodeGen/CGClass.cpp index 27aefe482f2..d503d332e7d 100644 --- a/clang/lib/CodeGen/CGClass.cpp +++ b/clang/lib/CodeGen/CGClass.cpp @@ -1703,38 +1703,23 @@ CodeGenFunction::EmitSynthesizedCXXCopyCtorCall(const CXXConstructorDecl *D, assert(D->isInstance() && "Trying to emit a member call expr on a static method!"); - const FunctionProtoType *FPT = D->getType()->getAs<FunctionProtoType>(); + const FunctionProtoType *FPT = D->getType()->castAs<FunctionProtoType>(); CallArgList Args; // Push the this ptr. Args.add(RValue::get(This), D->getThisType(getContext())); - // Push the src ptr. QualType QT = *(FPT->arg_type_begin()); llvm::Type *t = CGM.getTypes().ConvertType(QT); Src = Builder.CreateBitCast(Src, t); Args.add(RValue::get(Src), QT); - + // Skip over first argument (Src). - ++ArgBeg; - CallExpr::const_arg_iterator Arg = ArgBeg; - for (FunctionProtoType::arg_type_iterator I = FPT->arg_type_begin()+1, - E = FPT->arg_type_end(); I != E; ++I, ++Arg) { - assert(Arg != ArgEnd && "Running over edge of argument list!"); - EmitCallArg(Args, *Arg, *I); - } - // Either we've emitted all the call args, or we have a call to a - // variadic function. - assert((Arg == ArgEnd || FPT->isVariadic()) && - "Extra arguments in non-variadic function!"); - // If we still have any arguments, emit them using the type of the argument. - for (; Arg != ArgEnd; ++Arg) { - QualType ArgType = Arg->getType(); - EmitCallArg(Args, *Arg, ArgType); - } - + EmitCallArgs(Args, FPT->isVariadic(), FPT->arg_type_begin() + 1, + FPT->arg_type_end(), ArgBeg + 1, ArgEnd); + EmitCall(CGM.getTypes().arrangeCXXMethodCall(Args, FPT, RequiredArgs::All), Callee, ReturnValueSlot(), Args, D); } |