aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFariborz Jahanian <fjahanian@apple.com>2009-08-24 17:19:23 +0000
committerFariborz Jahanian <fjahanian@apple.com>2009-08-24 17:19:23 +0000
commit77a2b4f3618608be3e93b12df898d088f8e38337 (patch)
tree864e0d88c881da6ac04de1a1ba5aaa19dc7bdbcc
parentad3e7118c40711faf5f51f08d599dbd525d3408a (diff)
Fixes pr4763.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@79923 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r--lib/AST/DeclCXX.cpp11
-rw-r--r--test/SemaTemplate/dependent-base-member-init.cpp7
2 files changed, 14 insertions, 4 deletions
diff --git a/lib/AST/DeclCXX.cpp b/lib/AST/DeclCXX.cpp
index 40870bed8d..56d0456d59 100644
--- a/lib/AST/DeclCXX.cpp
+++ b/lib/AST/DeclCXX.cpp
@@ -604,6 +604,8 @@ CXXConstructorDecl::setBaseOrMemberInitializers(
for (CXXRecordDecl::base_class_iterator VBase =
ClassDecl->vbases_begin(),
E = ClassDecl->vbases_end(); VBase != E; ++VBase) {
+ if (VBase->getType()->isDependentType())
+ continue;
if (CXXBaseOrMemberInitializer *Value =
AllBaseFields.lookup(VBase->getType()->getAs<RecordType>()))
AllToInit.push_back(Value);
@@ -611,8 +613,7 @@ CXXConstructorDecl::setBaseOrMemberInitializers(
CXXRecordDecl *VBaseDecl =
cast<CXXRecordDecl>(VBase->getType()->getAs<RecordType>()->getDecl());
assert(VBaseDecl && "setBaseOrMemberInitializers - VBaseDecl null");
- if (!VBaseDecl->getDefaultConstructor(C) &&
- !VBase->getType()->isDependentType())
+ if (!VBaseDecl->getDefaultConstructor(C))
Bases.push_back(VBase);
CXXBaseOrMemberInitializer *Member =
new (C) CXXBaseOrMemberInitializer(VBase->getType(), 0, 0,
@@ -628,6 +629,9 @@ CXXConstructorDecl::setBaseOrMemberInitializers(
// Virtuals are in the virtual base list and already constructed.
if (Base->isVirtual())
continue;
+ // Skip dependent types.
+ if (Base->getType()->isDependentType())
+ continue;
if (CXXBaseOrMemberInitializer *Value =
AllBaseFields.lookup(Base->getType()->getAs<RecordType>()))
AllToInit.push_back(Value);
@@ -635,8 +639,7 @@ CXXConstructorDecl::setBaseOrMemberInitializers(
CXXRecordDecl *BaseDecl =
cast<CXXRecordDecl>(Base->getType()->getAs<RecordType>()->getDecl());
assert(BaseDecl && "setBaseOrMemberInitializers - BaseDecl null");
- if (!BaseDecl->getDefaultConstructor(C) &&
- !Base->getType()->isDependentType())
+ if (!BaseDecl->getDefaultConstructor(C))
Bases.push_back(Base);
CXXBaseOrMemberInitializer *Member =
new (C) CXXBaseOrMemberInitializer(Base->getType(), 0, 0,
diff --git a/test/SemaTemplate/dependent-base-member-init.cpp b/test/SemaTemplate/dependent-base-member-init.cpp
index fef945da25..684bce6f5a 100644
--- a/test/SemaTemplate/dependent-base-member-init.cpp
+++ b/test/SemaTemplate/dependent-base-member-init.cpp
@@ -23,3 +23,10 @@ template<typename _Container> class insert_iterator {
insert_iterator(_Container& __x) : container(&__x) {}
};
+// PR4763
+template<typename T> struct s0 {};
+template<typename T> struct s0_traits {};
+template<typename T> struct s1 : s0<typename s0_traits<T>::t0> {
+ s1() {}
+};
+