Account for the VTT argument when making an implicit copy constructor for

a class with virtual bases.  Just a patch until Sema starts (correctly) doing
most of this analysis.

Fixes PR 6622.

llvm-svn: 102692
This commit is contained in:
John McCall 2010-04-30 05:56:45 +00:00
parent 1e13c5a8fb
commit b3cec96a7c
2 changed files with 25 additions and 1 deletions

View File

@ -677,13 +677,25 @@ CodeGenFunction::EmitClassCopyAssignment(llvm::Value *Dest, llvm::Value *Src,
void
CodeGenFunction::SynthesizeCXXCopyConstructor(const FunctionArgList &Args) {
const CXXConstructorDecl *Ctor = cast<CXXConstructorDecl>(CurGD.getDecl());
CXXCtorType CtorType = CurGD.getCtorType();
(void) CtorType;
const CXXRecordDecl *ClassDecl = Ctor->getParent();
assert(!ClassDecl->hasUserDeclaredCopyConstructor() &&
"SynthesizeCXXCopyConstructor - copy constructor has definition already");
assert(!Ctor->isTrivial() && "shouldn't need to generate trivial ctor");
llvm::Value *ThisPtr = LoadCXXThis();
llvm::Value *SrcPtr = Builder.CreateLoad(GetAddrOfLocalVar(Args[1].first));
// Find the source pointer.
unsigned SrcArgIndex = Args.size() - 1;
assert(CtorType == Ctor_Base || SrcArgIndex == 1);
assert(CtorType != Ctor_Base ||
(ClassDecl->getNumVBases() != 0 && SrcArgIndex == 2) ||
SrcArgIndex == 1);
llvm::Value *SrcPtr =
Builder.CreateLoad(GetAddrOfLocalVar(Args[SrcArgIndex].first));
for (CXXRecordDecl::base_class_const_iterator Base = ClassDecl->bases_begin();
Base != ClassDecl->bases_end(); ++Base) {

View File

@ -92,3 +92,15 @@ D::D(int x, ...) : A(ValueClass(x, x+1)), mem(x*x) {}
// CHECK: call void @_ZN10ValueClassC1Eii(
// CHECK: call void @_ZN1AC2E10ValueClass(
// CHECK: call void @_ZN6MemberC1Ei(
// PR6622: this shouldn't crash
namespace test0 {
struct A {};
struct B : virtual A { int x; };
struct C : B {};
void test(C &in) {
C tmp = in;
}
}