]> granicus.if.org Git - clang/commitdiff
We weren't generating correct code for calls to variadic member functions.
authorAnders Carlsson <andersca@mac.com>
Wed, 8 Apr 2009 20:31:57 +0000 (20:31 +0000)
committerAnders Carlsson <andersca@mac.com>
Wed, 8 Apr 2009 20:31:57 +0000 (20:31 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@68635 91177308-0d34-0410-b5e6-96231b3b80d8

lib/CodeGen/CGCXX.cpp
test/CodeGenCXX/member-functions.cpp

index 000a0a9123b9e144eee9d3cee224bff151e31443..217f63a9df4e34c61f99a2925042e1afcaf0e115 100644 (file)
@@ -142,12 +142,10 @@ RValue CodeGenFunction::EmitCXXMemberCallExpr(const CXXMemberCallExpr *CE) {
   assert(MD->isInstance() && 
          "Trying to emit a member call expr on a static method!");
   
-  const CGFunctionInfo &FnInfo = CGM.getTypes().getFunctionInfo(MD);
-  
-  bool IsVariadic = MD->getType()->getAsFunctionProtoType()->isVariadic();
+  const FunctionProtoType *FPT = MD->getType()->getAsFunctionProtoType();
   const llvm::Type *Ty = 
-    CGM.getTypes().GetFunctionType(FnInfo, IsVariadic);
-    
+    CGM.getTypes().GetFunctionType(CGM.getTypes().getFunctionInfo(MD), 
+                                   FPT->isVariadic());
   llvm::Constant *Callee = CGM.GetAddrOfFunction(MD, Ty);
   
   llvm::Value *BaseValue = 0;
@@ -173,5 +171,6 @@ RValue CodeGenFunction::EmitCXXMemberCallExpr(const CXXMemberCallExpr *CE) {
     Args.push_back(std::make_pair(EmitAnyExprToTemp(*I), I->getType()));
   
   QualType ResultType = MD->getType()->getAsFunctionType()->getResultType();
-  return EmitCall(FnInfo, Callee, Args, MD);
+  return EmitCall(CGM.getTypes().getFunctionInfo(ResultType, Args), 
+                  Callee, Args, MD);
 }
index a6fa000319ca4cf3f8f3ced2a4f75cbc9cdda7bd..9cdab0a6624befdac47ed746d830fa56892ec91f 100644 (file)
@@ -1,15 +1,19 @@
 // RUN: clang-cc -emit-llvm %s -o %t &&
 struct C {
   void f();
+  void g(int, ...);
 };
 
 // RUN: grep "define void @_ZN1C1fEv" %t | count 1 &&
 void C::f() {
 }
 
-// RUN: grep "call void @_ZN1C1fEv" %t | count 1
 void f() {
   C c;
   
+// RUN: grep "call void @_ZN1C1fEv" %t | count 1 &&
   c.f();
-}
\ No newline at end of file
+  
+// RUN: grep "call void (.struct.C\*, i32, ...)\* @_ZN1C1gEiz" %t | count 1
+  c.g(1, 2, 3);
+}