diff options
author | Anders Carlsson <andersca@mac.com> | 2009-10-06 17:54:23 +0000 |
---|---|---|
committer | Anders Carlsson <andersca@mac.com> | 2009-10-06 17:54:23 +0000 |
commit | b299d3516d4722ef527b1070bb87133427e621a3 (patch) | |
tree | dc01a184cefb261537d7805a8286a48559724bd9 /lib/CodeGen | |
parent | 6961fdd661f75b8452f526143b9f60b54e175c9d (diff) |
Pass the right type to GetAddrOfFunction when getting functions for the VTable. Fixes PR5021.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@83395 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/CodeGen')
-rw-r--r-- | lib/CodeGen/CGCXX.cpp | 20 |
1 files changed, 16 insertions, 4 deletions
diff --git a/lib/CodeGen/CGCXX.cpp b/lib/CodeGen/CGCXX.cpp index 2d5c62e3e2..a119c5af93 100644 --- a/lib/CodeGen/CGCXX.cpp +++ b/lib/CodeGen/CGCXX.cpp @@ -891,7 +891,13 @@ public: ++mi) if (mi->isVirtual()) { const CXXMethodDecl *MD = *mi; - llvm::Constant *m = wrap(CGM.GetAddrOfFunction(MD)); + const FunctionProtoType *FPT = + MD->getType()->getAs<FunctionProtoType>(); + const llvm::Type *Ty = + CGM.getTypes().GetFunctionType(CGM.getTypes().getFunctionInfo(MD), + FPT->isVariadic()); + + llvm::Constant *m = wrap(CGM.GetAddrOfFunction(MD, Ty)); OverrideMethod(MD, m, MorallyVirtual, Offset); } } @@ -901,9 +907,15 @@ public: llvm::Constant *m = 0; if (const CXXDestructorDecl *Dtor = dyn_cast<CXXDestructorDecl>(MD)) m = wrap(CGM.GetAddrOfCXXDestructor(Dtor, Dtor_Complete)); - else - m = wrap(CGM.GetAddrOfFunction(MD)); - + else { + const FunctionProtoType *FPT = MD->getType()->getAs<FunctionProtoType>(); + const llvm::Type *Ty = + CGM.getTypes().GetFunctionType(CGM.getTypes().getFunctionInfo(MD), + FPT->isVariadic()); + + m = wrap(CGM.GetAddrOfFunction(MD, Ty)); + } + // If we can find a previously allocated slot for this, reuse it. if (OverrideMethod(MD, m, MorallyVirtual, Offset)) return; |