Expr **Args;
unsigned NumArgs;
+ /// CtorToCall - For a base or mamber needing a constructor for their
+ /// initialization, this is the constructor to call.
+ CXXConstructorDecl *CtorToCall;
+
/// IdLoc - Location of the id in ctor-initializer list.
SourceLocation IdLoc;
/// CXXBaseOrMemberInitializer - Creates a new base-class initializer.
explicit
CXXBaseOrMemberInitializer(QualType BaseType, Expr **Args, unsigned NumArgs,
+ CXXConstructorDecl *C,
SourceLocation L);
/// CXXBaseOrMemberInitializer - Creates a new member initializer.
explicit
CXXBaseOrMemberInitializer(FieldDecl *Member, Expr **Args, unsigned NumArgs,
+ CXXConstructorDecl *C,
SourceLocation L);
/// ~CXXBaseOrMemberInitializer - Destroy the base or member initializer.
return 0;
}
+ CXXConstructorDecl *getConstructor() const { return CtorToCall; }
+
SourceLocation getSourceLocation() const { return IdLoc; }
/// begin() - Retrieve an iterator to the first initializer argument.
CXXBaseOrMemberInitializer::
CXXBaseOrMemberInitializer(QualType BaseType, Expr **Args, unsigned NumArgs,
+ CXXConstructorDecl *C,
SourceLocation L)
: Args(0), NumArgs(0), IdLoc(L) {
BaseOrMember = reinterpret_cast<uintptr_t>(BaseType.getTypePtr());
for (unsigned Idx = 0; Idx < NumArgs; ++Idx)
this->Args[Idx] = Args[Idx];
}
+ CtorToCall = C;
}
CXXBaseOrMemberInitializer::
CXXBaseOrMemberInitializer(FieldDecl *Member, Expr **Args, unsigned NumArgs,
+ CXXConstructorDecl *C,
SourceLocation L)
: Args(0), NumArgs(0), IdLoc(L) {
BaseOrMember = reinterpret_cast<uintptr_t>(Member);
for (unsigned Idx = 0; Idx < NumArgs; ++Idx)
this->Args[Idx] = Args[Idx];
}
+ CtorToCall = C;
}
CXXBaseOrMemberInitializer::~CXXBaseOrMemberInitializer() {
if (AllBaseFields[Key])
AllToInit.push_back(AllBaseFields[Key]);
else {
+ CXXRecordDecl *VBaseDecl =
+ cast<CXXRecordDecl>(VBase->getType()->getAsRecordType()->getDecl());
+ assert(VBaseDecl && "setBaseOrMemberInitializers - VBaseDecl null");
+ // FIXME. Issue error if default ctor is missing.
CXXBaseOrMemberInitializer *Member =
- new (C) CXXBaseOrMemberInitializer(VBase->getType(), 0, 0,
- SourceLocation());
+ new (C) CXXBaseOrMemberInitializer(VBase->getType(), 0, 0,
+ VBaseDecl->getDefaultConstructor(C),
+ SourceLocation());
AllToInit.push_back(Member);
}
}
if (AllBaseFields[Key])
AllToInit.push_back(AllBaseFields[Key]);
else {
+ CXXRecordDecl *BaseDecl =
+ cast<CXXRecordDecl>(Base->getType()->getAsRecordType()->getDecl());
+ assert(BaseDecl && "setBaseOrMemberInitializers - BaseDecl null");
+ // FIXME. Issue error if default ctor is missing.
CXXBaseOrMemberInitializer *Member =
new (C) CXXBaseOrMemberInitializer(Base->getType(), 0, 0,
+ BaseDecl->getDefaultConstructor(C),
SourceLocation());
AllToInit.push_back(Member);
}
FieldType = AT->getElementType();
if (FieldType->getAsRecordType()) {
+ CXXConstructorDecl *Ctor = 0;
+ if (CXXRecordDecl *FieldClassDecl =
+ dyn_cast<CXXRecordDecl>(FieldType->getAsRecordType()->getDecl()))
+ Ctor = FieldClassDecl->getDefaultConstructor(C);
+ // FIXME. Issue error if default ctor is missing.
CXXBaseOrMemberInitializer *Member =
- new (C) CXXBaseOrMemberInitializer((*Field), 0, 0, SourceLocation());
+ new (C) CXXBaseOrMemberInitializer((*Field), 0, 0,
+ Ctor,
+ SourceLocation());
AllToInit.push_back(Member);
}
}
// 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.
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) {