diff options
-rw-r--r-- | lib/AST/DeclCXX.cpp | 11 | ||||
-rw-r--r-- | test/SemaTemplate/dependent-base-member-init.cpp | 7 |
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() {} +}; + |