summaryrefslogtreecommitdiffstats
path: root/clang/lib/Sema/SemaDeclCXX.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'clang/lib/Sema/SemaDeclCXX.cpp')
-rw-r--r--clang/lib/Sema/SemaDeclCXX.cpp25
1 files changed, 20 insertions, 5 deletions
diff --git a/clang/lib/Sema/SemaDeclCXX.cpp b/clang/lib/Sema/SemaDeclCXX.cpp
index 3bb16572e9e..c12878c7603 100644
--- a/clang/lib/Sema/SemaDeclCXX.cpp
+++ b/clang/lib/Sema/SemaDeclCXX.cpp
@@ -717,9 +717,17 @@ Sema::ActOnMemInitializer(DeclPtrTy ConstructorD,
// FIXME: Handle members of an anonymous union.
if (Member) {
+ CXXConstructorDecl *C = 0;
+ QualType FieldType = Member->getType();
+ if (const ArrayType *Array = Context.getAsArrayType(FieldType))
+ FieldType = Array->getElementType();
+ if (!FieldType->isDependentType() && FieldType->getAsRecordType())
+ C = PerformInitializationByConstructor(
+ FieldType, (Expr **)Args, NumArgs, IdLoc,
+ SourceRange(IdLoc, RParenLoc), Member->getDeclName(), IK_Direct);
// FIXME: Perform direct initialization of the member.
return new (Context) CXXBaseOrMemberInitializer(Member, (Expr **)Args,
- NumArgs, IdLoc);
+ NumArgs, C, IdLoc);
}
}
// It didn't name a member, so see if it names a class.
@@ -789,10 +797,17 @@ Sema::ActOnMemInitializer(DeclPtrTy ConstructorD,
return Diag(IdLoc, diag::err_not_direct_base_or_virtual)
<< BaseType << ClassDecl->getNameAsCString()
<< SourceRange(IdLoc, RParenLoc);
-
-
- return new (Context) CXXBaseOrMemberInitializer(BaseType, (Expr **)Args,
- NumArgs, IdLoc);
+ DeclarationName Name
+ = Context.DeclarationNames.getCXXConstructorName(
+ Context.getCanonicalType(BaseType));
+ CXXConstructorDecl *C = 0;
+ if (!BaseType->isDependentType())
+ C = PerformInitializationByConstructor(BaseType, (Expr **)Args, NumArgs, IdLoc,
+ SourceRange(IdLoc, RParenLoc), Name,
+ IK_Direct);
+
+ return new (Context) CXXBaseOrMemberInitializer(BaseType, (Expr **)Args,
+ NumArgs, C, IdLoc);
}
static void *GetKeyForTopLevelField(FieldDecl *Field) {
OpenPOWER on IntegriCloud