From: Anders Carlsson Date: Tue, 6 Oct 2009 17:54:23 +0000 (+0000) Subject: Pass the right type to GetAddrOfFunction when getting functions for the VTable. Fixes... X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=b299d3516d4722ef527b1070bb87133427e621a3;p=clang 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 --- 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(); + 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(MD)) m = wrap(CGM.GetAddrOfCXXDestructor(Dtor, Dtor_Complete)); - else - m = wrap(CGM.GetAddrOfFunction(MD)); - + else { + const FunctionProtoType *FPT = MD->getType()->getAs(); + 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; diff --git a/test/CodeGenCXX/virtual-function-calls.cpp b/test/CodeGenCXX/virtual-function-calls.cpp new file mode 100644 index 0000000000..4002859638 --- /dev/null +++ b/test/CodeGenCXX/virtual-function-calls.cpp @@ -0,0 +1,16 @@ +// PR5021 +struct A { + virtual void f(char); +}; + +void f(A *a) { + a->f('c'); +} +// PR5021 +struct A { + virtual void f(char); +}; + +void f(A *a) { + a->f('c'); +}