]> granicus.if.org Git - clang/commitdiff
When adding initializers to a constructor, be sure that we are looking
authorDouglas Gregor <dgregor@apple.com>
Fri, 26 Mar 2010 22:43:07 +0000 (22:43 +0000)
committerDouglas Gregor <dgregor@apple.com>
Fri, 26 Mar 2010 22:43:07 +0000 (22:43 +0000)
through the bases and fields of the definition of the class in which
the constructor is declared, rather than some other declaration of
that class.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@99661 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Sema/SemaDeclCXX.cpp
test/CodeGenCXX/constructor-init.cpp

index 1f6630e34369564f2bfa75c75cda31c2bb22ed09..1b4710e3d085ca33904d418a3eae7bdd698ce858 100644 (file)
@@ -1433,7 +1433,11 @@ Sema::SetBaseOrMemberInitializers(CXXConstructorDecl *Constructor,
                                   bool AnyErrors) {
   // We need to build the initializer AST according to order of construction
   // and not what user specified in the Initializers list.
-  CXXRecordDecl *ClassDecl = cast<CXXRecordDecl>(Constructor->getDeclContext());
+  CXXRecordDecl *ClassDecl
+    = cast<CXXRecordDecl>(Constructor->getDeclContext())->getDefinition();
+  if (!ClassDecl)
+    return true;
+  
   llvm::SmallVector<CXXBaseOrMemberInitializer*, 32> AllToInit;
   llvm::DenseMap<const void *, CXXBaseOrMemberInitializer*> AllBaseFields;
   bool HasDependentBaseInit = false;
index a0a35fa16f1bd87dbb7e7f703b6dc015acad9117..284b8b5938f9422bef6a420ec3ab97d458e45d69 100644 (file)
@@ -80,3 +80,24 @@ void f() {
   // CHECK-NOT: call void @_ZN1AIsED1Ev
   // CHECK: ret void
 }
+
+template<typename T>
+struct X {
+  X(const X &);
+
+  T *start;
+  T *end;
+};
+
+template<typename T> struct X;
+
+// Make sure that the instantiated constructor initializes start and
+// end properly.
+// CHECK: define linkonce_odr void @_ZN1XIiEC2ERKS0_
+// CHECK: {{store.*null}}
+// CHECK: {{store.*null}}
+// CHECK: ret
+template<typename T>
+X<T>::X(const X &other) : start(0), end(0) { }
+
+X<int> get_X(X<int> x) { return x; }