[cfe-commits] r102692 - in /cfe/trunk: lib/CodeGen/CGClass.cpp test/CodeGenCXX/constructors.cpp

John McCall rjmccall at apple.com
Thu Apr 29 22:56:45 PDT 2010


Author: rjmccall
Date: Fri Apr 30 00:56:45 2010
New Revision: 102692

URL: http://llvm.org/viewvc/llvm-project?rev=102692&view=rev
Log:
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.


Modified:
    cfe/trunk/lib/CodeGen/CGClass.cpp
    cfe/trunk/test/CodeGenCXX/constructors.cpp

Modified: cfe/trunk/lib/CodeGen/CGClass.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CGClass.cpp?rev=102692&r1=102691&r2=102692&view=diff
==============================================================================
--- cfe/trunk/lib/CodeGen/CGClass.cpp (original)
+++ cfe/trunk/lib/CodeGen/CGClass.cpp Fri Apr 30 00:56:45 2010
@@ -677,13 +677,25 @@
 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) {

Modified: cfe/trunk/test/CodeGenCXX/constructors.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGenCXX/constructors.cpp?rev=102692&r1=102691&r2=102692&view=diff
==============================================================================
--- cfe/trunk/test/CodeGenCXX/constructors.cpp (original)
+++ cfe/trunk/test/CodeGenCXX/constructors.cpp Fri Apr 30 00:56:45 2010
@@ -92,3 +92,15 @@
 // 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;
+  }
+}





More information about the cfe-commits mailing list